📄 renderablemesh.cpp
字号:
// --------------------------------------------------------------------------
// Dingus project - a collection of subsystems for game/graphics applications
// --------------------------------------------------------------------------
#include "stdafx.h"
#include "RenderableMesh.h"
#include "RenderContext.h"
#include "../utils/Errors.h"
#include "../kernel/D3DDevice.h"
using namespace dingus;
DEFINE_POOLED_ALLOC(dingus::CRenderableMesh,256,false);
CRenderableMesh::CRenderableMesh( CMesh& mesh, int group, const SVector3* origin, int priority )
: CRenderable( origin, priority ),
mMesh( &mesh ),
mGroup( group )
{
assert( group >= 0 && group < mesh.getGroupCount() || group == ALL_GROUPS );
assert( mesh.isCreated() );
}
void CRenderableMesh::render( CRenderContext const& ctx )
{
assert( mMesh );
HRESULT hres;
//IDirect3DIndexBuffer9* ib = &mMesh->getIB();
//IDirect3DVertexBuffer9* vb = &mMesh->getVB();
//assert( ib && vb );
CD3DDevice& device = CD3DDevice::getInstance();
IDirect3DDevice9& dx = device.getDevice();
CRenderStats& stats = device.getStats();
device.setIndexBuffer( &mMesh->getIB() );
device.setVertexBuffer( 0, &mMesh->getVB(), 0, mMesh->getVertexStride() );
device.setDeclaration( mMesh->getVertexDecl() );
if( mGroup == ALL_GROUPS ) {
hres = dx.DrawIndexedPrimitive( D3DPT_TRIANGLELIST,
0, 0, mMesh->getVertexCount(),
0, mMesh->getIndexCount()/3 );
stats.incVerticesRendered( mMesh->getVertexCount() );
stats.incPrimsRendered( mMesh->getIndexCount()/3 );
} else {
const CMesh::CGroup& group = mMesh->getGroup( mGroup );
hres = dx.DrawIndexedPrimitive( D3DPT_TRIANGLELIST,
0, group.getFirstVertex(), group.getVertexCount(),
group.getFirstPrim() * 3, group.getPrimCount() );
stats.incVerticesRendered( group.getVertexCount() );
stats.incPrimsRendered( group.getPrimCount() );
}
if( FAILED( hres ) ) {
THROW_DXERROR( hres, "failed to DIP" );
}
// stats
stats.incDrawCalls();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -