mirror of
https://github.com/panda3d/panda3d.git
synced 2025-10-02 18:03:56 -04:00
get_effective_incomplete_render() for cull too
This commit is contained in:
parent
5819a3c4e3
commit
9d0860fffd
@ -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)) {
|
||||||
|
@ -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) {
|
||||||
|
@ -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
|
||||||
|
@ -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;
|
||||||
|
@ -140,8 +140,9 @@ PipeOcclusionCullTraverser(const PipeOcclusionCullTraverser ©) :
|
|||||||
// Description:
|
// Description:
|
||||||
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
||||||
void PipeOcclusionCullTraverser::
|
void PipeOcclusionCullTraverser::
|
||||||
set_scene(SceneSetup *scene_setup, GraphicsStateGuardianBase *gsgbase) {
|
set_scene(SceneSetup *scene_setup, GraphicsStateGuardianBase *gsgbase,
|
||||||
CullTraverser::set_scene(scene_setup, 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);
|
||||||
|
|
||||||
|
@ -51,7 +51,8 @@ PUBLISHED:
|
|||||||
PipeOcclusionCullTraverser(const PipeOcclusionCullTraverser ©);
|
PipeOcclusionCullTraverser(const PipeOcclusionCullTraverser ©);
|
||||||
|
|
||||||
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;
|
||||||
|
@ -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;
|
||||||
|
@ -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();
|
||||||
|
@ -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
|
||||||
|
@ -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 ©) :
|
|||||||
_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 ©) :
|
|||||||
// 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;
|
||||||
}
|
}
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
||||||
|
@ -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() {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user