301 glDisable(GL_ALPHA_TEST);
302 glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
306 glEnable(GL_ALPHA_TEST);
307 glBlendFunc(GL_ONE, GL_ZERO);
311 glDisable(GL_ALPHA_TEST);
312 glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
316 glDisable(GL_ALPHA_TEST);
317 glBlendFunc(GL_SRC_COLOR, GL_ONE);
321 glDisable(GL_ALPHA_TEST);
322 glBlendFunc(GL_SRC_ALPHA, GL_ONE);
326 glDisable(GL_ALPHA_TEST);
327 glBlendFunc(GL_DST_COLOR, GL_ZERO);
331 glDisable(GL_ALPHA_TEST);
332 glBlendFunc(GL_DST_COLOR, GL_SRC_COLOR);
336 glDisable(GL_ALPHA_TEST);
337 glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
342 glDisable(GL_ALPHA_TEST);
343 glBlendFunc(GL_DST_COLOR, GL_SRC_COLOR);
348 glActiveTextureARB(GL_TEXTURE0_ARB);
349 glEnable(GL_TEXTURE_2D);
350 glBindTexture(GL_TEXTURE_2D,
texture);
351 glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
355 glActiveTextureARB(GL_TEXTURE0_ARB);
356 glEnable(GL_TEXTURE_2D);
357 glBindTexture(GL_TEXTURE_2D,
texture);
358 glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE);
359 glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_MODULATE);
360 glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA, GL_MODULATE);
361 glTexEnvf(GL_TEXTURE_ENV, GL_RGB_SCALE, 4.0);
362 glTexEnvf(GL_TEXTURE_ENV, GL_ALPHA_SCALE, 4.0);
365 glActiveTextureARB(GL_TEXTURE1_ARB);
366 glEnable(GL_TEXTURE_2D);
367 glBindTexture(GL_TEXTURE_2D,
texture2);
368 glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE);
369 glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_MODULATE);
370 glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA, GL_MODULATE);
371 glActiveTextureARB(GL_TEXTURE0_ARB);
375 glActiveTextureARB(GL_TEXTURE2_ARB);
376 glEnable(GL_TEXTURE_2D);
377 glBindTexture(GL_TEXTURE_2D,
texture3);
378 glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE);
379 glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_MODULATE);
380 glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA, GL_MODULATE);
381 glActiveTextureARB(GL_TEXTURE0_ARB);
384 glm::vec3 vRight(1, 0, 0);
385 glm::vec3 vUp(0, 0, 1);
389 glm::vec3 bv0 = glm::vec3(-f, 0, +f);
390 glm::vec3 bv1 = glm::vec3(+f, 0, +f);
395 glGetFloatv(GL_MODELVIEW_MATRIX, modelview);
397 vRight = glm::vec3(modelview[0], modelview[4], modelview[8]);
398 vUp = glm::vec3(modelview[1], modelview[5], modelview[9]);
409 glm::vec3 vert1, vert2, vert3, vert4, Pos;
416 if (
tiles.size() - 1 < particle.tile)
418 glColor4fv(glm::value_ptr(particle.color));
419 size = particle.size;
430 vert1 = Pos - (vRight + vUp) * size;
431 vert2 = Pos + (vRight - vUp) * size;
432 vert3 = Pos + (vRight + vUp) * size;
433 vert4 = Pos - (vRight - vUp) * size;
437 vert1 = Pos + particle.corners[0] * size;
438 vert2 = Pos + particle.corners[1] * size;
439 vert3 = Pos + particle.corners[2] * size;
440 vert4 = Pos + particle.corners[3] * size;
445 vert1 = Pos + bv0 * size;
446 vert2 = Pos + bv1 * size;
447 vert3 = particle.origin + bv1 * size;
448 vert4 = particle.origin + bv0 * size;
451 glMultiTexCoord2fvARB(GL_TEXTURE0_ARB, glm::value_ptr(
tiles[particle.tile].tc[0]));
453 glMultiTexCoord2fvARB(GL_TEXTURE1_ARB, glm::value_ptr(
tiles[particle.tile].tc[0]));
455 glMultiTexCoord2fvARB(GL_TEXTURE2_ARB, glm::value_ptr(
tiles[particle.tile].tc[0]));
456 glVertex3fv(glm::value_ptr(vert1));
458 glMultiTexCoord2fvARB(GL_TEXTURE0_ARB, glm::value_ptr(
tiles[particle.tile].tc[1]));
460 glMultiTexCoord2fvARB(GL_TEXTURE1_ARB, glm::value_ptr(
tiles[particle.tile].tc[1]));
462 glMultiTexCoord2fvARB(GL_TEXTURE2_ARB, glm::value_ptr(
tiles[particle.tile].tc[1]));
463 glVertex3fv(glm::value_ptr(vert2));
465 glMultiTexCoord2fvARB(GL_TEXTURE0_ARB, glm::value_ptr(
tiles[particle.tile].tc[2]));
467 glMultiTexCoord2fvARB(GL_TEXTURE1_ARB, glm::value_ptr(
tiles[particle.tile].tc[2]));
469 glMultiTexCoord2fvARB(GL_TEXTURE2_ARB, glm::value_ptr(
tiles[particle.tile].tc[2]));
470 glVertex3fv(glm::value_ptr(vert3));
472 glMultiTexCoord2fvARB(GL_TEXTURE0_ARB, glm::value_ptr(
tiles[particle.tile].tc[3]));
474 glMultiTexCoord2fvARB(GL_TEXTURE1_ARB, glm::value_ptr(
tiles[particle.tile].tc[3]));
476 glMultiTexCoord2fvARB(GL_TEXTURE2_ARB, glm::value_ptr(
tiles[particle.tile].tc[3]));
477 glVertex3fv(glm::value_ptr(vert4));
481 glActiveTextureARB(GL_TEXTURE0_ARB);
482 glTexEnvf(GL_TEXTURE_ENV, GL_RGB_SCALE, 1.0);
483 glTexEnvf(GL_TEXTURE_ENV, GL_ALPHA_SCALE, 1.0);
484 glDisable(GL_TEXTURE_2D);
487 glActiveTextureARB(GL_TEXTURE1_ARB);
488 glDisable(GL_TEXTURE_2D);
489 glActiveTextureARB(GL_TEXTURE0_ARB);
493 glActiveTextureARB(GL_TEXTURE2_ARB);
494 glDisable(GL_TEXTURE_2D);
495 glActiveTextureARB(GL_TEXTURE0_ARB);
497 glActiveTextureARB(GL_TEXTURE0_ARB);
560 const float t =
randfloat(0.0f, 2 * glm::pi<float>());
561 p.
pos = glm::vec3(0.0f,
sys->
pos.y + 0.15f,
sys->
pos.z) + glm::vec3(cos(t) / 8, sin(t) / 8, 0.0f);
567 glm::vec3 dir(0.0f, 0.0f, 1.0f);
576 glm::vec3 dir = glm::vec3(mrot * glm::vec4(0.0f, 0.0f, 1.0f, 1.0f));
577 p.
dir = glm::normalize(dir);
593 glm::vec3 dir = glm::vec3(mrot * glm::vec4(0.0f, 0.0f, 1.0f, 1.0f));
594 p.
dir = glm::normalize(dir);
601 glm::vec3 dir = glm::vec3(
sys->
parent->
mrot * glm::vec4(0.0f, 0.0f, 1.0f, 1.0f));
604 p.
down = glm::vec3(0.0f, 0.0f, -1.0f);
605 p.
speed = glm::normalize(dir) * spd * (1.0f +
randfloat(-var, var));
610 p.
corners[0] = glm::vec3(mrot * glm::vec4(-1, 0, +1, +1));
611 p.
corners[1] = glm::vec3(mrot * glm::vec4(+1, 0, +1, +1));
612 p.
corners[2] = glm::vec3(mrot * glm::vec4(+1, 0, -1, +1));
613 p.
corners[3] = glm::vec3(mrot * glm::vec4(-1, 0, -1, +1));
617 size_t l_anim = anim;
virtual Particle newParticle(size_t anim, size_t time, float w, float l, float spd, float var, float spr, float spr2)=0
Create a new particle with the given emission parameters.
Particle newParticle(size_t anim, size_t time, float w, float l, float spd, float var, float spr, float spr2)
Create a new particle with the given emission parameters.
Particle newParticle(size_t anim, size_t time, float w, float l, float spd, float var, float spr, float spr2)
Create a new particle with the given emission parameters.
T lifeRamp(float life, float mid, const T &a, const T &b, const T &c)
glm::vec3 dir
Position, velocity, gravity, origin, and direction.