Pokusaj da iskomentarises deo po deo koda koji renderuje drvece - delove gde postavljas "rendering state"-ove.
Saljem ti parce svakako nezavrsenog koda koji mozda moze da ti da ideju kako da pojednostavis debug-ovanje DX aplikacija.
F-ja RestoreStates bi trebalo (ovako nedovrsena ne radi nista) da vrati na default vrednosti "state"-ova, ili da joj ime bude CheckStates i da proverava koji od "state"-ova nisu "resetovani".
Naravno, da bi ovo radilo umesto m_pDevice->SetTexture() treba da pozivas DXDevice_n::SetTexture i da prosiris listu sa svim f-jama koje koristis. Mozda deluje da ima preterano posla za pisanje ovog vrapera, ali vrlo brzo se ulozeni trud isplati. Takodje, ako si ukljucio "full debug" DX poziva, ovako ces izbeci reku poruka po "reudantnom postavljanju stejtova"
Code:
#include "dxDevice.h"
#include <d3d9.h>
#include <map>
#include <set>
#include <assert.h>
namespace DXDevice_n
{
struct StateValue_s
{
DWORD Value;
DWORD Default;
};
typedef std::map< DWORD, StateValue_s > StateMap_t;
typedef StateMap_t::iterator StateMapIter_t;
typedef std::pair< DWORD, StateValue_s > StatePair_t;
typedef std::set< DWORD > StateSet_t;
typedef StateSet_t::iterator StateSetIter_t;
StateMap_t n_TextureStageState[8];
StateMap_t n_RenderStatesMap;
StateMap_t n_SamplerState[8];
StateSet_t n_ChangedTextureStageStatesSet[8];
StateSet_t n_ChangedRenderStatesSet;
LPDIRECT3DBASETEXTURE9 n_Texture[8];
}
void DXDevice_n::Init()
{
static DWORD sTSSTable[] =
{
D3DTSS_COLOROP, D3DTOP_DISABLE,
D3DTSS_COLORARG1, D3DTA_TEXTURE,
D3DTSS_COLORARG2, D3DTA_CURRENT,
D3DTSS_ALPHAOP, D3DTOP_DISABLE,
D3DTSS_ALPHAARG1, D3DTA_TEXTURE,
D3DTSS_ALPHAARG2, D3DTA_CURRENT,
D3DTSS_BUMPENVMAT00, 0,
D3DTSS_BUMPENVMAT01, 0,
D3DTSS_BUMPENVMAT10, 0,
D3DTSS_BUMPENVMAT11, 0,
D3DTSS_TEXCOORDINDEX, 0,
D3DTSS_BUMPENVLSCALE, 0,
D3DTSS_BUMPENVLOFFSET, 0,
D3DTSS_TEXTURETRANSFORMFLAGS, D3DTTFF_DISABLE,
D3DTSS_COLORARG0, D3DTA_CURRENT,
D3DTSS_ALPHAARG0, D3DTA_CURRENT,
D3DTSS_RESULTARG, D3DTA_CURRENT,
D3DTSS_CONSTANT, D3DTA_CONSTANT,
};
static DWORD sRSTable[] =
{
D3DRS_CULLMODE, D3DCULL_CCW,
D3DRS_FOGCOLOR, 0,
D3DRS_FOGTABLEMODE, D3DFOG_NONE,
D3DRS_FOGSTART, 0,
D3DRS_FOGEND, 1,
D3DRS_FOGDENSITY, 1,
D3DRS_RANGEFOGENABLE, FALSE,
D3DRS_AMBIENT, 0,
D3DRS_COLORVERTEX, TRUE,
D3DRS_FOGVERTEXMODE, D3DFOG_NONE,
D3DRS_CLIPPING, TRUE,
D3DRS_LIGHTING, TRUE,
D3DRS_LOCALVIEWER, TRUE,
D3DRS_EMISSIVEMATERIALSOURCE, D3DMCS_MATERIAL,
D3DRS_AMBIENTMATERIALSOURCE, D3DMCS_MATERIAL,
D3DRS_DIFFUSEMATERIALSOURCE, D3DMCS_COLOR1,
D3DRS_SPECULARMATERIALSOURCE, D3DMCS_COLOR2,
D3DRS_VERTEXBLEND, D3DVBF_DISABLE,
D3DRS_CLIPPLANEENABLE, 0,
D3DRS_POINTSIZE_MIN, 1,
D3DRS_POINTSPRITEENABLE, FALSE,
D3DRS_POINTSCALEENABLE, FALSE,
D3DRS_POINTSCALE_A, 1,
D3DRS_POINTSCALE_B, 0,
D3DRS_POINTSCALE_C, 0,
D3DRS_MULTISAMPLEANTIALIAS, TRUE,
D3DRS_MULTISAMPLEMASK, 0xffffffff,
D3DRS_PATCHEDGESTYLE, D3DPATCHEDGE_DISCRETE,
D3DRS_POINTSIZE_MAX, 1,
D3DRS_INDEXEDVERTEXBLENDENABLE, FALSE,
D3DRS_TWEENFACTOR, 0,
D3DRS_POSITIONDEGREE, D3DDEGREE_CUBIC,
D3DRS_NORMALDEGREE, D3DDEGREE_LINEAR,
D3DRS_MINTESSELLATIONLEVEL, 1,
D3DRS_MAXTESSELLATIONLEVEL, 1,
D3DRS_ADAPTIVETESS_X, 0,
D3DRS_ADAPTIVETESS_Y, 0,
D3DRS_ADAPTIVETESS_Z, 1,
D3DRS_ADAPTIVETESS_W, 0,
D3DRS_ENABLEADAPTIVETESSELLATION, FALSE,
D3DRS_ZENABLE, D3DZB_FALSE,
D3DRS_SPECULARENABLE, FALSE,
D3DRS_FILLMODE, D3DFILL_SOLID,
D3DRS_SHADEMODE, D3DSHADE_GOURAUD,
D3DRS_ZWRITEENABLE, TRUE,
D3DRS_ALPHATESTENABLE, FALSE,
D3DRS_LASTPIXEL, TRUE,
D3DRS_SRCBLEND, D3DBLEND_ONE,
D3DRS_DESTBLEND, D3DBLEND_ZERO,
D3DRS_ZFUNC, D3DCMP_LESSEQUAL,
D3DRS_ALPHAREF, 0,
D3DRS_ALPHAFUNC, D3DCMP_ALWAYS,
D3DRS_DITHERENABLE, FALSE,
D3DRS_FOGSTART, 0,
D3DRS_FOGEND, 1,
D3DRS_FOGDENSITY, 1,
D3DRS_ALPHABLENDENABLE, FALSE,
D3DRS_DEPTHBIAS, 0,
D3DRS_STENCILENABLE, FALSE,
D3DRS_STENCILFAIL, D3DSTENCILOP_KEEP,
D3DRS_STENCILZFAIL, D3DSTENCILOP_KEEP,
D3DRS_STENCILPASS, D3DSTENCILOP_KEEP,
D3DRS_STENCILFUNC, D3DCMP_ALWAYS,
D3DRS_STENCILREF, 0,
D3DRS_STENCILMASK, 0xffffffff,
D3DRS_STENCILWRITEMASK, 0xffffffff,
D3DRS_TEXTUREFACTOR, 0xffffffff,
D3DRS_WRAP0, 0,
D3DRS_WRAP1, 0,
D3DRS_WRAP2, 0,
D3DRS_WRAP3, 0,
D3DRS_WRAP4, 0,
D3DRS_WRAP5, 0,
D3DRS_WRAP6, 0,
D3DRS_WRAP7, 0,
D3DRS_WRAP8, 0,
D3DRS_WRAP9, 0,
D3DRS_WRAP10, 0,
D3DRS_WRAP11, 0,
D3DRS_WRAP12, 0,
D3DRS_WRAP13, 0,
D3DRS_WRAP14, 0,
D3DRS_WRAP15, 0,
D3DRS_LOCALVIEWER, TRUE,
D3DRS_EMISSIVEMATERIALSOURCE, D3DMCS_MATERIAL,
D3DRS_AMBIENTMATERIALSOURCE, D3DMCS_MATERIAL,
D3DRS_DIFFUSEMATERIALSOURCE, D3DMCS_COLOR1,
D3DRS_SPECULARMATERIALSOURCE, D3DMCS_COLOR2,
D3DRS_COLORWRITEENABLE, 0x0000000f,
D3DRS_BLENDOP, D3DBLENDOP_ADD,
D3DRS_SCISSORTESTENABLE, FALSE,
D3DRS_SLOPESCALEDEPTHBIAS, 0,
D3DRS_ANTIALIASEDLINEENABLE, FALSE,
D3DRS_TWOSIDEDSTENCILMODE, FALSE,
D3DRS_CCW_STENCILFAIL, D3DSTENCILOP_KEEP,
D3DRS_CCW_STENCILZFAIL, D3DSTENCILOP_KEEP,
D3DRS_CCW_STENCILPASS, D3DSTENCILOP_KEEP,
D3DRS_CCW_STENCILFUNC, D3DCMP_ALWAYS,
D3DRS_COLORWRITEENABLE1, 0x0000000f,
D3DRS_COLORWRITEENABLE2, 0x0000000f,
D3DRS_COLORWRITEENABLE3, 0x0000000f,
D3DRS_BLENDFACTOR, 0xffffffff,
D3DRS_SRGBWRITEENABLE, 0,
D3DRS_SEPARATEALPHABLENDENABLE, FALSE,
D3DRS_SRCBLENDALPHA, D3DBLEND_ONE,
D3DRS_DESTBLENDALPHA, D3DBLEND_ZERO,
D3DRS_BLENDOPALPHA, D3DBLENDOP_ADD
};
static DWORD sSSTable[] =
{
D3DSAMP_ADDRESSU, D3DTADDRESS_WRAP,
D3DSAMP_ADDRESSV, D3DTADDRESS_WRAP,
D3DSAMP_ADDRESSW, D3DTADDRESS_WRAP,
D3DSAMP_BORDERCOLOR, 0x00000000,
D3DSAMP_MAGFILTER, D3DTEXF_POINT,
D3DSAMP_MINFILTER, D3DTEXF_POINT,
D3DSAMP_MIPFILTER, D3DTEXF_NONE,
D3DSAMP_MIPMAPLODBIAS, 0,
D3DSAMP_MAXMIPLEVEL, 0,
D3DSAMP_MAXANISOTROPY, 1,
D3DSAMP_SRGBTEXTURE, 0,
D3DSAMP_ELEMENTINDEX, 0,
D3DSAMP_DMAPOFFSET, 0
};
// TextureStageState
for ( int i = 0; i < 8; ++i )
{
int nCount = sizeof( sTSSTable )/( 2*sizeof( DWORD ) );
for ( int j = 0; j < nCount; ++j )
{
StateValue_s sSV;
sSV.Default = sSV.Value = sTSSTable[ 2*j + 1 ];
n_TextureStageState[i].insert( StatePair_t( sTSSTable[ 2*j + 0 ], sSV ) );
}
}
// RenderStates
int nCount = sizeof( sRSTable )/( 2*sizeof( DWORD ) );
for ( int j = 0; j < nCount; ++j )
{
StateValue_s sSV;
sSV.Default = sSV.Value = sRSTable[ 2*j + 1 ];
n_RenderStatesMap.insert( StatePair_t( sRSTable[ 2*j + 0 ], sSV ) );
}
// SamplerState
for ( int i = 0; i < 8; ++i )
{
int nCount = sizeof( sSSTable )/( 2*sizeof( DWORD ) );
for ( int j = 0; j < nCount; ++j )
{
StateValue_s sSV;
sSV.Default = sSV.Value = sSSTable[ 2*j + 1 ];
n_SamplerState[i].insert( StatePair_t( sSSTable[ 2*j + 0 ], sSV ) );
}
}
// Textures
ZeroMemory( n_Texture, sizeof( n_Texture ) );
}
void DXDevice_n::RestoreStates()
{
// TextureStageState
{
for ( int i = 0; i < 8; ++i )
{
StateSetIter_t iterChanged = n_ChangedTextureStageStatesSet[i].begin();
while( iterChanged != n_ChangedTextureStageStatesSet[i].end() )
{
DWORD dwChangedState = *iterChanged;
StateMapIter_t iter = n_TextureStageState[i].find( dwChangedState );
assert( iter != n_TextureStageState[i].end() );
if ( iter != n_TextureStageState[i].end() )
{
StateValue_s &sSV = iter->second;
sSV.Value = sSV.Default;
g_pd3dDevice->SetTextureStageState( i, (D3DTEXTURESTAGESTATETYPE)dwChangedState, sSV.Default );
}
++iterChanged;
}
}
}
// RenderStates
{
StateSetIter_t iterChanged = n_ChangedRenderStatesSet.begin();
while( iterChanged != n_ChangedRenderStatesSet.end() )
{
DWORD dwChangedState = *iterChanged;
StateMapIter_t iter = n_RenderStatesMap.find( dwChangedState );
assert( iter != n_RenderStatesMap.end() );
if ( iter != n_RenderStatesMap.end() )
{
StateValue_s &sSV = iter->second;
sSV.Value = sSV.Default;
g_pd3dDevice->SetRenderState( (D3DRENDERSTATETYPE)dwChangedState, sSV.Default );
}
++iterChanged;
}
n_ChangedRenderStatesSet.clear();
}
// sampler states
// ...
}
HRESULT DXDevice_n::SetTextureStageState(
DWORD Stage,
D3DTEXTURESTAGESTATETYPE Type,
DWORD Value )
{
assert( Stage >= 0 && Stage <= 7 );
if ( Stage < 0 || Stage > 7 ) return E_FAIL;
StateMapIter_t iter = n_TextureStageState[ Stage ].find( Type );
assert( iter != n_TextureStageState[ Stage ].end() );
if ( iter == n_TextureStageState[ Stage ].end() ) return E_FAIL;
StateValue_s &sSV = iter->second;
if ( sSV.Value != Value )
{
sSV.Value = Value;
return g_pd3dDevice->SetTextureStageState( Stage, Type, Value );
}
return S_OK;
}
HRESULT DXDevice_n::SetRenderState(
D3DRENDERSTATETYPE State,
DWORD Value )
{
StateMapIter_t iter = n_RenderStatesMap.find( State );
if ( iter != n_RenderStatesMap.end() )
{
StateValue_s &sSV = iter->second;
if ( sSV.Value != Value )
{
sSV.Value = Value;
}
else
{
return S_OK;
}
}
return g_pd3dDevice->SetRenderState( State, Value );
}
HRESULT DXDevice_n::SetSamplerState(
DWORD Sampler,
D3DSAMPLERSTATETYPE Type,
DWORD Value )
{
if ( Sampler >= 0 && Sampler <= 7 )
{
// ....
}
// ...
}
HRESULT DXDevice_n::SetTexture(
DWORD Sampler,
LPDIRECT3DBASETEXTURE9 pTexture )
{
if ( Sampler >= 0 && Sampler <= 7 )
{
if ( n_Texture[Sampler] == pTexture )
{
return S_OK;
}
n_Texture[Sampler] = pTexture;
}
return g_pd3dDevice->SetTexture( Sampler, pTexture );
}