⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 renderablebuffer.cpp

📁 java实现的简单的分形树。简单易学!是学习分形知识的很好的例子。其java语法简单
💻 CPP
字号:
// --------------------------------------------------------------------------
// Dingus project - a collection of subsystems for game/graphics applications
// --------------------------------------------------------------------------
#include "stdafx.h"

#include "RenderableBuffer.h"
#include "RenderContext.h"
#include "../kernel/D3DDevice.h"

using namespace dingus;


DEFINE_POOLED_ALLOC(dingus::CRenderableBuffer,128,false);
DEFINE_POOLED_ALLOC(dingus::CRenderableIndexedBuffer,128,false);

// --------------------------------------------------------------------------
//  CAbstractRenderableBuffer
// --------------------------------------------------------------------------

CAbstractRenderableBuffer::CAbstractRenderableBuffer( const SVector3* origin, int priority )
:	CRenderable( origin, priority ),
	mPrimType( D3DPT_TRIANGLELIST ),
	mPrimCount( 0 )
{
	mLargestActiveStream = VERTEX_STREAM_COUNT - 1;
	resetVBs();
	mLargestActiveStream = -1;
}

void CAbstractRenderableBuffer::resetVBs()
{
	for( int q = 0; q <= mLargestActiveStream; ++q ) {
		mVB[q] = NULL;
		mStride[q] = 0;
		mByteOffset[q] = 0;
	}
	mLargestActiveStream = -1;
	mVertexDecl = NULL;
}

void CAbstractRenderableBuffer::setVB( CD3DVertexBuffer& vb, int stream )
{
	assert( stream >= 0 && stream < VERTEX_STREAM_COUNT );
	mVB[stream] = &vb;
	if( stream > mLargestActiveStream )
		mLargestActiveStream = stream;
}

void CAbstractRenderableBuffer::applyStreams()
{
	CD3DDevice& device = CD3DDevice::getInstance();

	for( int q = 0; q <= mLargestActiveStream; ++q ) {
		assert( mStride[q] > 0 );
		device.setVertexBuffer( q, mVB[q], mByteOffset[q], mStride[q] );
	}

	if( mVertexDecl )
		device.setDeclaration( *mVertexDecl );
}

void CAbstractRenderableBuffer::unapplyStreams()
{
	/*
	CD3DDevice& device = CD3DDevice::getInstance();
	for( int q = 0; q <= mLargestActiveStream; ++q )
		device.setVertexBuffer( q, NULL, 0, 0 );
		*/
}


// --------------------------------------------------------------------------
//  CRenderableBuffer
// --------------------------------------------------------------------------

CRenderableBuffer::CRenderableBuffer( const SVector3* origin, int priority )
:	CAbstractRenderableBuffer( origin, priority ),
	mStartVertex( 0 )
{
}


void CRenderableBuffer::render( CRenderContext const& ctx )
{
	if( getLargestActiveStream() < 0 )
		return;
	if( getPrimCount() == 0 )
		return;

	CD3DDevice& device = CD3DDevice::getInstance();
	IDirect3DDevice9& dx = device.getDevice();
	CRenderStats& stats = device.getStats();
	
	applyStreams();
	dx.DrawPrimitive( getPrimType(), mStartVertex, getPrimCount() );
	unapplyStreams();
	
	// stats
	stats.incDrawCalls();
	stats.incVerticesRendered( /* TBD */ getPrimCount() );
	stats.incPrimsRendered( getPrimCount() );
}


// --------------------------------------------------------------------------
//  CRenderableIndexedBuffer
// --------------------------------------------------------------------------

CRenderableIndexedBuffer::CRenderableIndexedBuffer( const SVector3* origin, int priority )
:	CAbstractRenderableBuffer( origin, priority ),
	mIB( NULL ),
	mBaseVertex( 0 ),
	mMinVertex( 0 ),
	mNumVertices( 0 ),
	mStartIndex( 0 )
{
}

void CRenderableIndexedBuffer::render( CRenderContext const& ctx )
{
	if( getLargestActiveStream() < 0 )
		return;
	if( getPrimCount() == 0 )
		return;

	assert( mIB );

	CD3DDevice& device = CD3DDevice::getInstance();
	IDirect3DDevice9& dx = device.getDevice();
	CRenderStats& stats = device.getStats();

	applyStreams();

	device.setIndexBuffer( mIB );

	dx.DrawIndexedPrimitive(
		getPrimType(), mBaseVertex, mMinVertex, mNumVertices, mStartIndex, getPrimCount() );

	unapplyStreams();

	//device.setIndexBuffer( NULL );

	// stats
	stats.incDrawCalls();
	stats.incVerticesRendered( mNumVertices );
	stats.incPrimsRendered( getPrimCount() );
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -