/* ------------------------- CGCam_Track ------------------------- */ void CGCam_Track( int trackNum, float speed, float initLerp ) { centity_t *trackEnt = &cg_entities[trackNum]; CGCam_TrackDisable(); if(trackNum == ENTITYNUM_WORLD) {//turn off tracking return; } client_camera.info_state |= CAMERA_TRACKING; client_camera.info_state &= ~CAMERA_MOVING; client_camera.trackEntNum = trackNum; client_camera.initSpeed = speed/10.0f; client_camera.speed = speed; client_camera.nextTrackEntUpdateTime = cg.time; if ( initLerp ) { client_camera.trackInitLerp = qtrue; } else { client_camera.trackInitLerp = qfalse; } //Set a moveDir VectorSubtract( trackEnt->currentState.origin, client_camera.origin, client_camera.moveDir ); if ( !client_camera.trackInitLerp ) {//want to snap to first position //Snap to trackEnt's origin //VectorCopy( trackEnt->currentOrigin, client_camera.origin ); VectorCopy( trackEnt->currentState.origin, client_camera.origin ); //Set new moveDir if trackEnt has a next path_corner //Possible that track has no next point, in which case we won't be moving anyway } VectorNormalize( client_camera.moveDir ); }
void CGCam_StartRoff( char *roff ) { CGCam_FollowDisable(); CGCam_TrackDisable(); // Set up the roff state info..we'll hijack the moving and panning code until told otherwise // ...CAMERA_FOLLOWING would be a case that could override this.. client_camera.info_state |= CAMERA_MOVING; client_camera.info_state |= CAMERA_PANNING; if ( !G_LoadRoff( roff ) ) { // The load failed so don't turn on the roff playback... Com_Printf( S_COLOR_RED"ROFF camera playback failed\n" ); return; }; client_camera.info_state |= CAMERA_ROFFING; Q_strncpyz(client_camera.sRoff,roff,sizeof(client_camera.sRoff)); client_camera.roff_frame = 0; client_camera.next_roff_time = cg.time; // I can work right away }
void CGCam_Move( vec3_t dest, float duration ) { if ( client_camera.info_state & CAMERA_ROFFING ) { client_camera.info_state &= ~CAMERA_ROFFING; } CGCam_TrackDisable(); CGCam_DistanceDisable(); if ( !duration ) { client_camera.info_state &= ~CAMERA_MOVING; CGCam_SetPosition( dest ); return; } client_camera.info_state |= CAMERA_MOVING; VectorCopy( dest, client_camera.origin2 ); client_camera.move_duration = duration; client_camera.move_time = cg.time; }
void CGCam_TrackEntUpdate ( void ) {//FIXME: only do every 100 ms gentity_t *trackEnt = NULL; gentity_t *newTrackEnt = NULL; qboolean reached = qfalse; vec3_t vec; float dist; if ( client_camera.trackEntNum >= 0 && client_camera.trackEntNum < ENTITYNUM_WORLD ) {//We're already heading to a path_corner trackEnt = &g_entities[client_camera.trackEntNum]; VectorSubtract( trackEnt->currentOrigin, client_camera.origin, vec ); dist = VectorLengthSquared( vec ); if ( dist < 256 )//16 squared {//FIXME: who should be doing the using here? G_UseTargets( trackEnt, trackEnt ); reached = qtrue; } } if ( trackEnt && reached ) { if ( trackEnt->target && trackEnt->target[0] ) {//Find our next path_corner newTrackEnt = G_Find( NULL, FOFS(targetname), trackEnt->target ); if ( newTrackEnt ) { if ( newTrackEnt->radius < 0 ) {//Don't bother trying to maintain a radius client_camera.distance = 0; client_camera.speed = client_camera.initSpeed; } else if ( newTrackEnt->radius > 0 ) { client_camera.distance = newTrackEnt->radius; } if ( newTrackEnt->speed < 0 ) {//go back to our default speed client_camera.speed = client_camera.initSpeed; } else if ( newTrackEnt->speed > 0 ) { client_camera.speed = newTrackEnt->speed/10.0f; } } } else {//stop thinking if this is the last one CGCam_TrackDisable(); } } if ( newTrackEnt ) {//Update will lerp this client_camera.info_state |= CAMERA_TRACKING; client_camera.trackEntNum = newTrackEnt->s.number; VectorCopy( newTrackEnt->currentOrigin, client_camera.trackToOrg ); } client_camera.nextTrackEntUpdateTime = cg.time + 100; }
/* ------------------------- CGCam_Track ------------------------- */ void CGCam_Track( const char *trackName, float speed, float initLerp ) { gentity_t *trackEnt = NULL; CGCam_TrackDisable(); if(Q_stricmp("none", (char *)trackName) == 0) {//turn off tracking return; } //NOTE: if this interrupts a move before it's done, need to copy the cg.refdef.vieworg to the camera.origin! //This will find a path_corner now, not a misc_camera_track trackEnt = G_Find(NULL, FOFS(targetname), (char *)trackName); if ( !trackEnt ) { gi.Printf(S_COLOR_RED"ERROR: %s camera track target not found\n", trackName); return; } client_camera.info_state |= CAMERA_TRACKING; client_camera.info_state &= ~CAMERA_MOVING; client_camera.trackEntNum = trackEnt->s.number; client_camera.initSpeed = speed/10.0f; client_camera.speed = speed; client_camera.nextTrackEntUpdateTime = cg.time; if ( initLerp ) { client_camera.trackInitLerp = qtrue; } else { client_camera.trackInitLerp = qfalse; } /* if ( client_camera.info_state & CAMERA_FOLLOWING ) {//Used to snap angles? Do what...? } */ //Set a moveDir VectorSubtract( trackEnt->currentOrigin, client_camera.origin, client_camera.moveDir ); if ( !client_camera.trackInitLerp ) {//want to snap to first position //Snap to trackEnt's origin VectorCopy( trackEnt->currentOrigin, client_camera.origin ); //Set new moveDir if trackEnt has a next path_corner //Possible that track has no next point, in which case we won't be moving anyway if ( trackEnt->target && trackEnt->target[0] ) { gentity_t *newTrackEnt = G_Find( NULL, FOFS(targetname), trackEnt->target ); if ( newTrackEnt ) { VectorSubtract( newTrackEnt->currentOrigin, client_camera.origin, client_camera.moveDir ); } } } VectorNormalize( client_camera.moveDir ); }