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

📄 proxyeffect.cpp

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

#include "ProxyEffect.h"
#include "D3DDevice.h"
#include "../console/Console.h"
#include "../utils/Errors.h"

using namespace dingus;


CD3DXEffect::CD3DXEffect( ID3DXEffect* object )
:	CBaseProxyClass(object)
{
	init();
}

void CD3DXEffect::setObject( ID3DXEffect* object )
{
	setPtr(object);
	if( object )
		init();
}

void CD3DXEffect::init()
{
	CD3DDevice& dx = CD3DDevice::getInstance();
	mSoftwareVertexProcessed = false;
	if( dx.getVertexProcessing() != CD3DDevice::VP_SW )
		dx.getDevice().SetSoftwareVertexProcessing( FALSE );
	bool okhwvp = tryInit();
	if( !okhwvp ) {
		mSoftwareVertexProcessed = true;
		if( dx.getVertexProcessing() != CD3DDevice::VP_SW )
			dx.getDevice().SetSoftwareVertexProcessing( TRUE );
		bool okswvp = tryInit();
		if( !okswvp ) {
			// no valid technique found, throw exception
			std::string msg = "no valid techniques found in effect";
			CConsole::CON_ERROR.write( msg );
			THROW_ERROR( msg );
		}
		if( dx.getVertexProcessing() != CD3DDevice::VP_SW )
			dx.getDevice().SetSoftwareVertexProcessing( FALSE );
	}
}

bool CD3DXEffect::tryInit()
{
	HRESULT hres;

	ID3DXEffect* fx = getObject();
	assert( fx );

	D3DXHANDLE tech = fx->GetTechnique( 0 );
	if( FAILED( fx->ValidateTechnique( tech ) ) )
		hres = fx->FindNextValidTechnique( tech, &tech );
	
	if( tech != NULL )
		fx->SetTechnique( tech );
	else
		return false;
	assert( tech != NULL );

	// back to front?
	D3DXHANDLE annot = fx->GetAnnotationByName( tech, "backToFront" );
	BOOL backToFront = FALSE;
	if( annot != NULL )
		fx->GetBool( annot, &backToFront );
	mBackToFrontSorted = backToFront ? true : false;

	// vertex shader version
	annot = fx->GetAnnotationByName( tech, "vshader" );
	int vsVersion = CD3DDevice::VS_FFP;
	if( annot != NULL ) {
		float vsv;
		fx->GetFloat( annot, &vsv );
		if( vsv < 1.1f )
			vsVersion = CD3DDevice::VS_FFP;
		else if( vsv < 2.0f )
			vsVersion = CD3DDevice::VS_1_1;
		else if( vsv < 3.0f )
			vsVersion = CD3DDevice::VS_2_0;
		else
			vsVersion = CD3DDevice::VS_3_0;
	}
	if( vsVersion > CD3DDevice::getInstance().getVShaderVersion() )
		mSoftwareVertexProcessed = true;

	// sort value
	mSortValue = 0;
	mSortValue += mBackToFrontSorted ? 0x10 : 0x00;
	mSortValue += mSoftwareVertexProcessed ? 0 : 1;
	//mSortValue += vsVersion;

	// has restoring pass?
	D3DXTECHNIQUE_DESC techdsc;
	fx->GetTechniqueDesc( tech, &techdsc );
	D3DXPASS_DESC passdsc;
	fx->GetPassDesc( fx->GetPass(tech,techdsc.Passes-1), &passdsc );
	mHasRestoringPass = !stricmp( passdsc.Name, "PLast" );
	mPassCount = mHasRestoringPass ? techdsc.Passes-1 : techdsc.Passes;

	return true;
}


int CD3DXEffect::beginFx()
{
	UINT p;
	DWORD flags = mHasRestoringPass ? (D3DXFX_DONOTSAVESTATE | D3DXFX_DONOTSAVESHADERSTATE) : 0;
	HRESULT hr = getObject()->Begin( &p, flags );
	assert( SUCCEEDED(hr) );
	assert( mHasRestoringPass && p==mPassCount+1 || !mHasRestoringPass && p==mPassCount );
	return mPassCount;
}

void CD3DXEffect::endFx()
{
	if( mHasRestoringPass ) {
		beginPass( mPassCount );
		endPass();
	}
	HRESULT hr = getObject()->End();
	assert( SUCCEEDED(hr) );
}

void CD3DXEffect::beginPass( int p )
{
#ifdef USE_D3DX_SUMMER_2004
	HRESULT hr = getObject()->BeginPass( p );
#else
	HRESULT hr = getObject()->Pass( p );
#endif
	assert( SUCCEEDED(hr) );
}

void CD3DXEffect::endPass()
{
#ifdef USE_D3DX_SUMMER_2004
	HRESULT hr = getObject()->EndPass();
	assert( SUCCEEDED(hr) );
#endif
}

void CD3DXEffect::commitParams()
{
#ifdef USE_D3DX_SUMMER_2004
	HRESULT hr = getObject()->CommitChanges();
	assert( SUCCEEDED(hr) );
#endif
}

⌨️ 快捷键说明

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