|
@@ -96,6 +96,7 @@ void RigidBodyCombiner::
|
|
|
collect() {
|
|
collect() {
|
|
|
_internal_root = new GeomNode(get_name());
|
|
_internal_root = new GeomNode(get_name());
|
|
|
_internal_transforms.clear();
|
|
_internal_transforms.clear();
|
|
|
|
|
+ _vd_table.clear();
|
|
|
|
|
|
|
|
Children cr = get_children();
|
|
Children cr = get_children();
|
|
|
int num_children = cr.get_num_children();
|
|
int num_children = cr.get_num_children();
|
|
@@ -103,6 +104,8 @@ collect() {
|
|
|
r_collect(cr.get_child(i), RenderState::make_empty(), NULL);
|
|
r_collect(cr.get_child(i), RenderState::make_empty(), NULL);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ _vd_table.clear();
|
|
|
|
|
+
|
|
|
SceneGraphReducer gr;
|
|
SceneGraphReducer gr;
|
|
|
gr.apply_attribs(_internal_root);
|
|
gr.apply_attribs(_internal_root);
|
|
|
gr.collect_vertex_data(_internal_root, ~(SceneGraphReducer::CVD_format | SceneGraphReducer::CVD_name | SceneGraphReducer::CVD_animation_type));
|
|
gr.collect_vertex_data(_internal_root, ~(SceneGraphReducer::CVD_format | SceneGraphReducer::CVD_name | SceneGraphReducer::CVD_animation_type));
|
|
@@ -224,7 +227,14 @@ r_collect(PandaNode *node, const RenderState *state,
|
|
|
////////////////////////////////////////////////////////////////////
|
|
////////////////////////////////////////////////////////////////////
|
|
|
PT(GeomVertexData) RigidBodyCombiner::
|
|
PT(GeomVertexData) RigidBodyCombiner::
|
|
|
convert_vd(const VertexTransform *transform, const GeomVertexData *orig) {
|
|
convert_vd(const VertexTransform *transform, const GeomVertexData *orig) {
|
|
|
- // TODO: unify this operation for unique transform/data combinations.
|
|
|
|
|
|
|
+ // First, unify this operation for unique transform/data
|
|
|
|
|
+ // combinations. If we encounter a given GeomVertexData more than
|
|
|
|
|
+ // once under the same transform, we should return exactly the same
|
|
|
|
|
+ // GeomVertexData.
|
|
|
|
|
+ VDTable::iterator vdti = _vd_table.find(VDUnifier(transform, orig));
|
|
|
|
|
+ if (vdti != _vd_table.end()) {
|
|
|
|
|
+ return (*vdti).second;
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
PT(GeomVertexFormat) format = new GeomVertexFormat(*orig->get_format());
|
|
PT(GeomVertexFormat) format = new GeomVertexFormat(*orig->get_format());
|
|
|
if (!orig->get_format()->has_column(InternalName::get_transform_blend())) {
|
|
if (!orig->get_format()->has_column(InternalName::get_transform_blend())) {
|
|
@@ -254,5 +264,8 @@ convert_vd(const VertexTransform *transform, const GeomVertexData *orig) {
|
|
|
// case, we'll have to adjust it. TODO.
|
|
// case, we'll have to adjust it. TODO.
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ // Store the result for the next time.
|
|
|
|
|
+ _vd_table[VDUnifier(transform, orig)] = new_data;
|
|
|
|
|
+
|
|
|
return new_data;
|
|
return new_data;
|
|
|
}
|
|
}
|