~macslow/+junk/gl-particles

« back to all changes in this revision

Viewing changes to opengl.c

  • Committer: Mirco Müller
  • Date: 2009-11-05 01:24:40 UTC
  • Revision ID: mirco.mueller@ubuntu.com-20091105012440-5o5lbqnwljnw3jst
added gravity-force, added singularity-emitter, using 5000 particles now, looks a bit like a waterfall now

Show diffs side-by-side

added added

removed removed

Lines of Context:
33
33
#include "opengl.h"
34
34
#include "particle.h"
35
35
 
36
 
#define Z_NEAR          0.1f
37
 
#define Z_FAR         100.0f
38
 
#define FOVY           35.0f
39
 
#define MAX_PARTICLES 100
 
36
#define Z_NEAR           0.1f
 
37
#define Z_FAR          100.0f
 
38
#define FOVY            35.0f
 
39
#define MAX_PARTICLES 5000
40
40
 
41
41
GLdouble  g_camera_rot[3] = {169.5f, 246.5f,  0.0f};  // camera's pitch, yaw, roll
42
42
GLdouble  g_camera_pos[3] = {  3.94f,  3.71f, 4.97f}; // camera-center/eye
44
44
GLdouble  g_camera_up[3]  = {  0.0f,   1.0f,  0.0f};  // camera's up-vector
45
45
GLdouble  g_direction[3]  = {  0.0f,   0.0f,  1.0f};  // normalized view-vector
46
46
GLuint    g_coord_list_id = 0;                        // display-list id
 
47
GRand*    g_rand          = NULL;                     // rand. number-generator
47
48
Particle* g_particles[MAX_PARTICLES];                 // list of particles
48
49
 
49
50
void
164
165
}
165
166
 
166
167
void
 
168
_randomize_particle (Particle* particle)
 
169
{
 
170
        if (!particle)
 
171
                return;
 
172
 
 
173
        if (!g_rand)
 
174
                return;
 
175
 
 
176
        // wall-emitter
 
177
        particle->position[X]  = g_rand_double_range (g_rand, -0.5f, 0.5f);
 
178
        particle->position[Y]  = g_rand_double_range (g_rand,  1.0f, 1.3f);
 
179
        particle->position[Z]  = -1.0f;
 
180
        particle->direction[X] = g_rand_double_range (g_rand, -0.2f, 0.2f);
 
181
        particle->direction[Y] = g_rand_double_range (g_rand, -0.2f, 0.2f);
 
182
        particle->direction[Z] = g_rand_double_range (g_rand, 0.01f, 1.0f);
 
183
        particle->speed        = g_rand_double_range (g_rand, 0.05f, 0.1f);
 
184
        particle->age          = 0.0f;
 
185
        particle->lifetime     = g_rand_double_range (g_rand,
 
186
                                                      1.0f,
 
187
                                                      0.1f * 60.0f * 2.0f);
 
188
 
 
189
        // singularity-emitter
 
190
        /*particle->position[X]  = 0.0f;
 
191
        particle->position[Y]  = 0.0f;
 
192
        particle->position[Z]  = 0.0f;
 
193
        particle->direction[X] = g_rand_double_range (g_rand, -0.5f, 0.5f);
 
194
        particle->direction[Y] = g_rand_double_range (g_rand, -0.5f, 0.5f);
 
195
        particle->direction[Z] = g_rand_double_range (g_rand, -0.5f, 0.5f);
 
196
        particle->speed        = g_rand_double_range (g_rand, 0.03f, 0.06f);
 
197
        particle->age          = 0.0f;
 
198
        particle->lifetime     = g_rand_double_range (g_rand,
 
199
                                                      1.0f,
 
200
                                                      0.1f * 60.0f * 1.0f);*/
 
201
 
 
202
}
 
203
 
 
204
void
 
205
_apply_gravity (Particle* particle)
 
206
{
 
207
        if (!particle)
 
208
                return;
 
209
 
 
210
        particle->direction[Y] += -0.1f;
 
211
        particle->speed        += 0.001f;
 
212
}
 
213
 
 
214
void
167
215
_create_particles ()
168
216
{
169
 
        int     i;
170
 
        GRand*  rand         = NULL;
171
 
        gdouble position[3]  = {0.0f, 0.0f, 0.0f};
172
 
        gdouble direction[3] = {0.0f, 0.0f, 0.0f};
173
 
        gdouble speed        = 0.0f;
174
 
        gdouble lifetime     = 0.0f;
 
217
        int    i;
 
218
        double position[3]  = {0.0f, 0.0f, 0.0f};
 
219
        double direction[3] = {0.0f, 0.0f, 0.0f};
 
220
        double speed        = 1.0f;
 
221
        double lifetime     = 1.0f;
175
222
 
176
 
        rand = g_rand_new_with_seed (g_random_int ());
177
 
        if (!rand)
 
223
        if (!g_rand)
178
224
                return;
179
225
 
180
226
        for (i = 0; i < MAX_PARTICLES; i++)
181
227
        {
182
 
                position[X]  = g_rand_double_range (rand, -0.5f, 0.5f);
183
 
                position[Y]  = g_rand_double_range (rand, -0.5f, 0.5f);
184
 
                position[Z]  = -2.0f;
185
 
                direction[X] = g_rand_double_range (rand, -0.2f, 0.2f);
186
 
                direction[Y] = g_rand_double_range (rand, -0.2f, 0.2f);
187
 
                direction[Z] = g_rand_double_range (rand, 0.01f, 1.0f);
188
 
                speed        = g_rand_double_range (rand, 0.0f, 0.01f);
189
 
                lifetime     = g_rand_double_range (rand,
190
 
                                                    1.0f,
191
 
                                                    0.1f * 60.0f * 60.0f);
192
228
                g_particles[i] = particle_create (position,
193
229
                                                  direction,
194
230
                                                  speed,
195
231
                                                  lifetime);
 
232
                _randomize_particle (g_particles[i]);
196
233
        }
197
 
 
198
 
        g_rand_free (rand);
199
234
}
200
235
 
201
236
void
209
244
                {
210
245
                        if (g_particles[i]->age < g_particles[i]->lifetime)
211
246
                        {
 
247
                                _apply_gravity (g_particles[i]);
212
248
                                particle_update (g_particles[i]);
213
249
                        }
214
250
                        else
215
 
                        {
216
 
                                particle_destroy (g_particles[i]);
217
 
                                g_particles[i] = NULL;
218
 
                        }
 
251
                                _randomize_particle (g_particles[i]);
219
252
                }                       
220
253
        }
221
254
}
621
654
        }
622
655
 
623
656
        // initialize particle list
 
657
        g_rand = g_rand_new_with_seed (g_random_int ());
624
658
        _create_particles ();
625
659
 
 
660
        // position "camera"
626
661
        _recalc_camera ();
627
 
 
628
662
        gluLookAt (g_camera_pos[X], g_camera_pos[Y], g_camera_pos[Z],
629
663
                   g_camera_aim[X], g_camera_aim[Y], g_camera_aim[Z],
630
664
                   g_camera_up[X],  g_camera_up[Y],  g_camera_up[Z]);
698
732
opengl_cleanup ()
699
733
{
700
734
        _destroy_particles ();
 
735
        g_rand_free (g_rand);
701
736
}
702
737
 
703
738
void