Browse Source

get_effective_incomplete_render() for cull too

David Rose 17 years ago
parent
commit
9d0860fffd

+ 1 - 1
panda/src/cull/drawCullHandler.cxx

@@ -32,7 +32,7 @@ void DrawCullHandler::
 record_object(CullableObject *object, const CullTraverser *traverser) {
 record_object(CullableObject *object, const CullTraverser *traverser) {
   // Munge vertices as needed for the GSG's requirements, and the
   // Munge vertices as needed for the GSG's requirements, and the
   // object's current state.
   // object's current state.
-  bool force = !_gsg->get_incomplete_render();
+  bool force = !_gsg->get_effective_incomplete_render();
   Thread *current_thread = traverser->get_current_thread();
   Thread *current_thread = traverser->get_current_thread();
 
 
   if (object->munge_geom(_gsg, _gsg->get_geom_munger(object->_state, current_thread), traverser, force)) {
   if (object->munge_geom(_gsg, _gsg->get_geom_munger(object->_state, current_thread), traverser, force)) {

+ 1 - 1
panda/src/display/graphicsEngine.cxx

@@ -1687,7 +1687,7 @@ do_cull(CullHandler *cull_handler, SceneSetup *scene_setup,
 
 
   CullTraverser *trav = dr->get_cull_traverser();
   CullTraverser *trav = dr->get_cull_traverser();
   trav->set_cull_handler(cull_handler);
   trav->set_cull_handler(cull_handler);
-  trav->set_scene(scene_setup, gsg);
+  trav->set_scene(scene_setup, gsg, dr->get_incomplete_render());
 
 
   trav->set_view_frustum(NULL);
   trav->set_view_frustum(NULL);
   if (view_frustum_cull) {
   if (view_frustum_cull) {

+ 18 - 0
panda/src/display/graphicsStateGuardian.I

@@ -159,6 +159,24 @@ get_incomplete_render() const {
   return _incomplete_render;
   return _incomplete_render;
 }
 }
 
 
+////////////////////////////////////////////////////////////////////
+//     Function: GraphicsStateGuardian::get_effective_incomplete_render
+//       Access: Public, Virtual
+//  Description: Returns true if the GSG is effectively in
+//               incomplete_render state, considering both the GSG's
+//               incomplete_render and its current DisplayRegion's
+//               incomplete_render flags.  It only makes sense to call
+//               this during the draw traversal; at other times this
+//               return value will be meaningless.
+//
+//               See CullTraverser::get_effective_incomplete_render()
+//               for this same information during the cull traversal.
+////////////////////////////////////////////////////////////////////
+INLINE bool GraphicsStateGuardian::
+get_effective_incomplete_render() const {
+  return _effective_incomplete_render;
+}
+
 ////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////
 //     Function: GraphicsStateGuardian::set_loader
 //     Function: GraphicsStateGuardian::set_loader
 //       Access: Public
 //       Access: Public

+ 1 - 0
panda/src/display/graphicsStateGuardian.h

@@ -95,6 +95,7 @@ PUBLISHED:
 
 
   INLINE void set_incomplete_render(bool incomplete_render);
   INLINE void set_incomplete_render(bool incomplete_render);
   virtual INLINE bool get_incomplete_render() const;
   virtual INLINE bool get_incomplete_render() const;
+  virtual INLINE bool get_effective_incomplete_render() const;
 
 
   INLINE void set_loader(Loader *loader);
   INLINE void set_loader(Loader *loader);
   INLINE Loader *get_loader() const;
   INLINE Loader *get_loader() const;

+ 4 - 3
panda/src/grutil/pipeOcclusionCullTraverser.cxx

@@ -140,8 +140,9 @@ PipeOcclusionCullTraverser(const PipeOcclusionCullTraverser &copy) :
 //  Description: 
 //  Description: 
 ////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////
 void PipeOcclusionCullTraverser::
 void PipeOcclusionCullTraverser::
-set_scene(SceneSetup *scene_setup, GraphicsStateGuardianBase *gsgbase) {
-  CullTraverser::set_scene(scene_setup, gsgbase);
+set_scene(SceneSetup *scene_setup, GraphicsStateGuardianBase *gsgbase,
+          bool dr_incomplete_render) {
+  CullTraverser::set_scene(scene_setup, gsgbase, dr_incomplete_render);
   if (!_live) {
   if (!_live) {
     return;
     return;
   }
   }
@@ -195,7 +196,7 @@ set_scene(SceneSetup *scene_setup, GraphicsStateGuardianBase *gsgbase) {
   _internal_cull_handler = new DrawCullHandler(gsg);
   _internal_cull_handler = new DrawCullHandler(gsg);
   _internal_trav = new CullTraverser;
   _internal_trav = new CullTraverser;
   _internal_trav->set_cull_handler(_internal_cull_handler);
   _internal_trav->set_cull_handler(_internal_cull_handler);
-  _internal_trav->set_scene(_scene, gsg);
+  _internal_trav->set_scene(_scene, gsg, dr_incomplete_render);
   _internal_trav->set_view_frustum(get_view_frustum());
   _internal_trav->set_view_frustum(get_view_frustum());
   _internal_trav->set_camera_mask(_occlusion_mask);
   _internal_trav->set_camera_mask(_occlusion_mask);
 
 

+ 2 - 1
panda/src/grutil/pipeOcclusionCullTraverser.h

@@ -51,7 +51,8 @@ PUBLISHED:
   PipeOcclusionCullTraverser(const PipeOcclusionCullTraverser &copy);
   PipeOcclusionCullTraverser(const PipeOcclusionCullTraverser &copy);
 
 
   virtual void set_scene(SceneSetup *scene_setup,
   virtual void set_scene(SceneSetup *scene_setup,
-                         GraphicsStateGuardianBase *gsg);
+                         GraphicsStateGuardianBase *gsg,
+                         bool dr_incomplete_render);
   virtual void end_traverse();
   virtual void end_traverse();
 
 
   INLINE GraphicsOutput *get_buffer() const;
   INLINE GraphicsOutput *get_buffer() const;

+ 1 - 0
panda/src/gsgbase/graphicsStateGuardianBase.h

@@ -109,6 +109,7 @@ class Lens;
 class EXPCL_PANDA_GSGBASE GraphicsStateGuardianBase : public TypedWritableReferenceCount {
 class EXPCL_PANDA_GSGBASE GraphicsStateGuardianBase : public TypedWritableReferenceCount {
 PUBLISHED:
 PUBLISHED:
   virtual bool get_incomplete_render() const=0;
   virtual bool get_incomplete_render() const=0;
+  virtual bool get_effective_incomplete_render() const=0;
 
 
   virtual bool prefers_triangle_strips() const=0;
   virtual bool prefers_triangle_strips() const=0;
   virtual int get_max_vertices_per_array() const=0;
   virtual int get_max_vertices_per_array() const=0;

+ 2 - 2
panda/src/pgraph/cullResult.cxx

@@ -107,7 +107,7 @@ add_object(CullableObject *object, const CullTraverser *traverser) {
   static const Colorf flash_multisample_color(0.78f, 0.05f, 0.81f, 1.0f);
   static const Colorf flash_multisample_color(0.78f, 0.05f, 0.81f, 1.0f);
   static const Colorf flash_dual_color(0.92f, 0.01f, 0.01f, 1.0f);
   static const Colorf flash_dual_color(0.92f, 0.01f, 0.01f, 1.0f);
 
 
-  bool force = !_gsg->get_incomplete_render();
+  bool force = !traverser->get_effective_incomplete_render();
   Thread *current_thread = traverser->get_current_thread();
   Thread *current_thread = traverser->get_current_thread();
 
 
   // Check to see if there's a special transparency setting.
   // Check to see if there's a special transparency setting.
@@ -264,7 +264,7 @@ finish_cull(SceneSetup *scene_setup, Thread *current_thread) {
 ////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////
 void CullResult::
 void CullResult::
 draw(Thread *current_thread) {
 draw(Thread *current_thread) {
-  bool force = !_gsg->get_incomplete_render();
+  bool force = !_gsg->get_effective_incomplete_render();
 
 
   // Ask the bin manager for the correct order to draw all the bins.
   // Ask the bin manager for the correct order to draw all the bins.
   CullBinManager *bin_manager = CullBinManager::get_global_ptr();
   CullBinManager *bin_manager = CullBinManager::get_global_ptr();

+ 16 - 0
panda/src/pgraph/cullTraverser.I

@@ -217,6 +217,22 @@ get_portal_clipper() const {
   return _portal_clipper;
   return _portal_clipper;
 }
 }
 
 
+////////////////////////////////////////////////////////////////////
+//     Function: CullTraverser::get_effective_incomplete_render
+//       Access: Public
+//  Description: Returns true if the cull traversal is effectively in
+//               incomplete_render state, considering both the GSG's
+//               incomplete_render and the current DisplayRegion's
+//               incomplete_render flags.  This returns the flag
+//               during the cull traversal; see
+//               GSG::get_effective_incomplete_render() for this same
+//               flag during the draw traversal.
+////////////////////////////////////////////////////////////////////
+INLINE bool CullTraverser::
+get_effective_incomplete_render() const {
+  return _effective_incomplete_render;
+}
+
 ////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////
 //     Function: CullTraverser::flush_level
 //     Function: CullTraverser::flush_level
 //       Access: Public, Static
 //       Access: Public, Static

+ 7 - 2
panda/src/pgraph/cullTraverser.cxx

@@ -57,6 +57,7 @@ CullTraverser() :
   _initial_state = RenderState::make_empty();
   _initial_state = RenderState::make_empty();
   _cull_handler = (CullHandler *)NULL;
   _cull_handler = (CullHandler *)NULL;
   _portal_clipper = (PortalClipper *)NULL;
   _portal_clipper = (PortalClipper *)NULL;
+  _effective_incomplete_render = true;
 }
 }
 
 
 ////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////
@@ -76,7 +77,8 @@ CullTraverser(const CullTraverser &copy) :
   _depth_offset_decals(copy._depth_offset_decals),
   _depth_offset_decals(copy._depth_offset_decals),
   _view_frustum(copy._view_frustum),
   _view_frustum(copy._view_frustum),
   _cull_handler(copy._cull_handler),
   _cull_handler(copy._cull_handler),
-  _portal_clipper(copy._portal_clipper)
+  _portal_clipper(copy._portal_clipper),
+  _effective_incomplete_render(copy._effective_incomplete_render)
 {
 {
 }
 }
 
 
@@ -88,7 +90,8 @@ CullTraverser(const CullTraverser &copy) :
 //               traversal begins.
 //               traversal begins.
 ////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////
 void CullTraverser::
 void CullTraverser::
-set_scene(SceneSetup *scene_setup, GraphicsStateGuardianBase *gsg) {
+set_scene(SceneSetup *scene_setup, GraphicsStateGuardianBase *gsg,
+          bool dr_incomplete_render) {
   _scene_setup = scene_setup;
   _scene_setup = scene_setup;
   _gsg = gsg;
   _gsg = gsg;
 
 
@@ -101,6 +104,8 @@ set_scene(SceneSetup *scene_setup, GraphicsStateGuardianBase *gsg) {
   _tag_state_key = camera->get_tag_state_key();
   _tag_state_key = camera->get_tag_state_key();
   _has_tag_state_key = !_tag_state_key.empty();
   _has_tag_state_key = !_tag_state_key.empty();
   _camera_mask = camera->get_camera_mask();
   _camera_mask = camera->get_camera_mask();
+
+  _effective_incomplete_render = _gsg->get_incomplete_render() && dr_incomplete_render;
 }
 }
 
 
 ////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////

+ 5 - 1
panda/src/pgraph/cullTraverser.h

@@ -54,7 +54,8 @@ public:
   INLINE Thread *get_current_thread() const;
   INLINE Thread *get_current_thread() const;
 
 
   virtual void set_scene(SceneSetup *scene_setup,
   virtual void set_scene(SceneSetup *scene_setup,
-                         GraphicsStateGuardianBase *gsg);
+                         GraphicsStateGuardianBase *gsg,
+                         bool dr_incomplete_render);
   INLINE SceneSetup *get_scene() const;
   INLINE SceneSetup *get_scene() const;
   INLINE bool has_tag_state_key() const;
   INLINE bool has_tag_state_key() const;
   INLINE const string &get_tag_state_key() const;
   INLINE const string &get_tag_state_key() const;
@@ -77,6 +78,8 @@ public:
   INLINE void set_portal_clipper(PortalClipper *portal_clipper);
   INLINE void set_portal_clipper(PortalClipper *portal_clipper);
   INLINE PortalClipper *get_portal_clipper() const;
   INLINE PortalClipper *get_portal_clipper() const;
 
 
+  INLINE bool get_effective_incomplete_render() const;
+
   void traverse(const NodePath &root);
   void traverse(const NodePath &root);
   void traverse(CullTraverserData &data);
   void traverse(CullTraverserData &data);
   virtual void traverse_below(CullTraverserData &data);
   virtual void traverse_below(CullTraverserData &data);
@@ -123,6 +126,7 @@ private:
   PT(GeometricBoundingVolume) _view_frustum;
   PT(GeometricBoundingVolume) _view_frustum;
   CullHandler *_cull_handler;
   CullHandler *_cull_handler;
   PortalClipper *_portal_clipper;
   PortalClipper *_portal_clipper;
+  bool _effective_incomplete_render;
   
   
 public:
 public:
   static TypeHandle get_class_type() {
   static TypeHandle get_class_type() {