/** * @brief Generate rain particle * @details Attempt to 'spot' a raindrop somewhere below a sky texture. */ static qboolean CG_RainParticleGenerate(cg_atmosphericParticle_t *particle, vec3_t currvec, float currweight) { float angle = random() * 2 * M_PI, distance = 20 + MAX_ATMOSPHERIC_DISTANCE * random(); float groundHeight, skyHeight; particle->pos[0] = cg.refdef_current->vieworg[0] + sin(angle) * distance; particle->pos[1] = cg.refdef_current->vieworg[1] + cos(angle) * distance; // choose a spawn point randomly between sky and ground skyHeight = BG_GetSkyHeightAtPoint(particle->pos); if (skyHeight >= MAX_ATMOSPHERIC_HEIGHT) { return qfalse; } groundHeight = BG_GetSkyGroundHeightAtPoint(particle->pos); if (groundHeight + particle->height + ATMOSPHERIC_PARTICLE_OFFSET >= skyHeight) { return qfalse; } particle->pos[2] = groundHeight + random() * (skyHeight - groundHeight); // make sure it doesn't fall from too far cause it then will go over our heads ('lower the ceiling') if (cg_atmFx.baseHeightOffset > 0) { if (particle->pos[2] - cg.refdef_current->vieworg[2] > cg_atmFx.baseHeightOffset) { particle->pos[2] = cg.refdef_current->vieworg[2] + cg_atmFx.baseHeightOffset; if (particle->pos[2] < groundHeight) { return qfalse; } } } // rain goes in bursts - allow max raindrops every 10 seconds if (cg_atmFx.oldDropsActive > (0.50 * cg_atmFx.numDrops + 0.001 * cg_atmFx.numDrops * (10000 - (cg.time % 10000)))) { return qfalse; } CG_SetParticleActive(particle, ACT_FALLING); particle->colour[0] = 0.6 + 0.2 * random() * 0xFF; particle->colour[1] = 0.6 + 0.2 * random() * 0xFF; particle->colour[2] = 0.6 + 0.2 * random() * 0xFF; VectorCopy(currvec, particle->delta); particle->delta[2] += crandom() * 100; VectorCopy(particle->delta, particle->deltaNormalized); VectorNormalizeFast(particle->deltaNormalized); particle->height = ATMOSPHERIC_RAIN_HEIGHT + crandom() * 100; particle->weight = currweight; particle->effectshader = &cg_atmFx.effectshaders[0]; //particle->effectshader = &cg_atmFx.effectshaders[ (int) (random() * ( cg_atmFx.numEffectShaders - 1 )) ]; return qtrue; }
static qboolean CG_SnowParticleGenerate( cg_atmosphericParticle_t *particle, vec3_t currvec, float currweight ) { // Attempt to 'spot' a snowflake somewhere below a sky texture. float angle, distance; float groundHeight, skyHeight; // int msec = trap_Milliseconds(); // n_generatetime++; angle = random() * 2 * M_PI; distance = 20 + MAX_ATMOSPHERIC_DISTANCE * random(); particle->pos[0] = cg.refdef.vieworg[0] + sin( angle ) * distance; particle->pos[1] = cg.refdef.vieworg[1] + cos( angle ) * distance; // ydnar: choose a spawn point randomly between sky and ground skyHeight = BG_GetSkyHeightAtPoint( particle->pos ); if ( skyHeight == MAX_ATMOSPHERIC_HEIGHT ) { return qfalse; } groundHeight = BG_GetSkyGroundHeightAtPoint( particle->pos ); if ( groundHeight >= skyHeight ) { return qfalse; } particle->pos[2] = groundHeight + random() * ( skyHeight - groundHeight ); // make sure it doesn't fall from too far cause it then will go over our heads ('lower the ceiling') if ( cg_atmFx.baseHeightOffset > 0 ) { if ( particle->pos[2] - cg.refdef.vieworg[2] > cg_atmFx.baseHeightOffset ) { particle->pos[2] = cg.refdef.vieworg[2] + cg_atmFx.baseHeightOffset; if ( particle->pos[2] < groundHeight ) { return qfalse; } } } CG_SetParticleActive( particle, ACT_FALLING ); VectorCopy( currvec, particle->delta ); particle->delta[2] += crandom() * 25; VectorCopy( particle->delta, particle->deltaNormalized ); VectorNormalizeFast( particle->deltaNormalized ); particle->height = ATMOSPHERIC_SNOW_HEIGHT + random() * 2; particle->weight = particle->height * 0.5f; if (cg_atmFx.numEffectShaders > 1) { particle->effectshader = &cg_atmFx.effectshaders[ rand()%cg_atmFx.numEffectShaders ]; } else { particle->effectshader = &cg_atmFx.effectshaders[0]; } // generatetime += trap_Milliseconds() - msec; return( qtrue ); }
/** * @brief Generate a snowflake * @details Attempt to 'spot' a snowflake somewhere below a sky texture. */ static qboolean CG_SnowParticleGenerate(cg_atmosphericParticle_t *particle, vec3_t currvec, float currweight) { float angle = random() * 2 * M_PI, distance = 20 + MAX_ATMOSPHERIC_DISTANCE * random(); float groundHeight, skyHeight; particle->pos[0] = cg.refdef_current->vieworg[0] + sin(angle) * distance; particle->pos[1] = cg.refdef_current->vieworg[1] + cos(angle) * distance; // choose a spawn point randomly between sky and ground skyHeight = BG_GetSkyHeightAtPoint(particle->pos); if (skyHeight >= MAX_ATMOSPHERIC_HEIGHT) { return qfalse; } groundHeight = BG_GetSkyGroundHeightAtPoint(particle->pos); if (groundHeight + particle->height + ATMOSPHERIC_PARTICLE_OFFSET >= skyHeight) { return qfalse; } particle->pos[2] = groundHeight + random() * (skyHeight - groundHeight); // make sure it doesn't fall from too far cause it then will go over our heads ('lower the ceiling') if (cg_atmFx.baseHeightOffset > 0) { if (particle->pos[2] - cg.refdef_current->vieworg[2] > cg_atmFx.baseHeightOffset) { particle->pos[2] = cg.refdef_current->vieworg[2] + cg_atmFx.baseHeightOffset; if (particle->pos[2] < groundHeight) { return qfalse; } } } CG_SetParticleActive(particle, ACT_FALLING); VectorCopy(currvec, particle->delta); particle->delta[2] += crandom() * 25; VectorCopy(particle->delta, particle->deltaNormalized); VectorNormalizeFast(particle->deltaNormalized); particle->height = ATMOSPHERIC_SNOW_HEIGHT + random() * 2; particle->weight = particle->height * 0.5f; particle->effectshader = &cg_atmFx.effectshaders[0]; //particle->effectshader = &cg_atmFx.effectshaders[ (int) (random() * ( cg_atmFx.numEffectShaders - 1 )) ]; return qtrue; }
static qboolean CG_RainParticleGenerate( cg_atmosphericParticle_t *particle, vec3_t currvec, float currweight ) { // Attempt to 'spot' a raindrop somewhere below a sky texture. float angle, distance; float groundHeight, skyHeight; // int msec = trap_Milliseconds(); // n_generatetime++; angle = random() * 2*M_PI; distance = 20 + MAX_ATMOSPHERIC_DISTANCE * random(); particle->pos[0] = cg.refdef_current->vieworg[0] + sin(angle) * distance; particle->pos[1] = cg.refdef_current->vieworg[1] + cos(angle) * distance; // ydnar: choose a spawn point randomly between sky and ground skyHeight = BG_GetSkyHeightAtPoint( particle->pos ); if( skyHeight == MAX_ATMOSPHERIC_HEIGHT ) return qfalse; groundHeight = BG_GetSkyGroundHeightAtPoint( particle->pos ); if( groundHeight >= skyHeight ) return qfalse; particle->pos[2] = groundHeight + random() * (skyHeight - groundHeight); // make sure it doesn't fall from too far cause it then will go over our heads ('lower the ceiling') if( cg_atmFx.baseHeightOffset > 0 ) { if( particle->pos[2] - cg.refdef_current->vieworg[2] > cg_atmFx.baseHeightOffset ) { particle->pos[2] = cg.refdef_current->vieworg[2] + cg_atmFx.baseHeightOffset; if( particle->pos[2] < groundHeight ) { return qfalse; } } } // ydnar: rain goes in bursts { float maxActiveDrops; // every 10 seconds allow max raindrops maxActiveDrops = 0.50 * cg_atmFx.numDrops + 0.001 * cg_atmFx.numDrops * (10000 - (cg.time % 10000)); if( cg_atmFx.oldDropsActive > maxActiveDrops ) return qfalse; } CG_SetParticleActive( particle, ACT_FALLING ); particle->colour[0] = 0.6 + 0.2 * random() * 0xFF; particle->colour[1] = 0.6 + 0.2 * random() * 0xFF; particle->colour[2] = 0.6 + 0.2 * random() * 0xFF; VectorCopy( currvec, particle->delta ); particle->delta[2] += crandom() * 100; VectorCopy( particle->delta, particle->deltaNormalized ); VectorNormalizeFast( particle->deltaNormalized ); particle->height = ATMOSPHERIC_RAIN_HEIGHT + crandom() * 100; particle->weight = currweight; particle->effectshader = &cg_atmFx.effectshaders[0]; // particle->effectshader = &cg_atmFx.effectshaders[ (int) (random() * ( cg_atmFx.numEffectShaders - 1 )) ]; // generatetime += trap_Milliseconds() - msec; return( qtrue ); }