get_effective_incomplete_render() for cull too

This commit is contained in:
David Rose 2009-01-30 19:14:49 +00:00
parent 5819a3c4e3
commit 9d0860fffd
11 changed files with 58 additions and 11 deletions

View File

@ -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)) {

View File

@ -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) {

View File

@ -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

View File

@ -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;

View File

@ -140,8 +140,9 @@ PipeOcclusionCullTraverser(const PipeOcclusionCullTraverser &copy) :
// 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);

View File

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

View File

@ -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;

View File

@ -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();

View File

@ -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

View File

@ -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 &copy) :
_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 &copy) :
// 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;
}
////////////////////////////////////////////////////////////////////

View File

@ -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() {