Panda3D
|
00001 // Filename: portalClipper.h 00002 // Created by: masad (4May04) 00003 // 00004 //////////////////////////////////////////////////////////////////// 00005 // 00006 // PANDA 3D SOFTWARE 00007 // Copyright (c) Carnegie Mellon University. All rights reserved. 00008 // 00009 // All use of this software is subject to the terms of the revised BSD 00010 // license. You should have received a copy of this license along 00011 // with this source code in a file named "LICENSE." 00012 // 00013 //////////////////////////////////////////////////////////////////// 00014 00015 #ifndef PORTALCLIPPER_H 00016 #define PORTALCLIPPER_H 00017 00018 #include "pandabase.h" 00019 00020 #include "geom.h" 00021 #include "geomVertexData.h" 00022 #include "sceneSetup.h" 00023 #include "renderState.h" 00024 #include "portalNode.h" 00025 #include "transformState.h" 00026 #include "geometricBoundingVolume.h" 00027 #include "boundingHexahedron.h" 00028 #include "pointerTo.h" 00029 #include "drawMask.h" 00030 #include "typedObject.h" 00031 #include "pStatCollector.h" 00032 #include "config_pgraph.h" 00033 00034 #include "geom.h" 00035 #include "geomNode.h" 00036 00037 class PandaNode; 00038 class PortalNode; 00039 class CullHandler; 00040 class CullTraverserData; 00041 class CullableObject; 00042 class NodePath; 00043 00044 //////////////////////////////////////////////////////////////////// 00045 // Class : PortalClipper 00046 // Description : This object performs a depth-first traversal of the 00047 // scene graph, with optional view-frustum culling, 00048 // collecting CullState and searching for GeomNodes. 00049 // Each renderable Geom encountered is passed along with 00050 // its associated RenderState to the CullHandler object. 00051 //////////////////////////////////////////////////////////////////// 00052 class EXPCL_PANDA_PGRAPH PortalClipper : public TypedObject { 00053 public: 00054 PortalClipper(GeometricBoundingVolume *frustum, SceneSetup *scene_setup); 00055 ~PortalClipper(); 00056 00057 INLINE bool is_partial_portal_in_view(); 00058 INLINE bool is_facing_view(const LPlane &portal_plane); 00059 INLINE bool is_whole_portal_in_view(const LMatrix4 &cmat); 00060 00061 bool prepare_portal(const NodePath &node_path); 00062 00063 void draw_lines(); 00064 INLINE void draw_camera_frustum(); 00065 void draw_hexahedron(BoundingHexahedron *frustum); 00066 00067 INLINE void move_to(PN_stdfloat x, PN_stdfloat y, PN_stdfloat z); 00068 void move_to(const LVecBase3 &v); 00069 00070 INLINE void draw_to(PN_stdfloat x, PN_stdfloat y, PN_stdfloat z); 00071 void draw_to(const LVecBase3 &v); 00072 00073 void draw_current_portal(); 00074 00075 INLINE BoundingHexahedron *get_reduced_frustum() const; 00076 INLINE void set_reduced_frustum(BoundingHexahedron *bh); 00077 INLINE void get_reduced_viewport(LPoint2& min, LPoint2& max) const; 00078 INLINE void set_reduced_viewport(const LPoint2& min, const LPoint2& max); 00079 INLINE const RenderState* get_clip_state() const; 00080 INLINE void set_clip_state(const RenderState* clip_state); 00081 00082 public: 00083 static TypeHandle get_class_type() { 00084 return _type_handle; 00085 } 00086 static void init_type() { 00087 TypedObject::init_type(); 00088 register_type(_type_handle, "PortalClipper", 00089 TypedObject::get_class_type()); 00090 } 00091 virtual TypeHandle get_type() const { 00092 return get_class_type(); 00093 } 00094 virtual TypeHandle force_init_type() {init_type(); return get_class_type();} 00095 00096 private: 00097 static TypeHandle _type_handle; 00098 00099 private: 00100 class Point { 00101 public: 00102 INLINE Point(); 00103 INLINE Point(const LVecBase3 &point, const LColor &color); 00104 INLINE Point(const Point ©); 00105 INLINE void operator = (const Point ©); 00106 00107 LVertex _point; 00108 UnalignedLVecBase4 _color; 00109 }; 00110 00111 typedef pvector<Point> SegmentList; 00112 typedef pvector<SegmentList> LineList; 00113 00114 LineList _list; 00115 LColor _color; 00116 00117 PT(GeomVertexData) _created_data; 00118 00119 BoundingHexahedron *_view_frustum; 00120 BoundingHexahedron *_reduced_frustum; 00121 LPoint2 _reduced_viewport_min; 00122 LPoint2 _reduced_viewport_max; 00123 CPT(RenderState) _clip_state; // each portal node needs to know the clip state of its "parent" portal Node 00124 00125 PortalNode *_portal_node; // current working portal for dereference ease 00126 00127 //int _num_vert; 00128 //LVertex _coords[4]; 00129 00130 public: 00131 PT(GeomNode) _previous; 00132 SceneSetup *_scene_setup; 00133 }; 00134 00135 #include "portalClipper.I" 00136 00137 #endif 00138 00139 00140