瀏覽代碼

include points and lines in bam2egg

David Rose 14 年之前
父節點
當前提交
e26b9f4c92
共有 2 個文件被更改,包括 81 次插入32 次删除
  1. 74 28
      pandatool/src/bam/bamToEgg.cxx
  2. 7 4
      pandatool/src/bam/bamToEgg.h

+ 74 - 28
pandatool/src/bam/bamToEgg.cxx

@@ -39,6 +39,8 @@
 #include "geomNode.h"
 #include "geom.h"
 #include "geomTriangles.h"
+#include "geomPoints.h"
+#include "geomLines.h"
 #include "geomVertexReader.h"
 #include "transformTable.h"
 #include "modelNode.h"
@@ -57,6 +59,8 @@
 #include "eggVertex.h"
 #include "eggPrimitive.h"
 #include "eggPolygon.h"
+#include "eggPoint.h"
+#include "eggLine.h"
 #include "eggTexture.h"
 #include "eggMaterial.h"
 #include "eggRenderMode.h"
@@ -578,13 +582,10 @@ convert_geom_node(GeomNode *node, const WorkingNodePath &node_path,
     for (int j = 0; j < num_primitives; ++j) {
       const GeomPrimitive *primitive = geom->get_primitive(j);
       CPT(GeomPrimitive) simple = primitive->decompose();
-      if (simple->is_of_type(GeomTriangles::get_class_type())) {
-        CPT(GeomVertexData) vdata = geom->get_vertex_data();
-        //        vdata = vdata->animate_vertices(true, Thread::get_current_thread());
-        convert_triangles(vdata,
-                          DCAST(GeomTriangles, simple), geom_state,
-                          net_mat, egg_parent, jointMap);
-      }
+      CPT(GeomVertexData) vdata = geom->get_vertex_data();
+      //        vdata = vdata->animate_vertices(true, Thread::get_current_thread());
+      convert_primitive(vdata, simple, geom_state,
+                        net_mat, egg_parent, jointMap);
     }
   }
   
@@ -592,13 +593,13 @@ convert_geom_node(GeomNode *node, const WorkingNodePath &node_path,
 }
 
 ////////////////////////////////////////////////////////////////////
-//     Function: BamToEgg::convert_triangles
+//     Function: BamToEgg::convert_primitive
 //       Access: Private
 //  Description: 
 ////////////////////////////////////////////////////////////////////
 void BamToEgg::
-convert_triangles(const GeomVertexData *vertex_data,
-                  const GeomTriangles *primitive, 
+convert_primitive(const GeomVertexData *vertex_data,
+                  const GeomPrimitive *primitive,
                   const RenderState *net_state, 
                   const LMatrix4 &net_mat, EggGroupNode *egg_parent,
                   CharacterJointMap *jointMap) {
@@ -739,28 +740,44 @@ convert_triangles(const GeomVertexData *vertex_data,
   LColor color;
   CPT(TransformBlendTable) transformBlendTable = vertex_data->get_transform_blend_table();
 
-  int nprims = primitive->get_num_primitives();
-  for (int i = 0; i < nprims; ++i) {
-    EggPolygon *egg_poly = new EggPolygon;
-    egg_parent->add_child(egg_poly);
+  int num_primitives = primitive->get_num_primitives();
+  int num_vertices = primitive->get_num_vertices_per_primitive();
+
+  EggPrimitive *(*make_func)(void);
+
+  if (primitive->is_of_type(GeomTriangles::get_class_type())) {
+    make_func = make_egg_polygon;
+  } else if (primitive->is_of_type(GeomPoints::get_class_type())) {
+    make_func = make_egg_point;
+  } else if (primitive->is_of_type(GeomLines::get_class_type())) {
+    make_func = make_egg_line;
+  } else {
+    // Huh, an unknown geometry type.
+    return;
+  }
+  
+  for (int i = 0; i < num_primitives; ++i) {
+    PT(EggPrimitive) egg_prim = (*make_func)();
+
+    egg_parent->add_child(egg_prim);
     if (egg_tex != (EggTexture *)NULL) {
-      egg_poly->set_texture(egg_tex);
+      egg_prim->set_texture(egg_tex);
     }
-
+    
     if (bface) {
-      egg_poly->set_bface_flag(true);
+      egg_prim->set_bface_flag(true);
     }
 
-    for (int j = 0; j < 3; j++) {
+    for (int j = 0; j < num_vertices; j++) {
       EggVertex egg_vert;
-
+        
       // Get per-vertex properties.
-      reader.set_row(primitive->get_vertex(i * 3 + j));
-
+      reader.set_row(primitive->get_vertex(i * num_vertices + j));
+        
       reader.set_column(InternalName::get_vertex());
       LVertex vertex = reader.get_data3();
       egg_vert.set_pos(LCAST(double, vertex * net_mat));
-
+        
       if (vertex_data->has_column(InternalName::get_normal())) {
         reader.set_column(InternalName::get_normal());
         LNormal normal = reader.get_data3();
@@ -768,7 +785,7 @@ convert_triangles(const GeomVertexData *vertex_data,
       }
       if (has_color_override) {
         egg_vert.set_color(color_override);
-
+          
       } else if (!has_color_off) {
         LColor color(1.0f, 1.0f, 1.0f, 1.0f);
         if (vertex_data->has_column(InternalName::get_color())) {
@@ -780,17 +797,17 @@ convert_triangles(const GeomVertexData *vertex_data,
                                   color[2] * color_scale[2],
                                   color[3] * color_scale[3]));
       }
-
+        
       if (vertex_data->has_column(InternalName::get_texcoord())) {
         reader.set_column(InternalName::get_texcoord());
         LTexCoord uv = reader.get_data2();
         egg_vert.set_uv(LCAST(double, uv));
       }
-
+        
       EggVertex *new_egg_vert = _vpool->create_unique_vertex(egg_vert);
-
+        
       if ((vertex_data->has_column(InternalName::get_transform_blend())) && 
-      (jointMap!=NULL) && (transformBlendTable!=NULL)) {
+          (jointMap!=NULL) && (transformBlendTable!=NULL)) {
         reader.set_column(InternalName::get_transform_blend());
         int idx = reader.get_data1i();
         const TransformBlend &blend = transformBlendTable->get_blend(idx);
@@ -813,7 +830,7 @@ convert_triangles(const GeomVertexData *vertex_data,
         }
       }
 
-      egg_poly->add_vertex(new_egg_vert);
+      egg_prim->add_vertex(new_egg_vert);
     }
   }
 }
@@ -1129,6 +1146,35 @@ get_egg_texture(Texture *tex) {
   return NULL;
 }
 
+////////////////////////////////////////////////////////////////////
+//     Function: BamToEgg::make_egg_polygon
+//       Access: Public, Static
+//  Description: A factory function to make a new EggPolygon instance.
+////////////////////////////////////////////////////////////////////
+EggPrimitive *BamToEgg::
+make_egg_polygon() {
+  return new EggPolygon;
+}
+
+////////////////////////////////////////////////////////////////////
+//     Function: BamToEgg::make_egg_point
+//       Access: Public, Static
+//  Description: A factory function to make a new EggPoint instance.
+////////////////////////////////////////////////////////////////////
+EggPrimitive *BamToEgg::
+make_egg_point() {
+  return new EggPoint;
+}
+
+////////////////////////////////////////////////////////////////////
+//     Function: BamToEgg::make_egg_line
+//       Access: Public, Static
+//  Description: A factory function to make a new EggLine instance.
+////////////////////////////////////////////////////////////////////
+EggPrimitive *BamToEgg::
+make_egg_line() {
+  return new EggLine;
+}
 
 int main(int argc, char *argv[]) {
   // A call to pystub() to force libpystub.so to be linked in.

+ 7 - 4
pandatool/src/bam/bamToEgg.h

@@ -36,9 +36,8 @@ class Character;
 class PartGroup;
 class CollisionNode;
 class GeomNode;
-class GeomTri;
 class GeomVertexData;
-class GeomTriangles;
+class GeomPrimitive;
 class PandaNode;
 class RenderState;
 class Texture;
@@ -78,8 +77,8 @@ private:
                         EggGroupNode *egg_parent, bool has_decal);
   void convert_geom_node(GeomNode *node, const WorkingNodePath &node_path, 
                          EggGroupNode *egg_parent, bool has_decal, CharacterJointMap *jointMap=NULL);
-  void convert_triangles(const GeomVertexData *vertex_data,
-                         const GeomTriangles *primitive, 
+  void convert_primitive(const GeomVertexData *vertex_data,
+                         const GeomPrimitive *primitive, 
                          const RenderState *net_state, 
                          const LMatrix4 &net_mat, EggGroupNode *egg_parent,
                          CharacterJointMap *jointMap);
@@ -92,6 +91,10 @@ private:
 
   EggTexture *get_egg_texture(Texture *tex);
 
+  static EggPrimitive *make_egg_polygon();
+  static EggPrimitive *make_egg_point();
+  static EggPrimitive *make_egg_line();
+
   EggVertexPool *_vpool;
   EggTextureCollection _textures;
   EggMaterialCollection _materials;