The-Simpsons-Hit-and-Run/game/code/camera/wrecklesscam.cpp

344 lines
9.7 KiB
C++

//=============================================================================
// Copyright (C) 2002 Radical Entertainment Ltd. All rights reserved.
//
// File: wrecklesscam.cpp
//
// Description: Implement WrecklessCam
//
// History: 25/04/2002 + Created -- Cary Brisebois
//
//=============================================================================
//========================================
// System Includes
//========================================
// Foundation Tech
//These are included in the precompiled headers on XBOX and GC
#include <raddebug.hpp>
#include <raddebugwatch.hpp>
#include <p3d/utility.hpp>
//========================================
// Project Includes
//========================================
#include <camera/WrecklessCam.h>
#include <camera/isupercamtarget.h>
#include <events/eventmanager.h>
#include <events/eventenum.h>
#include <meta/eventlocator.h>
#include <mission/gameplaymanager.h>
//******************************************************************************
//
// Global Data, Local Data, Local Classes
//
//******************************************************************************
//******************************************************************************
//
// Public Member Functions
//
//******************************************************************************
//==============================================================================
// WrecklessCam::WrecklessCam
//==============================================================================
// Description: Constructor.
//
// Parameters: None.
//
// Return: N/A.
//
//==============================================================================
WrecklessCam::WrecklessCam() :
mNumTargets( 0 ),
mActiveTarget( 0 ),
mFOVDelta( 0 ),
mMaxFOV( 1.5707f ),
mMinFOV( 0.5f ),
mMaxDistance( 35.0f ),
mMinDistance( 10.0f ),
mLag( 0.08f )
{
unsigned int i;
for ( i = 0; i < MAX_TARGETS; ++i )
{
mTargets[ i ] = NULL;
}
}
//==============================================================================
// WrecklessCam::~WrecklessCam
//==============================================================================
// Description: Destructor.
//
// Parameters: None.
//
// Return: N/A.
//
//==============================================================================
WrecklessCam::~WrecklessCam()
{
}
//=============================================================================
// WrecklessCam::Update
//=============================================================================
// Description: Comment
//
// Parameters: ( unsigned int milliseconds )
//
// Return: void
//
//=============================================================================
void WrecklessCam::Update( unsigned int milliseconds )
{
float timeMod = 1.0f;
timeMod = (float)milliseconds / 16.0f;
rmt::Vector position;
mEventListener.GetLastPosition( &position );
if ( position != rmt::Vector(0.0f, 0.0f, 0.0f) )
{
//Use this position for placing the camera.
}
else
{
//Get the target position.
mTargets[ mActiveTarget ]->GetPosition( &position );
//HACK
position.y += 10.0f;
}
rmt::Vector targetPos;
mTargets[ mActiveTarget ]->GetPosition( &targetPos );
if ( GetFlag( (Flag)CUT ) )
{
mFOV = mMaxFOV;
SetFlag( (Flag)CUT, false );
}
rmt::Vector camToTarg;
camToTarg.Sub( position, targetPos );
float dist = camToTarg.Magnitude();
DoWrecklessZoom( dist, mMinDistance, mMaxDistance, mMinFOV, mMaxFOV, mFOV, mFOVDelta, mLag, timeMod );
SetFOV( mFOV );
SetCameraValues( milliseconds, position, targetPos );
}
//=============================================================================
// WrecklessCam::SetTarget
//=============================================================================
// Description: Comment
//
// Parameters: ( ISuperCamTarget* target )
//
// Return: void
//
//=============================================================================
void WrecklessCam::SetTarget( ISuperCamTarget* target )
{
rAssert( target );
//First test to make sure we don't already have this target.
if( mNumTargets != 0 )
{
unsigned int i;
for ( i = 0; i < mNumTargets; ++i )
{
if ( mTargets[ i ] == target )
{
//Already got one!
mActiveTarget = i;
return;
}
}
}
//This is going to be the first target
mTargets[ mNumTargets ] = target;
mActiveTarget = mNumTargets;
mNumTargets = 1;
}
//=============================================================================
// WrecklessCam::AddTarget
//=============================================================================
// Description: Comment
//
// Parameters: ( ISuperCamTarget* target )
//
// Return: void
//
//=============================================================================
void WrecklessCam::AddTarget( ISuperCamTarget* target )
{
rAssert( mNumTargets < MAX_TARGETS );
rAssert( target );
if ( mNumTargets < MAX_TARGETS )
{
//Add the target
mTargets[ mNumTargets ] = target;
++mNumTargets;
}
}
//******************************************************************************
//
// Protected Member Functions
//
//******************************************************************************
//=============================================================================
// WrecklessCam::OnInit
//=============================================================================
// Description: Comment
//
// Parameters: ()
//
// Return: void
//
//=============================================================================
void WrecklessCam::OnInit()
{
mEventListener.SetPlayerID( GetPlayerID() );
EventManager* evtMngr = GetEventManager();
evtMngr->AddListener( GetEventListener(), (EventEnum)(EVENT_LOCATOR + LocatorEvent::CAMERA_CUT) );
if ( !GetGameplayManager()->mIsDemo )
{
//Find all the CUT_CAM events and make them active.
p3d::inventory->PushSection();
if ( GetGameplayManager()->IsSuperSprint() || GetGameplayManager()->GetCurrentLevelIndex() > RenderEnums::L3 ) //Fucking hack. It's this or change the art pipes.
{
p3d::inventory->SelectSection( "Level" );
}
else
{
p3d::inventory->SelectSection( "Default" );
}
HeapMgr()->PushHeap( GMA_TEMP );
tInventory::Iterator<EventLocator> it;
HeapMgr()->PopHeap( GMA_TEMP );
EventLocator* evtLoc = it.First();
while( evtLoc )
{
if ( evtLoc->GetEventType() == LocatorEvent::CAMERA_CUT )
{
evtLoc->SetFlag( Locator::ACTIVE, true );
}
evtLoc = it.Next();
}
p3d::inventory->PopSection();
}
}
//=============================================================================
// WrecklessCam::OnShutdown
//=============================================================================
// Description: Comment
//
// Parameters: ()
//
// Return: void
//
//=============================================================================
void WrecklessCam::OnShutdown()
{
GetEventManager()->RemoveAll( GetEventListener() );
if ( !GetGameplayManager()->mIsDemo )
{
//Find all the CUT_CAM events and make them inactive.
p3d::inventory->PushSection();
p3d::inventory->SelectSection( "Default" );
HeapMgr()->PushHeap( GMA_TEMP );
tInventory::Iterator<EventLocator> it;
HeapMgr()->PopHeap( GMA_TEMP );
EventLocator* evtLoc = it.First();
while( evtLoc )
{
if ( evtLoc->GetEventType() == LocatorEvent::CAMERA_CUT )
{
evtLoc->SetFlag( Locator::ACTIVE, false );
}
evtLoc = it.Next();
}
p3d::inventory->PopSection();
}
}
//******************************************************************************
//
// Private Member Functions
//
//******************************************************************************
//=============================================================================
// WrecklessCam::OnRegisterDebugControls
//=============================================================================
// Description: Comment
//
// Parameters: ()
//
// Return: void
//
//=============================================================================
void WrecklessCam::OnRegisterDebugControls()
{
#ifdef DEBUGWATCH
char nameSpace[256];
sprintf( nameSpace, "SuperCam\\Player%d\\Wreckless", GetPlayerID() );
radDbgWatchAddFloat( &mMinFOV, "Min FOV", nameSpace, NULL, NULL, 0.0f, rmt::PI );
radDbgWatchAddFloat( &mMaxFOV, "Max FOV", nameSpace, NULL, NULL, 0.0f, rmt::PI );
radDbgWatchAddFloat( &mMinDistance, "Min Dist", nameSpace, NULL, NULL, 0.0f, 100.0f );
radDbgWatchAddFloat( &mMaxDistance, "Max Dist", nameSpace, NULL, NULL, 0.0f, 100.0f );
radDbgWatchAddFloat( &mLag, "Lag", nameSpace, NULL, NULL, 0.0f, 1.0f );
#endif
}
//=============================================================================
// WrecklessCam::OnUnregisterDebugControls
//=============================================================================
// Description: Comment
//
// Parameters: ()
//
// Return: void
//
//=============================================================================
void WrecklessCam::OnUnregisterDebugControls()
{
#ifdef DEBUGWATCH
radDbgWatchDelete( &mMinFOV );
radDbgWatchDelete( &mMaxFOV );
radDbgWatchDelete( &mMinDistance );
radDbgWatchDelete( &mMaxDistance );
radDbgWatchDelete( &mLag );
#endif
}