diff --git a/panda/src/egg2pg/animBundleMaker.cxx b/panda/src/egg2pg/animBundleMaker.cxx index 4e38c8eb91..f1952711ea 100644 --- a/panda/src/egg2pg/animBundleMaker.cxx +++ b/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()); } //////////////////////////////////////////////////////////////////// diff --git a/panda/src/egg2pg/characterMaker.cxx b/panda/src/egg2pg/characterMaker.cxx index bee7f1d7f6..d9b2c08332 100644 --- a/panda/src/egg2pg/characterMaker.cxx +++ b/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); } } diff --git a/panda/src/egg2pg/characterMaker.h b/panda/src/egg2pg/characterMaker.h index d53e24e165..8a73f6ef98 100644 --- a/panda/src/egg2pg/characterMaker.h +++ b/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); diff --git a/panda/src/egg2pg/eggLoader.cxx b/panda/src/egg2pg/eggLoader.cxx index dfcf007f49..2440f1b545 100644 --- a/panda/src/egg2pg/eggLoader.cxx +++ b/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(); diff --git a/panda/src/egg2pg/eggLoader.h b/panda/src/egg2pg/eggLoader.h index 6a6f9673a0..40b7eb3207 100644 --- a/panda/src/egg2pg/eggLoader.h +++ b/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,