Files
Client/Engine/Effect/SMRHeader.h
LGram16 e067522598 Initial commit: ROW Client source code
Game client codebase including:
- CharacterActionControl: Character and creature management
- GlobalScript: Network, items, skills, quests, utilities
- RYLClient: Main client application with GUI and event handlers
- Engine: 3D rendering engine (RYLGL)
- MemoryManager: Custom memory allocation
- Library: Third-party dependencies (DirectX, boost, etc.)
- Tools: Development utilities

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-29 16:24:34 +09:00

861 lines
17 KiB
C++

#include <d3dx8.h>
#include <d3d8.h>
#include <vector>
namespace SGEngine {
// template function Á¤ÀÇ
template<class _T>
inline void SafeDelete( _T ptr )
{
if( NULL != ptr )
{
delete (ptr);
ptr = NULL;
}
}
template<class _T>
inline void SafeDeleteA( _T ptr )
{
if( NULL != ptr )
{
delete[] (ptr);
ptr = NULL;
}
}
class CExportMeshVertex
{
public:
D3DXVECTOR3 m_vecPos;
D3DXVECTOR3 m_vecNormal;
D3DXVECTOR2 m_vecTexcoord;
CExportMeshVertex() : m_vecPos(0.0f,0.0f,0.0f),m_vecNormal(0.0f,0.0f,0.0f),m_vecTexcoord(0.0f,0.0f)
{}
~CExportMeshVertex(){}
};
enum MESHNODETYPE
{
MESHNODETYPE_DUMY = 0,
MESHNODETYPE_MATERIAL, // Material
MESHNODETYPE_MESHDATA, // Vertex, Index Data
MESHNODETYPE_ANINODE, // Ani Node
MESHNODETYPE_NUM,
};
enum SMRNODE
{
SMRNODE_NODE = 0,
SMRNODE_GROUP,
SMRNODE_NUM,
};
enum SMROBJTYPE
{
SMROBJ_MESH = 0,
SMROBJ_HELPER,
SMROBJ_BONE,
SMROBJ_NUM,
};
enum SMRMESHTYPE
{
SMRMESHTYPE_STATIC = 0,
SMRMESHTYPE_STATIC_WITHOUTLIGHTMAP,
SMRMESHTYPE_DYNAMIC,
SMRMESHTYPE_NUM,
};
enum SMRANICONTROLTYPE
{
SMRANICONTROL_BEZIER = 0,
SMRANICONTROL_LINEAR,
SMRANICONTROL_TCB,
SMRANICONTROL_SAMPLE,
SMRANICONTROL_NUM,
};
namespace Core {
class CMeshHeader
{
public:
CMeshHeader() : m_fVersion(1.0f),m_iNodes(0),m_iType(SMRMESHTYPE_STATIC)
{
memset(m_iExtension,0,sizeof(int)*10);
}
~CMeshHeader()
{}
float m_fVersion;
int m_iNodes;
int m_iType;
int m_iExtension[10]; // ÈÄÀÏÀ» À§ÇÑ È®Àå.
};
class CMeshObjNodeHeader
{
public:
CMeshObjNodeHeader() : m_iNodeType(MESHNODETYPE_DUMY), m_iNodeSize(0)
{}
~CMeshObjNodeHeader()
{}
int m_iNodeType;
unsigned long m_iNodeSize;
};
class CNodeTMInfo // MeshTM KeyInfo.
{
public:
D3DXVECTOR3 m_vecTrans; // Translation
D3DXVECTOR3 m_vecScale; // Scale
D3DXQUATERNION m_qRot; // Rot
D3DXQUATERNION m_qScaleAxis;
float m_fDetermination;
CNodeTMInfo() : m_vecTrans(0.0f,0.0f,0.0f),m_vecScale(1.0f,1.0f,1.0f),m_qRot(0.0f,0.0f,0.0f,1.0f),
m_qScaleAxis(0.0f,0.0f,0.0f,1.0f),m_fDetermination(0.0f)
{}
~CNodeTMInfo(){}
};
class CMeshKeyAniNode
{
public:
class CMeshKeyAniTm
{
public:
CMeshKeyAniTm() : m_iFrame(0)
{
}
~CMeshKeyAniTm()
{
}
int m_iFrame;
CNodeTMInfo m_TmInfo;
};
class CMeshKeyAniRot
{
public:
CMeshKeyAniRot() : m_qRotKey(0.0f,0.0f,0.0f,1.0f),m_iFrame(0)
{
}
~CMeshKeyAniRot()
{
}
D3DXQUATERNION m_qRotKey;
int m_iFrame;
};
class CMeshKeyAniPos
{
public:
CMeshKeyAniPos() : m_vecPos(0.0f,0.0f,0.0f),m_iFrame(0)
{
}
~CMeshKeyAniPos()
{
}
D3DXVECTOR3 m_vecPos;
int m_iFrame;
};
class CMeshKeyAniScale
{
public:
CMeshKeyAniScale() : m_iFrame(0),m_vecScale(1.0f,1.0f,1.0f)
{
}
~CMeshKeyAniScale()
{
}
D3DXVECTOR3 m_vecScale;
int m_iFrame;
};
class CMeshKeyAniVis
{
public:
CMeshKeyAniVis() : m_iFrame(0),m_fVisibility(1.0f)
{
}
~CMeshKeyAniVis()
{
}
float m_fVisibility;
int m_iFrame;
};
CMeshKeyAniNode() :m_iRotKeys(0),m_pRotKeys(NULL),m_bRotAni(false),m_iRotType(SMRANICONTROL_BEZIER),
m_iPosKeys(0),m_pPosKeys(NULL),m_bPosAni(false),m_iPosType(SMRANICONTROL_BEZIER),
m_iScaleKeys(0),m_pScaleKeys(NULL),m_bScaleAni(false),m_iScaleType(SMRANICONTROL_BEZIER),
m_iVisKeys(0),m_pVisKeys(NULL),m_bVisAni(false),m_iVisType(SMRANICONTROL_BEZIER),
m_bTmAni(false),m_iTmKeys(0),m_pTmKeys(NULL)
{
}
~CMeshKeyAniNode()
{
if(m_pRotKeys)
{
delete[] m_pRotKeys;
m_pRotKeys = NULL;
}
if(m_pPosKeys)
{
delete[] m_pPosKeys;
m_pPosKeys = NULL;
}
if(m_pScaleKeys)
{
delete[] m_pScaleKeys;
m_pScaleKeys = NULL;
}
if(m_pVisKeys)
{
delete[] m_pVisKeys;
m_pVisKeys = NULL;
}
if(m_pTmKeys)
{
delete[] m_pTmKeys;
m_pTmKeys = NULL;
}
}
bool m_bRotAni;
int m_iRotKeys;
CMeshKeyAniRot *m_pRotKeys;
int m_iRotType;
bool m_bPosAni;
int m_iPosKeys;
CMeshKeyAniPos *m_pPosKeys;
int m_iPosType;
bool m_bScaleAni;
int m_iScaleKeys;
CMeshKeyAniScale *m_pScaleKeys;
int m_iScaleType;
bool m_bVisAni;
int m_iVisKeys;
CMeshKeyAniVis *m_pVisKeys;
int m_iVisType;
bool m_bTmAni;
int m_iTmKeys;
CMeshKeyAniTm *m_pTmKeys;
};
class CMeshMaterialInfo
{
public:
CMeshMaterialInfo()
{
memset(m_strName,0,sizeof(char) * 256);
}
~CMeshMaterialInfo(){}
bool CheckString(const char *strName)
{
if(!strcmp(m_strName,strName))
return true;
return false;
}
char m_strName[256];
};
class CMeshObjNode;
class CMeshSkinData
{
public:
class CMeshSkinRigid
{
public:
int m_iMatIndex;
int m_iVertexIndex;
char m_strNodeName[256];
int m_iNodeIndex;
CMeshObjNode *m_pNode;
CMeshSkinRigid() : m_iVertexIndex(0), m_iMatIndex(0),m_pNode(NULL)
{
memset(m_strNodeName,0,sizeof(char) * 256);
m_iNodeIndex = 0;
}
~CMeshSkinRigid(){}
};
class CMeshBlendData
{
public:
char m_strNodeName[256];
int m_iNodeIndex;
float m_fNodeWeight;
CMeshObjNode *m_pNode;
CMeshBlendData() :m_fNodeWeight(0.0f) , m_pNode(NULL)
{
memset(m_strNodeName,0,sizeof(char) * 256);
m_iNodeIndex = 0;
}
~CMeshBlendData(){}
};
class CMeshSkinBlend
{
public:
int m_iMatIndex;
int m_iVertexIndex;
CMeshBlendData *m_pArrBlendData;
int m_iBlendData;
CMeshSkinBlend() : m_iVertexIndex(0),m_iMatIndex(0)
{
m_pArrBlendData = NULL;
m_iBlendData = 0;
}
~CMeshSkinBlend()
{
SafeDeleteA(m_pArrBlendData);
m_pArrBlendData = NULL;
}
};
CMeshSkinData() : m_iRigid(0),m_iBlend(0),m_pRigid(NULL),m_pBlend(NULL)
{
}
~CMeshSkinData()
{
SafeDeleteA(m_pRigid);
m_pRigid = NULL;
SafeDeleteA(m_pBlend);
m_pBlend = NULL;
}
void FindSkinRigidData(int iIndex,std::vector<CMeshSkinRigid *> *pArrRigid)
{
int i;
if(pArrRigid)
{
for(i = 0; i < m_iRigid; i++)
{
if(m_pRigid[i].m_iVertexIndex == iIndex)
{
pArrRigid->push_back(&(m_pRigid[i]));
}
}
}
}
void FindSkinBlendData(int iIndex,std::vector<CMeshSkinBlend *> *pArrBlend)
{
int i;
if(pArrBlend)
{
for(i = 0; i < m_iBlend; i++)
{
if(m_pBlend[i].m_iVertexIndex == iIndex)
{
pArrBlend->push_back(&(m_pBlend[i]));
}
}
}
}
int m_iRigid;
CMeshSkinRigid *m_pRigid;
int m_iBlend;
CMeshSkinBlend *m_pBlend;
};
class CMeshObjNode;
class CMeshCoreData
{
public:
class CMeshSMorphData // Smart Morphing
{
public:
int m_iModelID;
char m_strName[256];
D3DXVECTOR3 *m_pRelativeVertices;
int *m_pRelativeIndex;
int m_iRelativeNum;
CMeshSMorphData() : m_iModelID(-1),m_pRelativeVertices(NULL),m_pRelativeIndex(NULL),m_iRelativeNum(0)
{
memset(m_strName,0,sizeof(char) * 256);
}
~CMeshSMorphData()
{
SafeDeleteA(m_pRelativeVertices);
m_pRelativeVertices = NULL;
SafeDeleteA(m_pRelativeIndex);
m_pRelativeIndex = NULL;
}
void SetSmartMorphData(CExportMeshVertex *pSrc,CExportMeshVertex *pDest,const int &iVertices,const int &iModelIndex = -1,char *strModelName = NULL);
};
class CMeshMorphData
{
public:
CMeshMorphData() : m_iFrame(0), m_pVertices(NULL)
{}
~CMeshMorphData()
{
SafeDeleteA(m_pVertices);
m_pVertices = NULL;
}
int m_iFrame;
CExportMeshVertex *m_pVertices;
};
CMeshCoreData() : m_iType(SMRMESHTYPE_STATIC),m_iVerticesNum(0),m_iIndicesNum(0),
m_pVertices(NULL),m_pIndices(NULL),m_iMaterialIndex(0),m_pNode(NULL),m_bUpdateData(false),
m_bMorph(false),m_pMorphData(NULL),m_iMorph(0),
m_bSMorph(false),m_pSMorph(NULL),m_iSMorph(0),m_pfSMorphInterValue(NULL),
m_bCullOff(false),m_bZWriteOff(false),m_bZOff(false)
{
m_bTotalBilboard = false;
memset(m_strName,0,sizeof(char) * 256);
m_pDefaultVertices = NULL;
}
~CMeshCoreData()
{
SafeDeleteA(m_pVertices);
m_pVertices = NULL;
SafeDeleteA(m_pDefaultVertices);
m_pDefaultVertices = NULL;
SafeDeleteA(m_pIndices);
m_pIndices = NULL;
SafeDeleteA(m_pMorphData);
m_pMorphData = NULL;
SafeDeleteA(m_pSMorph);
m_pSMorph = NULL;
SafeDeleteA(m_pfSMorphInterValue);
m_pfSMorphInterValue = NULL;
}
void SetTotalBilboard(bool bValue) { m_bTotalBilboard = bValue;}
bool GetTotalBilboard() { return m_bTotalBilboard;}
void SetCullOffFlag(bool bValue) { m_bCullOff = bValue;}
bool GetCullOffFlag() { return m_bCullOff; }
void SetZWriteOffFlag(bool bValue) { m_bZWriteOff = bValue;}
bool GetZWriteOffFlag() { return m_bZWriteOff; }
void SetZOffFlag(bool bValue) { m_bZOff = bValue;}
bool GetZOffFlag() { return m_bZOff; }
void CreateBuffer()
{
if(m_iIndicesNum > 0)
{
SafeDeleteA(m_pIndices);
m_pIndices = NULL;
m_pIndices = new WORD[m_iIndicesNum];
}
if(m_iVerticesNum > 0)
{
SafeDeleteA(m_pVertices);
m_pVertices = NULL;
m_pVertices = new CExportMeshVertex[m_iVerticesNum];
}
}
void CreateDefaultBuffer()
{
if(m_pDefaultVertices == NULL)
{
if(m_iVerticesNum > 0)
{
m_pDefaultVertices = new CExportMeshVertex[m_iVerticesNum];
memcpy(m_pDefaultVertices,m_pVertices,sizeof(CExportMeshVertex) * m_iVerticesNum);
}
}
}
void CopyBuffer(CExportMeshVertex *pData,WORD *pData2)
{
if(pData != NULL && m_pVertices != NULL)
{
memcpy(m_pVertices,pData,sizeof(CExportMeshVertex) * m_iVerticesNum);
}
if(pData2 != NULL && m_pIndices != NULL)
{
memcpy(m_pIndices,pData2,sizeof(WORD) * m_iIndicesNum);
}
}
void AddBuffer(CExportMeshVertex *pData,int iData,WORD *pData2,int iData2)
{
int i;
int iIndexStart = m_iVerticesNum;
if(pData && m_pVertices)
{
CExportMeshVertex *pNewData = new CExportMeshVertex[m_iVerticesNum + iData];
memcpy(pNewData,m_pVertices,sizeof(CExportMeshVertex) * m_iVerticesNum);
for(i = 0; i < iData; i++ )
{
pNewData[m_iVerticesNum + i] = pData[i];
}
m_iVerticesNum += iData;
SafeDeleteA(m_pVertices);
m_pVertices = pNewData;
}
if(pData2 && m_pIndices)
{
WORD *pNewData2 = new WORD[iData2 + m_iIndicesNum];
memcpy(pNewData2,m_pIndices,sizeof(WORD) * m_iIndicesNum);
for(i = 0; i < iData2; i++ )
{
pData2[i] += iIndexStart;
pNewData2[m_iIndicesNum + i] = pData2[i];
}
m_iIndicesNum += iData2;
SafeDeleteA(m_pIndices);
m_pIndices = pNewData2;
}
}
void CreateMorphBuffer(int iMorphNums)
{
m_bMorph = true;
m_iMorph = iMorphNums;
m_pMorphData = new CMeshMorphData[m_iMorph];
}
void SetMorphBuffer(int iMorphIndex,int iFrame,int iVertices,CExportMeshVertex *pVertices)
{
if(pVertices && iMorphIndex < m_iMorph && m_pMorphData)
{
m_pMorphData[iMorphIndex].m_iFrame = iFrame;
m_pMorphData[iMorphIndex].m_pVertices = new CExportMeshVertex[iVertices];
memcpy(m_pMorphData[iMorphIndex].m_pVertices,pVertices,sizeof(CExportMeshVertex ) * iVertices);
}
}
void SetSkinMeshData(const int &iVertex,D3DXMATRIX *matTm,D3DXMATRIX *matInvNodeTm); // rigid
void SetSkinMeshData(const int &iVertex,CMeshSkinData::CMeshBlendData *pBlend,const int &iBlend);
void SetUpdateFlag(bool bFlag) { m_bUpdateData = bFlag;}
void UpdateMeshMorph(const float &fFrame);
void UpdateMeshSmartMorph();
void SetSmartMorphInterValue(const float &fValue,const int &iIndex);
int GetSmartMorphNum() { return m_iSMorph;}
CMeshObjNode *m_pNode;
char m_strName[256];
int m_iType;
int m_iVerticesNum;
int m_iIndicesNum;
int m_iMaterialIndex;
bool m_bUpdateData;
CExportMeshVertex *m_pVertices;
CExportMeshVertex *m_pDefaultVertices; //skinning À» À§ÇÑ default vertices.
WORD *m_pIndices;
bool m_bMorph;
CMeshMorphData *m_pMorphData;
int m_iMorph;
bool m_bSMorph;
CMeshSMorphData *m_pSMorph;
int m_iSMorph;
float *m_pfSMorphInterValue;
bool m_bTotalBilboard;
bool m_bCullOff;
bool m_bZWriteOff;
bool m_bZOff;
};
class CMeshObjNode
{
public:
CMeshObjNode() : m_pParent(0),m_pChild(0),m_iChild(0),m_iParentID(-1),m_iNodeID(-1),
m_iNodeType(SMRNODE_NODE),m_iObjectType(SMROBJ_MESH),m_iMeshType(SMRMESHTYPE_STATIC),m_pAniNode(NULL),
m_bSkinMorph(false),m_pSkinData(NULL)
{
memset(m_strName,0,sizeof(char) * 256);
m_iMeshData = 0;
m_pArrMeshData.clear();
m_bAniNode = false;
D3DXMatrixIdentity(&m_matNodeTm);
D3DXMatrixIdentity(&m_matInvNodeTm);
D3DXMatrixIdentity(&m_matLocalTm);
m_fVisibility = 1.0f;
m_bWorldTM = false;
}
~CMeshObjNode()
{
SafeDeleteA(m_pChild);
m_pChild = NULL;
SafeDelete(m_pAniNode);
m_pAniNode = NULL;
SafeDelete(m_pSkinData);
m_pSkinData = NULL;
}
void SetParentNode(CMeshObjNode *pNode,const int &iParentID)
{
m_pParent = pNode;
m_iParentID = iParentID;
}
CMeshObjNode *GetParentNode()
{
return m_pParent;
}
int GetParentNodeID()
{
return m_iParentID;
}
int GetChildNum()
{
return m_iChild;
}
CMeshObjNode *GetChildNode(int iNum)
{
if(iNum < m_iChild)
{
return &(m_pChild[iNum]);
}
return NULL;
}
void SetNodeName(const char *strName) { strcpy(m_strName,strName);}
bool IsNodeSameName(const char *strName)
{
if(!strcmp(m_strName,strName)) return true;
return false;
}
char *GetNodeName() { return m_strName;}
int GetNodeID() { return m_iNodeID;}
void SetNodeID(const int &iNodeID) { m_iNodeID = iNodeID;}
void SetType(const int &iNodeType,const int &iObjType,const int &iMeshType)
{
m_iNodeType = iNodeType;
m_iObjectType = iObjType;
m_iMeshType = iMeshType;
}
int GetNodeType() { return m_iNodeType;}
int GetObjectType() { return m_iObjectType;}
int GetMeshType() { return m_iMeshType;}
CMeshCoreData *GetMeshData(const int &iMat)
{
for(unsigned int i = 0; i < m_pArrMeshData.size(); i++ )
{
if(m_pArrMeshData[i]->m_iMaterialIndex == iMat)
return m_pArrMeshData[i];
}
return NULL;
}
void SetSkinMeshData(const int &iMat,const int &iVertex,CMeshSkinData::CMeshBlendData *pBlend,const int &iBlend)
{
for(unsigned int i = 0; i < m_pArrMeshData.size(); i++ )
{
if(m_pArrMeshData[i]->m_iMaterialIndex == iMat)
m_pArrMeshData[i]->SetSkinMeshData(iVertex,pBlend,iBlend);
}
}
void SetSkinMeshData(const int &iMat,const int &iVertex,D3DXMATRIX *matTm,D3DXMATRIX *matInvNodeTm)
{
for(unsigned int i = 0; i < m_pArrMeshData.size(); i++ )
{
if(m_pArrMeshData[i]->m_iMaterialIndex == iMat)
m_pArrMeshData[i]->SetSkinMeshData(iVertex,matTm,matInvNodeTm);
}
}
void AddMeshData(CMeshCoreData *pMesh)
{
m_pArrMeshData.push_back(pMesh);
pMesh->m_pNode = this;
m_iMeshData++;
}
void SetChildNum(const int &iNum) {
m_iChild = iNum;
SafeDeleteA(m_pChild);
if(iNum > 0)
{
m_pChild = new CMeshObjNode[m_iChild];
for(int i = 0; i <m_iChild; i++ )
{
m_pChild[i].SetParentNode(this,m_iNodeID);
}
}
}
void SetAniNode(CMeshKeyAniNode *pNode)
{
m_pAniNode = pNode;
m_bAniNode = true;
}
CMeshKeyAniNode *GetAniNode()
{
if(m_bAniNode)
return m_pAniNode;
return NULL;
}
bool ISAniNode()
{
return m_bAniNode;
}
void SetSkinData(CMeshSkinData *pData)
{
m_pSkinData = pData;
m_bSkinMorph =true;
}
CMeshSkinData *GetSkinData()
{
if(m_bSkinMorph)
return m_pSkinData;
return NULL;
}
bool ISSkinData()
{
return m_bSkinMorph;
}
void SetWorldTMFlag(bool bFlag) { m_bWorldTM = bFlag;}
bool GetWorldTMFlag() { return m_bWorldTM;}
void UpdateTm(const float &fFrame,D3DXMATRIX *matParent = NULL);
void UpdateSkinning();
CMeshObjNode * m_pParent;
int m_iParentID;
CMeshObjNode * m_pChild;
int m_iChild;
D3DXMATRIX m_matNodeTm;
D3DXMATRIX m_matInvNodeTm;
D3DXMATRIX m_matLocalTm;
CNodeTMInfo m_DefaultNodeTm;
float m_fVisibility;
protected:
char m_strName[256];
int m_iNodeID;
int m_iNodeType;
int m_iObjectType;
int m_iMeshType;
bool m_bWorldTM;
CMeshKeyAniNode *m_pAniNode;
bool m_bAniNode;
bool m_bSkinMorph;
CMeshSkinData *m_pSkinData;
std::vector<CMeshCoreData *> m_pArrMeshData; // loading ÇÒ¶§ ä¿öÁø´Ù.
int m_iMeshData;
};
}
}