From 9a93914d58134997fdfe63eaab7a202ca2c9e75c Mon Sep 17 00:00:00 2001 From: David Rose Date: Wed, 14 Mar 2012 20:51:58 +0000 Subject: [PATCH] properly support a different coordinate system per camera (or lens) --- panda/src/collide/collisionVisualizer.cxx | 4 +-- panda/src/display/graphicsEngine.cxx | 3 ++ panda/src/display/graphicsStateGuardian.cxx | 30 ++++++++++++++++++- panda/src/display/graphicsStateGuardian.h | 1 + .../src/grutil/pipeOcclusionCullTraverser.cxx | 6 ++-- panda/src/gsgbase/graphicsStateGuardianBase.h | 1 + panda/src/parametrics/ropeNode.cxx | 8 ++--- panda/src/parametrics/sheetNode.cxx | 2 +- panda/src/pgraph/cullTraverser.cxx | 10 +++---- panda/src/pgraph/cullableObject.I | 4 +-- panda/src/pgraph/cullableObject.h | 3 +- panda/src/pgraph/geomNode.cxx | 2 +- panda/src/pgraph/occluderNode.cxx | 4 +-- panda/src/pgraph/planeNode.cxx | 2 +- panda/src/pgraph/sceneSetup.I | 23 ++++++++++++++ panda/src/pgraph/sceneSetup.h | 4 +++ panda/src/pgraphnodes/callbackNode.cxx | 2 +- .../src/pgraphnodes/nodeCullCallbackData.cxx | 2 +- panda/src/rocket/rocketRenderInterface.cxx | 2 +- panda/src/speedtree/speedTreeNode.cxx | 4 +-- 20 files changed, 89 insertions(+), 28 deletions(-) diff --git a/panda/src/collide/collisionVisualizer.cxx b/panda/src/collide/collisionVisualizer.cxx index ddb13d59d7..333552dda5 100644 --- a/panda/src/collide/collisionVisualizer.cxx +++ b/panda/src/collide/collisionVisualizer.cxx @@ -208,7 +208,7 @@ cull_callback(CullTraverser *trav, CullTraverserData &data) { new CullableObject(geom, point_state, xform_data.get_net_transform(trav), xform_data.get_modelview_transform(trav), - trav->get_gsg()); + trav->get_scene()); trav->get_cull_handler()->record_object(object, trav); } @@ -239,7 +239,7 @@ cull_callback(CullTraverser *trav, CullTraverserData &data) { new CullableObject(geom, empty_state, xform_data.get_net_transform(trav), xform_data.get_modelview_transform(trav), - trav->get_gsg()); + trav->get_scene()); trav->get_cull_handler()->record_object(object, trav); } diff --git a/panda/src/display/graphicsEngine.cxx b/panda/src/display/graphicsEngine.cxx index 091a6d95a1..1a1ddc3eda 100644 --- a/panda/src/display/graphicsEngine.cxx +++ b/panda/src/display/graphicsEngine.cxx @@ -1884,6 +1884,9 @@ setup_scene(GraphicsStateGuardian *gsg, DisplayRegionPipelineReader *dr) { scene_setup->set_camera_transform(camera_transform); scene_setup->set_world_transform(world_transform); + CPT(TransformState) cs_transform = gsg->get_cs_transform_for(lens->get_coordinate_system()); + scene_setup->set_cs_transform(cs_transform); + return scene_setup; } diff --git a/panda/src/display/graphicsStateGuardian.cxx b/panda/src/display/graphicsStateGuardian.cxx index e9759b6b7b..d81259f020 100644 --- a/panda/src/display/graphicsStateGuardian.cxx +++ b/panda/src/display/graphicsStateGuardian.cxx @@ -341,10 +341,15 @@ get_supports_cg_profile(const string &name) const { // used by the scene graph, external to to GSG. // // Normally, this will be the default coordinate system, -// but it might be set differently at runtime. +// but it might be set differently at runtime. It will +// automatically be copied from the current lens's +// coordinate system as each DisplayRegion is rendered. //////////////////////////////////////////////////////////////////// void GraphicsStateGuardian:: set_coordinate_system(CoordinateSystem cs) { + if (cs == CS_default) { + cs = get_default_coordinate_system(); + } _coordinate_system = cs; // Changing the external coordinate system changes the cs_transform. @@ -556,6 +561,8 @@ set_scene(SceneSetup *scene_setup) { return false; } + set_coordinate_system(_current_lens->get_coordinate_system()); + _projection_mat = calc_projection_mat(_current_lens); if (_projection_mat == 0) { return false; @@ -1856,6 +1863,27 @@ get_render_buffer(int buffer_type, const FrameBufferProperties &prop) { return RenderBuffer(this, buffer_type & prop.get_buffer_mask() & _stereo_buffer_mask); } +//////////////////////////////////////////////////////////////////// +// Function: GraphicsStateGuardian::get_cs_transform_for +// Access: Public, Virtual +// Description: Returns what the cs_transform would be set to after a +// call to set_coordinate_system(cs). This is another +// way of saying the cs_transform when rendering the +// scene for a camera with the indicated coordinate +// system. +//////////////////////////////////////////////////////////////////// +const TransformState *GraphicsStateGuardian:: +get_cs_transform_for(CoordinateSystem cs) const { + if (_internal_coordinate_system == CS_default || + _internal_coordinate_system == cs) { + return TransformState::make_identity(); + + } else { + return TransformState::make_mat + (LMatrix4::convert_mat(cs, _internal_coordinate_system)); + } +} + //////////////////////////////////////////////////////////////////// // Function: GraphicsStateGuardian::get_cs_transform // Access: Public, Virtual diff --git a/panda/src/display/graphicsStateGuardian.h b/panda/src/display/graphicsStateGuardian.h index 5654a7c7a6..b2b66ec64d 100644 --- a/panda/src/display/graphicsStateGuardian.h +++ b/panda/src/display/graphicsStateGuardian.h @@ -296,6 +296,7 @@ public: INLINE int get_current_tex_view_offset() const; INLINE const Lens *get_current_lens() const; + virtual const TransformState *get_cs_transform_for(CoordinateSystem cs) const; virtual const TransformState *get_cs_transform() const; INLINE const TransformState *get_inv_cs_transform() const; diff --git a/panda/src/grutil/pipeOcclusionCullTraverser.cxx b/panda/src/grutil/pipeOcclusionCullTraverser.cxx index 9a6216fb34..e5783b069b 100644 --- a/panda/src/grutil/pipeOcclusionCullTraverser.cxx +++ b/panda/src/grutil/pipeOcclusionCullTraverser.cxx @@ -650,7 +650,7 @@ perform_occlusion_test(const Geom *geom, const TransformState *net_transform, CullableObject *viz = new CullableObject(geom, _solid_test_state, - net_transform, modelview_transform, gsg); + net_transform, modelview_transform, get_scene()); static ConfigVariableBool test_occlude("test-occlude", false); if (test_occlude) { @@ -702,13 +702,13 @@ show_results(int num_fragments, const Geom *geom, CullableObject *internal_viz = new CullableObject(geom, state, - net_transform, modelview_transform, gsg); + net_transform, modelview_transform, get_scene()); _internal_cull_handler->record_object(internal_viz, _internal_trav); // Also render the viz in the main scene. modelview_transform = get_world_transform()->compose(net_transform); CullableObject *main_viz = new CullableObject(geom, state, - net_transform, modelview_transform, gsg); + net_transform, modelview_transform, get_scene()); _true_cull_handler->record_object(main_viz, this); } diff --git a/panda/src/gsgbase/graphicsStateGuardianBase.h b/panda/src/gsgbase/graphicsStateGuardianBase.h index f3fb5a2b75..c2e3260e20 100644 --- a/panda/src/gsgbase/graphicsStateGuardianBase.h +++ b/panda/src/gsgbase/graphicsStateGuardianBase.h @@ -211,6 +211,7 @@ public: (Texture *tex, int z, const DisplayRegion *dr, const RenderBuffer &rb)=0; virtual CoordinateSystem get_internal_coordinate_system() const=0; + virtual const TransformState *get_cs_transform_for(CoordinateSystem cs) const=0; virtual const TransformState *get_cs_transform() const=0; virtual void bind_light(PointLight *light_obj, const NodePath &light, diff --git a/panda/src/parametrics/ropeNode.cxx b/panda/src/parametrics/ropeNode.cxx index ade6f6faad..0c65a0d6b9 100644 --- a/panda/src/parametrics/ropeNode.cxx +++ b/panda/src/parametrics/ropeNode.cxx @@ -384,7 +384,7 @@ render_thread(CullTraverser *trav, CullTraverserData &data, new CullableObject(geom, state, data.get_net_transform(trav), data.get_modelview_transform(trav), - trav->get_gsg()); + trav->get_scene()); trav->get_cull_handler()->record_object(object, trav); } @@ -436,7 +436,7 @@ render_tape(CullTraverser *trav, CullTraverserData &data, new CullableObject(geom, state, data.get_net_transform(trav), data.get_modelview_transform(trav), - trav->get_gsg()); + trav->get_scene()); trav->get_cull_handler()->record_object(object, trav); } @@ -495,7 +495,7 @@ render_billboard(CullTraverser *trav, CullTraverserData &data, new CullableObject(geom, state, data.get_net_transform(trav), data.get_modelview_transform(trav), - trav->get_gsg()); + trav->get_scene()); trav->get_cull_handler()->record_object(object, trav); } @@ -561,7 +561,7 @@ render_tube(CullTraverser *trav, CullTraverserData &data, new CullableObject(geom, state, data.get_net_transform(trav), data.get_modelview_transform(trav), - trav->get_gsg()); + trav->get_scene()); trav->get_cull_handler()->record_object(object, trav); } diff --git a/panda/src/parametrics/sheetNode.cxx b/panda/src/parametrics/sheetNode.cxx index 87f43b5369..ce6da994f4 100644 --- a/panda/src/parametrics/sheetNode.cxx +++ b/panda/src/parametrics/sheetNode.cxx @@ -377,7 +377,7 @@ render_sheet(CullTraverser *trav, CullTraverserData &data, new CullableObject(geom, state, data.get_net_transform(trav), data.get_modelview_transform(trav), - trav->get_gsg()); + trav->get_scene()); trav->get_cull_handler()->record_object(object, trav); } diff --git a/panda/src/pgraph/cullTraverser.cxx b/panda/src/pgraph/cullTraverser.cxx index a0f5078992..308d52f3b7 100644 --- a/panda/src/pgraph/cullTraverser.cxx +++ b/panda/src/pgraph/cullTraverser.cxx @@ -320,12 +320,12 @@ draw_bounding_volume(const BoundingVolume *vol, _geoms_pcollector.add_level(2); CullableObject *outer_viz = new CullableObject(bounds_viz, get_bounds_outer_viz_state(), - net_transform, modelview_transform, get_gsg()); + net_transform, modelview_transform, get_scene()); _cull_handler->record_object(outer_viz, this); CullableObject *inner_viz = new CullableObject(bounds_viz, get_bounds_inner_viz_state(), - net_transform, modelview_transform, get_gsg()); + net_transform, modelview_transform, get_scene()); _cull_handler->record_object(inner_viz, this); } } @@ -363,7 +363,7 @@ show_bounds(CullTraverserData &data, bool tight) { CullableObject *outer_viz = new CullableObject(bounds_viz, get_bounds_outer_viz_state(), net_transform, modelview_transform, - get_gsg()); + get_scene()); _cull_handler->record_object(outer_viz, this); } @@ -706,7 +706,7 @@ start_decal(const CullTraverserData &data) { _geoms_pcollector.add_level(num_geoms); CPT(TransformState) net_transform = data.get_net_transform(this); CPT(TransformState) modelview_transform = data.get_modelview_transform(this); - CPT(TransformState) internal_transform = get_gsg()->get_cs_transform()->compose(modelview_transform); + CPT(TransformState) internal_transform = _scene_setup->get_cs_transform()->compose(modelview_transform); for (int i = num_geoms - 1; i >= 0; i--) { const Geom *geom = geoms.get_geom(i); @@ -819,7 +819,7 @@ r_get_decals(CullTraverserData &data, CullableObject *decals) { _geoms_pcollector.add_level(num_geoms); CPT(TransformState) net_transform = data.get_net_transform(this); CPT(TransformState) modelview_transform = data.get_modelview_transform(this); - CPT(TransformState) internal_transform = get_gsg()->get_cs_transform()->compose(modelview_transform); + CPT(TransformState) internal_transform = _scene_setup->get_cs_transform()->compose(modelview_transform); for (int i = num_geoms - 1; i >= 0; i--) { const Geom *geom = geoms.get_geom(i); diff --git a/panda/src/pgraph/cullableObject.I b/panda/src/pgraph/cullableObject.I index cc647b06f4..a5d7901dce 100644 --- a/panda/src/pgraph/cullableObject.I +++ b/panda/src/pgraph/cullableObject.I @@ -37,12 +37,12 @@ INLINE CullableObject:: CullableObject(const Geom *geom, const RenderState *state, const TransformState *net_transform, const TransformState *modelview_transform, - const GraphicsStateGuardianBase *gsg) : + SceneSetup *scene_setup) : _geom(geom), _state(state), _net_transform(net_transform), _modelview_transform(modelview_transform), - _internal_transform(gsg->get_cs_transform()->compose(modelview_transform)), + _internal_transform(scene_setup->get_cs_transform()->compose(modelview_transform)), _fancy(false) { #ifdef DO_MEMORY_USAGE diff --git a/panda/src/pgraph/cullableObject.h b/panda/src/pgraph/cullableObject.h index 4ac2018814..19a8731aca 100644 --- a/panda/src/pgraph/cullableObject.h +++ b/panda/src/pgraph/cullableObject.h @@ -29,6 +29,7 @@ #include "pStatCollector.h" #include "deletedChain.h" #include "graphicsStateGuardianBase.h" +#include "sceneSetup.h" #include "lightMutex.h" #include "callbackObject.h" @@ -51,7 +52,7 @@ public: INLINE CullableObject(const Geom *geom, const RenderState *state, const TransformState *net_transform, const TransformState *modelview_transform, - const GraphicsStateGuardianBase *gsg); + SceneSetup *scene_setup); INLINE CullableObject(const Geom *geom, const RenderState *state, const TransformState *net_transform, const TransformState *modelview_transform, diff --git a/panda/src/pgraph/geomNode.cxx b/panda/src/pgraph/geomNode.cxx index b0b319efbe..8c24df1633 100644 --- a/panda/src/pgraph/geomNode.cxx +++ b/panda/src/pgraph/geomNode.cxx @@ -543,7 +543,7 @@ add_for_draw(CullTraverser *trav, CullTraverserData &data) { trav->_geoms_pcollector.add_level(num_geoms); CPT(TransformState) net_transform = data.get_net_transform(trav); CPT(TransformState) modelview_transform = data.get_modelview_transform(trav); - CPT(TransformState) internal_transform = trav->get_gsg()->get_cs_transform()->compose(modelview_transform); + CPT(TransformState) internal_transform = trav->get_scene()->get_cs_transform()->compose(modelview_transform); for (int i = 0; i < num_geoms; i++) { const Geom *geom = geoms.get_geom(i); diff --git a/panda/src/pgraph/occluderNode.cxx b/panda/src/pgraph/occluderNode.cxx index 4ddc936812..0063a7fba9 100644 --- a/panda/src/pgraph/occluderNode.cxx +++ b/panda/src/pgraph/occluderNode.cxx @@ -168,7 +168,7 @@ cull_callback(CullTraverser *trav, CullTraverserData &data) { new CullableObject(get_occluder_viz(trav, data), get_occluder_viz_state(trav, data), data.get_net_transform(trav), data.get_modelview_transform(trav), - trav->get_gsg()); + trav->get_scene()); trav->get_cull_handler()->record_object(occluder_viz, trav); // Also get the frame. @@ -177,7 +177,7 @@ cull_callback(CullTraverser *trav, CullTraverserData &data) { new CullableObject(_frame_viz, get_frame_viz_state(trav, data), data.get_net_transform(trav), data.get_modelview_transform(trav), - trav->get_gsg()); + trav->get_scene()); trav->get_cull_handler()->record_object(frame_viz, trav); // Now carry on to render our child nodes. diff --git a/panda/src/pgraph/planeNode.cxx b/panda/src/pgraph/planeNode.cxx index 0623cbdfb4..8e2d25f41e 100644 --- a/panda/src/pgraph/planeNode.cxx +++ b/panda/src/pgraph/planeNode.cxx @@ -170,7 +170,7 @@ cull_callback(CullTraverser *trav, CullTraverserData &data) { new CullableObject(get_viz(trav, data), data._state, data.get_net_transform(trav), data.get_modelview_transform(trav), - trav->get_gsg()); + trav->get_scene()); trav->get_cull_handler()->record_object(plane_viz, trav); // Now carry on to render our child nodes. diff --git a/panda/src/pgraph/sceneSetup.I b/panda/src/pgraph/sceneSetup.I index 17a81c58ca..7099a559f5 100644 --- a/panda/src/pgraph/sceneSetup.I +++ b/panda/src/pgraph/sceneSetup.I @@ -27,6 +27,7 @@ SceneSetup() { _initial_state = RenderState::make_empty(); _camera_transform = TransformState::make_identity(); _world_transform = TransformState::make_identity(); + _cs_transform = TransformState::make_identity(); } //////////////////////////////////////////////////////////////////// @@ -293,3 +294,25 @@ INLINE const TransformState *SceneSetup:: get_world_transform() const { return _world_transform; } + +//////////////////////////////////////////////////////////////////// +// Function: SceneSetup::set_cs_transform +// Access: Published +// Description: Specifies the transform from the camera's coordinate +// system to the GSG's internal coordinate system. +//////////////////////////////////////////////////////////////////// +INLINE void SceneSetup:: +set_cs_transform(const TransformState *cs_transform) { + _cs_transform = cs_transform; +} + +//////////////////////////////////////////////////////////////////// +// Function: SceneSetup::get_cs_transform +// Access: Published +// Description: Returns the transform from the camera's coordinate +// system to the GSG's internal coordinate system. +//////////////////////////////////////////////////////////////////// +INLINE const TransformState *SceneSetup:: +get_cs_transform() const { + return _cs_transform; +} diff --git a/panda/src/pgraph/sceneSetup.h b/panda/src/pgraph/sceneSetup.h index e3f2d39065..f2ba3e6cf3 100644 --- a/panda/src/pgraph/sceneSetup.h +++ b/panda/src/pgraph/sceneSetup.h @@ -71,6 +71,9 @@ PUBLISHED: INLINE void set_world_transform(const TransformState *world_transform); INLINE const TransformState *get_world_transform() const; + INLINE void set_cs_transform(const TransformState *cs_transform); + INLINE const TransformState *get_cs_transform() const; + private: DisplayRegion *_display_region; int _viewport_width; @@ -83,6 +86,7 @@ private: CPT(RenderState) _initial_state; CPT(TransformState) _camera_transform; CPT(TransformState) _world_transform; + CPT(TransformState) _cs_transform; public: static TypeHandle get_class_type() { diff --git a/panda/src/pgraphnodes/callbackNode.cxx b/panda/src/pgraphnodes/callbackNode.cxx index f887db6c5f..19c959f09f 100644 --- a/panda/src/pgraphnodes/callbackNode.cxx +++ b/panda/src/pgraphnodes/callbackNode.cxx @@ -162,7 +162,7 @@ add_for_draw(CullTraverser *trav, CullTraverserData &data) { new CullableObject(NULL, data._state, data.get_net_transform(trav), data.get_modelview_transform(trav), - trav->get_gsg()); + trav->get_scene()); object->set_draw_callback(cbobj); trav->get_cull_handler()->record_object(object, trav); } diff --git a/panda/src/pgraphnodes/nodeCullCallbackData.cxx b/panda/src/pgraphnodes/nodeCullCallbackData.cxx index 52b681c024..f762650b04 100644 --- a/panda/src/pgraphnodes/nodeCullCallbackData.cxx +++ b/panda/src/pgraphnodes/nodeCullCallbackData.cxx @@ -59,7 +59,7 @@ upcall() { new CullableObject(NULL, _data._state, _data.get_net_transform(_trav), _data.get_modelview_transform(_trav), - _trav->get_gsg()); + _trav->get_scene()); object->set_draw_callback(cbobj); _trav->get_cull_handler()->record_object(object, _trav); } diff --git a/panda/src/rocket/rocketRenderInterface.cxx b/panda/src/rocket/rocketRenderInterface.cxx index cce543a80f..1f2850144a 100644 --- a/panda/src/rocket/rocketRenderInterface.cxx +++ b/panda/src/rocket/rocketRenderInterface.cxx @@ -130,7 +130,7 @@ render_geom(const Geom* geom, const RenderState* state, const Rocket::Core::Vect CullableObject *object = new CullableObject(geom, _net_state->compose(state), net_transform, modelview_transform, - _trav->get_gsg()); + _trav->get_scene()); _trav->get_cull_handler()->record_object(object, _trav); } diff --git a/panda/src/speedtree/speedTreeNode.cxx b/panda/src/speedtree/speedTreeNode.cxx index c25952e622..0b7639eb7e 100644 --- a/panda/src/speedtree/speedTreeNode.cxx +++ b/panda/src/speedtree/speedTreeNode.cxx @@ -984,7 +984,7 @@ cull_callback(CullTraverser *trav, CullTraverserData &data) { // Compute the modelview and camera transforms, to pass to the // SpeedTree CView structure. CPT(TransformState) orig_modelview = data.get_modelview_transform(trav); - CPT(TransformState) modelview = gsg->get_cs_transform()->compose(orig_modelview); + CPT(TransformState) modelview = trav->get_scene()->get_cs_transform()->compose(orig_modelview); CPT(TransformState) camera_transform = modelview->invert_compose(TransformState::make_identity()); LMatrix4f modelview_mat = LCAST(float, modelview->get_mat()); const LPoint3 &camera_pos = camera_transform->get_pos(); @@ -1122,7 +1122,7 @@ add_for_draw(CullTraverser *trav, CullTraverserData &data) { new CullableObject(NULL, data._state, TransformState::make_identity(), TransformState::make_identity(), - trav->get_gsg()); + trav->get_scene()); object->set_draw_callback(new DrawCallback(this)); trav->get_cull_handler()->record_object(object, trav); }