Files
Leviathan/Client/Game/game/Player/SGameAvatarTerrainDegree.h
2026-06-01 12:46:52 +02:00

86 lines
2.3 KiB
C++

#pragma once
class SGameAvatarTerrainDegree
{
private:
float m_fAngleX, m_fAngleY;
float m_fPrevAngleX, m_fPrevAngleY;
float m_fCurrentAngleX, m_fCurrentAngleY;
DWORD m_dwAngleTime;
bool m_bReset;
public:
float GetAngleX() { return m_fAngleX; }
float GetAngleY() { return m_fAngleY; }
float GetCurrentAngleX() { return m_fCurrentAngleX; }
float GetCurrentAngleY() { return m_fCurrentAngleY; }
/// 이전 각과 비교하자
bool CheckPrevAngle() { return (m_fAngleX != m_fPrevAngleX || m_fAngleY != m_fPrevAngleY); }
void ClearReset()
{
m_bReset = false;
}
void Reset( DWORD time )
{
if( m_bReset ) return;
m_bReset = true;
m_fAngleX = 3.1415926f/2;
m_fAngleY = 3.1415926f/2;
m_fPrevAngleX = m_fCurrentAngleX;
m_fPrevAngleY = m_fCurrentAngleY;
m_dwAngleTime = time;
}
void CalcCurrentAngle( DWORD time )
{
m_fCurrentAngleX = m_fPrevAngleX + (m_fAngleX - m_fPrevAngleX) * (time - m_dwAngleTime) / 100.0f;
m_fCurrentAngleY = m_fPrevAngleY + (m_fAngleY - m_fPrevAngleY) * (time - m_dwAngleTime) / 100.0f;
if( (float)(time - m_dwAngleTime) > 100.0f )
{
m_fCurrentAngleX = m_fPrevAngleX = m_fAngleX;
m_fCurrentAngleY = m_fPrevAngleY = m_fAngleY;
}
}
void CalcTerrainDegree( K3DVector & vTerrainNormal, DWORD time )
{
static K3DVector vXNormal = K3DVector( -1.0f, 0.0f, 0.0f );
static K3DVector vYNormal = K3DVector( 0.0f, 1.0f, 0.0f );
K3DVector vXCross = CrossProduct( vXNormal, vTerrainNormal );
K3DVector vYCross = CrossProduct( vYNormal, vTerrainNormal );
m_fAngleX = DotProduct( vXNormal, vTerrainNormal );
m_fAngleY = DotProduct( vYNormal, vTerrainNormal );
if( vXCross.y < 0.0f ) m_fAngleX = -acosf( m_fAngleX );
else m_fAngleX = acosf( m_fAngleX );
if( vYCross.x < 0.0f ) m_fAngleY = -acosf( m_fAngleY );
else m_fAngleY = acosf( m_fAngleY );
m_fPrevAngleX = m_fCurrentAngleX;
m_fPrevAngleY = m_fCurrentAngleY;
m_dwAngleTime = time;
ClearReset();
}
public:
SGameAvatarTerrainDegree() : m_fAngleX(0.0f), m_fAngleY(0.0f),
m_fPrevAngleX(0.0f), m_fPrevAngleY(0.0f),
m_fCurrentAngleX(0.0f), m_fCurrentAngleY(0.0f),
m_dwAngleTime(0),
m_bReset( false )
{}
~SGameAvatarTerrainDegree()
{}
};