214 lines
6.1 KiB
C++
214 lines
6.1 KiB
C++
// { [sonador][COLLIDABLE_CAMERA]
|
|
|
|
#pragma once
|
|
|
|
#include "SGameCamera.h"
|
|
#include "KPrimitiveMesh.h"
|
|
|
|
namespace {
|
|
|
|
struct CollisionArgument
|
|
{
|
|
K3DVector radius;
|
|
K3DVector rayPosition;
|
|
K3DVector rayDirection;
|
|
float nearestT;
|
|
K3DVector collidePoint;
|
|
K3DVector collideDirection;
|
|
bool found;
|
|
#ifdef _DEBUG
|
|
K3DVector foundPolygon[ 3 ];
|
|
typedef std::vector< std::pair< K3DVector, KColor > > DEBUG_LINE_CONTAINER;
|
|
DEBUG_LINE_CONTAINER debugLines;
|
|
#endif
|
|
|
|
CollisionArgument( )
|
|
: radius ( 0, 0, 0 )
|
|
, rayPosition ( 0, 0, 0 )
|
|
, rayDirection ( 0, 0, 0 )
|
|
, nearestT ( 1.0f )
|
|
, collidePoint ( 0, 0, 0 )
|
|
, collideDirection ( 0, 0, 0 )
|
|
, found ( false )
|
|
{
|
|
}
|
|
|
|
CollisionArgument& operator = ( const CollisionArgument& rhs )
|
|
{
|
|
if( &rhs == this ) return *this;
|
|
radius = rhs.radius ;
|
|
rayPosition = rhs.rayPosition ;
|
|
rayDirection = rhs.rayDirection ;
|
|
nearestT = rhs.nearestT ;
|
|
collidePoint = rhs.collidePoint ;
|
|
collideDirection = rhs.collideDirection ;
|
|
found = rhs.found ;
|
|
#ifdef _DEBUG
|
|
foundPolygon[ 0 ] = rhs.foundPolygon[ 0 ] ;
|
|
foundPolygon[ 1 ] = rhs.foundPolygon[ 1 ] ;
|
|
foundPolygon[ 2 ] = rhs.foundPolygon[ 2 ] ;
|
|
debugLines.clear( );
|
|
DEBUG_LINE_CONTAINER::const_iterator it = rhs.debugLines.begin( ), itend = rhs.debugLines.end( );
|
|
for( ; it != itend; ++it )
|
|
debugLines.push_back( std::make_pair( it->first, it->second ) );
|
|
#endif
|
|
return *this;
|
|
}
|
|
};
|
|
|
|
}
|
|
|
|
class CTerrainMapEngine;
|
|
class SGameLowQualityWater;
|
|
|
|
//=======================================================================================
|
|
//
|
|
// SGameCameraTerrainHeightAnimator
|
|
//
|
|
|
|
class SGameCameraTerrainHeightAnimator : public IGameCameraAnimator
|
|
{
|
|
public:
|
|
|
|
SGameCameraTerrainHeightAnimator
|
|
( CTerrainMapEngine& terrain
|
|
, SGameLowQualityWater& water );
|
|
virtual ~SGameCameraTerrainHeightAnimator();
|
|
virtual void Animate( DWORD time, SGameCamera& camera );
|
|
virtual void Render( KViewportObject* pViewport ) {}
|
|
virtual TYPE GetType() { return IGameCameraAnimator::TERRAIN_HEIGHT_RESPONSE; }
|
|
|
|
private:
|
|
|
|
CTerrainMapEngine& m_terrain;
|
|
SGameLowQualityWater& m_water;
|
|
};
|
|
|
|
//=======================================================================================
|
|
//
|
|
// SGameCameraTerrainCollisionAnimator
|
|
//
|
|
|
|
class SGameCameraTerrainCollisionAnimator : public IGameCameraAnimator
|
|
{
|
|
public:
|
|
|
|
SGameCameraTerrainCollisionAnimator
|
|
( CTerrainMapEngine& terrain
|
|
, SGameLowQualityWater& water );
|
|
virtual ~SGameCameraTerrainCollisionAnimator();
|
|
virtual void Animate( DWORD time, SGameCamera& camera );
|
|
virtual void Render( KViewportObject* pViewport ) {}
|
|
virtual TYPE GetType() { return IGameCameraAnimator::TERRAIN_COLLISION_RESPONSE; }
|
|
|
|
private:
|
|
|
|
void _ExecuteCollisionResponseWithTerrain( CollisionArgument& argument );
|
|
float _GetTerrainHeight( const K3DVector& position );
|
|
bool _HasMoved( const SGameCamera& camera );
|
|
|
|
CTerrainMapEngine& m_terrain;
|
|
SGameLowQualityWater& m_water;
|
|
K3DVector m_vPrevCameraPosition;
|
|
K3DVector m_vPrevTargetPosition;
|
|
CollisionArgument m_backupCollisionArgument;
|
|
};
|
|
|
|
//=======================================================================================
|
|
//
|
|
// SGameCameraPropCollisionAnimator
|
|
//
|
|
|
|
class SGameCameraPropCollisionAnimator : public IGameCameraAnimator
|
|
{
|
|
public:
|
|
|
|
SGameCameraPropCollisionAnimator
|
|
( CTerrainMapEngine& terrain
|
|
, const K3DVector& vCollisionRadius = K3DVector( 1, 1, 1 )
|
|
, DWORD dwInterpolationTime = 1000 );
|
|
virtual ~SGameCameraPropCollisionAnimator();
|
|
virtual void Animate( DWORD time, SGameCamera& camera );
|
|
virtual void Render( KViewportObject* pViewport );
|
|
virtual TYPE GetType() { return IGameCameraAnimator::TERRAIN_PROP_COLLISION_RESPONSE; }
|
|
|
|
private:
|
|
|
|
bool _HasMoved( SGameCamera& camera );
|
|
bool _HasInterpolated() const { return m_bInterpolated; }
|
|
void _BackupCollisionArgument( const CollisionArgument& argument )
|
|
{
|
|
m_backupCollidionArgument = argument;
|
|
}
|
|
void _ExecuteCollisionResponseWithProp( CollisionArgument& argument );
|
|
void _SoftenResponse( CollisionArgument& argument );
|
|
float _GetInterpolatedRadius();
|
|
|
|
CTerrainMapEngine& m_terrain;
|
|
K3DVector m_vCollidableSphereRadius;
|
|
CollisionArgument m_backupCollidionArgument;
|
|
K3DVector m_vPrevCameraPosition;
|
|
K3DVector m_vPrevTargetPosition;
|
|
DWORD m_dwTime;
|
|
DWORD m_dwTimeDiff;
|
|
DWORD m_dwInterpolationTime;
|
|
bool m_bInterpolated;
|
|
float m_fCurrRadius;
|
|
float m_fGoalRadius;
|
|
|
|
#ifdef _DEBUG
|
|
KWireUtilPrimitive m_primitiveWire;
|
|
bool m_bDebugRender;
|
|
#endif
|
|
};
|
|
|
|
//=======================================================================================
|
|
//
|
|
// SGameCameraPropCollisionAnimator
|
|
//
|
|
|
|
class SGameCameraTerrainAndPropCollisionAnimator : public IGameCameraAnimator
|
|
{
|
|
public:
|
|
|
|
SGameCameraTerrainAndPropCollisionAnimator
|
|
( CTerrainMapEngine& terrain
|
|
, SGameLowQualityWater& water
|
|
, const K3DVector& vCollisionRadius = K3DVector( 1, 1, 1 )
|
|
, DWORD dwInterpolationTime = 3000 );
|
|
virtual ~SGameCameraTerrainAndPropCollisionAnimator();
|
|
virtual void Animate( DWORD time, SGameCamera& camera );
|
|
virtual void Render( KViewportObject* pViewport );
|
|
void SetRadius( const K3DVector& vRadius ); // sonador 7.1.9 성능 개선
|
|
virtual TYPE GetType() { return IGameCameraAnimator::TERRAIN_AND_PROP_COLLISION_RESPONSE; }
|
|
|
|
private:
|
|
|
|
bool _HasMoved( SGameCamera& camera );
|
|
bool _HasInterpolated() const { return m_bInterpolated; }
|
|
void _ExecuteCollisionResponseWithWater( CollisionArgument& argument, SGameCamera& camera );
|
|
void _ExecuteCollisionResponseWithTerrain( CollisionArgument& argument );
|
|
void _ExecuteCollisionResponseWithProp( CollisionArgument& argument );
|
|
void _SoftenResponse( CollisionArgument& argument );
|
|
float _GetInterpolatedRadius();
|
|
|
|
CTerrainMapEngine& m_terrain;
|
|
SGameLowQualityWater& m_water;
|
|
K3DVector m_vCollidableSphereRadius;
|
|
CollisionArgument m_backupCollidionArgument;
|
|
K3DVector m_vPrevCameraPosition;
|
|
K3DVector m_vPrevTargetPosition;
|
|
DWORD m_dwTime;
|
|
DWORD m_dwTimeDiff;
|
|
DWORD m_dwInterpolationTime;
|
|
bool m_bInterpolated;
|
|
float m_fCurrRadius;
|
|
float m_fGoalRadius;
|
|
|
|
#ifdef _DEBUG
|
|
KWireUtilPrimitive m_primitiveWire;
|
|
bool m_bDebugRender;
|
|
#endif
|
|
};
|
|
|
|
// }
|