fix static geometry parented directly to the joint

This commit is contained in:
David Rose 2005-05-25 20:14:45 +00:00
parent a6d9f869dd
commit d3238eb5fb
5 changed files with 27 additions and 17 deletions

View File

@ -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());
}
////////////////////////////////////////////////////////////////////

View File

@ -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);
}
}

View File

@ -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);

View File

@ -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();

View File

@ -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,