//============================================================================= // Copyright (C) 2002 Radical Entertainment Ltd. All rights reserved. // // File: supersprintcam.cpp // // Description: Implement SuperSprintCam // // History: 2/8/2003 + Created -- Cary Brisebois // //============================================================================= //======================================== // System Includes //======================================== // Foundation Tech #include #include #include //======================================== // Project Includes //======================================== #include #include #include #include //***************************************************************************** // // Global Data, Local Data, Local Classes // //***************************************************************************** unsigned int SuperSprintCam::mSprintCamCount = 0; #ifdef RAD_PS2 static float CAMERA_VALUES[ RenderEnums::MAX_LEVEL - RenderEnums::numLevels ][ 3 ] = { // { 4.847f, 306.69729f, -289.8292f }, { 26.88f, 157.87f, -206.23f }, { 35.67f, 195.66f, -207.82f }, { -27.78f, 146.18f, -228.17f }, { 32.92f, 305.26f, -292.99f }, { 26.73f, 128.08f, -208.55f }, { 30.338f, 208.018f, -358.739f }, { 30.62f, 157.05f, -213.99f }, }; //Theres a 1-1 bonus to main levels. static rmt::Vector* CAMERA_SETTINGS = (rmt::Vector*)(CAMERA_VALUES); static float CAMERA_FOV[ RenderEnums::MAX_LEVEL - RenderEnums::numLevels ] = { // 0.2618f, 0.4f, 0.4f, 0.35f, 0.26f, 0.4f, 0.2618f, 0.4f }; #endif #ifdef RAD_XBOX static float CAMERA_VALUES[ RenderEnums::MAX_LEVEL - RenderEnums::numLevels ][ 3 ] = { // { 49.99f, 160.21f, -233.60f }, { 49.99f, 160.21f, -233.60f }, { 36.79f, 213.18f, -224.51f }, { -35.01f, 164.01f, -234.05f }, { 37.59f, 347.682f, -316.03f }, { 38.66f, 152.70f, -215.20f }, { -0.729f, 149.45f, -235.30f }, { 54.581f, 178.399f, -220.06f } }; //Theres a 1-1 bonus to main levels. static rmt::Vector* CAMERA_SETTINGS = (rmt::Vector*)(CAMERA_VALUES); static float CAMERA_FOV[ RenderEnums::MAX_LEVEL - RenderEnums::numLevels ] = { // 0.2618f, 0.4f, 0.4f, 0.35f, 0.26f, 0.4f, 0.42f, 0.4f }; #endif #ifdef RAD_WIN32 //Straight copy of xbox. Will figure out later. static float CAMERA_VALUES[ RenderEnums::MAX_LEVEL - RenderEnums::numLevels ][ 3 ] = { // {-14.268f, 322.9046f, -313.13299f}, {-14.268f, 322.9046f, -313.13299f}, {-10.0362f, 290.3872f, -336.8332f}, {-14.268f, 322.9046f, -313.13299f}, {-12.757f, 261.6806f, -341.0744f}, {-14.268f, 322.9046f, -313.13299f}, {-14.268f, 322.9046f, -313.13299f}, {-14.268f, 322.9046f, -313.13299f} }; //Theres a 1-1 bonus to main levels. static rmt::Vector* CAMERA_SETTINGS = (rmt::Vector*)(CAMERA_VALUES); static float CAMERA_FOV[ RenderEnums::MAX_LEVEL - RenderEnums::numLevels ] = { // 0.2618f, 0.2618f, 0.2618f, 0.2618f, 0.2618f, 0.2618f, 0.2618f, 0.2618f }; #endif #ifdef RAD_GAMECUBE static float CAMERA_VALUES[ RenderEnums::MAX_LEVEL - RenderEnums::numLevels ][ 3 ] = { // { 4.847f, 343.4719f, -244.00512f }, { 48.38f, 253.394f, -347.603f }, { 39.991f, 277.6909f, -331.487f }, { -13.377f, 196.149f, -306.219f }, { 13.81f, 276.968f, -327.466f }, { 43.636f, 198.81f, -314.173f }, { 27.499f, 233.753f, -377.58f }, { 79.005f, 239.61f, -354.552f } }; //Theres a 1-1 bonus to main levels. static rmt::Vector* CAMERA_SETTINGS = (rmt::Vector*)(CAMERA_VALUES); static float CAMERA_FOV[ RenderEnums::MAX_LEVEL - RenderEnums::numLevels ] = { // 0.2618f, 0.2618f, 0.2618f, 0.2618f, 0.2618f, 0.2618f, 0.2618f, 0.2618f }; #endif //***************************************************************************** // // Public Member Functions // //***************************************************************************** //============================================================================= // SuperSprintCam::SuperSprintCam //============================================================================= // Description: Constructor. // // Parameters: None. // // Return: N/A. // //============================================================================= SuperSprintCam::SuperSprintCam() : mNear( 150.0f ), mFar( 800.0f ), mFOV( rmt::PI_BY2 ), mAspect( 4.0f / 3.0f ), mLag( 0.05f ), mDist( 10.0f ) { } //============================================================================= // SuperSprintCam::~SuperSprintCam //============================================================================= // Description: Destructor. // // Parameters: None. // // Return: N/A. // //============================================================================= SuperSprintCam::~SuperSprintCam() { } //***************************************************************************** // // Protected Member Functions // //***************************************************************************** //============================================================================= // SuperSprintCam::Update //============================================================================= // Description: Comment // // Parameters: ( unsigned int milliseconds ) // // Return: void // //============================================================================= void SuperSprintCam::Update( unsigned int milliseconds ) { if ( GetFlag( (Flag)FIRST_TIME ) ) { //Get the position of the vector cam. //Find and set up the camera. tVectorCamera* cam = p3d::find("sprint_camShape"); // mPos.Set( 4.847f, 240.5329f, -234.17244f ); mPos = CAMERA_SETTINGS[ GetGameplayManager()->GetCurrentLevelIndex() - 1 ]; mTarg.Set( 0.0f, 0.0f, 0.0f ); mFOV = CAMERA_FOV[ GetGameplayManager()->GetCurrentLevelIndex() - 1 ]; SetFOV( mFOV ); mAspect = 4.0f / 3.0f; SetAspect( mAspect ); mUp.Set( -0.019949f, 0.6996f, 0.714194f ); mPosDelta.Set( 0.0f, 0.0f, 0.0f ); #ifndef RAD_RELEASE // InitMyController( s_secondaryControllerID ); #endif SetFlag( (Flag)FIRST_TIME, false ); } else { #ifndef RAD_RELEASE // float x, y, z; // x = mController->GetValue( SuperCamController::stickX ); // y = mController->GetValue( SuperCamController::leftStickY ); // z = mController->GetValue( SuperCamController::stickY ); // if ( rmt::Epsilon( x, 0.0f, 0.001f ) && rmt::Epsilon( y, 0.0f, 0.001f ) && rmt::Epsilon( z, 0.0f, 0.001f ) ) // { #endif GetPosition( &mPos ); GetTarget( &mTarg ); GetCameraUp( &mUp ); #ifndef RAD_RELEASE // } // else // { // //Use the controller values to move the camera. // // rmt::Vector xMove( mDist, 0.0f, 0.0f ); // xMove.Scale( x ); // // rmt::Vector yMove( 0.0f, -mDist, 0.0f ); // yMove.Scale( y ); // // rmt::Vector zMove( 0.0f, 0.0f, mDist ); // zMove.Scale( z ); // // GetPosition( &mPos ); // rmt::Vector desiredPos( mPos ); // desiredPos.Add( xMove ); // desiredPos.Add( yMove ); // desiredPos.Add( zMove ); // // float timeMod = milliseconds / 16.0f; // // float lag = mLag * timeMod; // CLAMP_TO_ONE( lag ); // // MotionCubic( &mPos.x, &mPosDelta.x, desiredPos.x, lag ); // MotionCubic( &mPos.y, &mPosDelta.y, desiredPos.y, lag ); // MotionCubic( &mPos.z, &mPosDelta.z, desiredPos.z, lag ); // } #endif } #ifdef RAD_PS2 if ( (GetGameplayManager()->GetCurrentLevelIndex() + RenderEnums::B00) == RenderEnums::B06 ) { SetNearPlane( 250.0f ); //HACK! } else { SetNearPlane( mNear ); } #else SetNearPlane( mNear ); #endif SetFarPlane( mFar ); SetFOV( mFOV ); SetAspect( mAspect ); SetCameraValues( milliseconds, mPos, mTarg ); SetFlag( (Flag)CUT, false ); } //============================================================================= // SuperSprintCam::OnInit //============================================================================= // Description: Comment // // Parameters: () // // Return: void // //============================================================================= void SuperSprintCam::OnInit() { } //============================================================================= // SuperSprintCam::OnShutdown //============================================================================= // Description: Comment // // Parameters: () // // Return: void // //============================================================================= void SuperSprintCam::OnShutdown() { } //============================================================================= // SuperSprintCam::OnRegisterDebugControls //============================================================================= // Description: Comment // // Parameters: () // // Return: void // //============================================================================= void SuperSprintCam::OnRegisterDebugControls() { #ifdef DEBUGWATCH if ( mSprintCamCount == 0 ) { char nameSpace[256]; sprintf( nameSpace, "SuperCam\\SuperSprint" ); radDbgWatchAddFloat( &mNear, "mNear", nameSpace, NULL, NULL, 1.0, 2000.0f ); radDbgWatchAddFloat( &mFar, "mFar", nameSpace, NULL, NULL, 1.0, 2000.0f ); radDbgWatchAddFloat( &mFOV, "mFOV", nameSpace, NULL, NULL, 0.001f, rmt::PI ); radDbgWatchAddFloat( &mAspect, "mAspect", nameSpace, NULL, NULL, 0.001f, 3.0f ); radDbgWatchAddVector(&(mPos.x), "mPos", nameSpace, NULL, NULL, -2000.0f, 2000.0f ); radDbgWatchAddVector(&(mTarg.x), "mTarg", nameSpace, NULL, NULL, -2000.0f, 2000.0f ); radDbgWatchAddVector(&(mUp.x), "mUp", nameSpace, NULL, NULL, -2000.0f, 2000.0f ); radDbgWatchAddFloat( &mDist, "Dist", nameSpace, NULL, NULL, 1.0f, 1000.0f ); } #endif mSprintCamCount++; } //============================================================================= // SuperSprintCam::OnUnregisterDebugControls //============================================================================= // Description: Comment // // Parameters: () // // Return: void // //============================================================================= void SuperSprintCam::OnUnregisterDebugControls() { #ifdef DEBUGWATCH if ( mSprintCamCount == 1 ) { radDbgWatchDelete( &mNear ); radDbgWatchDelete( &mFar ); radDbgWatchDelete( &mFOV ); radDbgWatchDelete( &mAspect ); radDbgWatchDelete( &mPos.x ); radDbgWatchDelete( &mTarg.x ); radDbgWatchDelete( &mUp.x ); radDbgWatchDelete( &mDist ); } #endif mSprintCamCount--; } //***************************************************************************** // // Private Member Functions // //*****************************************************************************