Panda3D
|
00001 // Filename: spotlight.h 00002 // Created by: mike (09Jan97) 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 SPOTLIGHT_H 00016 #define SPOTLIGHT_H 00017 00018 #include "pandabase.h" 00019 00020 #include "lightLensNode.h" 00021 #include "texture.h" 00022 00023 //////////////////////////////////////////////////////////////////// 00024 // Class : Spotlight 00025 // Description : A light originating from a single point in space, and 00026 // shining in a particular direction, with a cone-shaped 00027 // falloff. 00028 // 00029 // The Spotlight frustum is defined using a Lens, so it 00030 // can have any of the properties that a camera lens can 00031 // have. 00032 // 00033 // Note that the class is named Spotlight instead of 00034 // SpotLight, because "spotlight" is a single English 00035 // word, instead of two words. 00036 //////////////////////////////////////////////////////////////////// 00037 class EXPCL_PANDA_PGRAPHNODES Spotlight : public LightLensNode { 00038 PUBLISHED: 00039 Spotlight(const string &name); 00040 00041 protected: 00042 Spotlight(const Spotlight ©); 00043 00044 public: 00045 virtual PandaNode *make_copy() const; 00046 virtual void xform(const LMatrix4 &mat); 00047 virtual void write(ostream &out, int indent_level) const; 00048 00049 virtual bool get_vector_to_light(LVector3 &result, 00050 const LPoint3 &from_object_point, 00051 const LMatrix4 &to_object_space); 00052 00053 PUBLISHED: 00054 INLINE PN_stdfloat get_exponent() const; 00055 INLINE void set_exponent(PN_stdfloat exponent); 00056 00057 INLINE const LColor &get_specular_color() const; 00058 INLINE void set_specular_color(const LColor &color); 00059 00060 INLINE const LVecBase3 &get_attenuation() const; 00061 INLINE void set_attenuation(const LVecBase3 &attenuation); 00062 00063 virtual int get_class_priority() const; 00064 00065 static PT(Texture) make_spot(int pixel_width, PN_stdfloat full_radius, 00066 LColor &fg, LColor &bg); 00067 00068 public: 00069 virtual void bind(GraphicsStateGuardianBase *gsg, const NodePath &light, 00070 int light_id); 00071 00072 protected: 00073 virtual void fill_viz_geom(GeomNode *viz_geom); 00074 00075 private: 00076 CPT(RenderState) get_viz_state(); 00077 00078 private: 00079 // This is the data that must be cycled between pipeline stages. 00080 class EXPCL_PANDA_PGRAPHNODES CData : public CycleData { 00081 public: 00082 INLINE CData(); 00083 INLINE CData(const CData ©); 00084 virtual CycleData *make_copy() const; 00085 virtual void write_datagram(BamWriter *manager, Datagram &dg) const; 00086 virtual void fillin(DatagramIterator &scan, BamReader *manager); 00087 virtual TypeHandle get_parent_type() const { 00088 return Spotlight::get_class_type(); 00089 } 00090 00091 PN_stdfloat _exponent; 00092 LColor _specular_color; 00093 LVecBase3 _attenuation; 00094 }; 00095 00096 PipelineCycler<CData> _cycler; 00097 typedef CycleDataReader<CData> CDReader; 00098 typedef CycleDataWriter<CData> CDWriter; 00099 00100 public: 00101 static void register_with_read_factory(); 00102 virtual void write_datagram(BamWriter *manager, Datagram &dg); 00103 00104 protected: 00105 static TypedWritable *make_from_bam(const FactoryParams ¶ms); 00106 void fillin(DatagramIterator &scan, BamReader *manager); 00107 00108 public: 00109 static TypeHandle get_class_type() { 00110 return _type_handle; 00111 } 00112 static void init_type() { 00113 LightLensNode::init_type(); 00114 register_type(_type_handle, "Spotlight", 00115 LightLensNode::get_class_type()); 00116 } 00117 virtual TypeHandle get_type() const { 00118 return get_class_type(); 00119 } 00120 virtual TypeHandle force_init_type() {init_type(); return get_class_type();} 00121 00122 private: 00123 static TypeHandle _type_handle; 00124 }; 00125 00126 INLINE ostream &operator << (ostream &out, const Spotlight &light) { 00127 light.output(out); 00128 return out; 00129 } 00130 00131 #include "spotlight.I" 00132 00133 #endif