#pragma once #include "KSeqForm.h" #include "krenderobject.h" #include "GameDefine.h" // 2010.05.18 - prodongi #include 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* 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; };