00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #include "geomParticleRenderer.h"
00020 #include "baseParticle.h"
00021
00022 #include "transformState.h"
00023 #include "colorAttrib.h"
00024
00025
00026
00027
00028
00029
00030
00031 GeomParticleRenderer::
00032 GeomParticleRenderer(ParticleRendererAlphaMode am, PandaNode *geom_node) :
00033 BaseParticleRenderer(am), _geom_node(geom_node), _pool_size(0) {
00034
00035 if (_geom_node.is_null())
00036 _geom_node = new PandaNode("empty");
00037 }
00038
00039
00040
00041
00042
00043
00044
00045 GeomParticleRenderer::
00046 GeomParticleRenderer(const GeomParticleRenderer& copy) :
00047 BaseParticleRenderer(copy), _pool_size(0) {
00048 _geom_node = copy._geom_node;
00049 }
00050
00051
00052
00053
00054
00055
00056
00057 GeomParticleRenderer::
00058 ~GeomParticleRenderer(void) {
00059 kill_nodes();
00060 }
00061
00062
00063
00064
00065
00066
00067
00068 BaseParticleRenderer *GeomParticleRenderer::
00069 make_copy(void) {
00070 return new GeomParticleRenderer(*this);
00071 }
00072
00073
00074
00075
00076
00077
00078
00079 void GeomParticleRenderer::
00080 init_geoms(void) {
00081 }
00082
00083
00084
00085
00086
00087
00088
00089 void GeomParticleRenderer::
00090 resize_pool(int new_size) {
00091 kill_nodes();
00092
00093
00094
00095
00096 int i;
00097 for (i = 0; i < new_size; i++) {
00098 _node_vector.push_back(NULL);
00099 }
00100
00101 _pool_size = new_size;
00102 }
00103
00104
00105
00106
00107
00108
00109 void GeomParticleRenderer::
00110 kill_nodes(void) {
00111 pvector< PT(PandaNode) >::iterator vec_iter = _node_vector.begin();
00112
00113 PandaNode *render_node = get_render_node();
00114 for (; vec_iter != _node_vector.end(); vec_iter++) {
00115 PandaNode *node = *vec_iter;
00116 if (node != (PandaNode *)NULL) {
00117 render_node->remove_child(node);
00118 }
00119 }
00120
00121 _node_vector.erase(_node_vector.begin(), _node_vector.end());
00122 }
00123
00124
00125
00126
00127
00128
00129
00130 void GeomParticleRenderer::
00131 birth_particle(int index) {
00132 if (_node_vector[index] == (PandaNode *)NULL) {
00133 PandaNode *node = new PandaNode("");
00134 get_render_node()->add_child(node);
00135 node->add_child(_geom_node);
00136 _node_vector[index] = node;
00137 }
00138 }
00139
00140
00141
00142
00143
00144
00145
00146 void GeomParticleRenderer::
00147 kill_particle(int index) {
00148 if (_node_vector[index] != (PandaNode *)NULL) {
00149 get_render_node()->remove_child(_node_vector[index]);
00150 _node_vector[index] = (PandaNode *)NULL;
00151 }
00152 }
00153
00154
00155
00156
00157
00158
00159
00160 void GeomParticleRenderer::
00161 render(pvector< PT(PhysicsObject) >& po_vector, int ttl_particles) {
00162 BaseParticle *cur_particle;
00163 LPoint3f pos;
00164 int i, remaining_particles = ttl_particles;
00165
00166 pvector< PT(PandaNode) >::iterator cur_node_iter = _node_vector.begin();
00167
00168
00169
00170 for (i = 0; i < (int)po_vector.size(); i++) {
00171 PandaNode *cur_node;
00172
00173 cur_particle = (BaseParticle *) po_vector[i].p();
00174 cur_node = *cur_node_iter;
00175
00176 if (cur_particle->get_alive()) {
00177
00178 if (cur_node == (PandaNode *)NULL) {
00179 birth_particle(i);
00180 cur_node = *cur_node_iter;
00181 }
00182 nassertv(cur_node != (PandaNode *)NULL);
00183
00184 pos = cur_particle->get_position();
00185
00186 cur_node->set_state(_render_state);
00187
00188 if ((_alpha_mode != PR_ALPHA_NONE)) {
00189 float alpha_scalar;
00190
00191 if(_alpha_mode == PR_ALPHA_USER) {
00192 alpha_scalar = get_user_alpha();
00193 } else {
00194 alpha_scalar = cur_particle->get_parameterized_age();
00195 if (_alpha_mode == PR_ALPHA_OUT)
00196 alpha_scalar = 1.0f - alpha_scalar;
00197 alpha_scalar *= get_user_alpha();
00198 }
00199
00200 cur_node->set_attrib(ColorAttrib::make_flat
00201 (Colorf(1.0f, 1.0f, 1.0f, alpha_scalar)));
00202 }
00203
00204 cur_node->set_transform(TransformState::make_pos(pos));
00205
00206
00207
00208 remaining_particles--;
00209
00210 if (remaining_particles == 0)
00211 break;
00212 }
00213
00214 cur_node_iter++;
00215 }
00216 }