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:
613
Engine/Caldron/Src/Scene/D3DBufferPools.cpp
Normal file
613
Engine/Caldron/Src/Scene/D3DBufferPools.cpp
Normal file
@@ -0,0 +1,613 @@
|
||||
#include "./d3dbufferpools.h"
|
||||
#include "SceneManager.h"
|
||||
#include "GMMemory.h"
|
||||
|
||||
using namespace Caldron::Scene;
|
||||
|
||||
void CD3DBufferObj::CreateBuffer(int iType,unsigned int uiSize,DWORD dwDecl,LPDIRECT3DRESOURCE8 lpBuffer)
|
||||
{
|
||||
m_iBufferObjType = iType;
|
||||
m_uiBufferSize = uiSize;
|
||||
m_dwValue = dwDecl;
|
||||
|
||||
m_pBuffers = lpBuffer;
|
||||
|
||||
}
|
||||
void CD3DBufferObj::NullBuffer()
|
||||
{
|
||||
SafeRelease(m_pBuffers);
|
||||
m_pBuffers = NULL;
|
||||
m_iBufferObjType = 0;
|
||||
m_uiBufferSize = 0;
|
||||
m_dwValue = 0;
|
||||
|
||||
|
||||
}
|
||||
CD3DBufferPools::CD3DBufferPools(void)
|
||||
{
|
||||
for(int i = 0; i < D3DBUFFER_SIZENUM - 1; i++ )
|
||||
{
|
||||
m_DVertexBufferNums[i] = 0;
|
||||
m_DIndexBufferNums[i] = 0;
|
||||
}
|
||||
|
||||
m_DCustomVertexBufferPools.clear();
|
||||
m_DCustomIndexBufferPools.clear();
|
||||
m_DIndexBufferNums[D3DBUFFER_SIZENUM - 1] = 0;
|
||||
m_DVertexBufferNums[D3DBUFFER_SIZENUM - 1] = 0;
|
||||
|
||||
for(int i = 0; i < D3DBUFFER_SIZENUM - 1; i++ )
|
||||
{
|
||||
m_SVertexBufferNums[i] = 0;
|
||||
m_SIndexBufferNums[i] = 0;
|
||||
}
|
||||
|
||||
m_SCustomVertexBufferPools.clear();
|
||||
m_SCustomIndexBufferPools.clear();
|
||||
m_SIndexBufferNums[D3DBUFFER_SIZENUM - 1] = 0;
|
||||
m_SVertexBufferNums[D3DBUFFER_SIZENUM - 1] = 0;
|
||||
}
|
||||
|
||||
CD3DBufferPools::~CD3DBufferPools(void)
|
||||
{
|
||||
// Dynamic Buffer Clear
|
||||
for(int i = 0; i < D3DBUFFER_SIZENUM - 1; i++ )
|
||||
{
|
||||
while(!m_DVertexBufferPools[i].empty())
|
||||
{
|
||||
CD3DBufferObj *pObj = m_DVertexBufferPools[i].front();
|
||||
m_DVertexBufferPools[i].pop();
|
||||
if(pObj)
|
||||
{
|
||||
pObj->NullBuffer();
|
||||
SafeDelete(pObj);
|
||||
|
||||
}
|
||||
}
|
||||
while(!m_DIndexBufferPools[i].empty())
|
||||
{
|
||||
CD3DBufferObj *pObj = m_DIndexBufferPools[i].front();
|
||||
m_DIndexBufferPools[i].pop();
|
||||
if(pObj)
|
||||
{
|
||||
pObj->NullBuffer();
|
||||
SafeDelete(pObj);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
m_DVertexBufferNums[i] = 0;
|
||||
m_DIndexBufferNums[i] = 0;
|
||||
}
|
||||
|
||||
for(int i = 0; i < (int)m_DVertexBufferNums[D3DBUFFER_SIZENUM - 1]; i++ )
|
||||
{
|
||||
if(m_DCustomVertexBufferPools[i])
|
||||
{
|
||||
m_DCustomVertexBufferPools[i]->NullBuffer();
|
||||
SafeDelete(m_DCustomVertexBufferPools[i]);
|
||||
m_DCustomVertexBufferPools[i] = NULL;
|
||||
}
|
||||
}
|
||||
m_DCustomVertexBufferPools.clear();
|
||||
|
||||
for(int i = 0; i < (int)m_DIndexBufferNums[D3DBUFFER_SIZENUM - 1]; i++ )
|
||||
{
|
||||
if(m_DCustomIndexBufferPools[i])
|
||||
{
|
||||
m_DCustomIndexBufferPools[i]->NullBuffer();
|
||||
SafeDelete(m_DCustomIndexBufferPools[i]);
|
||||
m_DCustomIndexBufferPools[i] = NULL;
|
||||
}
|
||||
}
|
||||
m_DCustomIndexBufferPools.clear();
|
||||
|
||||
// Static Buffer Clear
|
||||
for(int i = 0; i < D3DBUFFER_SIZENUM - 1; i++ )
|
||||
{
|
||||
while(!m_SVertexBufferPools[i].empty())
|
||||
{
|
||||
CD3DBufferObj *pObj = m_SVertexBufferPools[i].front();
|
||||
m_SVertexBufferPools[i].pop();
|
||||
if(pObj)
|
||||
{
|
||||
pObj->NullBuffer();
|
||||
SafeDelete(pObj);
|
||||
|
||||
}
|
||||
}
|
||||
while(!m_SIndexBufferPools[i].empty())
|
||||
{
|
||||
CD3DBufferObj *pObj = m_SIndexBufferPools[i].front();
|
||||
m_SIndexBufferPools[i].pop();
|
||||
if(pObj)
|
||||
{
|
||||
pObj->NullBuffer();
|
||||
SafeDelete(pObj);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
m_SVertexBufferNums[i] = 0;
|
||||
m_SIndexBufferNums[i] = 0;
|
||||
}
|
||||
|
||||
for(int i = 0; i < (int)m_SVertexBufferNums[D3DBUFFER_SIZENUM - 1]; i++ )
|
||||
{
|
||||
if(m_SCustomVertexBufferPools[i])
|
||||
{
|
||||
m_SCustomVertexBufferPools[i]->NullBuffer();
|
||||
SafeDelete(m_SCustomVertexBufferPools[i]);
|
||||
m_SCustomVertexBufferPools[i] = NULL;
|
||||
}
|
||||
}
|
||||
m_SCustomVertexBufferPools.clear();
|
||||
|
||||
for(int i = 0; i < (int)m_SIndexBufferNums[D3DBUFFER_SIZENUM - 1]; i++ )
|
||||
{
|
||||
if(m_SCustomIndexBufferPools[i])
|
||||
{
|
||||
m_SCustomIndexBufferPools[i]->NullBuffer();
|
||||
SafeDelete(m_SCustomIndexBufferPools[i]);
|
||||
m_SCustomIndexBufferPools[i] = NULL;
|
||||
}
|
||||
}
|
||||
m_SCustomIndexBufferPools.clear();
|
||||
|
||||
|
||||
}
|
||||
LPDIRECT3DVERTEXBUFFER8 CD3DBufferPools::GetVertexBuffer(unsigned int uiSize,DWORD dwDecl,bool bDynamic)
|
||||
{
|
||||
LPDIRECT3DVERTEXBUFFER8 pReturn = NULL;
|
||||
int i,j;
|
||||
if(bDynamic)
|
||||
{
|
||||
for(i = 0;i < D3DBUFFER_SIZENUM - 1; i++)
|
||||
{
|
||||
if(uiSize <= ArrBufferSize[i])
|
||||
{
|
||||
if(m_DVertexBufferNums[i])
|
||||
{
|
||||
CD3DBufferObj *pObj = m_DVertexBufferPools[i].front();
|
||||
m_DVertexBufferPools[i].pop();
|
||||
m_DVertexBufferNums[i]--;
|
||||
if(pObj)
|
||||
{
|
||||
pReturn = (LPDIRECT3DVERTEXBUFFER8) pObj->m_pBuffers;
|
||||
SafeDelete(pObj);
|
||||
return pReturn;
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
return (pReturn = (LPDIRECT3DVERTEXBUFFER8)CreateBuffer(bDynamic,Scene::D3DBUFFEROBJ_VERTEX,i,dwDecl));
|
||||
|
||||
}
|
||||
}
|
||||
// Custom Size
|
||||
if(m_DVertexBufferNums[D3DBUFFER_SIZENUM - 1])
|
||||
{
|
||||
for(j = 0; j < (int)m_DVertexBufferNums[D3DBUFFER_SIZENUM - 1]; j++ )
|
||||
{
|
||||
|
||||
if((m_DCustomVertexBufferPools[j]->m_uiBufferSize) >= uiSize)
|
||||
{
|
||||
pReturn = ((LPDIRECT3DVERTEXBUFFER8)m_DCustomVertexBufferPools[j]->m_pBuffers);
|
||||
SafeDelete(m_DCustomVertexBufferPools[j]);
|
||||
m_DCustomVertexBufferPools.erase(m_DCustomVertexBufferPools.begin() + j);
|
||||
m_DVertexBufferNums[D3DBUFFER_SIZENUM - 1]--;
|
||||
|
||||
return pReturn;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
else //static
|
||||
{
|
||||
for(i = 0;i < D3DBUFFER_SIZENUM - 1; i++)
|
||||
{
|
||||
if(uiSize <= ArrBufferSize[i])
|
||||
{
|
||||
if(m_SVertexBufferNums[i])
|
||||
{
|
||||
CD3DBufferObj *pObj = m_SVertexBufferPools[i].front();
|
||||
m_SVertexBufferPools[i].pop();
|
||||
m_SVertexBufferNums[i]--;
|
||||
if(pObj)
|
||||
{
|
||||
pReturn = (LPDIRECT3DVERTEXBUFFER8) pObj->m_pBuffers;
|
||||
SafeDelete(pObj);
|
||||
return pReturn;
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
return (pReturn = (LPDIRECT3DVERTEXBUFFER8)CreateBuffer(bDynamic,Scene::D3DBUFFEROBJ_VERTEX,i,dwDecl));
|
||||
|
||||
}
|
||||
}
|
||||
// Custom Size
|
||||
if(m_SVertexBufferNums[D3DBUFFER_SIZENUM - 1])
|
||||
{
|
||||
for(j = 0; j < (int)m_SVertexBufferNums[D3DBUFFER_SIZENUM - 1]; j++ )
|
||||
{
|
||||
|
||||
if((m_SCustomVertexBufferPools[j]->m_uiBufferSize) >= uiSize)
|
||||
{
|
||||
pReturn = ((LPDIRECT3DVERTEXBUFFER8)m_SCustomVertexBufferPools[j]->m_pBuffers);
|
||||
SafeDelete(m_SCustomVertexBufferPools[j]);
|
||||
m_SCustomVertexBufferPools.erase(m_SCustomVertexBufferPools.begin() + j);
|
||||
m_SVertexBufferNums[D3DBUFFER_SIZENUM - 1]--;
|
||||
|
||||
return pReturn;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
return (pReturn = (LPDIRECT3DVERTEXBUFFER8)CreateBuffer(bDynamic,Scene::D3DBUFFEROBJ_VERTEX,-1,dwDecl,uiSize));
|
||||
|
||||
}
|
||||
|
||||
LPDIRECT3DINDEXBUFFER8 CD3DBufferPools::GetIndexBuffer(unsigned int uiSize,DWORD dwFormat,bool bDynamic)
|
||||
{
|
||||
LPDIRECT3DINDEXBUFFER8 pReturn = NULL;
|
||||
int i,j;
|
||||
if(bDynamic)
|
||||
{
|
||||
for(i = 0;i < D3DBUFFER_SIZENUM - 1; i++)
|
||||
{
|
||||
if(uiSize <= ArrBufferSize[i])
|
||||
{
|
||||
if(m_DIndexBufferNums[i])
|
||||
{
|
||||
CD3DBufferObj *pObj = m_DIndexBufferPools[i].front();
|
||||
m_DIndexBufferPools[i].pop();
|
||||
m_DIndexBufferNums[i]--;
|
||||
if(pObj)
|
||||
{
|
||||
pReturn = (LPDIRECT3DINDEXBUFFER8) pObj->m_pBuffers;
|
||||
SafeDelete(pObj);
|
||||
return pReturn;
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
return (pReturn = (LPDIRECT3DINDEXBUFFER8)CreateBuffer(bDynamic,Scene::D3DBUFFEROBJ_INDEX,i,dwFormat));
|
||||
|
||||
}
|
||||
}
|
||||
// Custom Size
|
||||
if(m_DIndexBufferNums[D3DBUFFER_SIZENUM - 1])
|
||||
{
|
||||
for(j = 0; j < (int)m_DIndexBufferNums[D3DBUFFER_SIZENUM - 1]; j++ )
|
||||
{
|
||||
|
||||
if((m_DCustomIndexBufferPools[j]->m_uiBufferSize) >= uiSize)
|
||||
{
|
||||
pReturn = ((LPDIRECT3DINDEXBUFFER8)m_DCustomIndexBufferPools[j]->m_pBuffers);
|
||||
SafeDelete(m_DCustomIndexBufferPools[j]);
|
||||
m_DCustomIndexBufferPools.erase(m_DCustomIndexBufferPools.begin() + j);
|
||||
m_DIndexBufferNums[D3DBUFFER_SIZENUM - 1]--;
|
||||
return pReturn;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
else //Static Buffer
|
||||
{
|
||||
for(i = 0;i < D3DBUFFER_SIZENUM - 1; i++)
|
||||
{
|
||||
if(uiSize <= ArrBufferSize[i])
|
||||
{
|
||||
if(m_SIndexBufferNums[i])
|
||||
{
|
||||
CD3DBufferObj *pObj = m_SIndexBufferPools[i].front();
|
||||
m_SIndexBufferPools[i].pop();
|
||||
m_SIndexBufferNums[i]--;
|
||||
if(pObj)
|
||||
{
|
||||
pReturn = (LPDIRECT3DINDEXBUFFER8) pObj->m_pBuffers;
|
||||
SafeDelete(pObj);
|
||||
return pReturn;
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
return (pReturn = (LPDIRECT3DINDEXBUFFER8)CreateBuffer(bDynamic,Scene::D3DBUFFEROBJ_INDEX,i,dwFormat));
|
||||
|
||||
}
|
||||
}
|
||||
// Custom Size
|
||||
if(m_SIndexBufferNums[D3DBUFFER_SIZENUM - 1])
|
||||
{
|
||||
for(j = 0; j < (int)m_SIndexBufferNums[D3DBUFFER_SIZENUM - 1]; j++ )
|
||||
{
|
||||
|
||||
if((m_SCustomIndexBufferPools[j]->m_uiBufferSize) >= uiSize)
|
||||
{
|
||||
pReturn = ((LPDIRECT3DINDEXBUFFER8)m_SCustomIndexBufferPools[j]->m_pBuffers);
|
||||
SafeDelete(m_SCustomIndexBufferPools[j]);
|
||||
m_SCustomIndexBufferPools.erase(m_SCustomIndexBufferPools.begin() + j);
|
||||
m_SIndexBufferNums[D3DBUFFER_SIZENUM - 1]--;
|
||||
return pReturn;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
return (pReturn = (LPDIRECT3DINDEXBUFFER8)CreateBuffer(bDynamic,Scene::D3DBUFFEROBJ_INDEX,-1,dwFormat,uiSize));
|
||||
|
||||
}
|
||||
void CD3DBufferPools::UnRef(unsigned int iType,LPDIRECT3DRESOURCE8 lpBuffer)
|
||||
{
|
||||
// ppuchuu 2004/11/15
|
||||
if( NULL == lpBuffer )
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
// edith 2008.12.12 버퍼풀의 최대개수를 제한한다.
|
||||
unsigned int iMaxPoolCount = 100;
|
||||
bool bDynamic = false;
|
||||
|
||||
|
||||
if(iType == Scene::D3DBUFFEROBJ_VERTEX)
|
||||
{
|
||||
D3DVERTEXBUFFER_DESC VertexBufferDesc;
|
||||
((LPDIRECT3DVERTEXBUFFER8)lpBuffer)->GetDesc(&VertexBufferDesc);
|
||||
|
||||
if(VertexBufferDesc.Usage & D3DUSAGE_DYNAMIC)
|
||||
bDynamic = true;
|
||||
|
||||
if(bDynamic)
|
||||
{
|
||||
// 최대개수 지정.
|
||||
for(int i = 0;i < D3DBUFFER_SIZENUM - 1; i++)
|
||||
{
|
||||
if(VertexBufferDesc.Size <= ArrBufferSize[i])
|
||||
{
|
||||
if(m_DVertexBufferNums[i] >= iMaxPoolCount)
|
||||
{
|
||||
SafeRelease(lpBuffer);
|
||||
return;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// 최대개수 지정
|
||||
for(int i = 0;i < D3DBUFFER_SIZENUM - 1; i++)
|
||||
{
|
||||
if(VertexBufferDesc.Size <= ArrBufferSize[i])
|
||||
{
|
||||
if(m_SVertexBufferNums[i] >= iMaxPoolCount)
|
||||
{
|
||||
SafeRelease(lpBuffer);
|
||||
return;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
CD3DBufferObj *pObj = new CD3DBufferObj;
|
||||
pObj->CreateBuffer(iType,VertexBufferDesc.Size,VertexBufferDesc.FVF,lpBuffer);
|
||||
|
||||
if(bDynamic)
|
||||
{
|
||||
for(int i = 0;i < D3DBUFFER_SIZENUM - 1; i++)
|
||||
{
|
||||
if(pObj->m_uiBufferSize <= ArrBufferSize[i])
|
||||
{
|
||||
m_DVertexBufferPools[i].push(pObj);
|
||||
m_DVertexBufferNums[i]++;
|
||||
return;
|
||||
}
|
||||
}
|
||||
m_DCustomVertexBufferPools.push_back(pObj);
|
||||
m_DVertexBufferNums[D3DBUFFER_SIZENUM - 1]++;
|
||||
}
|
||||
else // Static Buffer
|
||||
{
|
||||
for(int i = 0;i < D3DBUFFER_SIZENUM - 1; i++)
|
||||
{
|
||||
if(pObj->m_uiBufferSize <= ArrBufferSize[i])
|
||||
{
|
||||
m_SVertexBufferPools[i].push(pObj);
|
||||
m_SVertexBufferNums[i]++;
|
||||
return;
|
||||
}
|
||||
}
|
||||
m_SCustomVertexBufferPools.push_back(pObj);
|
||||
m_SVertexBufferNums[D3DBUFFER_SIZENUM - 1]++;
|
||||
}
|
||||
}
|
||||
else if(iType == Scene::D3DBUFFEROBJ_INDEX)
|
||||
{
|
||||
D3DINDEXBUFFER_DESC IndexBufferDesc;
|
||||
((LPDIRECT3DINDEXBUFFER8)lpBuffer)->GetDesc(&IndexBufferDesc);
|
||||
|
||||
if(IndexBufferDesc.Usage & D3DUSAGE_DYNAMIC)
|
||||
bDynamic = true;
|
||||
|
||||
if(bDynamic)
|
||||
{
|
||||
// 최대개수 지정.
|
||||
for(int i = 0;i < D3DBUFFER_SIZENUM - 1; i++)
|
||||
{
|
||||
if(IndexBufferDesc.Size <= ArrBufferSize[i])
|
||||
{
|
||||
if(m_DIndexBufferNums[i] >= iMaxPoolCount)
|
||||
{
|
||||
SafeRelease(lpBuffer);
|
||||
return;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// 최대개수 지정
|
||||
for(int i = 0;i < D3DBUFFER_SIZENUM - 1; i++)
|
||||
{
|
||||
if(IndexBufferDesc.Size <= ArrBufferSize[i])
|
||||
{
|
||||
if(m_SIndexBufferNums[i] >= iMaxPoolCount)
|
||||
{
|
||||
SafeRelease(lpBuffer);
|
||||
return;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
CD3DBufferObj *pObj = new CD3DBufferObj;
|
||||
pObj->CreateBuffer(iType,IndexBufferDesc.Size,IndexBufferDesc.Format,lpBuffer);
|
||||
|
||||
if(bDynamic)
|
||||
{
|
||||
for(int i = 0;i < D3DBUFFER_SIZENUM - 1; i++)
|
||||
{
|
||||
if(pObj->m_uiBufferSize <= ArrBufferSize[i])
|
||||
{
|
||||
m_DIndexBufferPools[i].push(pObj);
|
||||
m_DIndexBufferNums[i]++;
|
||||
return;
|
||||
}
|
||||
}
|
||||
m_DCustomIndexBufferPools.push_back(pObj);
|
||||
m_DIndexBufferNums[D3DBUFFER_SIZENUM - 1]++;
|
||||
}
|
||||
else // Static
|
||||
{
|
||||
|
||||
for(int i = 0;i < D3DBUFFER_SIZENUM - 1; i++)
|
||||
{
|
||||
if(pObj->m_uiBufferSize <= ArrBufferSize[i])
|
||||
{
|
||||
m_SIndexBufferPools[i].push(pObj);
|
||||
m_SIndexBufferNums[i]++;
|
||||
return;
|
||||
}
|
||||
}
|
||||
m_SCustomIndexBufferPools.push_back(pObj);
|
||||
m_SIndexBufferNums[D3DBUFFER_SIZENUM - 1]++;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
LPDIRECT3DRESOURCE8 CD3DBufferPools::CreateBuffer(bool bDynamic,unsigned int iType,int iSizeType,DWORD dwValue,unsigned int uiCustomSize)
|
||||
{
|
||||
unsigned int uiSize = 0;
|
||||
|
||||
if(iSizeType >= 0)
|
||||
uiSize = ArrBufferSize[iSizeType];
|
||||
else
|
||||
uiSize = uiCustomSize;
|
||||
|
||||
if(iType == Scene::D3DBUFFEROBJ_VERTEX)
|
||||
{
|
||||
LPDIRECT3DVERTEXBUFFER8 lpVertex;
|
||||
|
||||
if(!bDynamic)
|
||||
{
|
||||
|
||||
// if(Caldron::Failed(CSceneManager::GetDevice()->CreateVertexBuffer(uiSize,D3DUSAGE_WRITEONLY,dwValue,D3DPOOL_DEFAULT,&lpVertex)))
|
||||
if(Caldron::Failed(CSceneManager::GetDevice()->CreateVertexBuffer(uiSize,D3DUSAGE_WRITEONLY,0,D3DPOOL_MANAGED,&lpVertex)))
|
||||
{
|
||||
MessageBox(NULL,"Buffer Create Faile(1)","Error",MB_OK);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if(Caldron::Failed(CSceneManager::GetDevice()->CreateVertexBuffer(uiSize,D3DUSAGE_WRITEONLY | D3DUSAGE_DYNAMIC,0,D3DPOOL_DEFAULT,&lpVertex)))
|
||||
{
|
||||
MessageBox(NULL,"Buffer Create Faile(2)","Error",MB_OK);
|
||||
}
|
||||
}
|
||||
|
||||
return lpVertex;
|
||||
|
||||
}
|
||||
else if(iType == Scene::D3DBUFFEROBJ_INDEX)
|
||||
{
|
||||
LPDIRECT3DINDEXBUFFER8 lpIndex;
|
||||
if(!bDynamic)
|
||||
{
|
||||
if(Caldron::Failed(CSceneManager::GetDevice()->CreateIndexBuffer(uiSize,D3DUSAGE_WRITEONLY,(D3DFORMAT)dwValue,D3DPOOL_MANAGED,&lpIndex)))
|
||||
// if(Caldron::Failed(CSceneManager::GetDevice()->CreateIndexBuffer(uiSize,D3DUSAGE_WRITEONLY,(D3DFORMAT)dwValue,D3DPOOL_DEFAULT,&lpIndex)))
|
||||
{
|
||||
MessageBox(NULL,"Buffer Create Faile(3)","Error",MB_OK);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
if(Caldron::Failed(CSceneManager::GetDevice()->CreateIndexBuffer(uiSize,D3DUSAGE_WRITEONLY | D3DUSAGE_DYNAMIC,(D3DFORMAT)dwValue,D3DPOOL_DEFAULT ,&lpIndex)))
|
||||
{
|
||||
MessageBox(NULL,"Buffer Create Faile(4)","Error",MB_OK);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
return lpIndex;
|
||||
|
||||
}
|
||||
|
||||
return NULL;
|
||||
|
||||
}
|
||||
void CD3DBufferPools::InitBuffer()
|
||||
{
|
||||
int i,j;
|
||||
|
||||
for( i = 0; i < 8; i++ )
|
||||
{
|
||||
LPDIRECT3DVERTEXBUFFER8 lpVertexBuffer[80];
|
||||
LPDIRECT3DINDEXBUFFER8 lpIndexBuffer[80];
|
||||
|
||||
for( j = 0;j < 80; j++ )
|
||||
{
|
||||
if(j < 15)
|
||||
{
|
||||
lpVertexBuffer[j] = GetVertexBuffer(ArrBufferSize[i] - 10,0,false);
|
||||
lpIndexBuffer[j] = GetIndexBuffer(ArrBufferSize[i] - 10,D3DFMT_INDEX16,false);
|
||||
}
|
||||
else
|
||||
{
|
||||
lpVertexBuffer[j] = GetVertexBuffer(ArrBufferSize[i] - 10,0,true);
|
||||
lpIndexBuffer[j] = GetIndexBuffer(ArrBufferSize[i] - 10,D3DFMT_INDEX16,true);
|
||||
}
|
||||
}
|
||||
for(j = 0;j < 80; j++ )
|
||||
{
|
||||
UnRef(D3DBUFFEROBJ_VERTEX,lpVertexBuffer[j]);
|
||||
UnRef(D3DBUFFEROBJ_INDEX,lpIndexBuffer[j]);
|
||||
lpVertexBuffer[j] = NULL;
|
||||
lpIndexBuffer[j] = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
for(i = 0; i < 5; i++ )
|
||||
{
|
||||
LPDIRECT3DVERTEXBUFFER8 lpCustomBuffer[5];
|
||||
lpCustomBuffer[0] = GetVertexBuffer(150000,0,true);
|
||||
lpCustomBuffer[1] = GetVertexBuffer(100000,0,true);
|
||||
lpCustomBuffer[2] = GetVertexBuffer(50000,0,true);
|
||||
lpCustomBuffer[3] = GetVertexBuffer(50000,0,true);
|
||||
lpCustomBuffer[4] = GetVertexBuffer(150000,0,true);
|
||||
for(j = 0; j < 5; j++ )
|
||||
{
|
||||
UnRef(D3DBUFFEROBJ_VERTEX,lpCustomBuffer[j]);
|
||||
lpCustomBuffer[j] = NULL;
|
||||
}
|
||||
}
|
||||
}
|
||||
90
Engine/Caldron/Src/Scene/D3DBufferPools.h
Normal file
90
Engine/Caldron/Src/Scene/D3DBufferPools.h
Normal file
@@ -0,0 +1,90 @@
|
||||
#pragma once
|
||||
#include "../../include/Caldron.h"
|
||||
|
||||
namespace Caldron {
|
||||
namespace Scene {
|
||||
enum D3DBUFFFEROBJ_TYPE
|
||||
{
|
||||
D3DBUFFEROBJ_VERTEX = 0,
|
||||
D3DBUFFEROBJ_INDEX,
|
||||
D3DBUFFEROBJ_TYPENUM,
|
||||
|
||||
};
|
||||
enum D3DBUFFER_SIZE
|
||||
{
|
||||
D3DBUFFER_SIZE1 = 0, // 100
|
||||
D3DBUFFER_SIZE2 = 1, // 250
|
||||
D3DBUFFER_SIZE3 = 2, // 500
|
||||
D3DBUFFER_SIZE4 = 3, // 1000
|
||||
D3DBUFFER_SIZE5 = 4, // 3000
|
||||
D3DBUFFER_SIZE6 = 5, // 7000
|
||||
D3DBUFFER_SIZE7 = 6, // 10000
|
||||
D3DBUFFER_SIZE8 = 7, // 20000
|
||||
D3DBUFFER_SIZE9 = 8, // Custom Buffer
|
||||
D3DBUFFER_SIZENUM = 9,
|
||||
|
||||
};
|
||||
// edith 2010.01.29 D3D ¹öÆÛ Å©±â Á¶Àý
|
||||
const unsigned int ArrBufferSize[8] = {
|
||||
100,
|
||||
250,
|
||||
500,
|
||||
1000,
|
||||
3000,
|
||||
7000,
|
||||
10000,
|
||||
20000
|
||||
};
|
||||
class CD3DBufferObj
|
||||
{
|
||||
public:
|
||||
int m_iBufferObjType;
|
||||
LPDIRECT3DRESOURCE8 m_pBuffers;
|
||||
unsigned int m_uiBufferSize;
|
||||
DWORD m_dwValue;
|
||||
|
||||
|
||||
CD3DBufferObj() : m_pBuffers(NULL),m_uiBufferSize(0),m_dwValue(0){}
|
||||
~CD3DBufferObj()
|
||||
{
|
||||
//SafeRelease(m_pBuffers);
|
||||
m_pBuffers = NULL;
|
||||
}
|
||||
void NullBuffer();
|
||||
void CreateBuffer(int iType,unsigned int uiSize,DWORD dwDecl,LPDIRECT3DRESOURCE8 lpBuffer);
|
||||
|
||||
};
|
||||
|
||||
class CD3DBufferPools
|
||||
{
|
||||
public:
|
||||
CD3DBufferPools(void);
|
||||
~CD3DBufferPools(void);
|
||||
void InitBuffer();
|
||||
|
||||
LPDIRECT3DVERTEXBUFFER8 GetVertexBuffer(unsigned int uiSize,DWORD dwDecl,bool bDynamic = false);
|
||||
LPDIRECT3DINDEXBUFFER8 GetIndexBuffer(unsigned int uiSize,DWORD dwFormat,bool bDynamic = false);
|
||||
void UnRef(unsigned int iType,LPDIRECT3DRESOURCE8 lpBuffer);
|
||||
|
||||
LPDIRECT3DRESOURCE8 CreateBuffer(bool bDynamic,unsigned int iType,int iSizeType,DWORD dwValue,unsigned int uiCustomSize = 0);
|
||||
// Dynamic Buffer
|
||||
std::queue<CD3DBufferObj *> m_DVertexBufferPools[D3DBUFFER_SIZENUM -1];
|
||||
std::vector<CD3DBufferObj *> m_DCustomVertexBufferPools;
|
||||
unsigned int m_DVertexBufferNums[D3DBUFFER_SIZENUM];
|
||||
|
||||
std::queue<CD3DBufferObj *> m_DIndexBufferPools[D3DBUFFER_SIZENUM -1];
|
||||
std::vector<CD3DBufferObj *> m_DCustomIndexBufferPools;
|
||||
unsigned int m_DIndexBufferNums[D3DBUFFER_SIZENUM];
|
||||
// Static Buffer
|
||||
std::queue<CD3DBufferObj *> m_SVertexBufferPools[D3DBUFFER_SIZENUM -1];
|
||||
std::vector<CD3DBufferObj *> m_SCustomVertexBufferPools;
|
||||
unsigned int m_SVertexBufferNums[D3DBUFFER_SIZENUM];
|
||||
|
||||
std::queue<CD3DBufferObj *> m_SIndexBufferPools[D3DBUFFER_SIZENUM -1];
|
||||
std::vector<CD3DBufferObj *> m_SCustomIndexBufferPools;
|
||||
unsigned int m_SIndexBufferNums[D3DBUFFER_SIZENUM];
|
||||
|
||||
};
|
||||
|
||||
|
||||
}}
|
||||
408
Engine/Caldron/Src/Scene/DrawElement.cpp
Normal file
408
Engine/Caldron/Src/Scene/DrawElement.cpp
Normal file
@@ -0,0 +1,408 @@
|
||||
#include "DrawElement.h"
|
||||
#include <algorithm>
|
||||
|
||||
|
||||
namespace Caldron
|
||||
{
|
||||
namespace Scene
|
||||
{
|
||||
IDirect3DDevice8* CDrawElementMgr::ms_pDevice;
|
||||
|
||||
std::vector< DRAW_ELEMENT > CDrawElementMgr::ms_avecDynamicDrawElement[MAX_DRAW_ELEMENT_LAYER];
|
||||
// std::vector< DRAW_ELEMENT > CDrawElementMgr::ms_avecStaticDrawElement[MAX_DRAW_ELEMENT_LAYER];
|
||||
|
||||
int CDrawElementMgr::ms_nDynamicVertexBufferCount;
|
||||
DWORD CDrawElementMgr::ms_dwDynamicVertexBufferSize;
|
||||
|
||||
int CDrawElementMgr::ms_nDynamicIndexBufferCount;
|
||||
DWORD CDrawElementMgr::ms_dwDynamicIndexBufferSize;
|
||||
|
||||
// int CDrawElementMgr::ms_nStaticVertexBufferCount;
|
||||
// DWORD CDrawElementMgr::ms_dwStaticVertexBufferSize;
|
||||
|
||||
// int CDrawElementMgr::ms_nStaticIndexBufferCount;
|
||||
// DWORD CDrawElementMgr::ms_dwStaticIndexBufferSize;
|
||||
|
||||
// IDirect3DVertexBuffer8** CDrawElementMgr::ms_apDynamicVertexBuffer;
|
||||
// IDirect3DIndexBuffer8** CDrawElementMgr::ms_apDynaicIndexBuffer;
|
||||
IDirect3DVertexBuffer8* CDrawElementMgr::ms_pDynamicVertexBuffer;
|
||||
IDirect3DIndexBuffer8* CDrawElementMgr::ms_pDynamicIndexBuffer;
|
||||
|
||||
std::map< CBaseMesh*, UINT > CDrawElementMgr::ms_mapVBAllocationInfo;
|
||||
std::map< CBaseMesh*, UINT > CDrawElementMgr::ms_mapIBAllocationInfo;
|
||||
int CDrawElementMgr::ms_nVBUsedInByte;
|
||||
int CDrawElementMgr::ms_nIBUsedInByte;
|
||||
|
||||
|
||||
// IDirect3DVertexBuffer8** CDrawElementMgr::ms_apStaticVertexBuffer;
|
||||
// IDirect3DIndexBuffer8** CDrawElementMgr::ms_apStaticIndexBuffer;
|
||||
|
||||
DRAW_ELEMENT CDrawElementMgr::ms_LastTimeDE;
|
||||
|
||||
|
||||
bool CDrawElementMgr::_Init( IDirect3DDevice8* pDevice, DRAW_ELEMENT_MGR_INIT_PARAM* pInitParam )
|
||||
{
|
||||
ms_pDevice = pDevice;
|
||||
|
||||
HRESULT hr;
|
||||
|
||||
// dynamic VB 할당
|
||||
hr = pDevice->CreateVertexBuffer( pInitParam->dwDynamicVertexBufferSize, D3DUSAGE_DYNAMIC | D3DUSAGE_WRITEONLY,
|
||||
0, D3DPOOL_DEFAULT, &ms_pDynamicVertexBuffer );
|
||||
if( FAILED(hr) )
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
// dynamic IB 할당
|
||||
hr = pDevice->CreateIndexBuffer( pInitParam->dwDynamicIndexBufferSize, D3DUSAGE_DYNAMIC | D3DUSAGE_WRITEONLY,
|
||||
D3DFMT_INDEX16, D3DPOOL_DEFAULT, &ms_pDynamicIndexBuffer );
|
||||
if( FAILED(hr) )
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
// static VB 할당
|
||||
// 현재없음
|
||||
|
||||
// static IB 할당
|
||||
// 현재없음
|
||||
|
||||
|
||||
ms_nDynamicVertexBufferCount = 1;//pInitParam->nDynamicVertexBufferCount;
|
||||
ms_dwDynamicVertexBufferSize = pInitParam->dwDynamicVertexBufferSize;
|
||||
|
||||
ms_nDynamicIndexBufferCount = 1;//pInitParam->nDynamicIndexBufferCount;
|
||||
ms_dwDynamicIndexBufferSize = pInitParam->dwDynamicIndexBufferSize;
|
||||
|
||||
|
||||
// ms_nStaticVertexBufferCount = pInitParam->nStaticVertexBufferCount;
|
||||
// ms_dwStaticVertexBufferSize = pInitParam->dwStaticVertexBufferSize;
|
||||
|
||||
// ms_nStaticIndexBufferCount = pInitParam->nStaticIndexBufferCount;
|
||||
// ms_dwStaticIndexBufferSize = pInitParam->dwStaticIndexBufferSize;
|
||||
|
||||
|
||||
ms_LastTimeDE.pMesh = NULL;
|
||||
ms_LastTimeDE.pTM = NULL;
|
||||
ms_LastTimeDE.pTextureTM = NULL;
|
||||
ms_LastTimeDE.textureSlot.apTexture[0] = NULL;
|
||||
ms_LastTimeDE.textureSlot.nUsed = 1;
|
||||
ms_LastTimeDE.hVertexShader = NULL;
|
||||
ms_LastTimeDE.hPixelShader = NULL;
|
||||
ms_LastTimeDE.pStateSet = NULL;
|
||||
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
bool CDrawElementMgr::_RegisterDrawElement( int nLayer, DRAW_ELEMENT& rDE )
|
||||
{
|
||||
if( nLayer >= MAX_DRAW_ELEMENT_LAYER )
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
if( false == rDE.ValidityCheck() )
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
// D/E 각 요소들에 대한 lock 이 필요할듯.. 그런데 이렇게 하려면 각 요소들 모두 lockable 한 객체로 바꿔줘야한다.
|
||||
rDE.pMesh->Lock();
|
||||
|
||||
ms_avecDynamicDrawElement[nLayer].push_back( rDE );
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
// bool CDrawElementMgr::_RegisterStaticDrawElement( int nLayer, DRAW_ELEMENT& rDE )
|
||||
// {
|
||||
// //
|
||||
// // 현재는 dynamic 일때와 구현이 같으나 차후 바뀔 수 있음
|
||||
// //
|
||||
//
|
||||
// if( nLayer >= MAX_DRAW_ELEMENT_LAYER )
|
||||
// {
|
||||
// return false;
|
||||
// }
|
||||
//
|
||||
// if( false ==rDE.ValidityCheck() )
|
||||
// {
|
||||
// return false;
|
||||
// }
|
||||
//
|
||||
// // D/E 각 요소들에 대한 lock 이 필요할듯.. 그런데 이렇게 하려면 각 요소들 모두 lockable 한 객체로 바꿔줘야한다.
|
||||
//
|
||||
// ms_avecDynamicDrawElement[nLayer].push_back( rDE );
|
||||
//
|
||||
// return true;
|
||||
// }
|
||||
|
||||
void CDrawElementMgr::_Process()
|
||||
{
|
||||
VIB_PACKET packet;
|
||||
|
||||
// sort
|
||||
_Sort();
|
||||
|
||||
// optimize
|
||||
_Optimize();
|
||||
|
||||
|
||||
|
||||
for( int i = 0; i < MAX_DRAW_ELEMENT_LAYER; ++i )
|
||||
{
|
||||
// per-layer setting ( ex) Render Target Change )
|
||||
// render target, view matrix, projection matrix 변경 적용
|
||||
|
||||
|
||||
|
||||
std::vector< DRAW_ELEMENT > & rvecDE = ms_avecDynamicDrawElement[i]; // shortcut to i-th layer of D/E vector
|
||||
|
||||
for( int j = 0; j < rvecDE.size(); ++j )
|
||||
{
|
||||
DRAW_ELEMENT &rCurrentDrawElement = rvecDE[j];
|
||||
|
||||
// mesh data uploading (to VB/IB )
|
||||
_UploadMesh( rCurrentDrawElement, packet );
|
||||
|
||||
// draw primitive(include state setting)
|
||||
_Render( rCurrentDrawElement, packet );
|
||||
|
||||
// unlock D/E related components
|
||||
// 지금은 CMesh 만 Lock/Unlock 구현되어있음
|
||||
rCurrentDrawElement.pMesh->Unlock();
|
||||
}
|
||||
|
||||
// flush D/E list 'cause this is DYNAMIC D/E list
|
||||
rvecDE.clear();
|
||||
}
|
||||
|
||||
ms_pDevice->SetStreamSource( 0, NULL, 0 );
|
||||
ms_pDevice->SetIndices( NULL, 0 );
|
||||
}
|
||||
|
||||
void CDrawElementMgr::_Close()
|
||||
{
|
||||
// VB/IB 해제
|
||||
SafeRelease( ms_pDynamicVertexBuffer );
|
||||
SafeRelease( ms_pDynamicIndexBuffer );
|
||||
}
|
||||
|
||||
// D/E sort comparison processor
|
||||
bool DE_Ascend( DRAW_ELEMENT rDE1, DRAW_ELEMENT rDE2 )
|
||||
{
|
||||
if( rDE1.textureSlot.apTexture[0] > rDE2.textureSlot.apTexture[0] ) return false;
|
||||
if( rDE1.pTM > rDE2.pTM ) return false;
|
||||
if( rDE1.hVertexShader > rDE2.hVertexShader ) return false;
|
||||
if( rDE1.hPixelShader > rDE2.hPixelShader ) return false;
|
||||
if( rDE1.pStateSet > rDE2.pStateSet ) return false;
|
||||
if( rDE1.pMesh > rDE2.pMesh ) return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void CDrawElementMgr::_Sort()
|
||||
{
|
||||
for( int i = 0; i < MAX_DRAW_ELEMENT_LAYER; ++i )
|
||||
{
|
||||
std::stable_sort( ms_avecDynamicDrawElement[i].begin(), ms_avecDynamicDrawElement[i].end(), DE_Ascend );
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
void CDrawElementMgr::_Optimize()
|
||||
{
|
||||
// nothing now..
|
||||
}
|
||||
|
||||
|
||||
void CDrawElementMgr::_UploadMesh( DRAW_ELEMENT &rDE, VIB_PACKET &rPacket )
|
||||
{
|
||||
std::map< CBaseMesh*, UINT >::iterator it;
|
||||
BYTE* pByteDataInBuffer = NULL;
|
||||
UINT uSizeInByte; // 할당될 mesh data 의 byte 사이즈
|
||||
UINT uAllocOffset; // buffer 상에 upload 될 위치
|
||||
UINT uRemain; // buffer 상에 남아있는 공간
|
||||
HRESULT hr;
|
||||
|
||||
// VB 상에 이미 upload 되어있는 mesh 인가?
|
||||
it = ms_mapVBAllocationInfo.find( rDE.pMesh );
|
||||
if( it != ms_mapVBAllocationInfo.end() )
|
||||
{
|
||||
// 그렇다면 기존 정보만 VIB packet 에 기록
|
||||
rPacket.uPositionInVB = it->second;
|
||||
}
|
||||
else
|
||||
{
|
||||
// 아니면 할당 과정
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// DrawPrimitive 계열의 offset 관련 파라미터들이 vertex 갯수 단위이므로
|
||||
// mesh vertex data가 upload 될 경우 그 위치를 vertex size에 맞게 align
|
||||
// 해 준다.
|
||||
//
|
||||
|
||||
uSizeInByte = rDE.pMesh->GetVertexCount() * rDE.pMesh->GetVertexSize();
|
||||
|
||||
UINT uUsedAlignFixed = (ms_nVBUsedInByte % rDE.pMesh->GetVertexSize() ) ?
|
||||
( ( ms_nVBUsedInByte/rDE.pMesh->GetVertexSize() ) + 1 ) * rDE.pMesh->GetVertexSize() :
|
||||
ms_nVBUsedInByte; // vertex size 경계에 맞춰 올림
|
||||
uRemain = ms_dwDynamicVertexBufferSize - uUsedAlignFixed;
|
||||
|
||||
// Lock VB
|
||||
if( uRemain < uSizeInByte )
|
||||
{
|
||||
// 공간이 부족할때 -> discard all & reset alloc info
|
||||
uAllocOffset = 0;
|
||||
hr = ms_pDynamicVertexBuffer->Lock( uAllocOffset, uSizeInByte, &pByteDataInBuffer, D3DLOCK_DISCARD );
|
||||
if( FAILED(hr) )
|
||||
{
|
||||
return; // Lock 실패시 걍 리턴..-_-
|
||||
}
|
||||
|
||||
// VB flush, 할당정보 clear
|
||||
ms_mapVBAllocationInfo.clear();
|
||||
ms_nVBUsedInByte = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
// 공간이 충분할때 -> 걍 Lock
|
||||
uAllocOffset = uUsedAlignFixed;
|
||||
hr = ms_pDynamicVertexBuffer->Lock( uAllocOffset, uSizeInByte, &pByteDataInBuffer, D3DLOCK_NOOVERWRITE );
|
||||
if( FAILED(hr) )
|
||||
{
|
||||
return; // Lock 실패시 걍 리턴..-_-
|
||||
}
|
||||
}
|
||||
|
||||
// upload, 할당정보 갱신
|
||||
rDE.pMesh->UploadVertexData( pByteDataInBuffer );
|
||||
ms_pDynamicVertexBuffer->Unlock();
|
||||
|
||||
ms_mapVBAllocationInfo[rDE.pMesh] = uAllocOffset;
|
||||
ms_nVBUsedInByte = uUsedAlignFixed + uSizeInByte;
|
||||
}
|
||||
|
||||
// indexed mesh 가 아니면 -> 종료
|
||||
if( !( rDE.pMesh->IsIndexed() ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
// IB 에도 VB 와 같은 과정 반복
|
||||
|
||||
// IB 상에 이미 upload 되어있는 mesh 인가?
|
||||
it = ms_mapIBAllocationInfo.find( rDE.pMesh );
|
||||
if( it != ms_mapIBAllocationInfo.end() )
|
||||
{
|
||||
// 그렇다면 기존 정보만 VIB packet 에 기록
|
||||
rPacket.uPositionInIB = it->second;
|
||||
}
|
||||
else
|
||||
{
|
||||
// 아니면 할당 과정
|
||||
|
||||
uSizeInByte = rDE.pMesh->GetIndexCount() * sizeof(WORD);
|
||||
uRemain = ms_dwDynamicIndexBufferSize - ms_nIBUsedInByte;
|
||||
|
||||
// Lock IB
|
||||
if( uRemain < uSizeInByte )
|
||||
{
|
||||
// 공간이 부족할때 -> discard all & reset alloc info
|
||||
uAllocOffset = 0;
|
||||
hr = ms_pDynamicIndexBuffer->Lock( uAllocOffset, uSizeInByte, &pByteDataInBuffer, D3DLOCK_DISCARD );
|
||||
if( FAILED(hr) )
|
||||
{
|
||||
return; // Lock 실패시 걍 리턴..-_-
|
||||
}
|
||||
|
||||
// IB flush, 할당정보 clear
|
||||
ms_mapIBAllocationInfo.clear();
|
||||
ms_nIBUsedInByte = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
// 공간이 충분할때 -> 걍 Lock
|
||||
uAllocOffset = ms_nIBUsedInByte;
|
||||
hr = ms_pDynamicIndexBuffer->Lock( uAllocOffset, uSizeInByte, &pByteDataInBuffer, D3DLOCK_NOOVERWRITE );
|
||||
if( FAILED(hr) )
|
||||
{
|
||||
return; // Lock 실패시 걍 리턴..-_-
|
||||
}
|
||||
}
|
||||
|
||||
// upload, 할당정보 갱신
|
||||
rDE.pMesh->UploadIndexData( pByteDataInBuffer );
|
||||
ms_pDynamicIndexBuffer->Unlock();
|
||||
|
||||
ms_mapIBAllocationInfo[rDE.pMesh] = uAllocOffset;
|
||||
ms_nIBUsedInByte += uSizeInByte;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void CDrawElementMgr::_Render( DRAW_ELEMENT &rDE, VIB_PACKET &rPacket )
|
||||
{
|
||||
// 임시코드
|
||||
ms_pDevice->SetRenderState( D3DRS_LIGHTING, TRUE );
|
||||
ms_pDevice->LightEnable( 0, TRUE );
|
||||
|
||||
|
||||
// ms_LastTimeDE 와 rDE 각 컴포넌트별 비교 후 다른 컴포넌트의 적용
|
||||
|
||||
// rPacket 에 VB/IB 가 last time 과 다를 경우 stream source 를 바꿔줘야..하지만
|
||||
// 현재는 VB/IB 가 하나뿐이므로 생략
|
||||
// ...하려고 했으나, SSS에 stride 가 파라미터로 들어가므로 매번 해주는것으로 결정-_-;
|
||||
ms_pDevice->SetStreamSource( 0, ms_pDynamicVertexBuffer, rDE.pMesh->GetVertexSize() );
|
||||
|
||||
ms_pDevice->SetTransform( D3DTS_WORLD, rDE.pTM );
|
||||
|
||||
if( NULL == rDE.hVertexShader )
|
||||
{
|
||||
DWORD dwFVF = rDE.pMesh->GetFVF();
|
||||
ms_pDevice->SetVertexShader( dwFVF );
|
||||
}
|
||||
else
|
||||
{
|
||||
ms_pDevice->SetVertexShader( rDE.hVertexShader );
|
||||
}
|
||||
ms_pDevice->SetPixelShader( rDE.hPixelShader );
|
||||
|
||||
if( NULL == rDE.textureSlot.apTexture[0] )
|
||||
{
|
||||
ms_pDevice->SetTexture( 0, NULL );
|
||||
}
|
||||
else
|
||||
{
|
||||
ms_pDevice->SetTexture( 0, rDE.textureSlot.apTexture[0]->GetTexture() );
|
||||
}
|
||||
|
||||
|
||||
if( rDE.pMesh->IsIndexed() )
|
||||
{
|
||||
ms_pDevice->SetIndices( ms_pDynamicIndexBuffer, rPacket.uPositionInVB / rDE.pMesh->GetVertexSize() );
|
||||
|
||||
ms_pDevice->DrawIndexedPrimitive( D3DPT_TRIANGLELIST, 0, rDE.pMesh->GetVertexCount(),
|
||||
rPacket.uPositionInIB / sizeof(WORD), rDE.pMesh->GetIndexCount() / 3 );
|
||||
}
|
||||
else
|
||||
{
|
||||
ms_pDevice->DrawPrimitive( D3DPT_TRIANGLELIST, rPacket.uPositionInVB / rDE.pMesh->GetVertexSize(),
|
||||
rDE.pMesh->GetVertexCount()/3 );
|
||||
}
|
||||
|
||||
// last time 데이터 업데이트
|
||||
ms_LastTimeDE = rDE;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
186
Engine/Caldron/Src/Scene/DrawElement.h
Normal file
186
Engine/Caldron/Src/Scene/DrawElement.h
Normal file
@@ -0,0 +1,186 @@
|
||||
#pragma once
|
||||
|
||||
#pragma warning( disable : 4786 )
|
||||
#include "../../include/Caldron.h"
|
||||
|
||||
#include "Mesh.h"
|
||||
//#include "Texture.h"
|
||||
#include "NTexture.h"
|
||||
#include "StateSet.h"
|
||||
|
||||
#include <vector>
|
||||
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// 1차적으로 dynamic buffer 만, VB/IB 각 1개씩으로만 구현
|
||||
//
|
||||
|
||||
namespace Caldron
|
||||
{
|
||||
namespace Scene
|
||||
{
|
||||
const int MAX_DRAW_ELEMENT_LAYER = 5;
|
||||
const int MAX_TEXTURE_SLOT = 8;
|
||||
|
||||
struct TEXTURE_SLOT
|
||||
{
|
||||
//CTexture* apTexture[MAX_TEXTURE_SLOT];
|
||||
CROSSM::CNTexture* apTexture[MAX_TEXTURE_SLOT];
|
||||
int nUsed;
|
||||
|
||||
|
||||
TEXTURE_SLOT()
|
||||
{
|
||||
apTexture[0] = NULL;
|
||||
nUsed = 1;
|
||||
}
|
||||
/*
|
||||
TEXTURE_SLOT( int n, CTexture pt0, CTexture pt1 = NULL, CTexture pt2 = NULL, CTexture pt3 = NULL )
|
||||
{
|
||||
apTexture[0] = pt0;
|
||||
apTexture[1] = pt1;
|
||||
apTexture[2] = pt2;
|
||||
apTexture[3] = pt3;
|
||||
|
||||
nUsed = n;
|
||||
}
|
||||
*/
|
||||
};
|
||||
|
||||
|
||||
struct DRAW_ELEMENT
|
||||
{
|
||||
CBaseMesh* pMesh;
|
||||
D3DMATRIX* pTM;
|
||||
D3DMATRIX* pTextureTM;
|
||||
TEXTURE_SLOT textureSlot;
|
||||
DWORD hVertexShader;
|
||||
DWORD hPixelShader;
|
||||
CStateSet* pStateSet;
|
||||
|
||||
|
||||
|
||||
// VB/IB 내 upload 후 위치 저장용 데이터부분 필요
|
||||
DRAW_ELEMENT() {}
|
||||
|
||||
|
||||
DRAW_ELEMENT( CBaseMesh* _pMesh, D3DMATRIX* _pTM, D3DMATRIX* _pTextureTM, TEXTURE_SLOT* _pTextureSlot, DWORD _hVertexShader, DWORD _hPixelShader, CStateSet* _pStateSet )
|
||||
{
|
||||
pMesh = _pMesh;
|
||||
pTM = _pTM;
|
||||
pTextureTM = _pTextureTM;
|
||||
textureSlot = *_pTextureSlot;
|
||||
hVertexShader = _hVertexShader;
|
||||
hPixelShader = _hPixelShader ;
|
||||
pStateSet = _pStateSet;
|
||||
}
|
||||
|
||||
bool ValidityCheck()
|
||||
{
|
||||
if( NULL == pMesh ) return false;
|
||||
//if( NULL == pTextureSlot ) return false;
|
||||
// VS, PS 모두 null 일 경우 가능
|
||||
if( NULL == pStateSet ) return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
struct DRAW_ELEMENT_MGR_INIT_PARAM
|
||||
{
|
||||
int nDynamicVertexBufferCount;
|
||||
DWORD dwDynamicVertexBufferSize;
|
||||
|
||||
int nDynamicIndexBufferCount;
|
||||
DWORD dwDynamicIndexBufferSize;
|
||||
|
||||
int nStaticVertexBufferCount;
|
||||
DWORD dwStaticVertexBufferSize;
|
||||
|
||||
int nStaticIndexBufferCount;
|
||||
DWORD dwStaticIndexBufferSize;
|
||||
};
|
||||
|
||||
struct VIB_PACKET
|
||||
{
|
||||
//IDirect3DVertexBuffer8* pVB;
|
||||
//IDirect3DIndexBuffer8* pIB;
|
||||
UINT uPositionInVB;
|
||||
UINT uPositionInIB;
|
||||
|
||||
VIB_PACKET()
|
||||
{
|
||||
uPositionInVB = 0;
|
||||
uPositionInIB = 0;
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
class CDrawElementMgr
|
||||
{
|
||||
public:
|
||||
// 초기화( InitDevice 성 초기화)
|
||||
static bool _Init( IDirect3DDevice8* pDevice, DRAW_ELEMENT_MGR_INIT_PARAM* pInitParam );
|
||||
|
||||
// Draw Element 등록
|
||||
static bool _RegisterDrawElement( int nLayer, DRAW_ELEMENT& rDE );
|
||||
|
||||
// Static Draw Element 등록
|
||||
// static bool _RegisterStaticDrawElement( int nLayer, DRAW_ELEMENT& rDE );
|
||||
|
||||
// register 된 D/E 들을 sort 하고 최적화한 후 DrawPrimitive 호출
|
||||
static void _Process();
|
||||
|
||||
// 종료( _Init 와 pair )
|
||||
static void _Close();
|
||||
|
||||
private:
|
||||
static IDirect3DDevice8* ms_pDevice;
|
||||
|
||||
static std::vector< DRAW_ELEMENT > ms_avecDynamicDrawElement[MAX_DRAW_ELEMENT_LAYER];
|
||||
// static std::vector< DRAW_ELEMENT > ms_avecStaticDrawElement[MAX_DRAW_ELEMENT_LAYER];
|
||||
|
||||
static int ms_nDynamicVertexBufferCount;
|
||||
static DWORD ms_dwDynamicVertexBufferSize;
|
||||
|
||||
static int ms_nDynamicIndexBufferCount;
|
||||
static DWORD ms_dwDynamicIndexBufferSize;
|
||||
|
||||
|
||||
// static int ms_nStaticVertexBufferCount;
|
||||
// static DWORD ms_dwStaticVertexBufferSize;
|
||||
|
||||
// static int ms_nStaticIndexBufferCount;
|
||||
// static DWORD ms_dwStaticIndexBufferSize;
|
||||
|
||||
// static IDirect3DVertexBuffer8** ms_apDynamicVertexBuffer;
|
||||
// static IDirect3DIndexBuffer8** ms_apDynaicIndexBuffer;
|
||||
static IDirect3DVertexBuffer8* ms_pDynamicVertexBuffer;
|
||||
static IDirect3DIndexBuffer8* ms_pDynamicIndexBuffer;
|
||||
|
||||
// static IDirect3DVertexBuffer8** ms_apStaticVertexBuffer;
|
||||
// static IDirect3DIndexBuffer8** ms_apStaticIndexBuffer;
|
||||
|
||||
|
||||
static std::map< CBaseMesh*, UINT > ms_mapVBAllocationInfo;
|
||||
static std::map< CBaseMesh*, UINT > ms_mapIBAllocationInfo;
|
||||
static int ms_nVBUsedInByte;
|
||||
static int ms_nIBUsedInByte;
|
||||
|
||||
static DRAW_ELEMENT ms_LastTimeDE;
|
||||
|
||||
|
||||
// Process 내부 동작 컴포넌트들
|
||||
static void _Sort();
|
||||
static void _Optimize();
|
||||
static void _UploadMesh( DRAW_ELEMENT &rDE, VIB_PACKET &rPacket );
|
||||
static void _Render( DRAW_ELEMENT &rDE, VIB_PACKET &rPacket );
|
||||
|
||||
};
|
||||
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
192
Engine/Caldron/Src/Scene/Mesh.h
Normal file
192
Engine/Caldron/Src/Scene/Mesh.h
Normal file
@@ -0,0 +1,192 @@
|
||||
#pragma once
|
||||
|
||||
#pragma warning( disable : 4786 )
|
||||
#include "../../include/Caldron.h"
|
||||
|
||||
|
||||
namespace Caldron
|
||||
{
|
||||
namespace Scene
|
||||
{
|
||||
|
||||
class CBaseMesh
|
||||
{
|
||||
public:
|
||||
CBaseMesh()
|
||||
{
|
||||
m_nLockCount = 0;
|
||||
}
|
||||
|
||||
virtual ~CBaseMesh()
|
||||
{
|
||||
// m_nLockCount 가 0이 아닐 경우 경고 메시지를 띄워줄 수 있다.
|
||||
}
|
||||
|
||||
void Lock()
|
||||
{
|
||||
// thread safe code 필요할지도?
|
||||
++m_nLockCount;
|
||||
}
|
||||
|
||||
void Unlock()
|
||||
{
|
||||
// thread safe code 필요할지도?
|
||||
if( m_nLockCount > 0 )
|
||||
{
|
||||
// 음수 lock count 에 대한 경고 메시지 출력할수 있을듯
|
||||
--m_nLockCount;
|
||||
}
|
||||
}
|
||||
|
||||
bool IsLocked()
|
||||
{
|
||||
return (m_nLockCount>0);
|
||||
}
|
||||
|
||||
// VB 로 vertex 내용 upload 시 사용
|
||||
virtual void UploadVertexData( void* p ) = 0;
|
||||
// IB 로 index 내용 upload 시 사용
|
||||
virtual void UploadIndexData( void* p ) = 0;
|
||||
|
||||
//
|
||||
virtual int GetVertexCount() = 0;
|
||||
virtual int GetIndexCount() = 0;
|
||||
|
||||
|
||||
virtual int GetVertexSize() = 0;
|
||||
virtual DWORD GetFVF() = 0;
|
||||
|
||||
|
||||
bool IsIndexed()
|
||||
{
|
||||
return m_bIndexed;
|
||||
}
|
||||
|
||||
|
||||
protected:
|
||||
int m_nLockCount;
|
||||
bool m_bIndexed;
|
||||
};
|
||||
|
||||
|
||||
template <class _T>
|
||||
class CMesh : public CBaseMesh
|
||||
{
|
||||
public:
|
||||
CMesh()
|
||||
{
|
||||
}
|
||||
|
||||
~CMesh()
|
||||
{
|
||||
}
|
||||
|
||||
// VB 로 vertex 내용 upload 시 사용
|
||||
void UploadVertexData( void* p )
|
||||
{
|
||||
if( 0 == m_vecVertexData.size() )
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
MoveMemory( p, &(m_vecVertexData[0]), sizeof(_T) * m_vecVertexData.size() );
|
||||
}
|
||||
|
||||
// IB 로 index 내용 upload 시 사용
|
||||
void UploadIndexData( void* p )
|
||||
{
|
||||
if( 0 == m_vecIndexData.size() )
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
MoveMemory( p, &(m_vecIndexData[0]), sizeof(_T) * m_vecIndexData.size() );
|
||||
}
|
||||
|
||||
|
||||
//
|
||||
int GetVertexCount()
|
||||
{
|
||||
return m_vecVertexData.size();
|
||||
}
|
||||
//
|
||||
int GetIndexCount()
|
||||
{
|
||||
return m_vecIndexData.size();
|
||||
}
|
||||
|
||||
|
||||
int GetVertexSize()
|
||||
{
|
||||
return sizeof( _T );
|
||||
}
|
||||
|
||||
DWORD GetFVF()
|
||||
{
|
||||
return _T::GetFVF();
|
||||
}
|
||||
|
||||
|
||||
|
||||
// vertex 갯수 설정(공간확보)
|
||||
void SetVertexCount( int n )
|
||||
{
|
||||
m_vecVertexData.resize( n );
|
||||
}
|
||||
|
||||
// 해당 index 갯수 설정(공간 확보)
|
||||
void SetIndexCount( int n )
|
||||
{
|
||||
m_vecIndexData.resize( n );
|
||||
|
||||
if( 0 == n )
|
||||
{
|
||||
m_bIndexed = false;
|
||||
}
|
||||
else
|
||||
{
|
||||
m_bIndexed = true;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//
|
||||
_T* GetVertexWritePtr()
|
||||
{
|
||||
if( IsLocked() )
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if( 0 == m_vecVertexData.size() )
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return &(m_vecVertexData[0]);
|
||||
}
|
||||
|
||||
WORD* GetIndexWritePtr()
|
||||
{
|
||||
if( IsLocked() )
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if( 0 == m_vecIndexData.size() )
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return &(m_vecIndexData[0]);
|
||||
}
|
||||
|
||||
|
||||
private:
|
||||
std::vector< _T > m_vecVertexData;
|
||||
std::vector< WORD > m_vecIndexData;
|
||||
};
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
11
Engine/Caldron/Src/Scene/StateSet.cpp
Normal file
11
Engine/Caldron/Src/Scene/StateSet.cpp
Normal file
@@ -0,0 +1,11 @@
|
||||
#include "StateSet.h"
|
||||
|
||||
|
||||
namespace Caldron
|
||||
{
|
||||
namespace Scene
|
||||
{
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
37
Engine/Caldron/Src/Scene/StateSet.h
Normal file
37
Engine/Caldron/Src/Scene/StateSet.h
Normal file
@@ -0,0 +1,37 @@
|
||||
#pragma once
|
||||
|
||||
#pragma warning( disable : 4786 )
|
||||
#include "../../include/Caldron.h"
|
||||
|
||||
#include "Mesh.h"
|
||||
#include "Texture.h"
|
||||
|
||||
|
||||
namespace Caldron
|
||||
{
|
||||
namespace Scene
|
||||
{
|
||||
class CStateSet
|
||||
{
|
||||
public:
|
||||
|
||||
|
||||
};
|
||||
|
||||
class CStateSetMgr
|
||||
{
|
||||
public:
|
||||
// 초기화( InitDevice 성 초기화)
|
||||
static bool _Init( IDirect3DDevice8* pDevice );
|
||||
|
||||
// StateSet Manager 외부에서 d3d device 로 직접 시도된 state change 들을 검사해 device 와 StateSet Mgr 의 state를 동기화
|
||||
static void _GetCurrentDeviceState();
|
||||
|
||||
// 지정된 StateSet 의 내용을 D3D Device 에 적용
|
||||
static void _ApplyStateSet( CStateSet* pStateSet );
|
||||
|
||||
private:
|
||||
// 각 state 변수들
|
||||
};
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user