mirror of
https://github.com/panda3d/panda3d.git
synced 2025-10-03 10:22:45 -04:00
fix bounds when flattening actors
This commit is contained in:
parent
e4f4701f23
commit
384a2570a8
@ -189,6 +189,10 @@ apply_transform(const TransformState *transform) {
|
|||||||
nassertr(inserted, new_bundle);
|
nassertr(inserted, new_bundle);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Make sure the new transform gets immediately applied to all of
|
||||||
|
// the joints.
|
||||||
|
new_bundle->force_update();
|
||||||
|
|
||||||
return new_bundle;
|
return new_bundle;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -57,6 +57,10 @@ apply_attribs_to_vertices(const AccumulatedAttribs &attribs, int attrib_types,
|
|||||||
PT(PartBundle) new_bundle = bundle->apply_transform(attribs._transform);
|
PT(PartBundle) new_bundle = bundle->apply_transform(attribs._transform);
|
||||||
update_bundle(handle, new_bundle);
|
update_bundle(handle, new_bundle);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Make sure the Geom bounding volumes get recomputed due to this
|
||||||
|
// update.
|
||||||
|
r_mark_geom_bounds_stale(Thread::get_current_thread());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1060,6 +1060,22 @@ animate_vertices(bool force, Thread *current_thread) const {
|
|||||||
return cdataw->_animated_vertices;
|
return cdataw->_animated_vertices;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
// Function: GeomVertexData::clear_animated_vertices
|
||||||
|
// Access: Published
|
||||||
|
// Description: Removes the cache of animated vertices computed by a
|
||||||
|
// previous call to animate_vertices() within the same
|
||||||
|
// frame. This will force the next call to
|
||||||
|
// animate_vertices() to recompute these values from
|
||||||
|
// scratch. Normally it is not necessary to call this.
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
void GeomVertexData::
|
||||||
|
clear_animated_vertices() {
|
||||||
|
CDWriter cdata(_cycler, true);
|
||||||
|
cdata->_animated_vertices_modified.clear();
|
||||||
|
cdata->_animated_vertices.clear();
|
||||||
|
}
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
||||||
// Function: GeomVertexData::bytewise_copy
|
// Function: GeomVertexData::bytewise_copy
|
||||||
// Access: Private, Static
|
// Access: Private, Static
|
||||||
|
@ -150,6 +150,7 @@ PUBLISHED:
|
|||||||
CPT(GeomVertexData) reverse_normals() const;
|
CPT(GeomVertexData) reverse_normals() const;
|
||||||
|
|
||||||
CPT(GeomVertexData) animate_vertices(bool force, Thread *current_thread) const;
|
CPT(GeomVertexData) animate_vertices(bool force, Thread *current_thread) const;
|
||||||
|
void clear_animated_vertices();
|
||||||
|
|
||||||
PT(GeomVertexData)
|
PT(GeomVertexData)
|
||||||
replace_column(InternalName *name, int num_components,
|
replace_column(InternalName *name, int num_components,
|
||||||
|
@ -832,6 +832,30 @@ do_premunge(GraphicsStateGuardianBase *gsg,
|
|||||||
CLOSE_ITERATE_CURRENT_AND_UPSTREAM(_cycler);
|
CLOSE_ITERATE_CURRENT_AND_UPSTREAM(_cycler);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
// Function: GeomNode::r_mark_geom_bounds_stale
|
||||||
|
// Access: Protected, Virtual
|
||||||
|
// Description: Recursively calls Geom::mark_bounds_stale() on every
|
||||||
|
// Geom at this node and below.
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
void GeomNode::
|
||||||
|
r_mark_geom_bounds_stale(Thread *current_thread) {
|
||||||
|
OPEN_ITERATE_CURRENT_AND_UPSTREAM(_cycler, current_thread) {
|
||||||
|
CDStageWriter cdata(_cycler, pipeline_stage, current_thread);
|
||||||
|
|
||||||
|
GeomList::iterator gi;
|
||||||
|
PT(GeomList) geoms = cdata->modify_geoms();
|
||||||
|
for (gi = geoms->begin(); gi != geoms->end(); ++gi) {
|
||||||
|
GeomEntry &entry = (*gi);
|
||||||
|
entry._geom.get_read_pointer()->mark_bounds_stale();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
CLOSE_ITERATE_CURRENT_AND_UPSTREAM(_cycler);
|
||||||
|
mark_internal_bounds_stale();
|
||||||
|
|
||||||
|
PandaNode::r_mark_geom_bounds_stale(current_thread);
|
||||||
|
}
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
||||||
// Function: GeomNode::compute_internal_bounds
|
// Function: GeomNode::compute_internal_bounds
|
||||||
// Access: Protected, Virtual
|
// Access: Protected, Virtual
|
||||||
|
@ -100,6 +100,7 @@ public:
|
|||||||
GeomTransformer &transformer);
|
GeomTransformer &transformer);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
virtual void r_mark_geom_bounds_stale(Thread *current_thread);
|
||||||
virtual void compute_internal_bounds(CPT(BoundingVolume) &internal_bounds,
|
virtual void compute_internal_bounds(CPT(BoundingVolume) &internal_bounds,
|
||||||
int &internal_vertices,
|
int &internal_vertices,
|
||||||
int pipeline_stage,
|
int pipeline_stage,
|
||||||
|
@ -2641,6 +2641,29 @@ force_bounds_stale(int pipeline_stage, Thread *current_thread) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
// Function: PandaNode::r_mark_geom_bounds_stale
|
||||||
|
// Access: Protected, Virtual
|
||||||
|
// Description: Recursively calls Geom::mark_bounds_stale() on every
|
||||||
|
// Geom at this node and below.
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
void PandaNode::
|
||||||
|
r_mark_geom_bounds_stale(Thread *current_thread) {
|
||||||
|
Children children = get_children(current_thread);
|
||||||
|
|
||||||
|
int i;
|
||||||
|
for (i = 0; i < children.get_num_children(); i++) {
|
||||||
|
PandaNode *child = children.get_child(i);
|
||||||
|
child->r_mark_geom_bounds_stale(current_thread);
|
||||||
|
}
|
||||||
|
|
||||||
|
Stashed stashed = get_stashed(current_thread);
|
||||||
|
for (i = 0; i < stashed.get_num_stashed(); i++) {
|
||||||
|
PandaNode *child = stashed.get_stashed(i);
|
||||||
|
child->r_mark_geom_bounds_stale(current_thread);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
||||||
// Function: PandaNode::compute_internal_bounds
|
// Function: PandaNode::compute_internal_bounds
|
||||||
// Access: Protected, Virtual
|
// Access: Protected, Virtual
|
||||||
|
@ -308,6 +308,8 @@ protected:
|
|||||||
void force_bounds_stale(int pipeline_stage, Thread *current_thread);
|
void force_bounds_stale(int pipeline_stage, Thread *current_thread);
|
||||||
INLINE void mark_internal_bounds_stale(int pipeline_stage, Thread *current_thread);
|
INLINE void mark_internal_bounds_stale(int pipeline_stage, Thread *current_thread);
|
||||||
|
|
||||||
|
virtual void r_mark_geom_bounds_stale(Thread *current_thread);
|
||||||
|
|
||||||
virtual void compute_internal_bounds(CPT(BoundingVolume) &internal_bounds,
|
virtual void compute_internal_bounds(CPT(BoundingVolume) &internal_bounds,
|
||||||
int &internal_vertices,
|
int &internal_vertices,
|
||||||
int pipeline_stage,
|
int pipeline_stage,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user