#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() {} };