void CGCam_Follow( const char *cameraGroup, float speed, float initLerp ) { int len; //Clear any previous CGCam_FollowDisable(); if(!cameraGroup || !cameraGroup[0]) { return; } if ( Q_stricmp("none", (char *)cameraGroup) == 0 ) {//Turn off all aiming return; } if ( Q_stricmp("NULL", (char *)cameraGroup) == 0 ) {//Turn off all aiming return; } //NOTE: if this interrupts a pan before it's done, need to copy the cg.refdef.viewAngles to the camera.angles! client_camera.info_state |= CAMERA_FOLLOWING; client_camera.info_state &= ~CAMERA_PANNING; len = strlen(cameraGroup); strncpy( client_camera.cameraGroup, cameraGroup, sizeof(client_camera.cameraGroup) ); //NULL terminate last char in case they type a name too long client_camera.cameraGroup[len] = 0; if ( speed ) { client_camera.followSpeed = speed; } else { client_camera.followSpeed = 100.0f; } if ( initLerp ) { client_camera.followInitLerp = qtrue; } else { client_camera.followInitLerp = qfalse; } }
//void CGCam_Follow( const char *cameraGroup, float speed, float initLerp ) void CGCam_Follow( int cameraGroup[MAX_CAMERA_GROUP_SUBJECTS], float speed, float initLerp ) { int len; //Clear any previous CGCam_FollowDisable(); if(cameraGroup[0] == -2) {//only wanted to disable follow mode return; } //NOTE: if this interrupts a pan before it's done, need to copy the cg.refdef.viewAngles to the camera.angles! client_camera.info_state |= CAMERA_FOLLOWING; client_camera.info_state &= ~CAMERA_PANNING; for( len = 0; len < MAX_CAMERA_GROUP_SUBJECTS; len++) { client_camera.cameraGroup[len] = cameraGroup[len]; } if ( speed ) { client_camera.followSpeed = speed; } else { client_camera.followSpeed = 100.0f; } if ( initLerp ) { client_camera.followInitLerp = qtrue; } else { client_camera.followInitLerp = qfalse; } }
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_Pan( vec3_t dest, vec3_t panDirection, float duration ) { //vec3_t panDirection = {0, 0, 0}; int i; float delta1 , delta2; CGCam_FollowDisable(); CGCam_DistanceDisable(); if ( !duration ) { CGCam_SetAngles( dest ); client_camera.info_state &= ~CAMERA_PANNING; return; } //FIXME: make the dest an absolute value, and pass in a //panDirection as well. If a panDirection's axis value is //zero, find the shortest difference for that axis. //Store the delta in client_camera.angles2. for( i = 0; i < 3; i++ ) { dest[i] = AngleNormalize360( dest[i] ); delta1 = dest[i] - AngleNormalize360( client_camera.angles[i] ); if ( delta1 < 0 ) { delta2 = delta1 + 360; } else { delta2 = delta1 - 360; } if ( !panDirection[i] ) {//Didn't specify a direction, pick shortest if( Q_fabs(delta1) < Q_fabs(delta2) ) { client_camera.angles2[i] = delta1; } else { client_camera.angles2[i] = delta2; } } else if ( panDirection[i] < 0 ) { if( delta1 < 0 ) { client_camera.angles2[i] = delta1; } else if( delta1 > 0 ) { client_camera.angles2[i] = delta2; } else {//exact client_camera.angles2[i] = 0; } } else if ( panDirection[i] > 0 ) { if( delta1 > 0 ) { client_camera.angles2[i] = delta1; } else if( delta1 < 0 ) { client_camera.angles2[i] = delta2; } else {//exact client_camera.angles2[i] = 0; } } } //VectorCopy( dest, client_camera.angles2 ); client_camera.info_state |= CAMERA_PANNING; client_camera.pan_duration = duration; client_camera.pan_time = cg.time; }