fix static geometry parented directly to the joint
This commit is contained in:
parent
a6d9f869dd
commit
d3238eb5fb
|
|
@ -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());
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
Loading…
Reference in New Issue