mirror of
https://github.com/panda3d/panda3d.git
synced 2025-10-02 01:44:06 -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) {
|
||||
// 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)) {
|
||||
|
@ -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) {
|
||||
|
@ -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
|
||||
|
@ -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;
|
||||
|
@ -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);
|
||||
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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();
|
||||
|
@ -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
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
|
@ -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() {
|
||||
|
Loading…
x
Reference in New Issue
Block a user