00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015 #ifndef LIGHT_H
00016 #define LIGHT_H
00017
00018 #include "pandabase.h"
00019
00020 #include "referenceCount.h"
00021 #include "luse.h"
00022 #include "cycleData.h"
00023 #include "cycleDataReader.h"
00024 #include "cycleDataLockedReader.h"
00025 #include "cycleDataWriter.h"
00026 #include "pipelineCycler.h"
00027 #include "updateSeq.h"
00028 #include "geomNode.h"
00029
00030 class NodePath;
00031 class PandaNode;
00032 class GraphicsStateGuardianBase;
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042 class EXPCL_PANDA_PGRAPH Light : virtual public ReferenceCount {
00043
00044
00045
00046
00047 PUBLISHED:
00048 INLINE Light();
00049 INLINE Light(const Light ©);
00050 virtual ~Light();
00051
00052 virtual PandaNode *as_node()=0;
00053 virtual bool is_ambient_light() const;
00054
00055 INLINE const LColor &get_color() const;
00056 INLINE void set_color(const LColor &color);
00057
00058 INLINE void set_priority(int priority);
00059 INLINE int get_priority() const;
00060 virtual int get_class_priority() const=0;
00061
00062 public:
00063 virtual void output(ostream &out) const=0;
00064 virtual void write(ostream &out, int indent_level) const=0;
00065 virtual void bind(GraphicsStateGuardianBase *gsg, const NodePath &light,
00066 int light_id)=0;
00067
00068 virtual bool get_vector_to_light(LVector3 &result,
00069 const LPoint3 &from_object_point,
00070 const LMatrix4 &to_object_space);
00071
00072 GeomNode *get_viz();
00073
00074 INLINE static UpdateSeq get_sort_seq();
00075
00076 protected:
00077 virtual void fill_viz_geom(GeomNode *viz_geom);
00078 INLINE void mark_viz_stale();
00079
00080
00081
00082
00083
00084
00085 enum ClassPriority {
00086 CP_ambient_priority,
00087 CP_point_priority,
00088 CP_directional_priority,
00089 CP_spot_priority,
00090 };
00091
00092 private:
00093
00094
00095
00096 int _priority;
00097 static UpdateSeq _sort_seq;
00098
00099
00100 class EXPCL_PANDA_PGRAPH CData : public CycleData {
00101 public:
00102 INLINE CData();
00103 INLINE CData(const CData ©);
00104 virtual CycleData *make_copy() const;
00105 virtual void write_datagram(BamWriter *manager, Datagram &dg) const;
00106 virtual void fillin(DatagramIterator &scan, BamReader *manager);
00107 virtual TypeHandle get_parent_type() const {
00108 return Light::get_class_type();
00109 }
00110
00111 LColor _color;
00112
00113 PT(GeomNode) _viz_geom;
00114 bool _viz_geom_stale;
00115 };
00116
00117 PipelineCycler<CData> _cycler;
00118 typedef CycleDataReader<CData> CDReader;
00119 typedef CycleDataLockedReader<CData> CDLockedReader;
00120 typedef CycleDataWriter<CData> CDWriter;
00121
00122 protected:
00123 void write_datagram(BamWriter *manager, Datagram &dg);
00124 void fillin(DatagramIterator &scan, BamReader *manager);
00125
00126 public:
00127 static TypeHandle get_class_type() {
00128 return _type_handle;
00129 }
00130 static void init_type() {
00131 ReferenceCount::init_type();
00132 register_type(_type_handle, "Light",
00133 ReferenceCount::get_class_type());
00134 }
00135 virtual TypeHandle get_type() const {
00136 return get_class_type();
00137 }
00138
00139 private:
00140 static TypeHandle _type_handle;
00141 };
00142
00143 INLINE ostream &operator << (ostream &out, const Light &light) {
00144 light.output(out);
00145 return out;
00146 }
00147
00148 #include "light.I"
00149
00150 #endif