Browse Source

properly support a different coordinate system per camera (or lens)

David Rose 13 years ago
parent
commit
9a93914d58

+ 2 - 2
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);
         }

+ 3 - 0
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;
 }
 

+ 29 - 1
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

+ 1 - 0
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;
 

+ 3 - 3
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);
 }

+ 1 - 0
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, 

+ 4 - 4
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);
 }
 

+ 1 - 1
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);
 }
 

+ 5 - 5
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);

+ 2 - 2
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

+ 2 - 1
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,

+ 1 - 1
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);

+ 2 - 2
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.

+ 1 - 1
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.

+ 23 - 0
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;
+}

+ 4 - 0
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() {

+ 1 - 1
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);
   }

+ 1 - 1
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);
     }

+ 1 - 1
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);
 }
 

+ 2 - 2
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);
   }