Browse Source

fix static geometry parented directly to the joint

David Rose 20 years ago
parent
commit
d3238eb5fb

+ 1 - 1
panda/src/egg2pg/animBundleMaker.cxx

@@ -71,7 +71,7 @@ AnimBundleMaker(EggTable *root) : _root(root) {
 ////////////////////////////////////////////////////////////////////
 AnimBundleNode *AnimBundleMaker::
 make_node() {
-  return new AnimBundleNode("", make_bundle());
+  return new AnimBundleNode(_root->get_name(), make_bundle());
 }
 
 ////////////////////////////////////////////////////////////////////

+ 3 - 5
panda/src/egg2pg/characterMaker.cxx

@@ -235,7 +235,7 @@ egg_to_slider(const string &name) {
 ////////////////////////////////////////////////////////////////////
 CharacterJointBundle *CharacterMaker::
 make_bundle() {
-  build_joint_hierarchy(_egg_root, _skeleton_root);
+  build_joint_hierarchy(_egg_root, _skeleton_root, -1);
 
   if (use_qpgeom) {
     // The new, experimental Geom system.
@@ -260,9 +260,7 @@ make_bundle() {
 //  Description:
 ////////////////////////////////////////////////////////////////////
 void CharacterMaker::
-build_joint_hierarchy(EggNode *egg_node, PartGroup *part) {
-  int index = -1;
-
+build_joint_hierarchy(EggNode *egg_node, PartGroup *part, int index) {
   if (egg_node->is_of_type(EggGroup::get_class_type())) {
     EggGroup *egg_group = DCAST(EggGroup, egg_node);
 
@@ -298,7 +296,7 @@ build_joint_hierarchy(EggNode *egg_node, PartGroup *part) {
 
     EggGroup::const_iterator ci;
     for (ci = egg_group->begin(); ci != egg_group->end(); ++ci) {
-      build_joint_hierarchy((*ci), part);
+      build_joint_hierarchy((*ci), part, index);
     }
   }
 

+ 1 - 1
panda/src/egg2pg/characterMaker.h

@@ -66,7 +66,7 @@ public:
 
 private:
   CharacterJointBundle *make_bundle();
-  void build_joint_hierarchy(EggNode *egg_node, PartGroup *part);
+  void build_joint_hierarchy(EggNode *egg_node, PartGroup *part, int index);
   void parent_joint_nodes(PartGroup *part);
 
   void make_geometry(EggNode *egg_node);

+ 21 - 9
panda/src/egg2pg/eggLoader.cxx

@@ -635,7 +635,7 @@ make_polyset(EggBin *egg_bin, PandaNode *parent, const LMatrix4d *transform,
     // Now convert the vertex pool to a GeomVertexData.
     nassertv(vertex_pool != (EggVertexPool *)NULL);
     PT(qpGeomVertexData) vertex_data = 
-      make_vertex_data(render_state, vertex_pool, mat,
+      make_vertex_data(render_state, vertex_pool, egg_bin, mat,
                        is_dynamic, character_maker);
     nassertv(vertex_data != (qpGeomVertexData *)NULL);
 
@@ -1989,7 +1989,8 @@ check_for_polysets(EggGroup *egg_group, bool &all_polysets, bool &any_hidden) {
 ////////////////////////////////////////////////////////////////////
 PT(qpGeomVertexData) EggLoader::
 make_vertex_data(const EggRenderState *render_state, 
-                 EggVertexPool *vertex_pool, const LMatrix4d &transform,
+                 EggVertexPool *vertex_pool, EggNode *primitive_home,
+                 const LMatrix4d &transform,
                  bool is_dynamic, CharacterMaker *character_maker) {
   VertexPoolTransform vpt;
   vpt._vertex_pool = vertex_pool;
@@ -2234,14 +2235,25 @@ make_vertex_data(const EggRenderState *render_state,
     if (is_dynamic) {
       // Figure out the transforms affecting this particular vertex.
       TransformBlend blend;
-      EggVertex::GroupRef::const_iterator gri;
-      for (gri = vertex->gref_begin(); gri != vertex->gref_end(); ++gri) {
-        EggGroup *egg_joint = (*gri);
-        double membership = egg_joint->get_vertex_membership(vertex);
-
-        PT(VertexTransform) vt = character_maker->egg_to_transform(egg_joint);
+      if (vertex->gref_size() == 0) {
+        // If the vertex has no explicit membership, it belongs right
+        // where it is.
+        PT(VertexTransform) vt = character_maker->egg_to_transform(primitive_home);
         nassertr(vt != (VertexTransform *)NULL, vertex_data);
-        blend.add_transform(vt, membership);
+        blend.add_transform(vt, 1.0f);
+
+      } else {
+        // If the vertex does have an explicit membership, ignore its
+        // parentage and assign it where it wants to be.
+        EggVertex::GroupRef::const_iterator gri;
+        for (gri = vertex->gref_begin(); gri != vertex->gref_end(); ++gri) {
+          EggGroup *egg_joint = (*gri);
+          double membership = egg_joint->get_vertex_membership(vertex);
+          
+          PT(VertexTransform) vt = character_maker->egg_to_transform(egg_joint);
+          nassertr(vt != (VertexTransform *)NULL, vertex_data);
+          blend.add_transform(vt, membership);
+        }
       }
       blend.normalize_weights();
 

+ 1 - 1
panda/src/egg2pg/eggLoader.h

@@ -146,7 +146,7 @@ private:
                           bool &any_hidden);
   PT(qpGeomVertexData) make_vertex_data
   (const EggRenderState *render_state, EggVertexPool *vertex_pool, 
-   const LMatrix4d &transform, bool is_dynamic, 
+   EggNode *primitive_home, const LMatrix4d &transform, bool is_dynamic, 
    CharacterMaker *character_maker);
   void record_morph
   (qpGeomVertexArrayFormat *array_format,