00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015 #ifndef SPRITEPARTICLERENDERER_H
00016 #define SPRITEPARTICLERENDERER_H
00017
00018 #include "pandabase.h"
00019 #include "pvector.h"
00020 #include "baseParticleRenderer.h"
00021 #include "baseParticle.h"
00022 #include "texture.h"
00023 #include "pointerTo.h"
00024 #include "geom.h"
00025 #include "geomVertexData.h"
00026 #include "geomPoints.h"
00027 #include "colorInterpolationManager.h"
00028 #include "geomVertexWriter.h"
00029 #include "textureCollection.h"
00030 #include "nodePathCollection.h"
00031 #include "vector_int.h"
00032 #include "pStatCollector.h"
00033
00034 class NodePath;
00035
00036
00037
00038
00039
00040
00041
00042
00043 class SpriteWriter {
00044 public:
00045 SpriteWriter() {
00046 }
00047 SpriteWriter(const SpriteWriter ©):
00048 vertex(copy.vertex),
00049 color(copy.color),
00050 rotate(copy.rotate),
00051 size(copy.size),
00052 aspect_ratio(copy.aspect_ratio) {
00053 };
00054
00055 void clear() {
00056 vertex.clear();
00057 color.clear();
00058 rotate.clear();
00059 size.clear();
00060 aspect_ratio.clear();
00061 }
00062
00063 GeomVertexWriter vertex;
00064 GeomVertexWriter color;
00065 GeomVertexWriter rotate;
00066 GeomVertexWriter size;
00067 GeomVertexWriter aspect_ratio;
00068 };
00069
00070
00071
00072
00073
00074
00075
00076 class SpriteAnim : public ReferenceCount{
00077 PUBLISHED:
00078 enum SourceType {
00079 ST_texture,
00080 ST_from_node,
00081 };
00082
00083 void set_source_info(const string &tex) {
00084 _source_type = ST_texture;
00085 _source_tex = tex;
00086 }
00087
00088 void set_source_info(const string &model, const string &node) {
00089 _source_type = ST_from_node;
00090 _source_model = model;
00091 _source_node = node;
00092 }
00093
00094 SourceType get_source_type() const {
00095 return _source_type;
00096 }
00097
00098 string get_tex_source() const {
00099 return _source_tex;
00100 }
00101
00102 string get_model_source() const {
00103 return _source_model;
00104 }
00105
00106 string get_node_source() const {
00107 return _source_node;
00108 }
00109
00110 int get_num_frames() const {
00111 return textures.size();
00112 }
00113
00114 public:
00115 SpriteAnim(Texture* t, LTexCoord ll, LTexCoord ur) {
00116 textures.push_back(t);
00117 this->ll.push_back(ll);
00118 this->ur.push_back(ur);
00119 };
00120
00121 SpriteAnim(const TextureCollection &t, const pvector< LTexCoord > &lls, const pvector< LTexCoord > &urs) :
00122 ll(lls),
00123 ur(urs) {
00124 for (int i = 0; i < t.get_num_textures(); ++i) {
00125 textures.push_back(t.get_texture(i));
00126 }
00127 };
00128
00129 void set_ll(const int n, LTexCoord c) {
00130 ll[n] = c;
00131 }
00132
00133 void set_ur(const int n, LTexCoord c) {
00134 ur[n] = c;
00135 }
00136
00137 Texture *get_frame(const int n) const {
00138 return textures[n];
00139 };
00140
00141 LTexCoord get_ll(const int n) const {
00142 return ll[n];
00143 }
00144
00145 LTexCoord get_ur(const int n) const {
00146 return ur[n];
00147 }
00148
00149 private:
00150 pvector< PT(Texture) > textures;
00151 pvector< LTexCoord > ll,ur;
00152 SourceType _source_type;
00153 string _source_tex,_source_model,_source_node;
00154 };
00155
00156
00157
00158
00159
00160
00161 class EXPCL_PANDAPHYSICS SpriteParticleRenderer : public BaseParticleRenderer {
00162 PUBLISHED:
00163 SpriteParticleRenderer(Texture *tex = (Texture *) NULL);
00164 SpriteParticleRenderer(const SpriteParticleRenderer ©);
00165 virtual ~SpriteParticleRenderer();
00166
00167 public:
00168 virtual BaseParticleRenderer *make_copy();
00169
00170 PUBLISHED:
00171 void set_from_node(const NodePath &node_path, bool size_from_texels = false);
00172 void set_from_node(const NodePath &node_path, const string &model, const string &node, bool size_from_texels = false);
00173 void add_from_node(const NodePath &node_path, bool size_from_texels = false, bool resize = false);
00174 void add_from_node(const NodePath &node_path, const string &model, const string &node, bool size_from_texels = false, bool resize = false);
00175
00176 INLINE void set_texture(Texture *tex, PN_stdfloat texels_per_unit = 1.0f);
00177 INLINE void add_texture(Texture *tex, PN_stdfloat texels_per_unit = 1.0f, bool resize = false);
00178 INLINE void remove_animation(const int n);
00179 INLINE void set_ll_uv(const LTexCoord &ll_uv);
00180 INLINE void set_ll_uv(const LTexCoord &ll_uv, const int anim, const int frame);
00181 INLINE void set_ur_uv(const LTexCoord &ur_uv);
00182 INLINE void set_ur_uv(const LTexCoord &ur_uv, const int anim, const int frame);
00183 INLINE void set_size(PN_stdfloat width, PN_stdfloat height);
00184 INLINE void set_color(const LColor &color);
00185 INLINE void set_x_scale_flag(bool animate_x_ratio);
00186 INLINE void set_y_scale_flag(bool animate_y_ratio);
00187 INLINE void set_anim_angle_flag(bool animate_theta);
00188 INLINE void set_initial_x_scale(PN_stdfloat initial_x_scale);
00189 INLINE void set_final_x_scale(PN_stdfloat final_x_scale);
00190 INLINE void set_initial_y_scale(PN_stdfloat initial_y_scale);
00191 INLINE void set_final_y_scale(PN_stdfloat final_y_scale);
00192 INLINE void set_nonanimated_theta(PN_stdfloat theta);
00193 INLINE void set_alpha_blend_method(ParticleRendererBlendMethod bm);
00194 INLINE void set_alpha_disable(bool ad);
00195 INLINE void set_animate_frames_enable(bool an);
00196 INLINE void set_animate_frames_rate(PN_stdfloat r);
00197 INLINE void set_animate_frames_index(int i);
00198
00199 INLINE Texture *get_texture() const;
00200 INLINE Texture *get_texture(const int anim, const int frame) const;
00201 INLINE int get_num_anims() const;
00202 INLINE SpriteAnim *get_anim(const int n) const;
00203 MAKE_SEQ(get_anims, get_num_anims, get_anim);
00204 INLINE SpriteAnim *get_last_anim() const;
00205 INLINE ColorInterpolationManager* get_color_interpolation_manager() const;
00206 INLINE LTexCoord get_ll_uv() const;
00207 INLINE LTexCoord get_ll_uv(const int anim, const int frame) const;
00208 INLINE LTexCoord get_ur_uv() const;
00209 INLINE LTexCoord get_ur_uv(const int anim, const int frame) const;
00210 INLINE PN_stdfloat get_width() const;
00211 INLINE PN_stdfloat get_height() const;
00212 INLINE LColor get_color() const;
00213 INLINE bool get_x_scale_flag() const;
00214 INLINE bool get_y_scale_flag() const;
00215 INLINE bool get_anim_angle_flag() const;
00216 INLINE PN_stdfloat get_initial_x_scale() const;
00217 INLINE PN_stdfloat get_final_x_scale() const;
00218 INLINE PN_stdfloat get_initial_y_scale() const;
00219 INLINE PN_stdfloat get_final_y_scale() const;
00220 INLINE PN_stdfloat get_nonanimated_theta() const;
00221 INLINE ParticleRendererBlendMethod get_alpha_blend_method() const;
00222 INLINE bool get_alpha_disable() const;
00223 INLINE bool get_animate_frames_enable() const;
00224 INLINE PN_stdfloat get_animate_frames_rate() const;
00225 INLINE int get_animate_frames_index() const;
00226
00227 virtual void output(ostream &out) const;
00228 virtual void write(ostream &out, int indent_level = 0) const;
00229
00230 private:
00231 pvector< pvector< PT(Geom) > > _sprite_primitive;
00232 pvector< pvector< PT(GeomPoints) > > _sprites;
00233 pvector< pvector< SpriteWriter > > _sprite_writer;
00234 pvector< pvector< PT(GeomVertexData) > > _vdata;
00235
00236 pvector< PT(SpriteAnim) > _anims;
00237
00238 LColor _color;
00239
00240 PN_stdfloat _height;
00241 PN_stdfloat _width;
00242 PN_stdfloat _initial_x_scale;
00243 PN_stdfloat _final_x_scale;
00244 PN_stdfloat _initial_y_scale;
00245 PN_stdfloat _final_y_scale;
00246 PN_stdfloat _theta;
00247 PN_stdfloat _base_y_scale;
00248 PN_stdfloat _aspect_ratio;
00249 PN_stdfloat _animate_frames_rate;
00250 int _animate_frames_index;
00251
00252 bool _animate_x_ratio;
00253 bool _animate_y_ratio;
00254 bool _animate_theta;
00255 bool _alpha_disable;
00256 bool _animate_frames;
00257 bool _animation_removed;
00258
00259 ParticleRendererBlendMethod _blend_method;
00260 PT(ColorInterpolationManager) _color_interpolation_manager;
00261
00262 LVertex _aabb_min;
00263 LVertex _aabb_max;
00264
00265 int _pool_size;
00266
00267 virtual void birth_particle(int index);
00268 virtual void kill_particle(int index);
00269 virtual void init_geoms();
00270 virtual void render(pvector< PT(PhysicsObject) > &po_vector,
00271 int ttl_particles);
00272 virtual void resize_pool(int new_size);
00273 int extract_textures_from_node(const NodePath &node_path, NodePathCollection &np_col, TextureCollection &tex_col);
00274
00275 vector_int _anim_size;
00276 pvector<int*> _ttl_count;
00277 vector_int _birth_list;
00278
00279 static PStatCollector _render_collector;
00280 };
00281
00282 #include "spriteParticleRenderer.I"
00283
00284 #endif // SPRITEPARTICLERENDERER_H