00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00040 #include "omicron/internal.h"
00041 #include "omicron/render.h"
00042 #include "omicron/particle.h"
00043 #include "omicron/array.h"
00044
00045
00046
00047
00048
00049
00050
00051 particle_emitter_c::particle_emitter_c()
00052 {
00053 birthrate = 1;
00054
00055 minangles.set(-180, -90, 0);
00056 maxangles.set( 180, 90, 1);
00057
00058 shape = ES_POINT;
00059
00060 pos.clear();
00061 lastpos.clear();
00062
00063 newparts = 0;
00064
00065 starttime = 0;
00066 endtime = 0;
00067
00068 }
00069
00070 particle_emitter_c::~particle_emitter_c()
00071 {
00072 if (psystem)
00073 psystem->remove_emitter(this);
00074 }
00075
00076 void
00077 particle_emitter_c::update
00078 ()
00079 {
00080 if (!starttime || gv.time<starttime || gv.time>endtime)
00081 {
00082 if (gv.time>endtime)
00083 {
00084
00085 return;
00086 }
00087
00088 lastupdate = gv.time;
00089 newparts = 0;
00090
00091 return;
00092 }
00093
00094 newparts += (gv.time-lastupdate)*birthrate;
00095
00096 while(newparts>=1)
00097 {
00098 particle_type_c *pt = psystem->types->get(particletype);
00099
00100 if (pt)
00101 {
00102 vec3_c speed;
00103 vec3_c angle;
00104 vec3_c tmp;
00105 vec3_c p;
00106
00107 angle.set( frand(minangles[ANGLE_YAW], maxangles[ANGLE_YAW]),
00108 frand(minangles[ANGLE_PITCH], maxangles[ANGLE_PITCH]),
00109 frand(minangles[ANGLE_ROLL], maxangles[ANGLE_ROLL]) );
00110
00111
00112 angle.get_view_from_angles(speed, tmp, tmp);
00113
00114 speed = speed * angle[ANGLE_ROLL];
00115
00116 float r = 0.5f;
00117
00118 switch(shape)
00119 {
00120 case ES_BOX:
00121 p.set(frand(-0.5f, 0.5f), frand(-0.5f, 0.5f), frand(-0.5f, 0.5f));
00122 break;
00123
00124 case ES_BOX|ES_HOLLOW:
00125 switch(rand()%6)
00126 {
00127 case 0:
00128 p.set(-0.5f, frand(-0.5f, 0.5f), frand(-0.5f, 0.5f));
00129 break;
00130 case 1:
00131 p.set( 0.5f, frand(-0.5f, 0.5f), frand(-0.5f, 0.5f));
00132 break;
00133
00134 case 2:
00135 p.set(frand(-0.5f, 0.5f), -0.5f, frand(-0.5f, 0.5f));
00136 break;
00137 case 3:
00138 p.set(frand(-0.5f, 0.5f), 0.5f, frand(-0.5f, 0.5f));
00139 break;
00140
00141 case 4:
00142 p.set(frand(-0.5f, 0.5f), frand(-0.5f, 0.5f), -0.5f);
00143 break;
00144 case 5:
00145 p.set(frand(-0.5f, 0.5f), frand(-0.5f, 0.5f), 0.5f);
00146 break;
00147 }
00148 break;
00149
00150 case ES_SPHERE:
00151 r = frand(0, 0.5f);
00152
00153
00154
00155 case ES_SPHERE|ES_HOLLOW:
00156 {
00157 p.set(r,0,0);
00158 p = p.rotate_vec(frand(-180, 180), vec3_c(0,1,0)).rotate_vec(frand(-90, 90), vec3_c(0,0,1)).rotate_vec(frand(-90, 90), vec3_c(1,0,0));
00159
00160 }
00161 break;
00162
00163 case ES_POINT:
00164 default:
00165 p.set(0,0,0);
00166 break;
00167 }
00168
00169 p = p * scale;
00170
00171 pt->new_particle(pos+p, speed);
00172 }
00173 newparts--;
00174 }
00175
00176 lastupdate = gv.time;
00177 }
00178
00179 void
00180 particle_emitter_c::start
00181 ()
00182 {
00183 starttime = gv.time;
00184 endtime = starttime+duration;
00185 lastupdate = gv.time;
00186 }