From ffb676cc9a17e9c13f76eb4d966e644a6fdf1462 Mon Sep 17 00:00:00 2001 From: David Rose Date: Fri, 24 Mar 2006 23:41:09 +0000 Subject: [PATCH] compute _net_transform, not _modelview_transform, at each node of cull traversal --- panda/src/collide/collisionNode.cxx | 4 ++-- panda/src/collide/collisionVisualizer.cxx | 10 +++++++--- panda/src/display/graphicsEngine.cxx | 8 +++++++- panda/src/parametrics/ropeNode.cxx | 16 ++++++++++------ panda/src/parametrics/sheetNode.cxx | 3 ++- panda/src/pgraph/billboardEffect.cxx | 8 ++++---- panda/src/pgraph/cullTraverser.I | 6 +++--- panda/src/pgraph/cullTraverser.cxx | 21 ++++++++++++--------- panda/src/pgraph/cullTraverserData.I | 20 ++++++++++---------- panda/src/pgraph/cullTraverserData.cxx | 12 ++++++------ panda/src/pgraph/cullTraverserData.h | 8 ++++---- panda/src/pgraph/cullableObject.I | 9 +++++++-- panda/src/pgraph/cullableObject.cxx | 6 ++++-- panda/src/pgraph/cullableObject.h | 5 ++++- panda/src/pgraph/lodNode.cxx | 4 ++-- panda/src/pgraph/planeNode.cxx | 5 +++-- 16 files changed, 87 insertions(+), 58 deletions(-) diff --git a/panda/src/collide/collisionNode.cxx b/panda/src/collide/collisionNode.cxx index 625f70a5b5..d46df709bd 100644 --- a/panda/src/collide/collisionNode.cxx +++ b/panda/src/collide/collisionNode.cxx @@ -250,8 +250,8 @@ cull_callback(CullTraverser *trav, CullTraverserData &data) { if (node != (PandaNode *)NULL) { CullTraverserData next_data(data, node); - next_data._modelview_transform = - next_data._modelview_transform->compose(transform); + next_data._net_transform = + next_data._net_transform->compose(transform); next_data._state = get_last_pos_state(); trav->traverse(next_data); } diff --git a/panda/src/collide/collisionVisualizer.cxx b/panda/src/collide/collisionVisualizer.cxx index 31da50401c..13911bc009 100644 --- a/panda/src/collide/collisionVisualizer.cxx +++ b/panda/src/collide/collisionVisualizer.cxx @@ -135,7 +135,7 @@ cull_callback(CullTraverser *trav, CullTraverserData &data) { // whatever transforms were above the CollisionVisualizer node; it // always renders its objects according to their appropriate net // transform. - xform_data._modelview_transform = trav->get_world_transform(); + xform_data._net_transform = TransformState::make_identity(); xform_data.apply_transform_and_state(trav, net_transform, RenderState::make_empty(), RenderEffects::make_empty(), @@ -212,7 +212,9 @@ cull_callback(CullTraverser *trav, CullTraverserData &data) { geom->add_primitive(points); CullableObject *object = - new CullableObject(geom, point_state, xform_data._modelview_transform); + new CullableObject(geom, point_state, + xform_data.get_net_transform(trav), + xform_data.get_modelview_transform(trav)); trav->get_cull_handler()->record_object(object, trav); } @@ -240,7 +242,9 @@ cull_callback(CullTraverser *trav, CullTraverserData &data) { geom->add_primitive(lines); CullableObject *object = - new CullableObject(geom, empty_state, xform_data._modelview_transform); + new CullableObject(geom, empty_state, + xform_data.get_net_transform(trav), + xform_data.get_modelview_transform(trav)); trav->get_cull_handler()->record_object(object, trav); } diff --git a/panda/src/display/graphicsEngine.cxx b/panda/src/display/graphicsEngine.cxx index 6aea6cb8c8..c1b9d8694e 100644 --- a/panda/src/display/graphicsEngine.cxx +++ b/panda/src/display/graphicsEngine.cxx @@ -529,6 +529,13 @@ render_frame() { } #endif + ClockObject *global_clock = ClockObject::get_global_clock(); + + if (display_cat.is_spam()) { + display_cat.spam() + << "render_frame() - frame " << global_clock->get_frame_count() << "\n"; + } + // We hold the GraphicsEngine mutex while we wait for all of the // threads. Doing this puts us at risk for deadlock if any of the // threads tries to call any methods on the GraphicsEngine. So @@ -621,7 +628,6 @@ render_frame() { } #endif // THREADED_PIPELINE - ClockObject *global_clock = ClockObject::get_global_clock(); global_clock->tick(); if (global_clock->check_errors()) { throw_event("clock_error"); diff --git a/panda/src/parametrics/ropeNode.cxx b/panda/src/parametrics/ropeNode.cxx index afe21be794..1b070b4e8b 100644 --- a/panda/src/parametrics/ropeNode.cxx +++ b/panda/src/parametrics/ropeNode.cxx @@ -362,7 +362,8 @@ render_thread(CullTraverser *trav, CullTraverserData &data, CPT(RenderState) state = data._state->add_attrib(thick); CullableObject *object = new CullableObject(geom, state, - data._modelview_transform); + data.get_net_transform(trav), + data.get_modelview_transform(trav)); trav->get_cull_handler()->record_object(object, trav); } @@ -404,7 +405,8 @@ render_tape(CullTraverser *trav, CullTraverserData &data, geom->add_primitive(strip); CullableObject *object = new CullableObject(geom, data._state, - data._modelview_transform); + data.get_net_transform(trav), + data.get_modelview_transform(trav)); trav->get_cull_handler()->record_object(object, trav); } @@ -421,11 +423,11 @@ render_tape(CullTraverser *trav, CullTraverserData &data, void RopeNode:: render_billboard(CullTraverser *trav, CullTraverserData &data, NurbsCurveResult *result) const { - const TransformState *net_transform = data._modelview_transform; + const TransformState *modelview_transform = data.get_modelview_transform(trav); const TransformState *camera_transform = trav->get_camera_transform(); CPT(TransformState) rel_transform = - net_transform->invert_compose(camera_transform); + modelview_transform->invert_compose(camera_transform); LVector3f camera_vec = LVector3f::forward() * rel_transform->get_mat(); CurveSegments curve_segments; @@ -453,7 +455,8 @@ render_billboard(CullTraverser *trav, CullTraverserData &data, geom->add_primitive(strip); CullableObject *object = new CullableObject(geom, data._state, - data._modelview_transform); + data.get_net_transform(trav), + data.get_modelview_transform(trav)); trav->get_cull_handler()->record_object(object, trav); } @@ -509,7 +512,8 @@ render_tube(CullTraverser *trav, CullTraverserData &data, geom->add_primitive(strip); CullableObject *object = new CullableObject(geom, data._state, - data._modelview_transform); + data.get_net_transform(trav), + data.get_modelview_transform(trav)); trav->get_cull_handler()->record_object(object, trav); } diff --git a/panda/src/parametrics/sheetNode.cxx b/panda/src/parametrics/sheetNode.cxx index 6d49571eb5..ab53700bd9 100644 --- a/panda/src/parametrics/sheetNode.cxx +++ b/panda/src/parametrics/sheetNode.cxx @@ -335,7 +335,8 @@ render_sheet(CullTraverser *trav, CullTraverserData &data, geom->add_primitive(strip); CullableObject *object = new CullableObject(geom, data._state, - data._modelview_transform); + data.get_net_transform(trav), + data.get_modelview_transform(trav)); trav->get_cull_handler()->record_object(object, trav); } diff --git a/panda/src/pgraph/billboardEffect.cxx b/panda/src/pgraph/billboardEffect.cxx index 38b8e60fd2..2caad2603d 100644 --- a/panda/src/pgraph/billboardEffect.cxx +++ b/panda/src/pgraph/billboardEffect.cxx @@ -147,13 +147,13 @@ void BillboardEffect:: cull_callback(CullTraverser *trav, CullTraverserData &data, CPT(TransformState) &node_transform, CPT(RenderState) &) const { - CPT(TransformState) net_transform = data._modelview_transform; - if (net_transform->is_singular()) { + CPT(TransformState) modelview_transform = data.get_modelview_transform(trav); + if (modelview_transform->is_singular()) { // If we're under a singular transform, never mind. return; } - // Since the "net" transform from the cull traverser already + // Since the "modelview" transform from the cull traverser already // includes the inverse camera transform, the camera transform is // identity. CPT(TransformState) camera_transform = TransformState::make_identity(); @@ -164,7 +164,7 @@ cull_callback(CullTraverser *trav, CullTraverserData &data, camera_transform = trav->get_camera_transform()->invert_compose(_look_at.get_net_transform()); } - compute_billboard(node_transform, net_transform, camera_transform); + compute_billboard(node_transform, modelview_transform, camera_transform); } //////////////////////////////////////////////////////////////////// diff --git a/panda/src/pgraph/cullTraverser.I b/panda/src/pgraph/cullTraverser.I index 1dc061af85..96468df2b0 100644 --- a/panda/src/pgraph/cullTraverser.I +++ b/panda/src/pgraph/cullTraverser.I @@ -97,9 +97,9 @@ get_camera_transform() const { // // Note that this value is always the position of the // starting node, not the current node, even if it is -// sampled during a traversal. To get the world -// transform of the current node use -// CullTraverserData::_net_transform. +// sampled during a traversal. To get the transform of +// the current node use +// CullTraverserData::get_modelview_transform(). //////////////////////////////////////////////////////////////////// INLINE const TransformState *CullTraverser:: get_world_transform() const { diff --git a/panda/src/pgraph/cullTraverser.cxx b/panda/src/pgraph/cullTraverser.cxx index b91634792d..adb6a6058c 100644 --- a/panda/src/pgraph/cullTraverser.cxx +++ b/panda/src/pgraph/cullTraverser.cxx @@ -110,7 +110,7 @@ traverse(const NodePath &root, bool python_cull_control) { // store this pointer in this set_portal_clipper(&portal_viewer); - CullTraverserData data(root, get_world_transform(), + CullTraverserData data(root, TransformState::make_identity(), _initial_state, _view_frustum, _guard_band); @@ -124,11 +124,11 @@ traverse(const NodePath &root, bool python_cull_control) { CPT(TransformState) transform = cull_center.get_transform(root); CullTraverserData my_data(data, portal_viewer._previous); - my_data._modelview_transform = my_data._modelview_transform->compose(transform); + my_data._net_transform = my_data._net_transform->compose(transform); traverse(my_data); } else { - CullTraverserData data(root, get_world_transform(), + CullTraverserData data(root, TransformState::make_identity(), _initial_state, _view_frustum, _guard_band); @@ -223,7 +223,7 @@ traverse_below(CullTraverserData &data) { int num_geoms = geom_node->get_num_geoms(); _geoms_pcollector.add_level(num_geoms); for (int i = 0; i < num_geoms; i++) { - CullableObject *object = new CullableObject(data, geom_node, i); + CullableObject *object = new CullableObject(this, data, geom_node, i); if (object->_state->has_cull_callback() && !object->_state->cull_callback(this, data)) { delete object; @@ -286,7 +286,8 @@ show_bounds(CullTraverserData &data, bool tight) { _geoms_pcollector.add_level(1); CullableObject *outer_viz = new CullableObject(bounds_viz, get_bounds_outer_viz_state(), - data._modelview_transform); + data.get_net_transform(this), + data.get_modelview_transform(this)); _cull_handler->record_object(outer_viz, this); } @@ -297,12 +298,14 @@ show_bounds(CullTraverserData &data, bool tight) { _geoms_pcollector.add_level(2); CullableObject *outer_viz = new CullableObject(bounds_viz, get_bounds_outer_viz_state(), - data._modelview_transform); + data.get_net_transform(this), + data.get_modelview_transform(this)); _cull_handler->record_object(outer_viz, this); CullableObject *inner_viz = new CullableObject(bounds_viz, get_bounds_inner_viz_state(), - data._modelview_transform); + data.get_net_transform(this), + data.get_modelview_transform(this)); _cull_handler->record_object(inner_viz, this); } } @@ -549,7 +552,7 @@ start_decal(const CullTraverserData &data) { _geoms_pcollector.add_level(num_geoms); for (int i = num_geoms - 1; i >= 0; i--) { CullableObject *next_object = - new CullableObject(data, geom_node, i, object); + new CullableObject(this, data, geom_node, i, object); if (next_object->_state->has_cull_callback() && !next_object->_state->cull_callback(this, data)) { next_object->_next = NULL; @@ -618,7 +621,7 @@ r_get_decals(CullTraverserData &data, CullableObject *decals) { _geoms_pcollector.add_level(num_geoms); for (int i = num_geoms - 1; i >= 0; i--) { CullableObject *next_decals = - new CullableObject(data, geom_node, i, decals); + new CullableObject(this, data, geom_node, i, decals); if (next_decals->_state->has_cull_callback() && !next_decals->_state->cull_callback(this, data)) { next_decals->_next = NULL; diff --git a/panda/src/pgraph/cullTraverserData.I b/panda/src/pgraph/cullTraverserData.I index 4276663dcf..b9dde02a56 100644 --- a/panda/src/pgraph/cullTraverserData.I +++ b/panda/src/pgraph/cullTraverserData.I @@ -23,12 +23,12 @@ //////////////////////////////////////////////////////////////////// INLINE CullTraverserData:: CullTraverserData(const NodePath &start, - const TransformState *modelview_transform, + const TransformState *net_transform, const RenderState *state, GeometricBoundingVolume *view_frustum, GeometricBoundingVolume *guard_band) : _node_path(start), - _modelview_transform(modelview_transform), + _net_transform(net_transform), _state(state), _view_frustum(view_frustum), _guard_band(guard_band), @@ -45,7 +45,7 @@ CullTraverserData(const NodePath &start, INLINE CullTraverserData:: CullTraverserData(const CullTraverserData ©) : _node_path(copy._node_path), - _modelview_transform(copy._modelview_transform), + _net_transform(copy._net_transform), _state(copy._state), _view_frustum(copy._view_frustum), _guard_band(copy._guard_band), @@ -62,7 +62,7 @@ CullTraverserData(const CullTraverserData ©) : INLINE void CullTraverserData:: operator = (const CullTraverserData ©) { _node_path = copy._node_path; - _modelview_transform = copy._modelview_transform; + _net_transform = copy._net_transform; _state = copy._state; _view_frustum = copy._view_frustum; _guard_band = copy._guard_band; @@ -79,7 +79,7 @@ operator = (const CullTraverserData ©) { INLINE CullTraverserData:: CullTraverserData(const CullTraverserData &parent, PandaNode *child) : _node_path(parent._node_path, child), - _modelview_transform(parent._modelview_transform), + _net_transform(parent._net_transform), _state(parent._state), _view_frustum(parent._view_frustum), _guard_band(parent._guard_band), @@ -108,14 +108,14 @@ node() const { } //////////////////////////////////////////////////////////////////// -// Function: CullTraverserData::get_modelview_transform +// Function: CullTraverserData::get_net_transform // Access: Public -// Description: Returns the modelview transform: the relative -// transform from the camera to the model. +// Description: Returns the net transform: the relative transform +// from root of the scene graph to the current node. //////////////////////////////////////////////////////////////////// INLINE const TransformState *CullTraverserData:: -get_modelview_transform() const { - return _modelview_transform; +get_net_transform(const CullTraverser *) const { + return _net_transform; } //////////////////////////////////////////////////////////////////// diff --git a/panda/src/pgraph/cullTraverserData.cxx b/panda/src/pgraph/cullTraverserData.cxx index d02a0b3b76..93ae862b49 100644 --- a/panda/src/pgraph/cullTraverserData.cxx +++ b/panda/src/pgraph/cullTraverserData.cxx @@ -32,14 +32,14 @@ //////////////////////////////////////////////////////////////////// -// Function: CullTraverserData::get_net_transform +// Function: CullTraverserData::get_modelview_transform // Access: Public -// Description: Returns the net transform: the relative -// transform from the root of the scene to the model. +// Description: Returns the modelview transform: the relative +// transform from the camera to the model. //////////////////////////////////////////////////////////////////// CPT(TransformState) CullTraverserData:: -get_net_transform(const CullTraverser *trav) const { - return trav->get_camera_transform()->compose(_modelview_transform); +get_modelview_transform(const CullTraverser *trav) const { + return trav->get_world_transform()->compose(_net_transform); } //////////////////////////////////////////////////////////////////// @@ -87,7 +87,7 @@ apply_transform_and_state(CullTraverser *trav, } if (!node_transform->is_identity()) { - _modelview_transform = _modelview_transform->compose(node_transform); + _net_transform = _net_transform->compose(node_transform); if ((_view_frustum != (GeometricBoundingVolume *)NULL) || (_guard_band != (GeometricBoundingVolume *)NULL) || diff --git a/panda/src/pgraph/cullTraverserData.h b/panda/src/pgraph/cullTraverserData.h index 17fba39496..f303c165d5 100644 --- a/panda/src/pgraph/cullTraverserData.h +++ b/panda/src/pgraph/cullTraverserData.h @@ -48,7 +48,7 @@ class PandaNode; class EXPCL_PANDA CullTraverserData { public: INLINE CullTraverserData(const NodePath &start, - const TransformState *modelview_transform, + const TransformState *net_transform, const RenderState *state, GeometricBoundingVolume *view_frustum, GeometricBoundingVolume *guard_band); @@ -60,8 +60,8 @@ public: INLINE PandaNode *node() const; - INLINE const TransformState *get_modelview_transform() const; - CPT(TransformState) get_net_transform(const CullTraverser *trav) const; + CPT(TransformState) get_modelview_transform(const CullTraverser *trav) const; + INLINE const TransformState *get_net_transform(const CullTraverser *trav) const; INLINE bool is_in_view(const DrawMask &camera_mask); INLINE bool is_this_node_hidden(const CullTraverser *trav) const; @@ -74,7 +74,7 @@ public: const RenderAttrib *off_clip_planes); WorkingNodePath _node_path; - CPT(TransformState) _modelview_transform; + CPT(TransformState) _net_transform; CPT(RenderState) _state; PT(GeometricBoundingVolume) _view_frustum; PT(GeometricBoundingVolume) _guard_band; diff --git a/panda/src/pgraph/cullableObject.I b/panda/src/pgraph/cullableObject.I index 2ce9feceac..a8cc61f78b 100644 --- a/panda/src/pgraph/cullableObject.I +++ b/panda/src/pgraph/cullableObject.I @@ -36,12 +36,13 @@ CullableObject(CullableObject *next) : // the indicated CullTraverserData. //////////////////////////////////////////////////////////////////// INLINE CullableObject:: -CullableObject(const CullTraverserData &data, +CullableObject(const CullTraverser *trav, const CullTraverserData &data, GeomNode *geom_node, int i, CullableObject *next) : _geom(geom_node->get_geom(i)), _state(data._state->compose(geom_node->get_geom_state(i))), - _modelview_transform(data._modelview_transform), + _net_transform(data.get_net_transform(trav)), + _modelview_transform(data.get_modelview_transform(trav)), _next(next) { } @@ -54,10 +55,12 @@ CullableObject(const CullTraverserData &data, //////////////////////////////////////////////////////////////////// INLINE CullableObject:: CullableObject(const Geom *geom, const RenderState *state, + const TransformState *net_transform, const TransformState *modelview_transform, CullableObject *next) : _geom(geom), _state(state), + _net_transform(net_transform), _modelview_transform(modelview_transform), _next(next) { @@ -74,6 +77,7 @@ INLINE CullableObject:: CullableObject(const CullableObject ©) : _geom(copy._geom), _state(copy._state), + _net_transform(copy._net_transform), _modelview_transform(copy._modelview_transform), _next((CullableObject *)NULL) { @@ -89,6 +93,7 @@ INLINE void CullableObject:: operator = (const CullableObject ©) { _geom = copy._geom; _state = copy._state; + _net_transform = copy._net_transform; _modelview_transform = copy._modelview_transform; } diff --git a/panda/src/pgraph/cullableObject.cxx b/panda/src/pgraph/cullableObject.cxx index 0ebc967a65..f1fa05defa 100644 --- a/panda/src/pgraph/cullableObject.cxx +++ b/panda/src/pgraph/cullableObject.cxx @@ -479,13 +479,15 @@ void CullableObject:: munge_texcoord_light_vector(const CullTraverser *traverser) { PStatTimer timer(_munge_light_vector_pcollector); - if (_modelview_transform->is_singular()) { + if (_net_transform->is_singular()) { // If we're under a singular transform, never mind. return; } + /* CPT(TransformState) net_transform = traverser->get_camera_transform()->compose(_modelview_transform); + */ if (!_munged_data->has_column(InternalName::get_vertex()) || !_munged_data->has_column(InternalName::get_normal())) { @@ -544,7 +546,7 @@ munge_texcoord_light_vector(const CullTraverser *traverser) { // Get the transform from the light to the object. CPT(TransformState) light_transform = - net_transform->invert_compose(light.get_net_transform()); + _net_transform->invert_compose(light.get_net_transform()); const LMatrix4f &light_mat = light_transform->get_mat(); GeomVertexWriter texcoord(new_data, texcoord_name); diff --git a/panda/src/pgraph/cullableObject.h b/panda/src/pgraph/cullableObject.h index c33db6c95e..d10eabf366 100644 --- a/panda/src/pgraph/cullableObject.h +++ b/panda/src/pgraph/cullableObject.h @@ -45,10 +45,12 @@ class CullTraverser; class EXPCL_PANDA CullableObject { public: INLINE CullableObject(CullableObject *next = NULL); - INLINE CullableObject(const CullTraverserData &data, + INLINE CullableObject(const CullTraverser *trav, + const CullTraverserData &data, GeomNode *geom_node, int i, CullableObject *next = NULL); INLINE CullableObject(const Geom *geom, const RenderState *state, + const TransformState *net_transform, const TransformState *modelview_transform, CullableObject *next = NULL); @@ -80,6 +82,7 @@ public: PT(GeomMunger) _munger; CPT(GeomVertexData) _munged_data; CPT(RenderState) _state; + CPT(TransformState) _net_transform; CPT(TransformState) _modelview_transform; CullableObject *_next; diff --git a/panda/src/pgraph/lodNode.cxx b/panda/src/pgraph/lodNode.cxx index 2381081c40..c833063d89 100644 --- a/panda/src/pgraph/lodNode.cxx +++ b/panda/src/pgraph/lodNode.cxx @@ -244,7 +244,7 @@ is_lod_node() const { //////////////////////////////////////////////////////////////////// int LODNode:: compute_child(CullTraverser *trav, CullTraverserData &data) { - if (data._modelview_transform->is_singular()) { + if (data.get_net_transform(trav)->is_singular()) { // If we're under a singular transform, we can't compute the LOD; // select none of them instead. return -1; @@ -264,7 +264,7 @@ compute_child(CullTraverser *trav, CullTraverserData &data) { // trav->get_scene()->get_cull_center().get_net_transform()-> // invert_compose(data._net_transform); - CPT(TransformState) rel_transform = data._modelview_transform; + CPT(TransformState) rel_transform = data.get_modelview_transform(trav); LPoint3f center = cdata->_center * rel_transform->get_mat(); // Determine which child to traverse diff --git a/panda/src/pgraph/planeNode.cxx b/panda/src/pgraph/planeNode.cxx index f8bd10bda5..ff5e155b40 100644 --- a/panda/src/pgraph/planeNode.cxx +++ b/panda/src/pgraph/planeNode.cxx @@ -176,7 +176,8 @@ cull_callback(CullTraverser *trav, CullTraverserData &data) { CullableObject *plane_viz = new CullableObject(get_viz(trav, data), data._state, - data._modelview_transform); + data.get_net_transform(trav), + data.get_modelview_transform(trav)); trav->get_cull_handler()->record_object(plane_viz, trav); // Now carry on to render our child nodes. @@ -225,7 +226,7 @@ get_viz(CullTraverser *trav, CullTraverserData &data) { // Figure out whether we are looking at the front or the back of the // plane. const Lens *lens = trav->get_scene()->get_lens(); - Planef eye_plane = cdata->_plane * data._modelview_transform->get_mat(); + Planef eye_plane = cdata->_plane * data.get_modelview_transform(trav)->get_mat(); bool front = (eye_plane.dist_to_plane(lens->get_nodal_point()) >= 0.0f); if (cdata->_front_viz != (Geom *)NULL) {