diff --git a/panda/src/collide/collisionNode.cxx b/panda/src/collide/collisionNode.cxx index cea830f1fa..75adfde195 100644 --- a/panda/src/collide/collisionNode.cxx +++ b/panda/src/collide/collisionNode.cxx @@ -224,7 +224,7 @@ cull_callback(CullTraverser *trav, CullTraverserData &data) { Solids::iterator si; for (si = _solids.begin(); si != _solids.end(); ++si) { CollisionSolid *solid = (*si); - PT(PandaNode) node = solid->get_viz(data, false); + PT(PandaNode) node = solid->get_viz(trav, data, false); if (node != (PandaNode *)NULL) { CullTraverserData next_data(data, node); @@ -246,12 +246,12 @@ cull_callback(CullTraverser *trav, CullTraverserData &data) { for (si = _solids.begin(); si != _solids.end(); ++si) { CollisionSolid *solid = (*si); - PT(PandaNode) node = solid->get_viz(data, false); + PT(PandaNode) node = solid->get_viz(trav, data, false); if (node != (PandaNode *)NULL) { CullTraverserData next_data(data, node); - next_data._net_transform = - next_data._net_transform->compose(transform); + next_data._modelview_transform = + next_data._modelview_transform->compose(transform); next_data._state = get_last_pos_state(); trav->traverse(next_data); } diff --git a/panda/src/collide/collisionPolygon.cxx b/panda/src/collide/collisionPolygon.cxx index 42fe8cc104..9d0885858d 100644 --- a/panda/src/collide/collisionPolygon.cxx +++ b/panda/src/collide/collisionPolygon.cxx @@ -278,13 +278,14 @@ get_collision_origin() const { // made visible. //////////////////////////////////////////////////////////////////// PT(PandaNode) CollisionPolygon:: -get_viz(const CullTraverserData &data, bool bounds_only) const { +get_viz(const CullTraverser *trav, const CullTraverserData &data, + bool bounds_only) const { const RenderAttrib *cpa_attrib = data._state->get_attrib(ClipPlaneAttrib::get_class_type()); if (cpa_attrib == (const RenderAttrib *)NULL) { // Fortunately, the polygon is not clipped. This is the normal, // easy case. - return CollisionSolid::get_viz(data, bounds_only); + return CollisionSolid::get_viz(trav, data, bounds_only); } if (collide_cat.is_debug()) { @@ -300,10 +301,10 @@ get_viz(const CullTraverserData &data, bool bounds_only) const { // work. const ClipPlaneAttrib *cpa = DCAST(ClipPlaneAttrib, cpa_attrib); Points new_points; - if (apply_clip_plane(new_points, cpa, data._net_transform)) { + if (apply_clip_plane(new_points, cpa, data.get_net_transform(trav))) { // All points are behind the clip plane; just draw the original // polygon. - return CollisionSolid::get_viz(data, bounds_only); + return CollisionSolid::get_viz(trav, data, bounds_only); } if (new_points.empty()) { @@ -845,11 +846,11 @@ draw_polygon(GeomNode *viz_geom_node, GeomNode *bounds_viz_geom_node, geom2->set_vertex_data(vdata); geom2->add_primitive(border); - _viz_geom->add_geom(geom1, ((CollisionPolygon *)this)->get_solid_viz_state()); - _viz_geom->add_geom(geom2, ((CollisionPolygon *)this)->get_wireframe_viz_state()); + viz_geom_node->add_geom(geom1, ((CollisionPolygon *)this)->get_solid_viz_state()); + viz_geom_node->add_geom(geom2, ((CollisionPolygon *)this)->get_wireframe_viz_state()); - _bounds_viz_geom->add_geom(geom1, ((CollisionPolygon *)this)->get_solid_bounds_viz_state()); - _bounds_viz_geom->add_geom(geom2, ((CollisionPolygon *)this)->get_wireframe_bounds_viz_state()); + bounds_viz_geom_node->add_geom(geom1, ((CollisionPolygon *)this)->get_solid_bounds_viz_state()); + bounds_viz_geom_node->add_geom(geom2, ((CollisionPolygon *)this)->get_wireframe_bounds_viz_state()); } else { PTA_Vertexf verts; diff --git a/panda/src/collide/collisionPolygon.h b/panda/src/collide/collisionPolygon.h index 28563a4357..c68ef25e44 100644 --- a/panda/src/collide/collisionPolygon.h +++ b/panda/src/collide/collisionPolygon.h @@ -61,7 +61,8 @@ public: virtual void xform(const LMatrix4f &mat); virtual LPoint3f get_collision_origin() const; - virtual PT(PandaNode) get_viz(const CullTraverserData &data, + virtual PT(PandaNode) get_viz(const CullTraverser *trav, + const CullTraverserData &data, bool bounds_only) const; virtual void output(ostream &out) const; diff --git a/panda/src/collide/collisionSolid.cxx b/panda/src/collide/collisionSolid.cxx index 14ca03d0bd..942a221c01 100644 --- a/panda/src/collide/collisionSolid.cxx +++ b/panda/src/collide/collisionSolid.cxx @@ -108,7 +108,7 @@ xform(const LMatrix4f &mat) { // made visible. //////////////////////////////////////////////////////////////////// PT(PandaNode) CollisionSolid:: -get_viz(const CullTraverserData &, bool bounds_only) const { +get_viz(const CullTraverser *, const CullTraverserData &, bool bounds_only) const { if ((_flags & F_viz_geom_stale) != 0) { if (_viz_geom == (GeomNode *)NULL) { ((CollisionSolid *)this)->_viz_geom = new GeomNode("viz"); diff --git a/panda/src/collide/collisionSolid.h b/panda/src/collide/collisionSolid.h index 36b64027c7..272f596634 100644 --- a/panda/src/collide/collisionSolid.h +++ b/panda/src/collide/collisionSolid.h @@ -77,7 +77,8 @@ public: virtual void xform(const LMatrix4f &mat); - virtual PT(PandaNode) get_viz(const CullTraverserData &data, + virtual PT(PandaNode) get_viz(const CullTraverser *trav, + const CullTraverserData &data, bool bounds_only) const; PUBLISHED: diff --git a/panda/src/collide/collisionVisualizer.cxx b/panda/src/collide/collisionVisualizer.cxx index a0809882c4..9bd48285aa 100644 --- a/panda/src/collide/collisionVisualizer.cxx +++ b/panda/src/collide/collisionVisualizer.cxx @@ -129,7 +129,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._net_transform = TransformState::make_identity(); + xform_data._modelview_transform = trav->get_world_transform(); xform_data.apply_transform_and_state(trav, net_transform, RenderState::make_empty(), RenderEffects::make_empty()); @@ -145,7 +145,7 @@ cull_callback(CullTraverser *trav, CullTraverserData &data) { const CollisionSolid *solid = (*si).first; const SolidInfo &solid_info = (*si).second; bool was_detected = (solid_info._detected_count > 0); - PT(PandaNode) node = solid->get_viz(xform_data, !was_detected); + PT(PandaNode) node = solid->get_viz(trav, xform_data, !was_detected); if (node != (PandaNode *)NULL) { CullTraverserData next_data(xform_data, node); @@ -188,7 +188,7 @@ cull_callback(CullTraverser *trav, CullTraverserData &data) { } CullableObject *object = - new CullableObject(sphere, empty_state, xform_data._net_transform); + new CullableObject(sphere, empty_state, xform_data._modelview_transform); trav->get_cull_handler()->record_object(object, trav); } @@ -206,7 +206,7 @@ cull_callback(CullTraverser *trav, CullTraverserData &data) { line->set_num_prims(1); CullableObject *object = - new CullableObject(line, empty_state, xform_data._net_transform); + new CullableObject(line, empty_state, xform_data._modelview_transform); trav->get_cull_handler()->record_object(object, trav); } diff --git a/panda/src/parametrics/ropeNode.cxx b/panda/src/parametrics/ropeNode.cxx index 0dd437cefc..9e8d8126a1 100644 --- a/panda/src/parametrics/ropeNode.cxx +++ b/panda/src/parametrics/ropeNode.cxx @@ -361,7 +361,7 @@ render_thread(CullTraverser *trav, CullTraverserData &data, CPT(RenderState) state = data._state->add_attrib(thick); CullableObject *object = new CullableObject(geom, state, - data._net_transform); + data._modelview_transform); trav->get_cull_handler()->record_object(object, trav); } else { @@ -406,7 +406,7 @@ render_thread(CullTraverser *trav, CullTraverserData &data, CPT(RenderState) state = data._state->add_attrib(thick); CullableObject *object = new CullableObject(geom, state, - data._net_transform); + data._modelview_transform); trav->get_cull_handler()->record_object(object, trav); } } @@ -451,7 +451,7 @@ render_tape(CullTraverser *trav, CullTraverserData &data, geom->add_primitive(strip); CullableObject *object = new CullableObject(geom, data._state, - data._net_transform); + data._modelview_transform); trav->get_cull_handler()->record_object(object, trav); } else { @@ -497,7 +497,7 @@ render_tape(CullTraverser *trav, CullTraverserData &data, geom->set_lengths(lengths); CullableObject *object = new CullableObject(geom, data._state, - data._net_transform); + data._modelview_transform); trav->get_cull_handler()->record_object(object, trav); } } @@ -515,7 +515,7 @@ render_tape(CullTraverser *trav, CullTraverserData &data, void RopeNode:: render_billboard(CullTraverser *trav, CullTraverserData &data, NurbsCurveResult *result) const { - const TransformState *net_transform = data._net_transform; + const TransformState *net_transform = data._modelview_transform; const TransformState *camera_transform = trav->get_camera_transform(); CPT(TransformState) rel_transform = @@ -549,7 +549,7 @@ render_billboard(CullTraverser *trav, CullTraverserData &data, geom->add_primitive(strip); CullableObject *object = new CullableObject(geom, data._state, - data._net_transform); + data._modelview_transform); trav->get_cull_handler()->record_object(object, trav); } else { @@ -595,7 +595,7 @@ render_billboard(CullTraverser *trav, CullTraverserData &data, geom->set_lengths(lengths); CullableObject *object = new CullableObject(geom, data._state, - data._net_transform); + data._modelview_transform); trav->get_cull_handler()->record_object(object, trav); } } @@ -654,7 +654,7 @@ render_tube(CullTraverser *trav, CullTraverserData &data, geom->add_primitive(strip); CullableObject *object = new CullableObject(geom, data._state, - data._net_transform); + data._modelview_transform); trav->get_cull_handler()->record_object(object, trav); } else { @@ -713,7 +713,7 @@ render_tube(CullTraverser *trav, CullTraverserData &data, geom->set_lengths(lengths); CullableObject *object = new CullableObject(geom, data._state, - data._net_transform); + data._modelview_transform); trav->get_cull_handler()->record_object(object, trav); } } diff --git a/panda/src/parametrics/sheetNode.cxx b/panda/src/parametrics/sheetNode.cxx index 1fd71ffa09..a87c71b055 100644 --- a/panda/src/parametrics/sheetNode.cxx +++ b/panda/src/parametrics/sheetNode.cxx @@ -333,7 +333,7 @@ render_sheet(CullTraverser *trav, CullTraverserData &data, geom->add_primitive(strip); CullableObject *object = new CullableObject(geom, data._state, - data._net_transform); + data._modelview_transform); trav->get_cull_handler()->record_object(object, trav); } else { @@ -403,7 +403,7 @@ render_sheet(CullTraverser *trav, CullTraverserData &data, geom->set_lengths(lengths); CullableObject *object = new CullableObject(geom, data._state, - data._net_transform); + data._modelview_transform); trav->get_cull_handler()->record_object(object, trav); } } diff --git a/panda/src/pgraph/billboardEffect.cxx b/panda/src/pgraph/billboardEffect.cxx index b4602ea7fd..38b8e60fd2 100644 --- a/panda/src/pgraph/billboardEffect.cxx +++ b/panda/src/pgraph/billboardEffect.cxx @@ -147,18 +147,21 @@ void BillboardEffect:: cull_callback(CullTraverser *trav, CullTraverserData &data, CPT(TransformState) &node_transform, CPT(RenderState) &) const { - CPT(TransformState) net_transform = data._net_transform; + CPT(TransformState) net_transform = data._modelview_transform; if (net_transform->is_singular()) { // If we're under a singular transform, never mind. return; } - CPT(TransformState) camera_transform = trav->get_camera_transform(); + // Since the "net" transform from the cull traverser already + // includes the inverse camera transform, the camera transform is + // identity. + CPT(TransformState) camera_transform = TransformState::make_identity(); - // Determine the relative transform to our camera (or other look_at - // coordinate space). + // But if we're rotating to face something other than the camera, we + // have to compute the "camera" transform to compensate for that. if (!_look_at.is_empty()) { - camera_transform = _look_at.get_net_transform(); + camera_transform = trav->get_camera_transform()->invert_compose(_look_at.get_net_transform()); } compute_billboard(node_transform, net_transform, camera_transform); diff --git a/panda/src/pgraph/compassEffect.cxx b/panda/src/pgraph/compassEffect.cxx index 0fadb50ac2..8c97378db9 100644 --- a/panda/src/pgraph/compassEffect.cxx +++ b/panda/src/pgraph/compassEffect.cxx @@ -135,7 +135,7 @@ has_cull_callback() const { // level. //////////////////////////////////////////////////////////////////// void CompassEffect:: -cull_callback(CullTraverser *, CullTraverserData &data, +cull_callback(CullTraverser *trav, CullTraverserData &data, CPT(TransformState) &node_transform, CPT(RenderState) &) const { if (_properties == 0) { @@ -143,8 +143,8 @@ cull_callback(CullTraverser *, CullTraverserData &data, return; } - CPT(TransformState) true_net_transform = data._net_transform; - CPT(TransformState) want_net_transform = data._net_transform; + CPT(TransformState) true_net_transform = data.get_net_transform(trav); + CPT(TransformState) want_net_transform = true_net_transform; adjust_transform(want_net_transform, node_transform); // Now compute the transform that will convert true_net_transform to diff --git a/panda/src/pgraph/cullBinBackToFront.cxx b/panda/src/pgraph/cullBinBackToFront.cxx index ed2475f095..44810b5b4f 100644 --- a/panda/src/pgraph/cullBinBackToFront.cxx +++ b/panda/src/pgraph/cullBinBackToFront.cxx @@ -59,8 +59,8 @@ add_object(CullableObject *object) { DCAST_INTO_V(gbv, &volume); LPoint3f center = gbv->get_approx_center(); - nassertv(object->_transform != (const TransformState *)NULL); - center = center * object->_transform->get_mat(); + nassertv(object->_modelview_transform != (const TransformState *)NULL); + center = center * object->_modelview_transform->get_mat(); float distance = _gsg->compute_distance_to(center); _objects.push_back(ObjectData(object, distance)); diff --git a/panda/src/pgraph/cullBinFrontToBack.cxx b/panda/src/pgraph/cullBinFrontToBack.cxx index 269255d017..35dfc55968 100644 --- a/panda/src/pgraph/cullBinFrontToBack.cxx +++ b/panda/src/pgraph/cullBinFrontToBack.cxx @@ -59,8 +59,8 @@ add_object(CullableObject *object) { DCAST_INTO_V(gbv, &volume); LPoint3f center = gbv->get_approx_center(); - nassertv(object->_transform != (const TransformState *)NULL); - center = center * object->_transform->get_mat(); + nassertv(object->_modelview_transform != (const TransformState *)NULL); + center = center * object->_modelview_transform->get_mat(); float distance = _gsg->compute_distance_to(center); _objects.push_back(ObjectData(object, distance)); diff --git a/panda/src/pgraph/cullBinStateSorted.I b/panda/src/pgraph/cullBinStateSorted.I index 26e11ff703..614b600f0f 100644 --- a/panda/src/pgraph/cullBinStateSorted.I +++ b/panda/src/pgraph/cullBinStateSorted.I @@ -52,8 +52,8 @@ operator < (const ObjectData &other) const { // Then group objects by transform, since these are supposed to be // expensive too. - if (_object->_transform != other._object->_transform) { - return _object->_transform < other._object->_transform; + if (_object->_modelview_transform != other._object->_modelview_transform) { + return _object->_modelview_transform < other._object->_modelview_transform; } // Then, sort by all the other states, in no particular order, diff --git a/panda/src/pgraph/cullHandler.I b/panda/src/pgraph/cullHandler.I index 7473b0d39d..31c8b51521 100644 --- a/panda/src/pgraph/cullHandler.I +++ b/panda/src/pgraph/cullHandler.I @@ -29,7 +29,7 @@ draw(CullableObject *object, GraphicsStateGuardianBase *gsg) { if (object->_next != (CullableObject *)NULL) { draw_with_decals(object, gsg); } else { - gsg->set_state_and_transform(object->_state, object->_transform); + gsg->set_state_and_transform(object->_state, object->_modelview_transform); object->draw(gsg); } } diff --git a/panda/src/pgraph/cullHandler.cxx b/panda/src/pgraph/cullHandler.cxx index b3e8316492..6301070503 100644 --- a/panda/src/pgraph/cullHandler.cxx +++ b/panda/src/pgraph/cullHandler.cxx @@ -45,7 +45,7 @@ CullHandler:: //////////////////////////////////////////////////////////////////// void CullHandler:: record_object(CullableObject *object, const CullTraverser *traverser) { - nout << *object->_geom << " " << *object->_transform << " " + nout << *object->_geom << " " << *object->_modelview_transform << " " << *object->_state << "\n"; delete object; } @@ -65,7 +65,7 @@ draw_with_decals(CullableObject *object, GraphicsStateGuardianBase *gsg) { CullableObject *base = object; while (base != (CullableObject *)NULL && base->_geom != (Geom *)NULL) { - gsg->set_state_and_transform(base->_state->compose(state), base->_transform); + gsg->set_state_and_transform(base->_state->compose(state), base->_modelview_transform); base->draw(gsg); base = base->_next; @@ -77,7 +77,7 @@ draw_with_decals(CullableObject *object, GraphicsStateGuardianBase *gsg) { CullableObject *decal = base->_next; while (decal != (CullableObject *)NULL) { - gsg->set_state_and_transform(decal->_state->compose(state), decal->_transform); + gsg->set_state_and_transform(decal->_state->compose(state), decal->_modelview_transform); decal->draw(gsg); decal = decal->_next; } @@ -88,7 +88,7 @@ draw_with_decals(CullableObject *object, GraphicsStateGuardianBase *gsg) { if (state != (const RenderState *)NULL) { base = object; while (base != (CullableObject *)NULL && base->_geom != (Geom *)NULL) { - gsg->set_state_and_transform(base->_state->compose(state), base->_transform); + gsg->set_state_and_transform(base->_state->compose(state), base->_modelview_transform); base->draw(gsg); base = base->_next; diff --git a/panda/src/pgraph/cullTraverser.cxx b/panda/src/pgraph/cullTraverser.cxx index 6666e6e59b..71cb91779e 100644 --- a/panda/src/pgraph/cullTraverser.cxx +++ b/panda/src/pgraph/cullTraverser.cxx @@ -125,7 +125,7 @@ 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._net_transform = my_data._net_transform->compose(transform); + my_data._modelview_transform = my_data._modelview_transform->compose(transform); traverse(my_data); } else { @@ -273,7 +273,7 @@ show_bounds(CullTraverserData &data, bool tight) { _geoms_pcollector.add_level(1); CullableObject *outer_viz = new CullableObject(bounds_viz, get_bounds_outer_viz_state(), - data._net_transform); + data._modelview_transform); _cull_handler->record_object(outer_viz, this); } @@ -284,12 +284,12 @@ show_bounds(CullTraverserData &data, bool tight) { _geoms_pcollector.add_level(2); CullableObject *outer_viz = new CullableObject(bounds_viz, get_bounds_outer_viz_state(), - data._net_transform); + data._modelview_transform); _cull_handler->record_object(outer_viz, this); CullableObject *inner_viz = new CullableObject(bounds_viz, get_bounds_inner_viz_state(), - data._net_transform); + data._modelview_transform); _cull_handler->record_object(inner_viz, this); } } diff --git a/panda/src/pgraph/cullTraverserData.I b/panda/src/pgraph/cullTraverserData.I index 8c6f837f12..e7067b1bd9 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 *net_transform, + const TransformState *modelview_transform, const RenderState *state, GeometricBoundingVolume *view_frustum, GeometricBoundingVolume *guard_band) : _node_path(start), - _net_transform(net_transform), + _modelview_transform(modelview_transform), _state(state), _view_frustum(view_frustum), _guard_band(guard_band) @@ -43,7 +43,7 @@ CullTraverserData(const NodePath &start, INLINE CullTraverserData:: CullTraverserData(const CullTraverserData ©) : _node_path(copy._node_path), - _net_transform(copy._net_transform), + _modelview_transform(copy._modelview_transform), _state(copy._state), _view_frustum(copy._view_frustum), _guard_band(copy._guard_band) @@ -58,7 +58,7 @@ CullTraverserData(const CullTraverserData ©) : INLINE void CullTraverserData:: operator = (const CullTraverserData ©) { _node_path = copy._node_path; - _net_transform = copy._net_transform; + _modelview_transform = copy._modelview_transform; _state = copy._state; _view_frustum = copy._view_frustum; _guard_band = copy._guard_band; @@ -73,7 +73,7 @@ operator = (const CullTraverserData ©) { INLINE CullTraverserData:: CullTraverserData(const CullTraverserData &parent, PandaNode *child) : _node_path(parent._node_path, child), - _net_transform(parent._net_transform), + _modelview_transform(parent._modelview_transform), _state(parent._state), _view_frustum(parent._view_frustum), _guard_band(parent._guard_band) @@ -99,6 +99,17 @@ node() const { return _node_path.node(); } +//////////////////////////////////////////////////////////////////// +// Function: CullTraverserData::get_modelview_transform +// Access: Public +// Description: Returns the modelview transform: the relative +// transform from the camera to the model. +//////////////////////////////////////////////////////////////////// +INLINE const TransformState *CullTraverserData:: +get_modelview_transform() const { + return _modelview_transform; +} + //////////////////////////////////////////////////////////////////// // Function: CullTraverserData::is_in_view // Access: Public diff --git a/panda/src/pgraph/cullTraverserData.cxx b/panda/src/pgraph/cullTraverserData.cxx index 3e4c797974..4a238c0c96 100644 --- a/panda/src/pgraph/cullTraverserData.cxx +++ b/panda/src/pgraph/cullTraverserData.cxx @@ -29,6 +29,17 @@ #include "renderState.h" +//////////////////////////////////////////////////////////////////// +// Function: CullTraverserData::get_net_transform +// Access: Public +// Description: Returns the net transform: the relative +// transform from the root of the scene to the model. +//////////////////////////////////////////////////////////////////// +CPT(TransformState) CullTraverserData:: +get_net_transform(const CullTraverser *trav) const { + return trav->get_camera_transform()->compose(_modelview_transform); +} + //////////////////////////////////////////////////////////////////// // Function: CullTraverserData::apply_transform_and_state // Access: Public @@ -71,7 +82,7 @@ apply_transform_and_state(CullTraverser *trav, } if (!node_transform->is_identity()) { - _net_transform = _net_transform->compose(node_transform); + _modelview_transform = _modelview_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 33ee810e8e..a19ffc860b 100644 --- a/panda/src/pgraph/cullTraverserData.h +++ b/panda/src/pgraph/cullTraverserData.h @@ -48,7 +48,7 @@ class CullTraverser; class EXPCL_PANDA CullTraverserData { public: INLINE CullTraverserData(const NodePath &start, - const TransformState *net_transform, + const TransformState *modelview_transform, const RenderState *state, GeometricBoundingVolume *view_frustum, GeometricBoundingVolume *guard_band); @@ -60,6 +60,9 @@ public: INLINE PandaNode *node() const; + INLINE const TransformState *get_modelview_transform() const; + CPT(TransformState) get_net_transform(const CullTraverser *trav) const; + INLINE bool is_in_view(const DrawMask &camera_mask); void apply_transform_and_state(CullTraverser *trav); void apply_transform_and_state(CullTraverser *trav, @@ -68,7 +71,7 @@ public: CPT(RenderEffects) node_effects); WorkingNodePath _node_path; - CPT(TransformState) _net_transform; + CPT(TransformState) _modelview_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 243c5f606f..2ce9feceac 100644 --- a/panda/src/pgraph/cullableObject.I +++ b/panda/src/pgraph/cullableObject.I @@ -41,7 +41,7 @@ CullableObject(const CullTraverserData &data, CullableObject *next) : _geom(geom_node->get_geom(i)), _state(data._state->compose(geom_node->get_geom_state(i))), - _transform(data._net_transform), + _modelview_transform(data._modelview_transform), _next(next) { } @@ -54,11 +54,11 @@ CullableObject(const CullTraverserData &data, //////////////////////////////////////////////////////////////////// INLINE CullableObject:: CullableObject(const Geom *geom, const RenderState *state, - const TransformState *transform, + const TransformState *modelview_transform, CullableObject *next) : _geom(geom), _state(state), - _transform(transform), + _modelview_transform(modelview_transform), _next(next) { } @@ -74,7 +74,7 @@ INLINE CullableObject:: CullableObject(const CullableObject ©) : _geom(copy._geom), _state(copy._state), - _transform(copy._transform), + _modelview_transform(copy._modelview_transform), _next((CullableObject *)NULL) { } @@ -89,7 +89,7 @@ INLINE void CullableObject:: operator = (const CullableObject ©) { _geom = copy._geom; _state = copy._state; - _transform = copy._transform; + _modelview_transform = copy._modelview_transform; } //////////////////////////////////////////////////////////////////// diff --git a/panda/src/pgraph/cullableObject.cxx b/panda/src/pgraph/cullableObject.cxx index cf39f24587..7e5b1d769f 100644 --- a/panda/src/pgraph/cullableObject.cxx +++ b/panda/src/pgraph/cullableObject.cxx @@ -54,7 +54,7 @@ munge_geom(GraphicsStateGuardianBase *gsg, int geom_rendering = qpgeom->get_geom_rendering(); geom_rendering = _state->get_geom_rendering(geom_rendering); - geom_rendering = _transform->get_geom_rendering(geom_rendering); + geom_rendering = _modelview_transform->get_geom_rendering(geom_rendering); GraphicsStateGuardianBase *gsg = traverser->get_gsg(); int gsg_bits = gsg->get_supported_geom_rendering(); @@ -235,7 +235,7 @@ munge_points_to_quads(const CullTraverser *traverser) { PT(qpGeom) new_geom = new qpGeom(); new_geom->set_vertex_data(new_data); - const LMatrix4f &modelview = _transform->get_mat(); + const LMatrix4f &modelview = _modelview_transform->get_mat(); SceneSetup *scene = traverser->get_scene(); const Lens *lens = scene->get_lens(); @@ -350,7 +350,7 @@ munge_points_to_quads(const CullTraverser *traverser) { // height in 3-d units. To arrange that, we need to figure // out the appropriate scaling factor based on the current // viewport and projection matrix. - float scale = _transform->get_scale()[1]; + float scale = _modelview_transform->get_scale()[1]; LVector3f height(0.0f, point_size * scale, scale); height = height * height_projection; scale_y = height[1] * viewport_height; diff --git a/panda/src/pgraph/cullableObject.h b/panda/src/pgraph/cullableObject.h index caa228a8ed..bb05baf627 100644 --- a/panda/src/pgraph/cullableObject.h +++ b/panda/src/pgraph/cullableObject.h @@ -49,7 +49,7 @@ public: GeomNode *geom_node, int i, CullableObject *next = NULL); INLINE CullableObject(const Geom *geom, const RenderState *state, - const TransformState *transform, + const TransformState *modelview_transform, CullableObject *next = NULL); INLINE CullableObject(const CullableObject ©); @@ -80,7 +80,7 @@ public: PT(qpGeomMunger) _munger; CPT(qpGeomVertexData) _munged_data; CPT(RenderState) _state; - CPT(TransformState) _transform; + CPT(TransformState) _modelview_transform; CullableObject *_next; private: diff --git a/panda/src/pgraph/lodNode.cxx b/panda/src/pgraph/lodNode.cxx index 9a272efea9..aec2702f1b 100644 --- a/panda/src/pgraph/lodNode.cxx +++ b/panda/src/pgraph/lodNode.cxx @@ -250,7 +250,7 @@ is_lod_node() const { //////////////////////////////////////////////////////////////////// int LODNode:: compute_child(CullTraverser *trav, CullTraverserData &data) { - if (data._net_transform->is_singular()) { + if (data._modelview_transform->is_singular()) { // If we're under a singular transform, we can't compute the LOD; // select none of them instead. return -1; @@ -266,10 +266,11 @@ compute_child(CullTraverser *trav, CullTraverserData &data) { // CPT(TransformState) rel_transform = // trav->get_camera_transform()->invert_compose(data._net_transform); - CPT(TransformState) rel_transform = - trav->get_scene()->get_cull_center().get_net_transform()-> - invert_compose(data._net_transform); + // CPT(TransformState) rel_transform = + // trav->get_scene()->get_cull_center().get_net_transform()-> + // invert_compose(data._net_transform); + CPT(TransformState) rel_transform = data._modelview_transform; LPoint3f center = cdata->_center * rel_transform->get_mat(); // Determine which child to traverse diff --git a/panda/src/pgui/pgItem.cxx b/panda/src/pgui/pgItem.cxx index d5a42fd3e5..44b9ff4675 100644 --- a/panda/src/pgui/pgItem.cxx +++ b/panda/src/pgui/pgItem.cxx @@ -182,7 +182,8 @@ cull_callback(CullTraverser *trav, CullTraverserData &data) { PGCullTraverser *pg_trav; DCAST_INTO_R(pg_trav, trav, true); - const LMatrix4f &transform = data._net_transform->get_mat(); + CPT(TransformState) net_transform = data.get_net_transform(trav); + const LMatrix4f &transform = net_transform->get_mat(); // Consider the cull bin this object is in. Since the binning // affects the render order, we want bins that render later to