/* =============== CG_RunCEntity =============== */ static void CG_RunCEntity( centity_t* cent ) { if ( cent->lastUpdateFrame == cg.clientFrame ) return; // it was already updated (this may happen for attachment parents) cent->lastUpdateFrame = cg.clientFrame; // calculate the current origin CG_CalcEntityLerpPositions( cent ); // update entity emitter CG_UpdateEntityEmitter( cent ); }
static int demoSetupView( void) { vec3_t forward; int inwater = qfalse; qboolean behindView = qfalse; int contents; cg.playerPredicted = qfalse; cg.playerCent = 0; demo.viewFocus = 0; demo.viewTarget = -1; switch (demo.viewType) { case viewChase: if ( demo.chase.cent && demo.chase.distance < mov_chaseRange.value ) { centity_t *cent = demo.chase.cent; if ( cent->currentState.number < MAX_CLIENTS ) { cg.playerCent = cent; cg.playerPredicted = cent == &cg.predictedPlayerEntity; if (!cg.playerPredicted ) { //Make sure lerporigin of playercent is val CG_CalcEntityLerpPositions( cg.playerCent ); } cg.renderingThirdPerson = cg_thirdPerson.integer || (cg.snap->ps.stats[STAT_HEALTH] <= 0); CG_CalcViewValues(); // first person blend blobs, done after AnglesToAxis if ( !cg.renderingThirdPerson ) { CG_DamageBlendBlob(); } VectorCopy( cg.refdef.vieworg, demo.viewOrigin ); VectorCopy( cg.refdefViewAngles, demo.viewAngles ); } else { VectorCopy( cent->lerpOrigin, demo.viewOrigin ); VectorCopy( cent->lerpAngles, demo.viewAngles ); } demo.viewFov = cg_fov.value; } else { memset( &cg.refdef, 0, sizeof(refdef_t)); AngleVectors( demo.chase.angles, forward, 0, 0 ); VectorMA( demo.chase.origin , -demo.chase.distance, forward, demo.viewOrigin ); VectorCopy( demo.chase.angles, demo.viewAngles ); demo.viewFov = cg_fov.value; demo.viewTarget = demo.chase.target; cg.renderingThirdPerson = qtrue; } break; case viewCamera: memset( &cg.refdef, 0, sizeof(refdef_t)); VectorCopy( demo.camera.origin, demo.viewOrigin ); VectorCopy( demo.camera.angles, demo.viewAngles ); demo.viewFov = demo.camera.fov + cg_fov.value; demo.viewTarget = demo.camera.target; cg.renderingThirdPerson = qtrue; cameraMove(); break; case viewEffect: memset( &cg.refdef, 0, sizeof(refdef_t)); if ( demo.effect.active ) { VectorCopy( demo.effect.active->origin, demo.viewOrigin ); VectorCopy( demo.effect.active->angles, demo.viewAngles ); demo.viewAngles[ROLL] = 0; demo.viewFov = cg_fov.value; cg.renderingThirdPerson = qtrue; } break; default: return inwater; } demo.viewAngles[YAW] += mov_deltaYaw.value; demo.viewAngles[PITCH] += mov_deltaPitch.value; demo.viewAngles[ROLL] += mov_deltaRoll.value; trap_FX_VibrateView( 1.0f, demo.viewOrigin, demo.viewAngles ); VectorCopy( demo.viewOrigin, cg.refdef.vieworg ); AnglesToAxis( demo.viewAngles, cg.refdef.viewaxis ); /* find focus ditance to certain target but don't apply if dof is not locked, use for drawing */ if ( demo.dof.target >= 0 ) { centity_t* targetCent = demoTargetEntity( demo.dof.target ); if ( targetCent ) { vec3_t targetOrigin; chaseEntityOrigin( targetCent, targetOrigin ); //Find distance betwene plane of camera and this target demo.viewFocus = DotProduct( cg.refdef.viewaxis[0], targetOrigin ) - DotProduct( cg.refdef.viewaxis[0], cg.refdef.vieworg ); demo.dof.focus = demo.viewFocusOld = demo.viewFocus; } else { demo.dof.focus = demo.viewFocus = demo.viewFocusOld; } if (demo.dof.focus < 0.001f) { behindView = qtrue; } } if ( demo.dof.locked ) { if (!behindView) { demo.viewFocus = demo.dof.focus; demo.viewRadius = demo.dof.radius; } else { demo.viewFocus = 0.002f; // no matter what value, just not less or equal zero demo.viewRadius = 0.0f; } } else if ( demo.viewTarget >= 0 ) { centity_t* targetCent = demoTargetEntity( demo.viewTarget ); if ( targetCent ) { vec3_t targetOrigin; chaseEntityOrigin( targetCent, targetOrigin ); //Find distance betwene plane of camera and this target demo.viewFocus = DotProduct( cg.refdef.viewaxis[0], targetOrigin ) - DotProduct( cg.refdef.viewaxis[0], cg.refdef.vieworg ); demo.viewRadius = CG_Cvar_Get( "mme_dofRadius" ); } } else if ( demo.dof.target >= 0 ) { demo.viewFocus = 0; demo.viewRadius = 0; } cg.refdef.width = cgs.glconfig.vidWidth*cg_viewsize.integer/100; cg.refdef.width &= ~1; cg.refdef.height = cgs.glconfig.vidHeight*cg_viewsize.integer/100; cg.refdef.height &= ~1; cg.refdef.x = (cgs.glconfig.vidWidth - cg.refdef.width)/2; cg.refdef.y = (cgs.glconfig.vidHeight - cg.refdef.height)/2; cg.refdef.fov_x = demo.viewFov; cg.refdef.fov_y = atan2( cg.refdef.height, (cg.refdef.width / tan( demo.viewFov / 360 * M_PI )) ) * 360 / M_PI; contents = CG_PointContents( cg.refdef.vieworg, -1 ); if ( contents & ( CONTENTS_WATER | CONTENTS_SLIME | CONTENTS_LAVA ) ){ double v = WAVE_AMPLITUDE * sin(((double)cg.time + (double)cg.timeFraction) / 1000.0 * WAVE_FREQUENCY * M_PI * 2); cg.refdef.fov_x += v; cg.refdef.fov_y -= v; inwater = qtrue; } else { inwater = qfalse; } return inwater; }