From 9d0860fffde9780260db5349ff4b9a457f76eb76 Mon Sep 17 00:00:00 2001 From: David Rose Date: Fri, 30 Jan 2009 19:14:49 +0000 Subject: [PATCH] get_effective_incomplete_render() for cull too --- panda/src/cull/drawCullHandler.cxx | 2 +- panda/src/display/graphicsEngine.cxx | 2 +- panda/src/display/graphicsStateGuardian.I | 18 ++++++++++++++++++ panda/src/display/graphicsStateGuardian.h | 1 + .../src/grutil/pipeOcclusionCullTraverser.cxx | 7 ++++--- panda/src/grutil/pipeOcclusionCullTraverser.h | 3 ++- panda/src/gsgbase/graphicsStateGuardianBase.h | 1 + panda/src/pgraph/cullResult.cxx | 4 ++-- panda/src/pgraph/cullTraverser.I | 16 ++++++++++++++++ panda/src/pgraph/cullTraverser.cxx | 9 +++++++-- panda/src/pgraph/cullTraverser.h | 6 +++++- 11 files changed, 58 insertions(+), 11 deletions(-) diff --git a/panda/src/cull/drawCullHandler.cxx b/panda/src/cull/drawCullHandler.cxx index d55240141c..02d6a660bb 100644 --- a/panda/src/cull/drawCullHandler.cxx +++ b/panda/src/cull/drawCullHandler.cxx @@ -32,7 +32,7 @@ void DrawCullHandler:: record_object(CullableObject *object, const CullTraverser *traverser) { // Munge vertices as needed for the GSG's requirements, and the // object's current state. - bool force = !_gsg->get_incomplete_render(); + bool force = !_gsg->get_effective_incomplete_render(); Thread *current_thread = traverser->get_current_thread(); if (object->munge_geom(_gsg, _gsg->get_geom_munger(object->_state, current_thread), traverser, force)) { diff --git a/panda/src/display/graphicsEngine.cxx b/panda/src/display/graphicsEngine.cxx index 13e383e794..f7f75d9239 100644 --- a/panda/src/display/graphicsEngine.cxx +++ b/panda/src/display/graphicsEngine.cxx @@ -1687,7 +1687,7 @@ do_cull(CullHandler *cull_handler, SceneSetup *scene_setup, CullTraverser *trav = dr->get_cull_traverser(); 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); if (view_frustum_cull) { diff --git a/panda/src/display/graphicsStateGuardian.I b/panda/src/display/graphicsStateGuardian.I index 16fcb9119f..a62ec436a5 100644 --- a/panda/src/display/graphicsStateGuardian.I +++ b/panda/src/display/graphicsStateGuardian.I @@ -159,6 +159,24 @@ get_incomplete_render() const { 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 // Access: Public diff --git a/panda/src/display/graphicsStateGuardian.h b/panda/src/display/graphicsStateGuardian.h index 709600e17b..f17cfaf1a2 100644 --- a/panda/src/display/graphicsStateGuardian.h +++ b/panda/src/display/graphicsStateGuardian.h @@ -95,6 +95,7 @@ PUBLISHED: INLINE void set_incomplete_render(bool incomplete_render); virtual INLINE bool get_incomplete_render() const; + virtual INLINE bool get_effective_incomplete_render() const; INLINE void set_loader(Loader *loader); INLINE Loader *get_loader() const; diff --git a/panda/src/grutil/pipeOcclusionCullTraverser.cxx b/panda/src/grutil/pipeOcclusionCullTraverser.cxx index e64f983b69..f92a4ccbfa 100644 --- a/panda/src/grutil/pipeOcclusionCullTraverser.cxx +++ b/panda/src/grutil/pipeOcclusionCullTraverser.cxx @@ -140,8 +140,9 @@ PipeOcclusionCullTraverser(const PipeOcclusionCullTraverser ©) : // Description: //////////////////////////////////////////////////////////////////// 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) { return; } @@ -195,7 +196,7 @@ set_scene(SceneSetup *scene_setup, GraphicsStateGuardianBase *gsgbase) { _internal_cull_handler = new DrawCullHandler(gsg); _internal_trav = new CullTraverser; _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_camera_mask(_occlusion_mask); diff --git a/panda/src/grutil/pipeOcclusionCullTraverser.h b/panda/src/grutil/pipeOcclusionCullTraverser.h index ecf5387534..076e972f39 100644 --- a/panda/src/grutil/pipeOcclusionCullTraverser.h +++ b/panda/src/grutil/pipeOcclusionCullTraverser.h @@ -51,7 +51,8 @@ PUBLISHED: PipeOcclusionCullTraverser(const PipeOcclusionCullTraverser ©); virtual void set_scene(SceneSetup *scene_setup, - GraphicsStateGuardianBase *gsg); + GraphicsStateGuardianBase *gsg, + bool dr_incomplete_render); virtual void end_traverse(); INLINE GraphicsOutput *get_buffer() const; diff --git a/panda/src/gsgbase/graphicsStateGuardianBase.h b/panda/src/gsgbase/graphicsStateGuardianBase.h index 9223907682..77bd289637 100644 --- a/panda/src/gsgbase/graphicsStateGuardianBase.h +++ b/panda/src/gsgbase/graphicsStateGuardianBase.h @@ -109,6 +109,7 @@ class Lens; class EXPCL_PANDA_GSGBASE GraphicsStateGuardianBase : public TypedWritableReferenceCount { PUBLISHED: virtual bool get_incomplete_render() const=0; + virtual bool get_effective_incomplete_render() const=0; virtual bool prefers_triangle_strips() const=0; virtual int get_max_vertices_per_array() const=0; diff --git a/panda/src/pgraph/cullResult.cxx b/panda/src/pgraph/cullResult.cxx index ca8cc78ed7..7ab101b088 100644 --- a/panda/src/pgraph/cullResult.cxx +++ b/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_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(); // Check to see if there's a special transparency setting. @@ -264,7 +264,7 @@ finish_cull(SceneSetup *scene_setup, Thread *current_thread) { //////////////////////////////////////////////////////////////////// void CullResult:: 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. CullBinManager *bin_manager = CullBinManager::get_global_ptr(); diff --git a/panda/src/pgraph/cullTraverser.I b/panda/src/pgraph/cullTraverser.I index 58a4136ea7..9dad5f3b0b 100644 --- a/panda/src/pgraph/cullTraverser.I +++ b/panda/src/pgraph/cullTraverser.I @@ -217,6 +217,22 @@ get_portal_clipper() const { 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 // Access: Public, Static diff --git a/panda/src/pgraph/cullTraverser.cxx b/panda/src/pgraph/cullTraverser.cxx index fdccb36a8b..bcfb46e34a 100644 --- a/panda/src/pgraph/cullTraverser.cxx +++ b/panda/src/pgraph/cullTraverser.cxx @@ -57,6 +57,7 @@ CullTraverser() : _initial_state = RenderState::make_empty(); _cull_handler = (CullHandler *)NULL; _portal_clipper = (PortalClipper *)NULL; + _effective_incomplete_render = true; } //////////////////////////////////////////////////////////////////// @@ -76,7 +77,8 @@ CullTraverser(const CullTraverser ©) : _depth_offset_decals(copy._depth_offset_decals), _view_frustum(copy._view_frustum), _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 ©) : // traversal begins. //////////////////////////////////////////////////////////////////// void CullTraverser:: -set_scene(SceneSetup *scene_setup, GraphicsStateGuardianBase *gsg) { +set_scene(SceneSetup *scene_setup, GraphicsStateGuardianBase *gsg, + bool dr_incomplete_render) { _scene_setup = scene_setup; _gsg = gsg; @@ -101,6 +104,8 @@ set_scene(SceneSetup *scene_setup, GraphicsStateGuardianBase *gsg) { _tag_state_key = camera->get_tag_state_key(); _has_tag_state_key = !_tag_state_key.empty(); _camera_mask = camera->get_camera_mask(); + + _effective_incomplete_render = _gsg->get_incomplete_render() && dr_incomplete_render; } //////////////////////////////////////////////////////////////////// diff --git a/panda/src/pgraph/cullTraverser.h b/panda/src/pgraph/cullTraverser.h index 86c158c0d4..a2720af5f0 100644 --- a/panda/src/pgraph/cullTraverser.h +++ b/panda/src/pgraph/cullTraverser.h @@ -54,7 +54,8 @@ public: INLINE Thread *get_current_thread() const; virtual void set_scene(SceneSetup *scene_setup, - GraphicsStateGuardianBase *gsg); + GraphicsStateGuardianBase *gsg, + bool dr_incomplete_render); INLINE SceneSetup *get_scene() const; INLINE bool has_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 PortalClipper *get_portal_clipper() const; + INLINE bool get_effective_incomplete_render() const; + void traverse(const NodePath &root); void traverse(CullTraverserData &data); virtual void traverse_below(CullTraverserData &data); @@ -123,6 +126,7 @@ private: PT(GeometricBoundingVolume) _view_frustum; CullHandler *_cull_handler; PortalClipper *_portal_clipper; + bool _effective_incomplete_render; public: static TypeHandle get_class_type() {