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>
This commit is contained in:
2025-11-29 16:24:34 +09:00
commit e067522598
5135 changed files with 1745744 additions and 0 deletions

572
Engine/Effect/SMRObj.cpp Normal file
View File

@@ -0,0 +1,572 @@
// SMRObj.cpp: implementation of the CSMRObj class.
//
//////////////////////////////////////////////////////////////////////
#include "SMRObj.h"
#include "SceneManager.h"
#include "GMMemory.h"
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
const DWORD dwExportMeshVertex = D3DFVF_XYZ | D3DFVF_NORMAL | D3DFVF_TEX1;
void CSMRObj::GetAniNode(SGEngine::Core::CMeshObjNode *pNode,FILE *fp)
{
bool bAni = false;
bool bWorldTM = false;
bool bSkin = false;
int iNum[8];
int iAniNum[14];
fread(iNum,sizeof(int) * 8,1,fp);
pNode->SetNodeID(iNum[0]);
pNode->SetType(iNum[2],iNum[3],iNum[4]);
pNode->SetChildNum(iNum[1]);
bAni = (iNum[5] == 1) ? true : false;
bWorldTM = (iNum[6] == 1) ? true : false;
bSkin = (iNum[7] == 1) ? true : false;
pNode->SetWorldTMFlag(bWorldTM);
fread(pNode->GetNodeName(),sizeof(char) * 256,1,fp);
fread(&(pNode->m_DefaultNodeTm),sizeof(SGEngine::Core::CNodeTMInfo),1,fp);
fread(&(pNode->m_matNodeTm),sizeof(D3DXMATRIX),1,fp);
D3DXMatrixInverse(&(pNode->m_matInvNodeTm),NULL,&(pNode->m_matNodeTm));
if(bAni)
{
SGEngine::Core::CMeshKeyAniNode *pAniNode = new SGEngine::Core::CMeshKeyAniNode;
fread(iAniNum,sizeof(int) * 14,1,fp);
pAniNode->m_bPosAni = (iAniNum[0] == 1) ? true : false;
pAniNode->m_bRotAni = (iAniNum[1] == 1) ? true : false;
pAniNode->m_bScaleAni = (iAniNum[2] == 1) ? true : false;
pAniNode->m_bVisAni = (iAniNum[3] == 1) ? true : false;
pAniNode->m_iPosKeys = iAniNum[4];
pAniNode->m_iPosType = iAniNum[5];
pAniNode->m_iRotKeys = iAniNum[6];
pAniNode->m_iRotType = iAniNum[7];
pAniNode->m_iScaleKeys = iAniNum[8];
pAniNode->m_iScaleType = iAniNum[9];
pAniNode->m_iVisKeys = iAniNum[10];
pAniNode->m_iVisType = iAniNum[11];
pAniNode->m_bTmAni = (iAniNum[12] == 1) ? true : false;
pAniNode->m_iTmKeys = iAniNum[13];
if(pAniNode->m_iPosKeys > 0)
{
pAniNode->m_pPosKeys = new SGEngine::Core::CMeshKeyAniNode::CMeshKeyAniPos[pAniNode->m_iPosKeys];
fread(pAniNode->m_pPosKeys,sizeof(SGEngine::Core::CMeshKeyAniNode::CMeshKeyAniPos) * pAniNode->m_iPosKeys,1,fp);
}
if(pAniNode->m_iRotKeys > 0)
{
pAniNode->m_pRotKeys = new SGEngine::Core::CMeshKeyAniNode::CMeshKeyAniRot[pAniNode->m_iRotKeys];
fread(pAniNode->m_pRotKeys,sizeof(SGEngine::Core::CMeshKeyAniNode::CMeshKeyAniRot) *pAniNode->m_iRotKeys,1,fp);
}
if(pAniNode->m_iScaleKeys > 0)
{
pAniNode->m_pScaleKeys = new SGEngine::Core::CMeshKeyAniNode::CMeshKeyAniScale[pAniNode->m_iScaleKeys ];
fread(pAniNode->m_pScaleKeys,sizeof(SGEngine::Core::CMeshKeyAniNode::CMeshKeyAniScale) *pAniNode->m_iScaleKeys ,1,fp);
}
if(pAniNode->m_iVisKeys > 0)
{
pAniNode->m_pVisKeys = new SGEngine::Core::CMeshKeyAniNode::CMeshKeyAniVis[pAniNode->m_iVisKeys];
fread(pAniNode->m_pVisKeys,sizeof(SGEngine::Core::CMeshKeyAniNode::CMeshKeyAniVis) *pAniNode->m_iVisKeys,1,fp);
}
if(pAniNode->m_iTmKeys > 0)
{
pAniNode->m_pTmKeys = new SGEngine::Core::CMeshKeyAniNode::CMeshKeyAniTm[pAniNode->m_iTmKeys];
fread(pAniNode->m_pTmKeys,sizeof(SGEngine::Core::CMeshKeyAniNode::CMeshKeyAniTm) * pAniNode->m_iTmKeys,1,fp);
}
pNode->SetAniNode(pAniNode);
}
if(bSkin)
{
SGEngine::Core::CMeshSkinData *pSkinData = new SGEngine::Core::CMeshSkinData;
int iSkinNum[2];
fread(iSkinNum,sizeof(int) * 2, 1,fp);
pSkinData->m_iRigid = iSkinNum[0];
pSkinData->m_iBlend = iSkinNum[1];
if(iSkinNum[0])
{
pSkinData->m_pRigid = new SGEngine::Core::CMeshSkinData::CMeshSkinRigid[iSkinNum[0]];
fread(pSkinData->m_pRigid,sizeof(SGEngine::Core::CMeshSkinData::CMeshSkinRigid) * iSkinNum[0],1,fp);
}
if(iSkinNum[1])
{
pSkinData->m_pBlend = new SGEngine::Core::CMeshSkinData::CMeshSkinBlend[iSkinNum[1]];
for(int iBlend = 0; iBlend < iSkinNum[1]; iBlend++)
{
int iBlendNum[3];
fread(iBlendNum,sizeof(int) * 3, 1,fp);
pSkinData->m_pBlend[iBlend].m_iMatIndex = iBlendNum[0];
pSkinData->m_pBlend[iBlend].m_iVertexIndex = iBlendNum[1];
pSkinData->m_pBlend[iBlend].m_iBlendData = iBlendNum[2];
if(iBlendNum[2])
{
pSkinData->m_pBlend[iBlend].m_pArrBlendData = new SGEngine::Core::CMeshSkinData::CMeshBlendData[iBlendNum[2]];
fread(pSkinData->m_pBlend[iBlend].m_pArrBlendData,sizeof(SGEngine::Core::CMeshSkinData::CMeshBlendData) * iBlendNum[2],1,fp);
}
}
}
pNode->SetSkinData(pSkinData);
}
for(int i= 0; i < pNode->GetChildNum(); i++)
GetAniNode(pNode->GetChildNode(i),fp);
}
void CSMRObj::AddMesh(SGEngine::Core::CMeshCoreData *pMesh,SGEngine::Core::CMeshObjNode *pNode)
{
if(pNode && pMesh)
{
if(!strcmp(pNode->GetNodeName() , pMesh->m_strName))
{
pNode->AddMeshData(pMesh);
if(pNode->ISSkinData())
{
pMesh->CreateDefaultBuffer();
}
return;
}
for(int i = 0; i < pNode->GetChildNum(); i++ )
{
AddMesh(pMesh,pNode->GetChildNode(i));
}
}
}
void CSMRObj::Load(const char *strFileName)
{
FILE *fp = fopen(strFileName,"rb");
int i = 0;
int j = 0;
if(fp)
{
fread(&m_MeshHeader,sizeof(SGEngine::Core::CMeshHeader),1,fp);
m_iFrameInfo[0] = m_MeshHeader.m_iExtension[0]; // Start Frame
m_iFrameInfo[1] = m_MeshHeader.m_iExtension[1]; // End Frame
m_iFrameInfo[2] = m_MeshHeader.m_iExtension[2]; // Frame Rate
m_iFrameInfo[3] = m_MeshHeader.m_iExtension[3]; // TickPerFrame
for(i = 0; i < m_MeshHeader.m_iNodes; i++ )
{
SGEngine::Core::CMeshObjNodeHeader ObjHeader;
fread(&ObjHeader,sizeof(SGEngine::Core::CMeshObjNodeHeader),1,fp);
if(ObjHeader.m_iNodeType == SGEngine::MESHNODETYPE_MATERIAL)
{
m_iMaterial = ObjHeader.m_iNodeSize;
if(m_iMaterial)
{
m_pMaterial = new SGEngine::Core::CMeshMaterialInfo[m_iMaterial];
fread(m_pMaterial,sizeof(SGEngine::Core::CMeshMaterialInfo) * m_iMaterial,1,fp);
CTexture *pTexture = NULL;
CTexture::SetPath(EFFECTTEXTUREPATH);
for(j = 0; j < m_iMaterial; j++ )
{
pTexture = new CTexture;
pTexture->Load(m_pMaterial[j].m_strName);
m_lstTexture.push_back(pTexture);
}
}
}
else if(ObjHeader.m_iNodeType == SGEngine::MESHNODETYPE_MESHDATA)
{
int iNum[6];
m_iMeshData = ObjHeader.m_iNodeSize;
m_pMeshData = new SGEngine::Core::CMeshCoreData[m_iMeshData];
m_pVertexBuffer = new LPDIRECT3DVERTEXBUFFER8[m_iMeshData];
m_pIndexBuffer= new LPDIRECT3DINDEXBUFFER8[m_iMeshData];
for(j = 0 ; j < (int)ObjHeader.m_iNodeSize; j++ )
{
fread(iNum,sizeof(int) * 6,1,fp);
m_pMeshData[j].m_iVerticesNum = iNum[2];
m_pMeshData[j].m_iIndicesNum = iNum[3];
m_pMeshData[j].m_iMaterialIndex = iNum[1];
m_pMeshData[j].m_iType = iNum[0];
m_pMeshData[j].m_bMorph = (iNum[4] == 1) ? true : false;
m_pMeshData[j].m_bSMorph = (iNum[5] == 1) ? true : false;
fread(m_pMeshData[j].m_strName,sizeof(char) * 256, 1,fp);
if(strchr(m_pMeshData[j].m_strName,'C'))
{
m_pMeshData[j].SetTotalBilboard(true);
}
if(strchr(m_pMeshData[j].m_strName,'Z'))
{
m_pMeshData[j].SetZWriteOffFlag(true);
}
if(strchr(m_pMeshData[j].m_strName,'W'))
{
m_pMeshData[j].SetCullOffFlag(true);
}
if(strchr(m_pMeshData[j].m_strName,'K'))
{
m_pMeshData[j].SetZOffFlag(true);
}
m_pMeshData[j].CreateBuffer();
fread(m_pMeshData[j].m_pIndices,sizeof(WORD) * m_pMeshData[j].m_iIndicesNum,1,fp);
fread(m_pMeshData[j].m_pVertices,sizeof(SGEngine::CExportMeshVertex) * m_pMeshData[j].m_iVerticesNum,1,fp);
if(m_pMeshData[j].m_bMorph)
{
fread(&m_pMeshData[j].m_iMorph,sizeof(int), 1,fp);
m_pMeshData[j].m_pMorphData = new SGEngine::Core::CMeshCoreData::CMeshMorphData[m_pMeshData[j].m_iMorph];
for(int iMorph= 0; iMorph < m_pMeshData[j].m_iMorph; iMorph++)
{
fread(&m_pMeshData[j].m_pMorphData[iMorph].m_iFrame,sizeof(int),1,fp);
m_pMeshData[j].m_pMorphData[iMorph].m_pVertices = new SGEngine::CExportMeshVertex[m_pMeshData[j].m_iVerticesNum];
fread(m_pMeshData[j].m_pMorphData[iMorph].m_pVertices,sizeof(SGEngine::CExportMeshVertex) * m_pMeshData[j].m_iVerticesNum,1,fp);
}
}
if(m_pMeshData[j].m_bSMorph)
{
m_pMeshData[j].CreateDefaultBuffer();
fread(&(m_pMeshData[j].m_iSMorph),sizeof(int),1,fp);
m_pMeshData[j].m_pSMorph = new SGEngine::Core::CMeshCoreData::CMeshSMorphData[m_pMeshData[j].m_iSMorph];
m_pMeshData[j].m_pfSMorphInterValue = new float[m_pMeshData[j].m_iSMorph];
for(int ism = 0;ism < m_pMeshData[j].m_iSMorph; ism++)
{
m_pMeshData[j].m_pfSMorphInterValue[ism] = 0.0f;
int iSMNum[2];
fread(m_pMeshData[j].m_pSMorph[ism].m_strName,sizeof(char) * 256, 1,fp);
fread(iSMNum,sizeof(int) * 2,1,fp);
m_pMeshData[j].m_pSMorph[ism].m_iModelID = iSMNum[0];
m_pMeshData[j].m_pSMorph[ism].m_iRelativeNum = iSMNum[1];
m_pMeshData[j].m_pSMorph[ism].m_pRelativeVertices = new D3DXVECTOR3[iSMNum[1]];
m_pMeshData[j].m_pSMorph[ism].m_pRelativeIndex = new int[iSMNum[1]];
fread(m_pMeshData[j].m_pSMorph[ism].m_pRelativeVertices,sizeof(D3DXVECTOR3) * iSMNum[1],1,fp);
fread(m_pMeshData[j].m_pSMorph[ism].m_pRelativeIndex,sizeof(int) * iSMNum[1],1,fp);
}
}
CSceneManager::GetDevice()->CreateVertexBuffer(m_pMeshData[j].m_iVerticesNum * sizeof(SGEngine::CExportMeshVertex),D3DUSAGE_WRITEONLY | D3DUSAGE_DYNAMIC,
D3DFVF_XYZ | D3DFVF_NORMAL | D3DFVF_TEX1,D3DPOOL_DEFAULT,&(m_pVertexBuffer[j]));
SGEngine::CExportMeshVertex *pVert = NULL;
m_pVertexBuffer[j]->Lock(0,0,(BYTE **) &pVert,0);
memcpy(pVert,m_pMeshData[j].m_pVertices,sizeof(SGEngine::CExportMeshVertex) * m_pMeshData[j].m_iVerticesNum);
m_pVertexBuffer[j]->Unlock();
CSceneManager::GetDevice()->CreateIndexBuffer(sizeof(WORD) * m_pMeshData[j].m_iIndicesNum,D3DUSAGE_WRITEONLY,D3DFMT_INDEX16,D3DPOOL_DEFAULT,&m_pIndexBuffer[j]);
WORD *pWord = NULL;
m_pIndexBuffer[j]->Lock(0,0,(BYTE **)&pWord,0);
memcpy(pWord,m_pMeshData[j].m_pIndices,sizeof(WORD) * m_pMeshData[j].m_iIndicesNum);
m_pIndexBuffer[j]->Unlock();
}
}
else if(ObjHeader.m_iNodeType == SGEngine::MESHNODETYPE_ANINODE)
{
m_pRootNode = new SGEngine::Core::CMeshObjNode;
GetAniNode(m_pRootNode,fp);
}
}
fclose(fp);
for(i = 0; i < m_iMeshData; i++ )
{
AddMesh(&m_pMeshData[i],m_pRootNode);
}
SetSkinningLink(m_pRootNode);
}
}
SGEngine::Core::CMeshObjNode *CSMRObj::FindNode(const char *strName,SGEngine::Core::CMeshObjNode *pNode)
{
int i;
if(pNode)
{
if(pNode->IsNodeSameName(strName))
return pNode;
}
for(i = 0; i < pNode->GetChildNum(); i++ )
{
SGEngine::Core::CMeshObjNode * pN = NULL;
if((pN = FindNode(strName,pNode->GetChildNode(i))) != NULL)
return pN;
}
return NULL;
}
void CSMRObj::SetSkinningLink(SGEngine::Core::CMeshObjNode *pNode)
{
int i,j;
if(pNode->ISSkinData())
{
SGEngine::Core::CMeshSkinData *pSkinData = pNode->GetSkinData();
for(i = 0; i < pSkinData->m_iRigid; i++ )
{
pSkinData->m_pRigid[i].m_pNode = FindNode(pSkinData->m_pRigid[i].m_strNodeName,m_pRootNode);
}
for(i =0; i < pSkinData->m_iBlend; i++ )
{
for(j = 0; j < (pSkinData->m_pBlend->m_iBlendData); j++ )
{
pSkinData->m_pBlend[i].m_pArrBlendData[j].m_pNode =
FindNode(pSkinData->m_pBlend[i].m_pArrBlendData[j].m_strNodeName,m_pRootNode);
}
}
}
for(i = 0; i < pNode->GetChildNum(); i++ )
{
SetSkinningLink(pNode->GetChildNode(i));
}
}
void CSMRObj::UpdateSkinning(SGEngine::Core::CMeshObjNode *pNode)
{
if(pNode->ISSkinData())
{
pNode->UpdateSkinning();
}
for(int i = 0; i < pNode->GetChildNum(); i++ )
{
UpdateSkinning(pNode->GetChildNode(i));
}
}
void CSMRObj::UpdateBuffer(const float &fFrame)
{
int i;
SGEngine::CExportMeshVertex *pVert = NULL;
for(i = 0; i < m_iMeshData; i++ )
{
m_pMeshData[i].UpdateMeshMorph(fFrame);
m_pMeshData[i].UpdateMeshSmartMorph();
if(m_pMeshData[i].m_bUpdateData)
{
m_pMeshData[i].SetUpdateFlag(false);
pVert = NULL;
m_pVertexBuffer[i]->Lock(0,0,(BYTE **) &pVert,0);
memcpy(pVert,m_pMeshData[i].m_pVertices,sizeof(SGEngine::CExportMeshVertex) * m_pMeshData[i].m_iVerticesNum);
m_pVertexBuffer[i]->Unlock();
}
}
}
void CSMRObj::UpdateTm(SGEngine::Core::CMeshObjNode *pNode,const float &fFrame)
{
if(pNode->GetParentNode())
pNode->UpdateTm(fFrame,&(pNode->GetParentNode()->m_matNodeTm));
else
pNode->UpdateTm(fFrame,NULL);
for(int i = 0; i < pNode->GetChildNum(); i++ )
{
UpdateTm(pNode->GetChildNode(i),fFrame);
}
}
void CSMRObj::Render(LPDIRECT3DDEVICE8 lpDevice,D3DXVECTOR3 vecPos,D3DXVECTOR3 vecScale,D3DXQUATERNION quatRot,float fFrame)
{
int i = 0;
float iFrame = fFrame;
// Scale, Pos ,setting
// D3DXMATRIX matWorld;
// D3DXMatrixIdentity(&matWorld);
// matWorld._41 = vecPos.x;
// matWorld._42 = vecPos.y;
// matWorld._43 = vecPos.z;
// matWorld._11 = vecScale.x;
// matWorld._22 = vecScale.y;
// matWorld._33 = vecScale.z;
D3DXMATRIX matWorld, matScale, matRot;
D3DXMatrixScaling( &matScale, vecScale.x, vecScale.y, vecScale.z );
D3DXMatrixRotationQuaternion( &matRot, &quatRot );
D3DXMatrixMultiply( &matWorld, &matRot, &matScale );
matWorld._41 = vecPos.x;
matWorld._42 = vecPos.y;
matWorld._43 = vecPos.z;
/*m_pRootNode->m_matNodeTm._41 = vecPos.x;
m_pRootNode->m_matNodeTm._42 = vecPos.y;
m_pRootNode->m_matNodeTm._43 = vecPos.z;
m_pRootNode->m_matNodeTm._11 = vecScale.x;
m_pRootNode->m_matNodeTm._22 = vecScale.y;
m_pRootNode->m_matNodeTm._33 = vecScale.z;
*/
UpdateTm(m_pRootNode,iFrame);
UpdateSkinning(m_pRootNode); // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>־<EFBFBD><D6BE><EFBFBD> <20>Ѵ<EFBFBD>.
UpdateBuffer(iFrame);
if(iFrame > (float)m_iFrameInfo[1])
{
iFrame = (float)m_iFrameInfo[0];
}
if(iFrame < (float)m_iFrameInfo[0])
iFrame = (float)m_iFrameInfo[1];
D3DXMATRIX matIdentity;
D3DXMatrixIdentity(&matIdentity);
lpDevice->SetPixelShader(NULL);
lpDevice->SetVertexShader(dwExportMeshVertex);
for(i = 0; i < m_iMeshData; i++ )
{
if(m_pMeshData[i].m_iVerticesNum && m_pMeshData[i].m_iIndicesNum)
{
if(m_pMeshData[i].m_pNode)
{
if(m_pMeshData[i].GetTotalBilboard())
{ // bilboard
D3DXMATRIX view;
D3DXMATRIX invers_view;
lpDevice->GetTransform(D3DTS_VIEW,&view);
view._41 = view._42 = view._43 =0.0;
D3DXMatrixInverse(&invers_view,NULL,&view);
D3DXMatrixMultiply(&(m_pMeshData[i].m_pNode->m_matNodeTm),&(m_pMeshData[i].m_pNode->m_matNodeTm),&invers_view);
}
D3DXMatrixMultiply(&(m_pMeshData[i].m_pNode->m_matNodeTm),&(m_pMeshData[i].m_pNode->m_matNodeTm),&matWorld);
if(m_pMeshData[i].m_pNode->ISSkinData())
{
lpDevice->SetTransform(D3DTS_WORLD,&matIdentity);
}
else{
lpDevice->SetTransform(D3DTS_WORLD,&(m_pMeshData[i].m_pNode->m_matNodeTm));
}
int iValue = (int)(m_pMeshData[i].m_pNode->m_fVisibility * 255.0f);
DWORD color = D3DCOLOR_ARGB(iValue,iValue,iValue,iValue);
lpDevice->SetRenderState(D3DRS_TEXTUREFACTOR,color);
}
else
{
DWORD color = D3DCOLOR_ARGB(255,255,255,255);
lpDevice->SetRenderState(D3DRS_TEXTUREFACTOR,color);
}
lpDevice->SetRenderState(D3DRS_ZWRITEENABLE,FALSE);
lpDevice->SetRenderState(D3DRS_ALPHABLENDENABLE,TRUE);
lpDevice->SetRenderState(D3DRS_ALPHATESTENABLE,FALSE);
lpDevice->SetRenderState(D3DRS_SRCBLEND,m_dwSrcBlend);
lpDevice->SetRenderState(D3DRS_DESTBLEND,m_dwDstBlend);
if(m_pMeshData[i].GetCullOffFlag())
lpDevice->SetRenderState(D3DRS_CULLMODE,D3DCULL_NONE);
else
lpDevice->SetRenderState(D3DRS_CULLMODE,D3DCULL_CCW);
if(m_pMeshData[i].GetZWriteOffFlag())
{
lpDevice->SetRenderState(D3DRS_ZWRITEENABLE,FALSE);
}
else
{
lpDevice->SetRenderState(D3DRS_ZWRITEENABLE,TRUE);
}
if(m_pMeshData[i].GetZOffFlag())
lpDevice->SetRenderState(D3DRS_ZENABLE,FALSE);
else
lpDevice->SetRenderState(D3DRS_ZENABLE,TRUE);
lpDevice->SetTextureStageState(0,D3DTSS_ALPHAARG1,D3DTA_TFACTOR);
lpDevice->SetTextureStageState(0,D3DTSS_ALPHAARG2,D3DTA_TEXTURE);
lpDevice->SetTextureStageState(0,D3DTSS_ALPHAOP,D3DTOP_MODULATE);
lpDevice->SetTextureStageState(1,D3DTSS_ALPHAOP,D3DTOP_DISABLE);
lpDevice->SetTextureStageState(0,D3DTSS_COLORARG1,D3DTA_TFACTOR);
lpDevice->SetTextureStageState(0,D3DTSS_COLORARG2,D3DTA_TEXTURE);
lpDevice->SetTextureStageState(0,D3DTSS_COLOROP,D3DTOP_MODULATE);
lpDevice->SetTextureStageState(1,D3DTSS_COLOROP,D3DTOP_DISABLE);
lpDevice->SetTexture(0,m_lstTexture[m_pMeshData[i].m_iMaterialIndex]->GetTexture());
lpDevice->SetStreamSource(0,m_pVertexBuffer[i],sizeof(SGEngine::CExportMeshVertex));
lpDevice->SetIndices(m_pIndexBuffer[i],0);
lpDevice->DrawIndexedPrimitive(D3DPT_TRIANGLELIST,0,m_pMeshData[i].m_iVerticesNum,0,m_pMeshData[i].m_iIndicesNum/3);
lpDevice->SetRenderState(D3DRS_ALPHABLENDENABLE,FALSE);
lpDevice->SetRenderState(D3DRS_ALPHAFUNC,D3DCMP_LESSEQUAL);
lpDevice->SetRenderState(D3DRS_ALPHATESTENABLE,FALSE);
lpDevice->SetRenderState(D3DRS_CULLMODE,D3DCULL_CW);
lpDevice->SetRenderState(D3DRS_ZWRITEENABLE,TRUE);
lpDevice->SetRenderState(D3DRS_ZENABLE,TRUE);
}
}
}