static void CG_DoGlassQuad( vec3_t p[4], vec2_t uv[4], bool stick, int time, vec3_t dmgDir ) { float bounce; vec3_t rotDelta; vec3_t vel, accel; vec3_t rgb1; VectorSet( vel, Q_flrand(-1.0f, 1.0f) * 12, Q_flrand(-1.0f, 1.0f) * 12, -1 ); if ( !stick ) { // We aren't a motion delayed chunk, so let us move quickly VectorMA( vel, 0.3f, dmgDir, vel ); } // Set up acceleration due to gravity, 800 is standard QuakeIII gravity, so let's use something close VectorSet( accel, 0.0f, 0.0f, -(600.0f + Q_flrand(0.0f, 1.0f) * 100.0f ) ); VectorSet( rgb1, 1.0f, 1.0f, 1.0f ); // Being glass, we don't want to bounce much bounce = Q_flrand(0.0f, 1.0f) * 0.2f + 0.15f; // Set up our random rotate, we only do PITCH and YAW, not ROLL. This is something like degrees per second VectorSet( rotDelta, Q_flrand(-1.0f, 1.0f) * 40.0f, Q_flrand(-1.0f, 1.0f) * 40.0f, 0.0f ); CPoly *pol = FX_AddPoly(p, uv, 4, // verts, ST, vertCount vel, accel, // motion 0.15f, 0.0f, 85.0f, // alpha start, alpha end, alpha parm ( begin alpha fade when 85% of life is complete ) rgb1, rgb1, 0.0f, // rgb start, rgb end, rgb parm ( not used ) rotDelta, bounce, time, // rotation amount, bounce, and time to delay motion for ( zero if no delay ); 3500 + Q_flrand(0.0f, 1.0f) * 1000, // life cgi_R_RegisterShader( "gfx/misc/test_crackle" ), FX_APPLY_PHYSICS | FX_ALPHA_NONLINEAR | FX_USE_ALPHA ); if ( Q_flrand(0.0f, 1.0f) > 0.95f && pol ) { pol->AddFlags( FX_IMPACT_RUNS_FX | FX_KILL_ON_IMPACT ); pol->SetImpactFxID( theFxScheduler.RegisterEffect( "misc/glass_impact" )); } }
static void CGFX_AddPoly( addpolyArgStruct_t *p ) { FX_AddPoly( p->p, p->ev, p->numVerts, p->vel, p->accel, p->alpha1, p->alpha2, p->alphaParm, p->rgb1, p->rgb2, p->rgbParm, p->rotationDelta, p->bounce, p->motionDelay, p->killTime, p->shader, p->flags ); }