00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015 #ifndef LODNODE_H
00016 #define LODNODE_H
00017
00018 #include "pandabase.h"
00019
00020 #include "pandaNode.h"
00021 #include "luse.h"
00022 #include "pvector.h"
00023
00024
00025
00026
00027
00028
00029
00030
00031 class EXPCL_PANDA_PGRAPHNODES LODNode : public PandaNode {
00032 PUBLISHED:
00033 INLINE LODNode(const string &name);
00034
00035 static PT(LODNode) make_default_lod(const string &name);
00036
00037 protected:
00038 INLINE LODNode(const LODNode ©);
00039 public:
00040 virtual PandaNode *make_copy() const;
00041 virtual bool safe_to_combine() const;
00042 virtual bool safe_to_combine_children() const;
00043 virtual void xform(const LMatrix4 &mat);
00044 virtual bool cull_callback(CullTraverser *trav, CullTraverserData &data);
00045
00046 virtual void output(ostream &out) const;
00047
00048 virtual bool is_lod_node() const;
00049
00050 PUBLISHED:
00051
00052
00053
00054
00055
00056 INLINE void add_switch(PN_stdfloat in, PN_stdfloat out);
00057 INLINE bool set_switch(int index, PN_stdfloat in, PN_stdfloat out);
00058 INLINE void clear_switches();
00059
00060 INLINE int get_num_switches() const;
00061 INLINE PN_stdfloat get_in(int index) const;
00062 MAKE_SEQ(get_ins, get_num_switches, get_in);
00063 INLINE PN_stdfloat get_out(int index) const;
00064 MAKE_SEQ(get_outs, get_num_switches, get_out);
00065
00066 INLINE int get_lowest_switch() const;
00067 INLINE int get_highest_switch() const;
00068
00069 INLINE void force_switch(int index);
00070 INLINE void clear_force_switch();
00071
00072
00073
00074 INLINE void set_lod_scale(PN_stdfloat value);
00075 INLINE PN_stdfloat get_lod_scale() const;
00076
00077
00078 INLINE void set_center(const LPoint3 ¢er);
00079 INLINE const LPoint3 &get_center() const;
00080
00081 void show_switch(int index);
00082 void show_switch(int index, const LColor &color);
00083 void hide_switch(int index);
00084 void show_all_switches();
00085 void hide_all_switches();
00086 INLINE bool is_any_shown() const;
00087
00088 bool verify_child_bounds() const;
00089
00090 protected:
00091 int compute_child(CullTraverser *trav, CullTraverserData &data);
00092
00093 bool show_switches_cull_callback(CullTraverser *trav, CullTraverserData &data);
00094 virtual void compute_internal_bounds(CPT(BoundingVolume) &internal_bounds,
00095 int &internal_vertices,
00096 int pipeline_stage,
00097 Thread *current_thread) const;
00098
00099 INLINE void consider_verify_lods(CullTraverser *trav, CullTraverserData &data);
00100
00101 CPT(TransformState) get_rel_transform(CullTraverser *trav, CullTraverserData &data);
00102
00103 private:
00104 class CData;
00105 void do_show_switch(CData *cdata, int index, const LColor &color);
00106 void do_hide_switch(CData *cdata, int index);
00107 bool do_verify_child_bounds(const CData *cdata, int index,
00108 PN_stdfloat &suggested_radius) const;
00109 void do_auto_verify_lods(CullTraverser *trav, CullTraverserData &data);
00110
00111 static const LColor &get_default_show_color(int index);
00112
00113 protected:
00114 class Switch {
00115 public:
00116 INLINE Switch(PN_stdfloat in, PN_stdfloat out);
00117 INLINE PN_stdfloat get_in() const;
00118 INLINE PN_stdfloat get_out() const;
00119
00120 INLINE void set_range(PN_stdfloat in, PN_stdfloat out);
00121 INLINE bool in_range(PN_stdfloat dist) const;
00122 INLINE bool in_range_2(PN_stdfloat dist2) const;
00123
00124 INLINE void rescale(PN_stdfloat factor);
00125
00126 INLINE bool is_shown() const;
00127 INLINE void show(const LColor &color);
00128 INLINE void hide();
00129
00130 INLINE PandaNode *get_ring_viz() const;
00131 INLINE PandaNode *get_spindle_viz() const;
00132 INLINE const RenderState *get_viz_model_state() const;
00133
00134 INLINE void write_datagram(Datagram &destination) const;
00135 INLINE void read_datagram(DatagramIterator &source);
00136
00137 private:
00138 INLINE void clear_ring_viz();
00139
00140 void compute_ring_viz();
00141 void compute_spindle_viz();
00142 void compute_viz_model_state();
00143
00144 private:
00145 PN_stdfloat _in;
00146 PN_stdfloat _out;
00147 bool _shown;
00148 UnalignedLVecBase4 _show_color;
00149 PT(PandaNode) _ring_viz;
00150 PT(PandaNode) _spindle_viz;
00151 CPT(RenderState) _viz_model_state;
00152
00153 public:
00154 UpdateSeq _bounds_seq;
00155 bool _verify_ok;
00156 };
00157 typedef pvector<Switch> SwitchVector;
00158
00159 private:
00160 class EXPCL_PANDA_PGRAPH CData : public CycleData {
00161 public:
00162 INLINE CData();
00163 INLINE CData(const CData ©);
00164 virtual CycleData *make_copy() const;
00165
00166 void check_limits();
00167
00168 virtual void write_datagram(BamWriter *manager, Datagram &dg) const;
00169 virtual void fillin(DatagramIterator &scan, BamReader *manager);
00170 virtual TypeHandle get_parent_type() const {
00171 return LODNode::get_class_type();
00172 }
00173
00174 LPoint3 _center;
00175 SwitchVector _switch_vector;
00176 size_t _lowest, _highest;
00177 UpdateSeq _bounds_seq;
00178
00179 bool _got_force_switch;
00180 int _force_switch;
00181 int _num_shown;
00182 PN_stdfloat _lod_scale;
00183 };
00184
00185 PipelineCycler<CData> _cycler;
00186 typedef CycleDataReader<CData> CDReader;
00187 typedef CycleDataWriter<CData> CDWriter;
00188 typedef CycleDataLockedReader<CData> CDLockedReader;
00189 typedef CycleDataStageReader<CData> CDStageReader;
00190 typedef CycleDataStageWriter<CData> CDStageWriter;
00191
00192 public:
00193 static void register_with_read_factory();
00194 virtual void write_datagram(BamWriter *manager, Datagram &dg);
00195
00196 protected:
00197 static TypedWritable *make_from_bam(const FactoryParams ¶ms);
00198 void fillin(DatagramIterator &scan, BamReader *manager);
00199
00200 public:
00201 static TypeHandle get_class_type() {
00202 return _type_handle;
00203 }
00204 static void init_type() {
00205 PandaNode::init_type();
00206 register_type(_type_handle, "LODNode",
00207 PandaNode::get_class_type());
00208 }
00209 virtual TypeHandle get_type() const {
00210 return get_class_type();
00211 }
00212 virtual TypeHandle force_init_type() {init_type(); return get_class_type();}
00213
00214 private:
00215 static TypeHandle _type_handle;
00216 };
00217
00218 #include "lodNode.I"
00219
00220 #endif