Files
Client/Engine/Caldron/Src/Scene/D3DBufferPools.cpp
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

614 lines
14 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#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 <20><><EFBFBD><EFBFBD>Ǯ<EFBFBD><C7AE> <20>ִ밳<D6B4><EBB0B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
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)
{
// <20>ִ밳<D6B4><EBB0B3> <20><><EFBFBD><EFBFBD>.
for(int i = 0;i < D3DBUFFER_SIZENUM - 1; i++)
{
if(VertexBufferDesc.Size <= ArrBufferSize[i])
{
if(m_DVertexBufferNums[i] >= iMaxPoolCount)
{
SafeRelease(lpBuffer);
return;
}
break;
}
}
}
else
{
// <20>ִ밳<D6B4><EBB0B3> <20><><EFBFBD><EFBFBD>
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)
{
// <20>ִ밳<D6B4><EBB0B3> <20><><EFBFBD><EFBFBD>.
for(int i = 0;i < D3DBUFFER_SIZENUM - 1; i++)
{
if(IndexBufferDesc.Size <= ArrBufferSize[i])
{
if(m_DIndexBufferNums[i] >= iMaxPoolCount)
{
SafeRelease(lpBuffer);
return;
}
break;
}
}
}
else
{
// <20>ִ밳<D6B4><EBB0B3> <20><><EFBFBD><EFBFBD>
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;
}
}
}