Files
2026-06-01 12:46:52 +02:00

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
};
// }