Browse Source

*** empty log message ***

David Rose 24 years ago
parent
commit
73750b7587

+ 13 - 2
pandatool/src/xfile/xFileMaker.cxx

@@ -262,11 +262,23 @@ add_polyset(EggBin *egg_bin, LPDIRECTXFILEDATA dx_parent) {
   mesh.make_mesh_data(raw_data);
   mesh.make_mesh_data(raw_data);
 
 
   LPDIRECTXFILEDATA xobj;
   LPDIRECTXFILEDATA xobj;
-  cerr << "Creating mesh\n";
   if (!create_object(xobj, TID_D3DRMMesh, "mesh" + mesh_index, raw_data)) {
   if (!create_object(xobj, TID_D3DRMMesh, "mesh" + mesh_index, raw_data)) {
     return false;
     return false;
   }
   }
 
 
+  if (mesh.has_normals()) {
+    // Tack on normals.
+    LPDIRECTXFILEDATA xnormals;
+    mesh.make_normal_data(raw_data);
+    if (!create_object(xnormals, TID_D3DRMMeshNormals, "norms" + mesh_index,
+                       raw_data)) {
+      return false;
+    }
+    if (!attach_and_release(xnormals, xobj)) {
+      return false;
+    }
+  }
+
   if (!attach_and_release(xobj, dx_parent)) {
   if (!attach_and_release(xobj, dx_parent)) {
     return false;
     return false;
   }
   }
@@ -329,7 +341,6 @@ create_object(LPDIRECTXFILEDATA &obj, REFGUID template_id,
 ////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////
 bool XFileMaker::
 bool XFileMaker::
 create_frame(LPDIRECTXFILEDATA &obj, const string &name) {
 create_frame(LPDIRECTXFILEDATA &obj, const string &name) {
-  cerr << "Creating frame\n";
   return create_object(obj, TID_D3DRMFrame, name, Datagram());
   return create_object(obj, TID_D3DRMFrame, name, Datagram());
 }
 }
 
 

+ 52 - 0
pandatool/src/xfile/xFileMesh.cxx

@@ -28,6 +28,7 @@
 ////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////
 XFileMesh::
 XFileMesh::
 XFileMesh() {
 XFileMesh() {
+  _has_normals = false;
 }
 }
 
 
 ////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////
@@ -89,6 +90,10 @@ int XFileMesh::
 add_normal(EggVertex *egg_vertex, EggPrimitive *egg_prim) {
 add_normal(EggVertex *egg_vertex, EggPrimitive *egg_prim) {
   int next_index = _normals.size();
   int next_index = _normals.size();
   XFileNormal *normal = new XFileNormal(egg_vertex, egg_prim);
   XFileNormal *normal = new XFileNormal(egg_vertex, egg_prim);
+  if (normal->_has_normal) {
+    _has_normals = true;
+  }
+
   pair<UniqueNormals::iterator, bool> result =
   pair<UniqueNormals::iterator, bool> result =
     _unique_normals.insert(UniqueNormals::value_type(normal, next_index));
     _unique_normals.insert(UniqueNormals::value_type(normal, next_index));
 
 
@@ -104,6 +109,17 @@ add_normal(EggVertex *egg_vertex, EggPrimitive *egg_prim) {
   }
   }
 }
 }
 
 
+////////////////////////////////////////////////////////////////////
+//     Function: XFileMesh::has_normals
+//       Access: Public
+//  Description: Returns true if any of the vertices or faces added to
+//               this mesh used a normal, false otherwise.
+////////////////////////////////////////////////////////////////////
+bool XFileMesh::
+has_normals() const {
+  return _has_normals;
+}
+
 ////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////
 //     Function: XFileMesh::make_mesh_data
 //     Function: XFileMesh::make_mesh_data
 //       Access: Public
 //       Access: Public
@@ -112,6 +128,7 @@ add_normal(EggVertex *egg_vertex, EggPrimitive *egg_prim) {
 ////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////
 void XFileMesh::
 void XFileMesh::
 make_mesh_data(Datagram &raw_data) {
 make_mesh_data(Datagram &raw_data) {
+  raw_data.clear();
   raw_data.add_int32(_vertices.size());
   raw_data.add_int32(_vertices.size());
   
   
   Vertices::const_iterator vi;
   Vertices::const_iterator vi;
@@ -137,3 +154,38 @@ make_mesh_data(Datagram &raw_data) {
     }
     }
   }
   }
 }
 }
+
+////////////////////////////////////////////////////////////////////
+//     Function: XFileMesh::make_normal_data
+//       Access: Public
+//  Description: Fills the datagram with the raw data for the DX
+//               MeshNormals template.
+////////////////////////////////////////////////////////////////////
+void XFileMesh::
+make_normal_data(Datagram &raw_data) {
+  raw_data.clear();
+  raw_data.add_int32(_normals.size());
+  
+  Normals::const_iterator ni;
+  for (ni = _normals.begin(); ni != _normals.end(); ++ni) {
+    XFileNormal *normal = (*ni);
+    const Normalf &norm = normal->_normal;
+    raw_data.add_float32(norm[0]);
+    raw_data.add_float32(norm[1]);
+    raw_data.add_float32(norm[2]);
+  }
+
+  raw_data.add_int32(_faces.size());
+  Faces::const_iterator fi;
+  for (fi = _faces.begin(); fi != _faces.end(); ++fi) {
+    XFileFace *face = (*fi);
+
+    raw_data.add_int32(face->_vertices.size());
+    XFileFace::Vertices::const_iterator fvi;
+    for (fvi = face->_vertices.begin();
+         fvi != face->_vertices.end();
+         ++fvi) {
+      raw_data.add_int32((*fvi)._normal_index);
+    }
+  }
+}

+ 6 - 1
pandatool/src/xfile/xFileMesh.h

@@ -46,9 +46,12 @@ public:
   int add_vertex(EggVertex *egg_vertex, EggPrimitive *egg_prim);
   int add_vertex(EggVertex *egg_vertex, EggPrimitive *egg_prim);
   int add_normal(EggVertex *egg_vertex, EggPrimitive *egg_prim);
   int add_normal(EggVertex *egg_vertex, EggPrimitive *egg_prim);
 
 
+  bool has_normals() const;
+
   void make_mesh_data(Datagram &raw_data);
   void make_mesh_data(Datagram &raw_data);
+  void make_normal_data(Datagram &raw_data);
 
 
-public:
+private:
   typedef pvector<XFileVertex *> Vertices;
   typedef pvector<XFileVertex *> Vertices;
   typedef pvector<XFileNormal *> Normals;
   typedef pvector<XFileNormal *> Normals;
   typedef pvector<XFileFace *> Faces;
   typedef pvector<XFileFace *> Faces;
@@ -62,6 +65,8 @@ private:
   typedef pmap<XFileNormal *, int, IndirectCompareTo<XFileNormal> > UniqueNormals;
   typedef pmap<XFileNormal *, int, IndirectCompareTo<XFileNormal> > UniqueNormals;
   UniqueVertices _unique_vertices;
   UniqueVertices _unique_vertices;
   UniqueNormals _unique_normals;
   UniqueNormals _unique_normals;
+
+  bool _has_normals;
 };
 };
 
 
 #endif
 #endif

+ 2 - 0
pandatool/src/xfile/xFileNormal.cxx

@@ -27,12 +27,14 @@
 ////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////
 XFileNormal::
 XFileNormal::
 XFileNormal(EggVertex *egg_vertex, EggPrimitive *egg_prim) {
 XFileNormal(EggVertex *egg_vertex, EggPrimitive *egg_prim) {
+  _has_normal = true;
   if (egg_vertex->has_normal()) {
   if (egg_vertex->has_normal()) {
     _normal = LCAST(float, egg_vertex->get_normal());
     _normal = LCAST(float, egg_vertex->get_normal());
   } else if (egg_prim->has_normal()) {
   } else if (egg_prim->has_normal()) {
     _normal = LCAST(float, egg_prim->get_normal());
     _normal = LCAST(float, egg_prim->get_normal());
   } else {
   } else {
     _normal.set(0.0, 0.0, 0.0);
     _normal.set(0.0, 0.0, 0.0);
+    _has_normal = false;
   }
   }
 }
 }
 
 

+ 1 - 0
pandatool/src/xfile/xFileNormal.h

@@ -38,6 +38,7 @@ public:
   int compare_to(const XFileNormal &other) const;
   int compare_to(const XFileNormal &other) const;
 
 
   Normalf _normal;
   Normalf _normal;
+  bool _has_normal;
 };
 };
 
 
 #endif
 #endif