Files
2026-06-01 12:46:52 +02:00

611 lines
12 KiB
C++

#pragma once
#include "KObject.h"
#include "KPrimitiveMesh.h"
#include "KPrimitiveFXParticle.h"
#include "K3DBound.h"
#include "krenderobject.h"
class KViewportObject;
class K3DRenderDeviceDX;
//class K3DFrustum;
class K3DMeshResource;
class K3DResMeshMatrixAnimation;
class K3DResMeshVisibilityAnimation;
/** Mesh Render Off
"SETRENDER_FLAG" */
class KMsgSET_RENDERFLAG : public KArg
{
public:
KMsgSET_RENDERFLAG() : pName(NULL), bRenderFlag(FALSE) {}
const char * pName;
BOOL bRenderFlag;
};
/** Mesh 이름 얻기
"GETMESH_NAME" */
class KMsgGET_MESHNAME : public KArg
{
public:
KMsgGET_MESHNAME() {}
std::vector<const char *> vNameList;
};
/// "GETMESH_INFO"
class KMsgGET_MESHINFO : public KArg
{
public:
KMsgGET_MESHINFO() {}
struct MESH_INFO
{
const char* szMeshName;
std::vector< const char* > vTextureList;
};
std::vector< MESH_INFO > vMeshList;
};
/// "CHANGE_MESH_TEXTURE"
class KMsgCHANGE_MESH_TEXTURE : public KArg
{
public:
KMsgCHANGE_MESH_TEXTURE() { bForceChange = false; }
bool bForceChange; // on이면 그냥 vTextureList[0]에 저장된 이름으로 모든 텍스쳐를 밀어버림-_- 아이템 텍스쳐 교환을 위해 억지로 삽입.
const char* szMeshName;
std::vector< const char* > vTextureList;
};
struct MESHVERTEXBUFFERSTRUCT
{
MESHVERTEXBUFFERSTRUCT() : pVBs(NULL), nVBCount(0) { K3DMatrixIdentity( matLocal ); }
~MESHVERTEXBUFFERSTRUCT() { SAFE_DELETE(pVBs); }
K3DVertexBuffer** pVBs;
int nVBCount;
K3DMatrix matLocal;
};
/** 버텍스 버퍼 얻기
"GETMESH_VERTEXBUFFERS" */
class KMsgGET_MESHVERTEXBUFFERS : public KArg
{
public:
KMsgGET_MESHVERTEXBUFFERS() {}
~KMsgGET_MESHVERTEXBUFFERS() { SAFE_DELETE_VECTOR(vVbStruct); }
std::vector<MESHVERTEXBUFFERSTRUCT*> vVbStruct;
};
struct MESHINDEXBUFFERSTRUCT
{
MESHINDEXBUFFERSTRUCT() : pIBs(NULL), nIBCount(0) {}
~MESHINDEXBUFFERSTRUCT() { SAFE_DELETE(pIBs); }
K3DIndexBuffer** pIBs;
int nIBCount;
};
/** 인덱스 버퍼 얻기
"GETMESH_INDEXBUFFERS" */
class KMsgGET_MESHINDEXBUFFERS : public KArg
{
public:
KMsgGET_MESHINDEXBUFFERS() {}
~KMsgGET_MESHINDEXBUFFERS() { SAFE_DELETE_VECTOR(vIbStruct); }
std::vector<MESHINDEXBUFFERSTRUCT*> vIbStruct;
};
/** 폴리곤 수 얻기
"GETMESH_POLYCOUNT" */
class KMsgGET_MESHPOLYCOUNT : public KArg
{
public:
KMsgGET_MESHPOLYCOUNT() : nPolyCount(0) {}
int nPolyCount;
};
/** 폴리곤의 삼각형 얻기
"GETMESH_TRI" */
class KMsgGET_GETMESH_TRI : public KArg
{
public:
KMsgGET_GETMESH_TRI()
{
K3DMatrixIdentity( mat );
pListTriangles = NULL;
}
K3DMatrix mat;
std::vector< K3DVector > * pListTriangles;
};
/** 텍스쳐 이름 얻기
"GETMESH_TEXNAME" */
class KMsgGET_MESHTEXNAME : public KArg
{
public:
KMsgGET_MESHTEXNAME() {}
std::vector<const char *> vNameList;
};
/** Ani Info
"GETMESH_ANIINFO" */
class KMsgGET_MESHANI_INFO : public KArg
{
public:
KMsgGET_MESHANI_INFO() : nStart(-1), nEnd(-1) {}
std::string strFindName;
int nStart;
int nEnd;
};
class KBoneSeqObject;
/** Deform Mesh
"SETDEFORM_BONE" */
class KMsgSET_DEFORM : public KArg
{
public:
KMsgSET_DEFORM( int _nBoneCount, K3DMatrix *_pMatBoneList ) : nBoneCount(_nBoneCount), pMatBoneList(_pMatBoneList) {}
int nBoneCount;
K3DMatrix * pMatBoneList;
KBoneSeqObject * pBoneSeq;
};
/// "REQ_BOUNDBOXEX"
class KMsgREQ_BOUNDBOXEX : public KArg
{
public:
KMsgREQ_BOUNDBOXEX() : m_isValid(false), pSearchName(NULL) {}
bool IsValid()
{
return m_isValid;
}
void AddBound( K3DBoundRotCube *cube )
{
m_isValid = true;
m_cubeBound.AddCube( *cube );
}
const K3DBoundRotCube &GetCube()
{
return m_cubeBound;
}
const char * pSearchName;
protected:
bool m_isValid;
K3DBoundRotCube m_cubeBound;
};
/** Request Clip Bound Box
"REQ_BOUNDBOX" */
class KMsgREQ_BOUNDBOX : public KArg
{
public:
KMsgREQ_BOUNDBOX()
{
m_isValid = false;
}
bool IsValid()
{
return m_isValid;
}
void AddBound( K3DBoundRotCube *cube )
{
if ( m_isValid == false )
{
m_cubeBound = *cube;
m_isValid = true;
}
else
m_cubeBound.AddCube( *cube );
}
const K3DBoundRotCube &GetCube()
{
return m_cubeBound;
}
protected:
bool m_isValid;
K3DBoundRotCube m_cubeBound;
};
/** Request Clip Bound Sphere
"REQ_BOUNDSPHERE" */
class KMsgREQ_BOUNDSPHERE : public KArg
{
public:
KMsgREQ_BOUNDSPHERE()
{
m_isValid = false;
}
bool IsValid()
{
return m_isValid;
}
void AddBound( K3DBoundSphere *sphere )
{
m_isValid = true;
m_sphereBound.AddSphere( *sphere );
}
const K3DBoundSphere &GetSphere()
{
return m_sphereBound;
}
protected:
bool m_isValid;
K3DBoundSphere m_sphereBound;
};
/// "SET_LIGHT_MAP"
class KMsgSET_LIGHTMAP : public KArg
{
public:
KMsgSET_LIGHTMAP(LPCSTR texName,size_t segmentIdx, size_t propIdx)
{
m_sPrefixTexName = texName;
m_segmentIdx = segmentIdx;
m_propIdx = propIdx;
}
size_t GetSegmentIdx() const { return m_segmentIdx; }
size_t GetPropIdx() const { return m_propIdx; }
LPCSTR GetPrefixTexName() const { return m_sPrefixTexName.c_str(); }
private:
std::string m_sPrefixTexName;
size_t m_segmentIdx;
size_t m_propIdx;
};
/// "GET_SEQOBJECT"
class KMsgGET_SEQOBJECT : public KArg
{
public:
KMsgGET_SEQOBJECT( const char * seqName )
{
pName = seqName;
pSeqObject = NULL;
}
const char * pName;
KSeqObject * pSeqObject;
};
class KMsgGET_MORPHMESH : public KArg
{
public:
KMsgGET_MORPHMESH()
{
bIsValid =false;
numFrames =0;
loopWindowSize=0;
markFrame =0;
animationDelay=0;
startColor0=startColor1=0xffffffff;
markColor0=markColor1 =0x80808080;
endColor0=endColor1 =0x00000000;
startSizeOffset=0.f;
markSizeOffset =0.f;
endSizeOffset =0.f;
}
bool bIsValid;
int numFrames;
int loopWindowSize;
int animationDelay;
int markFrame;
DWORD startColor0, startColor1;
DWORD markColor0, markColor1;
DWORD endColor0, endColor1;
float startSizeOffset;
float markSizeOffset;
float endSizeOffset;
std::string strTexture;
};
class KMsgSET_FIXTEXTURE : public KArg
{
public:
KMsgSET_FIXTEXTURE()
{
bUseFix = false;
bForceTransparent = false;
pTexture = NULL;
}
bool bUseFix;
bool bForceTransparent;
K3DTexture *pTexture;
};
class KMsgSET_WINKTEXTURE : public KArg
{
public:
KMsgSET_WINKTEXTURE() : bUseWink(false), nWinkTime(0), pTexture(NULL) {}
bool bUseWink;
short nWinkTime;
K3DTexture *pTexture;
};
class KMsgSET_COLORIZE : public KArg
{
public:
KMsgSET_COLORIZE()
{
color[0] = 0;
color[1] = 0;
color[2] = 0;
color[3] = 0;
nMode = 0;
}
DWORD color[4];
short nMode;
};
class KMsgSET_USE_TEXALPHA : public KArg
{
public:
KMsgSET_USE_TEXALPHA()
{
bIsUseTexAlpha = true;
}
bool bIsUseTexAlpha;
};
class KMsgSET_UV_MODIFY : public KArg
{
public:
KMsgSET_UV_MODIFY()
{
nW = 0;
nH = 0;
nTargetW = 0;
nTargetH = 0;
}
int nW, nH;
int nTargetW, nTargetH;
};
class KMsgSET_MORPHMESH : public KArg
{
public:
enum
{
FLAG_FRAME = 1 << 0,
FLAG_LOOP = 1 << 1,
FLAG_DELAY = 1 << 2,
FLAG_MARK = 1 << 3,
FLAG_SC0 = 1 << 4,
FLAG_SC1 = 1 << 5,
FLAG_MC0 = 1 << 6,
FLAG_MC1 = 1 << 7,
FLAG_EC0 = 1 << 8,
FLAG_EC1 = 1 << 9,
FLAG_SSIZE = 1 << 10,
FLAG_MSIZE = 1 << 11,
FLAG_ESIZE = 1 << 12,
FLAG_TEXTURE = 1 << 13,
FLAG_ADDITIVE = 1 << 14,
};
KMsgSET_MORPHMESH()
{
bShow =false;
nSetFlag =0;
numFrames =0;
loopWindowSize=0;
markFrame =0;
animationDelay=0;
startColor0=startColor1=0xffffffff;
markColor0=markColor1 =0x80808080;
endColor0=endColor1 =0x00000000;
startSizeOffset=0.f;
markSizeOffset =0.f;
endSizeOffset =0.f;
additive = 0;
}
bool bShow;
int nSetFlag;
int numFrames;
int loopWindowSize;
int animationDelay;
int markFrame;
DWORD startColor0, startColor1;
DWORD markColor0, markColor1;
DWORD endColor0, endColor1;
float startSizeOffset;
float markSizeOffset;
float endSizeOffset;
int additive;
std::string strTexture;
};
/** 텍스쳐 이름 얻기
"GETMESH_TEXNAME" */
class KMsgGET_MATRIX : public KArg
{
public:
KMsgGET_MATRIX() : matLocal( NULL )
, matRoot( NULL )
, bSuc( false )
{}
K3DMatrix* matLocal;
K3DMatrix* matRoot;
bool bSuc;
};
/// sonador 4.1.2 아바타 머리카락 알바 버그 재수정(ALPHABLENDTWOPASS)
class KMsgSET_BLENDMODE : public KArg
{
public:
KMsgSET_BLENDMODE() : blendMode( K3DMaterial::MBM_DEFAULT )
{
}
int blendMode;
};
//mte
class KMsgSET_MTETEX : public KArg
{
public:
KMsgSET_MTETEX() : pTexture(NULL) {}
K3DTexture* pTexture;
};
DECL_SPTR(K3DMeshResource)
DECL_SPTR(K3DResMeshMatrixAnimation)
DECL_SPTR(K3DResMeshVisibilityAnimation)
DECL_SPTR(K3DResMeshUVAnimation)
class KMeshSeqObject : public KSeqObject
{
public:
KMeshSeqObject();
virtual ~KMeshSeqObject();
void SetMeshRes( K3DMeshResource *mesh );
void SetMatrixRes( K3DResMeshMatrixAnimation *res );
void SetVisibilityRes( K3DResMeshVisibilityAnimation *res );
void SetUVAniRes( K3DResMeshUVAnimation *res );
virtual void SetAlterMaterial( K3DMaterial *pMtl );
virtual void SetColor( DWORD c1, DWORD c2 = 0, DWORD c3 = 0, DWORD c4 = 0, short nMode = 0 );
virtual void ClipTest( const K3DVector* pFrustrum);
virtual void Render( KViewportObject *viewport, DWORD flag = RENDEREFX_NONE, const K3DMatrix * pAttachMat = NULL );
virtual KSeqObject* Clone();
virtual void realizeTime();
virtual void *Perform( KID id, KArg& msg );
K3DBoundRotCube * GetCube();
K3DBoundSphere* GetSphere();
KMeshPrimitive* getMeshPrimitive(int nIndex);
static void SetToggleVisbleCube() { m_sVisbleCube = !m_sVisbleCube; }
void CalcMatrix();
//mte
void SetMTETexture( K3DTexture* pTex );
protected:
bool _defRender( int i, K3DResVertexAnimation *va, DWORD flag, float vis );
void _defSetTransform( DWORD flag );
void _makeBoundCube( KBoneSeqObject * pBoneSeq );
void updateColors();
void setBone( int nCount, K3DMatrix *pMatList );
void realizeTransform();
/// 강화
void _morphInit();
void _morphClear();
void _morphMeshMake();
void _morphDefaultSet();
void _oldmorphClear();
/// 무기 효과
void _effectMeshMake();
protected:
DWORD m_dwColors[4];
short m_nColorizedMode;
int m_nRenderState;
K3DMatrix m_matLocal;
K3DMatrix m_matRoot;
K3DMatrix m_matResult;
K3DMatrix m_matUV;
float m_fVisResult;
bool m_bForceTransparent;
K3DBoundSphere m_boundSphere;
K3DBoundRotCube m_boundCube;
K3DBoundOcclusion m_boundOcclusion;
K3DMaterial* m_pAlterMtl;
K3DMeshResourceSPtr m_spResMesh;
K3DResMeshMatrixAnimationSPtr m_spResMatrix;
K3DResMeshVisibilityAnimationSPtr m_spResVis;
K3DResMeshUVAnimationSPtr m_spResUV;
int m_nPrMeshCount;
KMeshPrimitive* m_pPrMesh;
KWireUtilPrimitive m_prCenterWire;
std::vector<K3DResVertexAnimation::Key *> m_vCacheKeyList;
int m_nBoneMatCount;
K3DMatrix* m_pBoneMatList;
static bool m_sVisbleCube;
bool m_bIsMakeBoundCube;
bool m_bUseTextureAlpha;
// sonador 1.8.10 아바타 텍스쳐 그룹 적용(페이스 컷 포함)
bool m_bUseDefaultTexture; ///< K3DResVertexAnimation의 TexPack을 사용하는가?
//무기 강화
// Parameters
int numFrames; ///< 전체 애니메이션 프레임 수. 대충 16~32
int loopWindowSize; ///< 반복될 애니메이션 간의 간격. 대충 4~8
int animationDelay; ///< 프레임 애니메이션 속도 (애니메이션 프레임 간의 시간간격)
int markFrame; ///< markFrame : 중간의 어떤 적절한 프레임. 애니메이션 경계를 주기 위해 사용
DWORD startColor0, startColor1; ///< 0번 프레임의 컬러. 24bit ARGB
DWORD markColor0, markColor1; ///< (markFrame)번 프레임의 컬러
DWORD endColor0, endColor1; ///< (numFrames-1)번 프레임의 컬러
float startSizeOffset; ///< 0번 프레임의 메쉬 확대 거리. 대충 +0.01정도?
float markSizeOffset; ///< (markFrame)번 프레임의 메쉬 크기.
float endSizeOffset; ///< (numFrames-1)번 프레임의 메쉬 크기. 대충 +0.6정도?
int additive; ///< Additive On/Off
std::string strFxTexture;
// Variables
DWORD previousTime;
DWORD checkTime;
int currentFrame; ///< 0 <= current < loopWindowSize
std::vector< FxResizedPrimitive* > morph_primitivelist;
int m_nMorphPrimitiveCount;
std::vector< FxResizedPrimitive* > clear_morph_primitivelist;
bool m_bUseWink;
bool m_bFlipWink;
K3DTextureSPtr m_spWinkTexture;
K3DTextureSPtr m_spBackUpDiffTexture;
};