Browse Source

Add material indices for triangle meshes.

enn0x 16 years ago
parent
commit
eb1a45529c

+ 1 - 0
dtool/src/parser-inc/NxPhysics.h

@@ -137,6 +137,7 @@ class NxVec3;
 class NxMat33;
 class NxMat34;
 class NxQuat;
+class NxMaterialIndex;
 
 class NxBox;
 class NxSphere;

+ 7 - 0
panda/src/physx/physxTriangleMeshDesc.I

@@ -24,11 +24,14 @@ PhysxTriangleMeshDesc() {
   _desc.flags = 0;
   _desc.pointStrideBytes = sizeof(NxVec3);
   _desc.triangleStrideBytes = 3*sizeof(NxU32);
+  _desc.materialIndexStride = sizeof(NxMaterialIndex);
   _desc.points = NULL;
   _desc.triangles = NULL;
+  _desc.materialIndices = NULL;
 
   _vertices = NULL;
   _triangles = NULL;
+  _materials = NULL;
 }
 
 ////////////////////////////////////////////////////////////////////
@@ -46,6 +49,10 @@ INLINE PhysxTriangleMeshDesc::
   if (_triangles) {
     delete [] _triangles;
   }
+
+  if (_materials) {
+    delete [] _materials;
+  }
 }
 
 ////////////////////////////////////////////////////////////////////

+ 17 - 2
panda/src/physx/physxTriangleMeshDesc.cxx

@@ -65,16 +65,25 @@ set_vertex(unsigned int idx, const LPoint3f &vert) {
 //               set_triangle are done!
 ////////////////////////////////////////////////////////////////////
 void PhysxTriangleMeshDesc::
-set_num_triangles(unsigned int numTriangles) {
+set_num_triangles(unsigned int numTriangles, bool use_material_indices) {
 
   if (_desc.triangles) {
     delete [] _triangles;
   }
 
+  if (_desc.materialIndices) {
+    delete [] _materials;
+  }
+
   _triangles = new NxU32[3 * numTriangles];
 
   _desc.numTriangles = numTriangles;
   _desc.triangles = _triangles;
+
+  if (use_material_indices == true) {
+    _materials = new NxMaterialIndex[numTriangles];
+    _desc.materialIndices = _materials;
+  }
 }
 
 ////////////////////////////////////////////////////////////////////
@@ -84,10 +93,16 @@ set_num_triangles(unsigned int numTriangles) {
 //               indices i1, i2, i3.
 ////////////////////////////////////////////////////////////////////
 void PhysxTriangleMeshDesc::
-set_triangle(unsigned int idx, unsigned int i1, unsigned int i2, unsigned int i3) {
+set_triangle(unsigned int idx,
+             unsigned int i1, unsigned int i2, unsigned int i3,
+             unsigned int material_index) {
 
   nassertv(_desc.numTriangles > idx);
 
+  if (_desc.materialIndices) {
+    _materials[idx] = (NxMaterialIndex) material_index;
+  }
+
   idx = 3 * idx;
   _triangles[idx] = i1;
   _triangles[idx + 1] = i2;

+ 5 - 2
panda/src/physx/physxTriangleMeshDesc.h

@@ -36,8 +36,10 @@ PUBLISHED:
   void set_num_vertices(unsigned int n);
   void set_vertex(unsigned int idx, const LPoint3f &vert);
 
-  void set_num_triangles(unsigned int n);
-  void set_triangle(unsigned int idx, unsigned int i1, unsigned int i2, unsigned int i3);
+  void set_num_triangles(unsigned int n, bool use_material_indices=false);
+  void set_triangle(unsigned int idx,
+                    unsigned int i1, unsigned int i2, unsigned int i3,
+                    unsigned int material_index=1);
 
   void set_from_node_path(const NodePath &np);
 
@@ -47,6 +49,7 @@ public:
 private:
   NxVec3 *_vertices;
   NxU32 *_triangles;
+  NxMaterialIndex *_materials;
   NxTriangleMeshDesc _desc;
 };