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:
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 <20>Ҵ<EFBFBD>
|
||||
hr = pDevice->CreateVertexBuffer( pInitParam->dwDynamicVertexBufferSize, D3DUSAGE_DYNAMIC | D3DUSAGE_WRITEONLY,
|
||||
0, D3DPOOL_DEFAULT, &ms_pDynamicVertexBuffer );
|
||||
if( FAILED(hr) )
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
// dynamic IB <20>Ҵ<EFBFBD>
|
||||
hr = pDevice->CreateIndexBuffer( pInitParam->dwDynamicIndexBufferSize, D3DUSAGE_DYNAMIC | D3DUSAGE_WRITEONLY,
|
||||
D3DFMT_INDEX16, D3DPOOL_DEFAULT, &ms_pDynamicIndexBuffer );
|
||||
if( FAILED(hr) )
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
// static VB <20>Ҵ<EFBFBD>
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
|
||||
// static IB <20>Ҵ<EFBFBD>
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
|
||||
|
||||
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 <20><> <20><><EFBFBD>ҵ鿡 <20><><EFBFBD><EFBFBD> lock <20><> <20>ʿ<EFBFBD><CABF>ҵ<EFBFBD>.. <20><EFBFBD><D7B7><EFBFBD> <20>̷<EFBFBD><CCB7><EFBFBD> <20>Ϸ<EFBFBD><CFB7><EFBFBD> <20><> <20><><EFBFBD>ҵ<EFBFBD> <20><><EFBFBD><EFBFBD> lockable <20><> <20><>ü<EFBFBD><C3BC> <20>ٲ<EFBFBD><D9B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
|
||||
rDE.pMesh->Lock();
|
||||
|
||||
ms_avecDynamicDrawElement[nLayer].push_back( rDE );
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
// bool CDrawElementMgr::_RegisterStaticDrawElement( int nLayer, DRAW_ELEMENT& rDE )
|
||||
// {
|
||||
// //
|
||||
// // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> dynamic <20>϶<EFBFBD><CFB6><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ٲ<EFBFBD> <20><> <20><><EFBFBD><EFBFBD>
|
||||
// //
|
||||
//
|
||||
// if( nLayer >= MAX_DRAW_ELEMENT_LAYER )
|
||||
// {
|
||||
// return false;
|
||||
// }
|
||||
//
|
||||
// if( false ==rDE.ValidityCheck() )
|
||||
// {
|
||||
// return false;
|
||||
// }
|
||||
//
|
||||
// // D/E <20><> <20><><EFBFBD>ҵ鿡 <20><><EFBFBD><EFBFBD> lock <20><> <20>ʿ<EFBFBD><CABF>ҵ<EFBFBD>.. <20><EFBFBD><D7B7><EFBFBD> <20>̷<EFBFBD><CCB7><EFBFBD> <20>Ϸ<EFBFBD><CFB7><EFBFBD> <20><> <20><><EFBFBD>ҵ<EFBFBD> <20><><EFBFBD><EFBFBD> lockable <20><> <20><>ü<EFBFBD><C3BC> <20>ٲ<EFBFBD><D9B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
|
||||
//
|
||||
// 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 <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
|
||||
|
||||
|
||||
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
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> CMesh <20><> Lock/Unlock <20><><EFBFBD><EFBFBD><EFBFBD>Ǿ<EFBFBD><C7BE><EFBFBD><EFBFBD><EFBFBD>
|
||||
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 <20><><EFBFBD><EFBFBD>
|
||||
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; // <20>Ҵ<EFBFBD><D2B4><EFBFBD> mesh data <20><> byte <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
UINT uAllocOffset; // buffer <20><><EFBFBD><EFBFBD> upload <20><> <20><>ġ
|
||||
UINT uRemain; // buffer <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ִ<EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
HRESULT hr;
|
||||
|
||||
// VB <20><><EFBFBD><EFBFBD> <20>̹<EFBFBD> upload <20>Ǿ<EFBFBD><C7BE>ִ<EFBFBD> mesh <20>ΰ<EFBFBD>?
|
||||
it = ms_mapVBAllocationInfo.find( rDE.pMesh );
|
||||
if( it != ms_mapVBAllocationInfo.end() )
|
||||
{
|
||||
// <20><EFBFBD><D7B7>ٸ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> VIB packet <20><> <20><><EFBFBD><EFBFBD>
|
||||
rPacket.uPositionInVB = it->second;
|
||||
}
|
||||
else
|
||||
{
|
||||
// <20>ƴϸ<C6B4> <20>Ҵ<EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// DrawPrimitive <20>迭<EFBFBD><E8BFAD> offset <20><><EFBFBD><EFBFBD> <20>Ķ<EFBFBD><C4B6><EFBFBD><EFBFBD>͵<EFBFBD><CDB5><EFBFBD> vertex <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>̹Ƿ<CCB9>
|
||||
// mesh vertex data<74><61> upload <20><> <20><><EFBFBD><EFBFBD> <20><> <20><>ġ<EFBFBD><C4A1> vertex size<7A><65> <20>°<EFBFBD> align
|
||||
// <20><> <20>ش<EFBFBD>.
|
||||
//
|
||||
|
||||
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 <20><><EFBFBD>迡 <20><><EFBFBD><EFBFBD> <20>ø<EFBFBD>
|
||||
uRemain = ms_dwDynamicVertexBufferSize - uUsedAlignFixed;
|
||||
|
||||
// Lock VB
|
||||
if( uRemain < uSizeInByte )
|
||||
{
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ҷ<EFBFBD> -> discard all & reset alloc info
|
||||
uAllocOffset = 0;
|
||||
hr = ms_pDynamicVertexBuffer->Lock( uAllocOffset, uSizeInByte, &pByteDataInBuffer, D3DLOCK_DISCARD );
|
||||
if( FAILED(hr) )
|
||||
{
|
||||
return; // Lock <20><><EFBFBD>н<EFBFBD> <20><> <20><><EFBFBD><EFBFBD>..-_-
|
||||
}
|
||||
|
||||
// VB flush, <20>Ҵ<EFBFBD><D2B4><EFBFBD><EFBFBD><EFBFBD> clear
|
||||
ms_mapVBAllocationInfo.clear();
|
||||
ms_nVBUsedInByte = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ҷ<EFBFBD> -> <20><> Lock
|
||||
uAllocOffset = uUsedAlignFixed;
|
||||
hr = ms_pDynamicVertexBuffer->Lock( uAllocOffset, uSizeInByte, &pByteDataInBuffer, D3DLOCK_NOOVERWRITE );
|
||||
if( FAILED(hr) )
|
||||
{
|
||||
return; // Lock <20><><EFBFBD>н<EFBFBD> <20><> <20><><EFBFBD><EFBFBD>..-_-
|
||||
}
|
||||
}
|
||||
|
||||
// upload, <20>Ҵ<EFBFBD><D2B4><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
rDE.pMesh->UploadVertexData( pByteDataInBuffer );
|
||||
ms_pDynamicVertexBuffer->Unlock();
|
||||
|
||||
ms_mapVBAllocationInfo[rDE.pMesh] = uAllocOffset;
|
||||
ms_nVBUsedInByte = uUsedAlignFixed + uSizeInByte;
|
||||
}
|
||||
|
||||
// indexed mesh <20><> <20>ƴϸ<C6B4> -> <20><><EFBFBD><EFBFBD>
|
||||
if( !( rDE.pMesh->IsIndexed() ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
// IB <20><><EFBFBD><EFBFBD> VB <20><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ݺ<EFBFBD>
|
||||
|
||||
// IB <20><><EFBFBD><EFBFBD> <20>̹<EFBFBD> upload <20>Ǿ<EFBFBD><C7BE>ִ<EFBFBD> mesh <20>ΰ<EFBFBD>?
|
||||
it = ms_mapIBAllocationInfo.find( rDE.pMesh );
|
||||
if( it != ms_mapIBAllocationInfo.end() )
|
||||
{
|
||||
// <20><EFBFBD><D7B7>ٸ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> VIB packet <20><> <20><><EFBFBD><EFBFBD>
|
||||
rPacket.uPositionInIB = it->second;
|
||||
}
|
||||
else
|
||||
{
|
||||
// <20>ƴϸ<C6B4> <20>Ҵ<EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
|
||||
uSizeInByte = rDE.pMesh->GetIndexCount() * sizeof(WORD);
|
||||
uRemain = ms_dwDynamicIndexBufferSize - ms_nIBUsedInByte;
|
||||
|
||||
// Lock IB
|
||||
if( uRemain < uSizeInByte )
|
||||
{
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ҷ<EFBFBD> -> discard all & reset alloc info
|
||||
uAllocOffset = 0;
|
||||
hr = ms_pDynamicIndexBuffer->Lock( uAllocOffset, uSizeInByte, &pByteDataInBuffer, D3DLOCK_DISCARD );
|
||||
if( FAILED(hr) )
|
||||
{
|
||||
return; // Lock <20><><EFBFBD>н<EFBFBD> <20><> <20><><EFBFBD><EFBFBD>..-_-
|
||||
}
|
||||
|
||||
// IB flush, <20>Ҵ<EFBFBD><D2B4><EFBFBD><EFBFBD><EFBFBD> clear
|
||||
ms_mapIBAllocationInfo.clear();
|
||||
ms_nIBUsedInByte = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ҷ<EFBFBD> -> <20><> Lock
|
||||
uAllocOffset = ms_nIBUsedInByte;
|
||||
hr = ms_pDynamicIndexBuffer->Lock( uAllocOffset, uSizeInByte, &pByteDataInBuffer, D3DLOCK_NOOVERWRITE );
|
||||
if( FAILED(hr) )
|
||||
{
|
||||
return; // Lock <20><><EFBFBD>н<EFBFBD> <20><> <20><><EFBFBD><EFBFBD>..-_-
|
||||
}
|
||||
}
|
||||
|
||||
// upload, <20>Ҵ<EFBFBD><D2B4><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
rDE.pMesh->UploadIndexData( pByteDataInBuffer );
|
||||
ms_pDynamicIndexBuffer->Unlock();
|
||||
|
||||
ms_mapIBAllocationInfo[rDE.pMesh] = uAllocOffset;
|
||||
ms_nIBUsedInByte += uSizeInByte;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void CDrawElementMgr::_Render( DRAW_ELEMENT &rDE, VIB_PACKET &rPacket )
|
||||
{
|
||||
// <20>ӽ<EFBFBD><D3BD>ڵ<EFBFBD>
|
||||
ms_pDevice->SetRenderState( D3DRS_LIGHTING, TRUE );
|
||||
ms_pDevice->LightEnable( 0, TRUE );
|
||||
|
||||
|
||||
// ms_LastTimeDE <20><> rDE <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD> <20><> <20>ٸ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD>
|
||||
|
||||
// rPacket <20><> VB/IB <20><> last time <20><> <20>ٸ<EFBFBD> <20><><EFBFBD><EFBFBD> stream source <20><> <20>ٲ<EFBFBD><D9B2><EFBFBD><EFBFBD><EFBFBD>..<2E><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> VB/IB <20><> <20>ϳ<EFBFBD><CFB3><EFBFBD><EFBFBD>̹Ƿ<CCB9> <20><><EFBFBD><EFBFBD>
|
||||
// ...<2E>Ϸ<EFBFBD><CFB7><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, SSS<53><53> stride <20><> <20>Ķ<EFBFBD><C4B6><EFBFBD><EFBFBD>ͷ<EFBFBD> <20><><EFBFBD><EFBFBD>Ƿ<EFBFBD> <20>Ź<EFBFBD> <20><><EFBFBD>ִ°<D6B4><C2B0><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>-_-;
|
||||
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 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ
|
||||
ms_LastTimeDE = rDE;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user