00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015 #ifndef CULLTRAVERSER_H
00016 #define CULLTRAVERSER_H
00017
00018 #include "pandabase.h"
00019
00020 #include "geom.h"
00021 #include "sceneSetup.h"
00022 #include "renderState.h"
00023 #include "transformState.h"
00024 #include "geometricBoundingVolume.h"
00025 #include "pointerTo.h"
00026 #include "camera.h"
00027 #include "drawMask.h"
00028 #include "typedReferenceCount.h"
00029 #include "pStatCollector.h"
00030
00031 class GraphicsStateGuardian;
00032 class PandaNode;
00033 class CullHandler;
00034 class CullableObject;
00035 class CullTraverserData;
00036 class PortalClipper;
00037 class NodePath;
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047 class EXPCL_PANDA_PGRAPH CullTraverser : public TypedReferenceCount {
00048 PUBLISHED:
00049 CullTraverser();
00050 CullTraverser(const CullTraverser ©);
00051
00052 INLINE GraphicsStateGuardianBase *get_gsg() const;
00053 INLINE Thread *get_current_thread() const;
00054
00055 virtual void set_scene(SceneSetup *scene_setup,
00056 GraphicsStateGuardianBase *gsg,
00057 bool dr_incomplete_render);
00058 INLINE SceneSetup *get_scene() const;
00059 INLINE bool has_tag_state_key() const;
00060 INLINE const string &get_tag_state_key() const;
00061
00062 INLINE void set_camera_mask(const DrawMask &camera_mask);
00063 INLINE const DrawMask &get_camera_mask() const;
00064
00065 INLINE const TransformState *get_camera_transform() const;
00066 INLINE const TransformState *get_world_transform() const;
00067
00068 INLINE const RenderState *get_initial_state() const;
00069 INLINE bool get_depth_offset_decals() const;
00070
00071 INLINE void set_view_frustum(GeometricBoundingVolume *view_frustum);
00072 INLINE GeometricBoundingVolume *get_view_frustum() const;
00073
00074 INLINE void set_cull_handler(CullHandler *cull_handler);
00075 INLINE CullHandler *get_cull_handler() const;
00076
00077 INLINE void set_portal_clipper(PortalClipper *portal_clipper);
00078 INLINE PortalClipper *get_portal_clipper() const;
00079
00080 INLINE bool get_effective_incomplete_render() const;
00081
00082 void traverse(const NodePath &root);
00083 void traverse(CullTraverserData &data);
00084 virtual void traverse_below(CullTraverserData &data);
00085
00086 virtual void end_traverse();
00087
00088 INLINE static void flush_level();
00089
00090 void draw_bounding_volume(const BoundingVolume *vol,
00091 const TransformState *net_transform,
00092 const TransformState *modelview_transform) const;
00093
00094 protected:
00095 virtual bool is_in_view(CullTraverserData &data);
00096
00097 public:
00098
00099 static PStatCollector _nodes_pcollector;
00100 static PStatCollector _geom_nodes_pcollector;
00101 static PStatCollector _geoms_pcollector;
00102 static PStatCollector _geoms_occluded_pcollector;
00103
00104 private:
00105 void show_bounds(CullTraverserData &data, bool tight);
00106 static PT(Geom) make_bounds_viz(const BoundingVolume *vol);
00107 PT(Geom) make_tight_bounds_viz(PandaNode *node) const;
00108 static LVertex compute_point(const BoundingSphere *sphere,
00109 PN_stdfloat latitude, PN_stdfloat longitude);
00110 static CPT(RenderState) get_bounds_outer_viz_state();
00111 static CPT(RenderState) get_bounds_inner_viz_state();
00112 static CPT(RenderState) get_depth_offset_state();
00113 void start_decal(const CullTraverserData &data);
00114 CullableObject *r_get_decals(CullTraverserData &data,
00115 CullableObject *decals);
00116
00117 GraphicsStateGuardianBase *_gsg;
00118 Thread *_current_thread;
00119 PT(SceneSetup) _scene_setup;
00120 DrawMask _camera_mask;
00121 bool _has_tag_state_key;
00122 string _tag_state_key;
00123 CPT(RenderState) _initial_state;
00124 bool _depth_offset_decals;
00125 PT(GeometricBoundingVolume) _view_frustum;
00126 CullHandler *_cull_handler;
00127 PortalClipper *_portal_clipper;
00128 bool _effective_incomplete_render;
00129
00130 public:
00131 static TypeHandle get_class_type() {
00132 return _type_handle;
00133 }
00134 static void init_type() {
00135 TypedReferenceCount::init_type();
00136 register_type(_type_handle, "CullTraverser",
00137 TypedReferenceCount::get_class_type());
00138 }
00139 virtual TypeHandle get_type() const {
00140 return get_class_type();
00141 }
00142 virtual TypeHandle force_init_type() {init_type(); return get_class_type();}
00143
00144 private:
00145 static TypeHandle _type_handle;
00146 };
00147
00148 #include "cullTraverser.I"
00149
00150 #endif
00151
00152
00153