static void CG_AddTestModel (void) { int i; // re-register the model, because the level may have changed /* cg.testModelEntity.hModel = cgi_R_RegisterModel( cg.testModelName ); if (! cg.testModelEntity.hModel ) { CG_Printf ("Can't register model\n"); return; } */ // if testing a gun, set the origin reletive to the view origin if ( cg.testGun ) { VectorCopy( cg.refdef.vieworg, cg.testModelEntity.origin ); VectorCopy( cg.refdef.viewaxis[0], cg.testModelEntity.axis[0] ); VectorCopy( cg.refdef.viewaxis[1], cg.testModelEntity.axis[1] ); VectorCopy( cg.refdef.viewaxis[2], cg.testModelEntity.axis[2] ); // allow the position to be adjusted for (i=0 ; i<3 ; i++) { cg.testModelEntity.origin[i] += cg.refdef.viewaxis[0][i] * cg_gun_x.value; cg.testModelEntity.origin[i] += cg.refdef.viewaxis[1][i] * cg_gun_y.value; cg.testModelEntity.origin[i] += cg.refdef.viewaxis[2][i] * cg_gun_z.value; } } cgi_R_AddRefEntityToScene( &cg.testModelEntity ); }
// NOTE: this is 100% for the demp2 alt-fire effect, so changes to the visual effect will affect game side demp2 code //--------------------------------------------------- static void CG_AddFadeScaleModel( localEntity_t *le ) { refEntity_t *ent = &le->refEntity; float frac = ( cg.time - le->startTime )/((float)( le->endTime - le->startTime )); frac *= frac * frac; // yes, this is completely ridiculous...but it causes the shell to grow slowly then "explode" at the end ent->nonNormalizedAxes = qtrue; AxisCopy( axisDefault, ent->axis ); VectorScale( ent->axis[0], le->radius * frac, ent->axis[0] ); VectorScale( ent->axis[1], le->radius * frac, ent->axis[1] ); VectorScale( ent->axis[2], le->radius * 0.5f * frac, ent->axis[2] ); frac = 1.0f - frac; ent->shaderRGBA[0] = le->color[0] * frac; ent->shaderRGBA[1] = le->color[1] * frac; ent->shaderRGBA[2] = le->color[2] * frac; ent->shaderRGBA[3] = le->color[3] * frac; // add the entity cgi_R_AddRefEntityToScene( ent ); }
/* ================== CG_AddPuff ================== */ static void CG_AddPuff( localEntity_t *le ) { refEntity_t *re; float c; vec3_t delta; float len; re = &le->refEntity; // fade / grow time c = ( le->endTime - cg.time ) / (float)( le->endTime - le->startTime ); re->shaderRGBA[0] = le->color[0] * c; re->shaderRGBA[1] = le->color[1] * c; re->shaderRGBA[2] = le->color[2] * c; if ( !( le->leFlags & LEF_PUFF_DONT_SCALE ) ) { re->radius = le->radius * ( 1.0 - c ) + 8; } EvaluateTrajectory( &le->pos, cg.time, re->origin ); // if the view would be "inside" the sprite, kill the sprite // so it doesn't add too much overdraw VectorSubtract( re->origin, cg.refdef.vieworg, delta ); len = VectorLength( delta ); if ( len < le->radius ) { CG_FreeLocalEntity( le ); return; } cgi_R_AddRefEntityToScene( re ); }
/* =================== CG_AddLine for beams and the like. =================== */ void CG_AddLine( localEntity_t *le ) { refEntity_t *re; re = &le->refEntity; re->reType = RT_LINE; cgi_R_AddRefEntityToScene( re ); }
/* ** CG_AddTeleporterEffect */ void CG_AddTeleporterEffect( localEntity_t *le ) { refEntity_t *re; float c; re = &le->refEntity; c = ( le->endTime - cg.time ) / ( float ) ( le->endTime - le->startTime ); re->shaderRGBA[0] = re->shaderRGBA[1] = re->shaderRGBA[2] = re->shaderRGBA[3] = 0xff * c; cgi_R_AddRefEntityToScene( re ); }
/* ** CG_AddFadeRGB */ void CG_AddFadeRGB( localEntity_t *le ) { refEntity_t *re; float c; re = &le->refEntity; c = ( le->endTime - cg.time ) * le->lifeRate; c *= 0xff; re->shaderRGBA[0] = le->color[0] * c; re->shaderRGBA[1] = le->color[1] * c; re->shaderRGBA[2] = le->color[2] * c; re->shaderRGBA[3] = le->color[3] * c; cgi_R_AddRefEntityToScene( re ); }
//--------------------------------------------------- static void CG_AddFadeModel( localEntity_t *le ) { refEntity_t *ent = &le->refEntity; if ( cg.time < le->startTime ) { CG_FreeLocalEntity( le ); return; } float frac = 1.0f - ((float)( cg.time - le->startTime )/(float)( le->endTime - le->startTime )); ent->shaderRGBA[0] = le->color[0] * frac; ent->shaderRGBA[1] = le->color[1] * frac; ent->shaderRGBA[2] = le->color[2] * frac; ent->shaderRGBA[3] = le->color[3] * frac; EvaluateTrajectory( &le->pos, cg.time, ent->origin ); // add the entity cgi_R_AddRefEntityToScene( ent ); }
/* =============== CG_DamageBlendBlob =============== */ static void CG_DamageBlendBlob( void ) { int t; int maxTime; refEntity_t ent; if ( !cg.damageValue ) { return; } // ragePro systems can't fade blends, so don't obscure the screen if ( cgs.glconfig.hardwareType == GLHW_RAGEPRO ) { return; } maxTime = DAMAGE_TIME; t = cg.time - cg.damageTime; if ( t <= 0 || t >= maxTime ) { return; } memset( &ent, 0, sizeof( ent ) ); ent.reType = RT_SPRITE; ent.renderfx = RF_FIRST_PERSON; VectorMA( cg.refdef.vieworg, 8, cg.refdef.viewaxis[0], ent.origin ); VectorMA( ent.origin, cg.damageX * -8, cg.refdef.viewaxis[1], ent.origin ); VectorMA( ent.origin, cg.damageY * 8, cg.refdef.viewaxis[2], ent.origin ); ent.radius = cg.damageValue * 3 * ( 1.0 - ((float)t / maxTime) ); ent.customShader = cgs.media.borgEyeFlareShader; ent.shaderRGBA[0] = 180 * ( 1.0 - ((float)t / maxTime) ); ent.shaderRGBA[1] = 50 * ( 1.0 - ((float)t / maxTime) ); ent.shaderRGBA[2] = 50 * ( 1.0 - ((float)t / maxTime) ); ent.shaderRGBA[3] = 255; cgi_R_AddRefEntityToScene( &ent ); }
/* ================ CG_AddFragment ================ */ void CG_AddFragment( localEntity_t *le ) { vec3_t newOrigin; trace_t trace; // used to sink into the ground, but it looks better to maybe just fade them out int t; t = le->endTime - cg.time; if ( t < FRAG_FADE_TIME ) { le->refEntity.renderfx |= RF_ALPHA_FADE; le->refEntity.shaderRGBA[0] = le->refEntity.shaderRGBA[1] = le->refEntity.shaderRGBA[2] = 255; le->refEntity.shaderRGBA[3] = ((float)t / FRAG_FADE_TIME) * 255.0f; } if ( le->pos.trType == TR_STATIONARY ) { if ( !(cgi_CM_PointContents( le->refEntity.origin, 0 ) & CONTENTS_SOLID )) { // thing is no longer in solid, so let gravity take it back VectorCopy( le->refEntity.origin, le->pos.trBase ); VectorClear( le->pos.trDelta ); le->pos.trTime = cg.time; le->pos.trType = TR_GRAVITY; } cgi_R_AddRefEntityToScene( &le->refEntity ); return; } // calculate new position EvaluateTrajectory( &le->pos, cg.time, newOrigin ); le->refEntity.renderfx |= RF_LIGHTING_ORIGIN; VectorCopy( newOrigin, le->refEntity.lightingOrigin ); // trace a line from previous position to new position CG_Trace( &trace, le->refEntity.origin, NULL, NULL, newOrigin, le->ownerGentNum, CONTENTS_SOLID ); if ( trace.fraction == 1.0 ) { // still in free fall VectorCopy( newOrigin, le->refEntity.origin ); if ( le->leFlags & LEF_TUMBLE ) { vec3_t angles; EvaluateTrajectory( &le->angles, cg.time, angles ); AnglesToAxis( angles, le->refEntity.axis ); for(int k = 0; k < 3; k++) { VectorScale(le->refEntity.axis[k], le->radius, le->refEntity.axis[k]); } } cgi_R_AddRefEntityToScene( &le->refEntity ); return; } // if it is in a nodrop zone, remove it // this keeps gibs from waiting at the bottom of pits of death // and floating levels if ( cgi_CM_PointContents( trace.endpos, 0 ) & CONTENTS_NODROP ) { CG_FreeLocalEntity( le ); return; } // do a bouncy sound CG_FragmentBounceSound( le, &trace ); // reflect the velocity on the trace plane CG_ReflectVelocity( le, &trace ); //FIXME: if LEF_TUMBLE, change avelocity too? cgi_R_AddRefEntityToScene( &le->refEntity ); }
//------------------------------------------------------ void SFxHelper::AddFxToScene( refEntity_t *ent ) { cgi_R_AddRefEntityToScene( ent ); }