Files
Leviathan/Client/Game/engine/Renderer/KSeqAvatar.h
T
2026-06-01 12:46:52 +02:00

220 lines
6.6 KiB
C++

#pragma once
#include "KSeqForm.h"
#include "krenderobject.h"
#include "GameDefine.h"
// 2010.05.18 - prodongi
#include <set>
using namespace GAME_DEFINE;
// "ITEM_RENDER"
namespace
{
const int BONE_EFFECT_MAX = 15;
};
class KSeqAvatar : public KSeqForm
{
public:
KSeqAvatar( int nAniPartIndex = 0 );
virtual ~KSeqAvatar();
virtual void Clear();
virtual void ClipTest( const K3DVector* pFrustrum);
virtual bool GetIsClip();
bool AddBoneEffect( int nIndex, const char *bonename, const char *filename );
void AddBoneEffect( int nIndex, KSeqObject *obj );
bool AddEffectPos( int nAttachIndex, const char *filename );
void AddEffectPos( int nIndex, KSeqObject *obj );
/// 아바타 본 애니메이션들~
bool AddAnimation( const char *filename, BOOL bOld = FALSE, bool bNowLoading = false );
void DelAnimation( const char *pszAniKey );
/// 아바타 살들~
void AddMesh( int nIndex, KSeqObject *obj );
bool AddMesh( int nIndex, const char *filename );
KSeqObject *GetMesh( int nIndex );
void ClearMesh();
int IsExistMesh( int nIndex );
KSeqObject* GetDecoMesh( int nIndex );
int IsExistDecoMesh( int nIndex );
// 2010.06.10 - prodongi
bool isRenderDecoMesh(int index);
// 2010.06.14 - prodongi
bool isRenderMesh(int index);
bool isDecoMeshCheck() const { return (m_bDecoMeshCheck == TRUE) ? true : false; } /// 2011.01.19 정리 - prodongi
bool isMeshCheck() const { return (m_bMeshCheck == TRUE) ? true : false; }
/// 치장용 살들
void AddDecoMesh( int nIndex, KSeqObject *obj );
bool AddDecoMesh( int nIndex, const char *filename );
/// 아바타 무기 링크들~
void AddAttachItem( int nIndex, KSeqObject *obj );
void AddAttachItem( int nIndex, const char *filename );
void AddMorphMesh( class KMsgSET_MORPHMESH* pMsg );
void SetFixTexture( class KMsgSET_FIXTEXTURE* pMsg );
/// 특수 효과 끄기
void SetItemRenderFlag( BOOL bRenderFlag );
void SetItemRenderFlag( int nIndex, BOOL bRenderFlag );
bool PlayAnimation( DWORD dwCurTime, const char *name, int nAniType = SEQTYPE_NORMAL, float fPlayRate = 4.8f );
/// sfreer 임시코드임. 인벤토리 창에 나오는 아바타에서 방패 장착시 표시 안되는 버그을 위해 추가한 함수. 2009.03.09
bool PlayAnimation_temp( DWORD dwCurTime, const char *name, int nAniType = SEQTYPE_NORMAL, float fPlayRate = 4.8f );
virtual bool PlayOverride( DWORD dwCurTime, const char *name, float fPlayRate = 4.8f );
virtual void SetParentTransform( const K3DMatrix *pMatParent, const K3DMatrix *pMatAttach = NULL, BOOL bRotationLock = FALSE );
// virtual void SetAttachBone( const K3DMatrix *pMatParent, const K3DMatrix *pMatAttach );
void SetAttach(); ///< 현재 Animation에 Attach
void SetDeform(); ///< 현재 채널과 Deform
void SetAttachEffectPos(); ///< 현재 Animation에 Effect Pos Attach
void SetAttachEffectBone();///< 현재 Animation에 Bone Effect Attach
virtual void Weld(int nIndex); ///< 몬스터 같은 경우는 없다.
void GetFrameInfo( const char * strKey, int &nBoneCount, DWORD &dwMinTime, DWORD &dwMaxTime );
enum
{
SEQPOS_BEGIN,
SEQPOS_END,
};
void ChangeAnimationType(int nAniType);
void ClearAnimation();
const K3DVector &GetPosition()
{
return *((K3DVector*)&m_matTransform.m30);
}
void SetViewVector( const K3DVector &view );
void SetTransform( const K3DMatrix &mat )
{
m_matTransform = mat;
}
K3DMatrix &GetTransform()
{
return m_matTransform;
}
KSeqObject *GetCurrentAnimation()
{
return m_pCurSeq;
}
const char *GetCurrentAnimationName()
{
return m_strCurSeq.c_str();
}
bool IsPlaying()
{
return m_bIsPlaying;
}
void SetTimeRate( float fTimeRate )
{
m_fRate = fTimeRate;
}
enum
{
SEQINFO_NOP,
SEQINFO_PLAYING,
SEQINFO_STOPPED,
SEQINFO_LOOPWRAP,
};
virtual void *Perform( KID id, KArg& msg );
// 2010.05.18 - prodongi
void* PerformWithIgnoreMesh(KID id, KArg& msg, std::set<int>* ignoreMeshList);
void *MeshPerform( int nMeshIndex, KID id, KArg& msg );
void *DecoMeshPerform( int nMeshIndex, KID id, KArg& msg );
virtual KSeqObject* Clone();
virtual int Process( DWORD dwTime );
virtual void Render( KViewportObject *viewport, DWORD flag = RENDEREFX_NONE, const K3DMatrix * pAttachMat = NULL );
void SetViewVectorX( float x, float y, float z ); ///< 좌우
void SetViewVectorZ( float x, float y, float z ); ///< 상하
void SetBodyVector( float x, float y ) ; ///< 몸통
void SetViewVectorX( K3DVector &Vec, int nDelay );
float GetHeadZ();
void GetHandPos( K3DVector &posLeft, K3DVector &posRight );
DWORD GetLength() { return m_nLength; }
void SetMeshRenderFlag( int nIndex, BOOL bRenderFlag );
void SetDecoMeshRenderFlag( int nIndex, BOOL bRenderFlag );
virtual void SetAniTime( DWORD dwTime );
BOOL GetMeshCheck() { return m_bMeshCheck; };
static void SetToggleEffectPos() { m_bEffectPosRenderFlag = !m_bEffectPosRenderFlag; }
static void SetToggleMeshRender() { m_sMeshRenderFlag = !m_sMeshRenderFlag; }
/// 동작 interpolation용 : 직접 bone sequencer를 가져온다
class KBoneSeqObject* getBoneSequencer();
bool CheckPendingSeq();
const char* GetMeshSeqObjName( int nMeshIndex );
protected:
void SetRenderFlag( const char * pStr, BOOL bRenderFlag );
protected:
K3DVector m_ViewVectorX; ///< 좌우
K3DVector m_ViewVectorZ; ///< 상하
K3DVector m_BodyVector ; ///< 몸통
K3DVector m_CurViewVector; ///< 현재 뷰~
K3DVector m_nPrevViewVector; ///< 전 뷰~
K3DVector m_vViewTarget; ///< 보는 위치~
KSeqObject* m_pMeshPart[MPART_MAX];
BOOL m_bMeshRender[MPART_MAX];
BOOL m_bMeshCheck; ///< Mesh도 추가된 것들만 처리.
KSeqObject* m_pDecoMeshPart[MDECOPART_MAX];
BOOL m_bDecoMeshRender[MDECOPART_MAX];
BOOL m_bDecoMeshCheck;
KSeqForm* m_pItemPart[ATTACH_MAX];
BOOL m_bItemRender[ATTACH_MAX];
BOOL m_bItemCheck; ///< Item은 아바타만 처리.
BOOL m_bRenderRotCube;
KSeqObject* m_pEffectPos[EFFECT_POS_MAX]; ///< 타격 이펙트 위치
BOOL m_bEffectPos[EFFECT_POS_MAX];
BOOL m_bEffectPosCheck;
KSeqForm* m_pBoneEffect[BONE_EFFECT_MAX]; ///< 타격 이펙트 위치
BOOL m_bBoneEffect[BONE_EFFECT_MAX];
short m_nBoneEffectIndex[BONE_EFFECT_MAX];
BOOL m_bBoneEffectCheck;
static BOOL m_bEffectPosRenderFlag; //
static BOOL m_sMeshRenderFlag; //
K3DMatrix m_matShadow; ///< 쉐도우 용 Matrix
DWORD m_decoShoulderPrevTime;
};