📄 proxyeffect.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 + -