86 lines
2.3 KiB
C++
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()
|
|
{}
|
|
};
|