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