Advertisement
Guest User

Untitled

a guest
Sep 2nd, 2014
221
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.83 KB | None | 0 0
  1. for (irr::u32 m = 0; m < MBCount; m++)
  2. {
  3. irr::scene::IMeshBuffer* MB = GetMesh()->getMeshBuffer(m);
  4.  
  5. irr::video::S3DVertex* Vertices = (irr::video::S3DVertex*)MB->getVertices();
  6. irr::u16* Indices = MB->getIndices();
  7.  
  8. for (irr::u32 i = 0; i < MB->getIndexCount(); i++)
  9. {
  10. v_Indices.push_back((int)Indices[i]);
  11. }
  12. for (irr::u32 i = 0; i < MB->getVertexCount(); i++)
  13. {
  14. v_Vertices.push_back((float)Vertices[i].Pos.X);
  15. v_Vertices.push_back((float)Vertices[i].Pos.Y);
  16. v_Vertices.push_back((float)Vertices[i].Pos.Z);
  17. }
  18. }
  19.  
  20. btCompoundShape* p_Shape = CreateShapeHACD(v_Vertices, v_Indices);
  21.  
  22. printf("Bn");
  23. btAlignedObjectArray<btTriangleMesh*> m_trimeshes;
  24. btAlignedObjectArray<btConvexHullShape*> m_convexShapes;
  25. btAlignedObjectArray<btVector3> m_convexCentroids;
  26.  
  27. printf("Cn");
  28. std::vector<HACD::Vec3<HACD::Real>> Points;
  29. std::vector<HACD::Vec3<long>> Triangles;
  30.  
  31. printf("Dn");
  32. for (unsigned int i = 0; i < i_Vertices.size(); i++)
  33. {
  34. unsigned int Index = i * 3;
  35. HACD::Vec3<HACD::Real> Vertex(i_Vertices[Index], i_Vertices[Index + 1], i_Vertices[Index + 2]);
  36. Points.push_back(Vertex);
  37. }
  38. printf("En");
  39. for (unsigned int i = 0; i < i_Indices.size() * 3; i++)
  40. {
  41. unsigned int Index = i * 3;
  42. HACD::Vec3<long> Triangle(i_Indices[Index], i_Indices[Index + 1], i_Indices[Index + 2]);
  43. Triangles.push_back(Triangle);
  44. }
  45.  
  46. printf("Fn");
  47. //
  48. // Let HACD do it's thing
  49. //
  50.  
  51. printf("Gn");
  52. HACD::HACD myHACD;
  53. myHACD.SetPoints(&Points[0]);
  54. myHACD.SetNPoints(Points.size());
  55. myHACD.SetTriangles(&Triangles[0]);
  56. myHACD.SetNTriangles(Triangles.size());
  57. myHACD.SetCompacityWeight(0.1);
  58. myHACD.SetVolumeWeight(0.0);
  59.  
  60. printf("Hn");
  61. size_t nClusters = 2; // minimum number of clusters
  62. size_t mVerts = 100; // max of 100 vertices per convex-hull
  63. double concavity = 100; // maximum concavity
  64. bool invert = false;
  65. bool addExtraDistPoints = false;
  66. bool addNeighboursDistPoints = false;
  67. bool addFacesPoints = false;
  68.  
  69. printf("In");
  70. myHACD.SetNClusters(nClusters);
  71. myHACD.SetNVerticesPerCH(mVerts);
  72. myHACD.SetConcavity(concavity);
  73. myHACD.SetAddExtraDistPoints(addExtraDistPoints);
  74. myHACD.SetAddNeighboursDistPoints(addNeighboursDistPoints);
  75. myHACD.SetAddFacesPoints(addFacesPoints);
  76.  
  77. printf("Jn");
  78. myHACD.Compute();
  79.  
  80. printf("Kn");
  81. btCompoundShape* Compound = new btCompoundShape();
  82.  
  83. printf("Ln");
  84. btTransform Trans;
  85. Trans.setIdentity();
  86.  
  87. for (unsigned int c = 0; c < nClusters; c++)
  88. {
  89. size_t nPoints = myHACD.GetNPointsCH(c);
  90. size_t nTriangles = myHACD.GetNTrianglesCH(c);
  91.  
  92. float* Vertices = new float[nPoints * 3];
  93. unsigned int* Triangles = new unsigned int[nTriangles * 3];
  94.  
  95. HACD::Vec3<HACD::Real>* PointsCH = new HACD::Vec3<HACD::Real>[nPoints];
  96. HACD::Vec3<long>* TrianglesCH = new HACD::Vec3<long>[nTriangles];
  97. myHACD.GetCH(c, PointsCH, TrianglesCH);
  98.  
  99. for (size_t v = 0; v < nPoints; v++)
  100. {
  101. Vertices[3 * v] = PointsCH[v].X();
  102. Vertices[3 * v + 1] = PointsCH[v].Y();
  103. Vertices[3 * v + 2] = PointsCH[v].Z();
  104. }
  105. for (size_t f = 0; f < nTriangles; f++)
  106. {
  107. Triangles[3 * f] = TrianglesCH[f].X();
  108. Triangles[3 * f + 1] = TrianglesCH[f].Y();
  109. Triangles[3 * f + 2] = TrianglesCH[f].Z();
  110. }
  111.  
  112. delete[] PointsCH;
  113. delete[] TrianglesCH;
  114.  
  115. //
  116. // Create the individual pieces of the btCompoundShape
  117. //
  118.  
  119. btTriangleMesh* TriMesh = new btTriangleMesh();
  120. m_trimeshes.push_back(TriMesh);
  121.  
  122. btVector3 localScaling(6.0F, 6.0F, 6.0F);
  123. Centroid.setValue(0, 0, 0);
  124.  
  125. btAlignedObjectArray<btVector3> h_Vertices;
  126.  
  127. // Might be nPoints*3
  128. for (unsigned int i = 0; i < nPoints; i++)
  129. {
  130. btVector3 Vertex(Vertices[i * 3], Vertices[i * 3 + 1], Vertices[i * 3 + 2]);
  131. Vertex *= localScaling;
  132. Centroid += Vertex;
  133. }
  134.  
  135. // Might be nPoints*3
  136. Centroid *= 1.0F / (float(nPoints));
  137.  
  138. // Might be nPoints*3
  139. for (unsigned int i = 0; i < nPoints; i++)
  140. {
  141. btVector3 Vertex(Vertices[i * 3], Vertices[i * 3 + 1], Vertices[i * 3 + 2]);
  142. Vertex *= localScaling;
  143. Centroid -= Vertex;
  144. h_Vertices.push_back(Vertex);
  145. }
  146.  
  147. for (unsigned int i = 0; i < nTriangles; i++)
  148. {
  149. unsigned int index0 = *Triangles++;
  150. unsigned int index1 = *Triangles++;
  151. unsigned int index2 = *Triangles++;
  152.  
  153. btVector3 vertex0(Vertices[index0 * 3], Vertices[index0 * 3 + 1], Vertices[index0 * 3 + 2]);
  154. btVector3 vertex1(Vertices[index1 * 3], Vertices[index1 * 3 + 1], Vertices[index1 * 3 + 2]);
  155. btVector3 vertex2(Vertices[index2 * 3], Vertices[index2 * 3 + 1], Vertices[index2 * 3 + 2]);
  156. vertex0 *= localScaling;
  157. vertex1 *= localScaling;
  158. vertex2 *= localScaling;
  159.  
  160. vertex0 -= Centroid;
  161. vertex1 -= Centroid;
  162. vertex2 -= Centroid;
  163.  
  164. TriMesh->addTriangle(vertex0, vertex1, vertex2);
  165.  
  166. index0 += mBaseCount;
  167. index1 += mBaseCount;
  168. index2 += mBaseCount;
  169. }
  170.  
  171. btConvexHullShape* ConvexShape = new btConvexHullShape(&(h_Vertices[0].getX()), h_Vertices.size());
  172. ConvexShape->setMargin(0.01F);
  173. m_convexShapes.push_back(ConvexShape);
  174. m_convexCentroids.push_back(Centroid);
  175. mBaseCount += nPoints;
  176. }
  177.  
  178. for (unsigned int i = 0; i < m_convexShapes.size(); i++)
  179. {
  180. Trans.setOrigin(m_convexCentroids[i]);
  181. Compound->addChildShape(Trans, m_convexShapes[i]);
  182. }
  183.  
  184. return Compound;
  185. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement