- #include "StdAfx.h"
- #include "StateManager.h"
- //#define StateManager_Assert(a) if (!(a)) puts("assert"#a)
- #define StateManager_Assert(a) assert(a)
- struct SLightData
- {
- enum
- {
- LIGHT_NUM = 8,
- };
- D3DLIGHT9 m_akD3DLight[LIGHT_NUM];
- } m_kLightData;
- void CStateManager::SetLight(DWORD index, CONST D3DLIGHT9* pLight)
- {
- assert(index<SLightData::LIGHT_NUM);
- m_kLightData.m_akD3DLight[index]=*pLight;
- m_lpD3DDev->SetLight(index, pLight);
- }
- void CStateManager::GetLight(DWORD index, D3DLIGHT9* pLight)
- {
- assert(index<8);
- *pLight=m_kLightData.m_akD3DLight[index];
- }
- bool CStateManager::BeginScene()
- {
- m_bScene=true;
- D3DXMATRIX m4Proj;
- D3DXMATRIX m4View;
- D3DXMATRIX m4World;
- GetTransform(D3DTS_WORLD, &m4World);
- GetTransform(D3DTS_PROJECTION, &m4Proj);
- GetTransform(D3DTS_VIEW, &m4View);
- SetTransform(D3DTS_WORLD, &m4World);
- SetTransform(D3DTS_PROJECTION, &m4Proj);
- SetTransform(D3DTS_VIEW, &m4View);
- if (FAILED(m_lpD3DDev->BeginScene()))
- return false;
- return true;
- }
- void CStateManager::EndScene()
- {
- m_lpD3DDev->EndScene();
- m_bScene=false;
- }
- CStateManager::CStateManager(LPDIRECT3DDEVICE9 lpDevice) : m_lpD3DDev(NULL)
- {
- m_bScene = false;
- m_dwBestMinFilter = D3DTEXF_LINEAR;
- m_dwBestMagFilter = D3DTEXF_LINEAR;
- SetDevice(lpDevice);
- }
- CStateManager::~CStateManager()
- {
- if (m_lpD3DDev)
- {
- m_lpD3DDev->Release();
- m_lpD3DDev = NULL;
- }
- }
- void CStateManager::SetDevice(LPDIRECT3DDEVICE9 lpDevice)
- {
- StateManager_Assert(lpDevice);
- lpDevice->AddRef();
- if (m_lpD3DDev)
- {
- m_lpD3DDev->Release();
- m_lpD3DDev = NULL;
- }
- m_lpD3DDev = lpDevice;
- D3DCAPS9 d3dCaps;
- m_lpD3DDev->GetDeviceCaps(&d3dCaps);
- if (d3dCaps.TextureFilterCaps & D3DPTFILTERCAPS_MAGFANISOTROPIC)
- m_dwBestMagFilter = D3DTEXF_ANISOTROPIC;
- else
- m_dwBestMagFilter = D3DTEXF_LINEAR;
- if (d3dCaps.TextureFilterCaps & D3DPTFILTERCAPS_MINFANISOTROPIC)
- m_dwBestMinFilter = D3DTEXF_ANISOTROPIC;
- else
- m_dwBestMinFilter = D3DTEXF_LINEAR;
- DWORD dwMax = d3dCaps.MaxAnisotropy;
- dwMax = dwMax < 4 ? dwMax : 4;
- for (int i = 0; i < 8; ++i)
- m_lpD3DDev->SetSamplerState(i, D3DSAMP_MAXANISOTROPY, dwMax);
- SetDefaultState();
- }
- void CStateManager::SetBestFiltering(DWORD dwStage)
- {
- SetSamplerState(dwStage, D3DSAMP_MINFILTER, m_dwBestMinFilter);
- SetSamplerState(dwStage, D3DSAMP_MAGFILTER, m_dwBestMagFilter);
- SetSamplerState(dwStage, D3DSAMP_MIPFILTER, D3DTEXF_LINEAR);
- }
- void CStateManager::Restore()
- {
- int i, j;
- m_bForce = true;
- for (i = 0; i < STATEMANAGER_MAX_RENDERSTATES; ++i)
- SetRenderState(D3DRENDERSTATETYPE(i), m_CurrentState.m_RenderStates[i]);
- for (i = 0; i < STATEMANAGER_MAX_STAGES; ++i)
- for (j = 0; j < STATEMANAGER_MAX_TEXTURESTATES; ++j)
- {
- SetTextureStageState(i, D3DTEXTURESTAGESTATETYPE(j), m_CurrentState.m_TextureStates[i][j]);
- SetTextureStageState(i, D3DTEXTURESTAGESTATETYPE(j), m_CurrentState.m_SamplerStates[i][j]);
- }
- for (i = 0; i < STATEMANAGER_MAX_STAGES; ++i)
- SetTexture(i, m_CurrentState.m_Textures[i]);
- m_bForce = false;
- }
- void CStateManager::SetDefaultState()
- {
- m_CurrentState.ResetState();
- m_CopyState.ResetState();
- m_ChipState.ResetState();
- m_bScene = false;
- m_bForce = true;
- D3DXMATRIX Identity;
- D3DXMatrixIdentity(&Identity);
- SetTransform(D3DTS_WORLD, &Identity);
- SetTransform(D3DTS_VIEW, &Identity);
- SetTransform(D3DTS_PROJECTION, &Identity);
- D3DMATERIAL9 DefaultMat;
- ZeroMemory(&DefaultMat, sizeof(D3DMATERIAL9));
- DefaultMat.Diffuse.r = 1.0f;
- DefaultMat.Diffuse.g = 1.0f;
- DefaultMat.Diffuse.b = 1.0f;
- DefaultMat.Diffuse.a = 1.0f;
- DefaultMat.Ambient.r = 1.0f;
- DefaultMat.Ambient.g = 1.0f;
- DefaultMat.Ambient.b = 1.0f;
- DefaultMat.Ambient.a = 1.0f;
- DefaultMat.Emissive.r = 0.0f;
- DefaultMat.Emissive.g = 0.0f;
- DefaultMat.Emissive.b = 0.0f;
- DefaultMat.Emissive.a = 0.0f;
- DefaultMat.Specular.r = 0.0f;
- DefaultMat.Specular.g = 0.0f;
- DefaultMat.Specular.b = 0.0f;
- DefaultMat.Specular.a = 0.0f;
- DefaultMat.Power = 0.0f;
- SetMaterial(&DefaultMat);
- SetRenderState(D3DRS_DIFFUSEMATERIALSOURCE, D3DMCS_MATERIAL);
- SetRenderState(D3DRS_SPECULARMATERIALSOURCE, D3DMCS_MATERIAL);
- SetRenderState(D3DRS_AMBIENTMATERIALSOURCE, D3DMCS_MATERIAL);
- SetRenderState(D3DRS_EMISSIVEMATERIALSOURCE, D3DMCS_MATERIAL);
- SetRenderState(D3DRS_LASTPIXEL, FALSE);
- SetRenderState(D3DRS_ALPHAREF, 1);
- SetRenderState(D3DRS_ALPHAFUNC, D3DCMP_GREATEREQUAL);
- SetRenderState(D3DRS_FOGSTART, 0);
- SetRenderState(D3DRS_FOGEND, 0);
- SetRenderState(D3DRS_FOGDENSITY, 0);
- SetRenderState(D3DRS_STENCILWRITEMASK, 0xFFFFFFFF);
- SetRenderState(D3DRS_AMBIENT, 0x00000000);
- SetRenderState(D3DRS_LOCALVIEWER, FALSE);
- SetRenderState(D3DRS_NORMALIZENORMALS, FALSE);
- SetRenderState(D3DRS_VERTEXBLEND, D3DVBF_DISABLE);
- SetRenderState(D3DRS_CLIPPLANEENABLE, 0);
- SaveVertexProcessing(FALSE);
- SetRenderState(D3DRS_MULTISAMPLEANTIALIAS, FALSE);
- SetRenderState(D3DRS_MULTISAMPLEMASK, 0xFFFFFFFF);
- SetRenderState(D3DRS_INDEXEDVERTEXBLENDENABLE, FALSE);
- SetRenderState(D3DRS_COLORWRITEENABLE, 0xFFFFFFFF);
- SetRenderState(D3DRS_FILLMODE, D3DFILL_SOLID);
- SetRenderState(D3DRS_SHADEMODE, D3DSHADE_GOURAUD);
- SetRenderState(D3DRS_CULLMODE, D3DCULL_CW);
- SetRenderState(D3DRS_ALPHABLENDENABLE, FALSE);
- SetRenderState(D3DRS_BLENDOP, D3DBLENDOP_ADD);
- SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA);
- SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA);
- SetRenderState(D3DRS_FOGENABLE, FALSE);
- SetRenderState(D3DRS_FOGCOLOR, 0xFF000000);
- SetRenderState(D3DRS_FOGTABLEMODE, D3DFOG_NONE);
- SetRenderState(D3DRS_FOGVERTEXMODE, D3DFOG_LINEAR);
- SetRenderState(D3DRS_RANGEFOGENABLE, FALSE);
- SetRenderState(D3DRS_ZENABLE, TRUE);
- SetRenderState(D3DRS_ZFUNC, D3DCMP_LESSEQUAL);
- SetRenderState(D3DRS_ZWRITEENABLE, TRUE);
- SetRenderState(D3DRS_DITHERENABLE, TRUE);
- SetRenderState(D3DRS_STENCILENABLE, FALSE);
- SetRenderState(D3DRS_ALPHATESTENABLE, FALSE);
- SetRenderState(D3DRS_CLIPPING, TRUE);
- SetRenderState(D3DRS_LIGHTING, FALSE);
- SetRenderState(D3DRS_SPECULARENABLE, FALSE);
- SetRenderState(D3DRS_COLORVERTEX, FALSE);
- SetRenderState(D3DRS_WRAP0, 0);
- SetRenderState(D3DRS_WRAP1, 0);
- SetRenderState(D3DRS_WRAP2, 0);
- SetRenderState(D3DRS_WRAP3, 0);
- SetRenderState(D3DRS_WRAP4, 0);
- SetRenderState(D3DRS_WRAP5, 0);
- SetRenderState(D3DRS_WRAP6, 0);
- SetRenderState(D3DRS_WRAP7, 0);
- SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_MODULATE);
- SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TEXTURE);
- SetTextureStageState(0, D3DTSS_COLORARG2, D3DTA_CURRENT);
- SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE);
- SetTextureStageState(0, D3DTSS_ALPHAARG2, D3DTA_CURRENT);
- SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1);
- SetTextureStageState(1, D3DTSS_COLOROP, D3DTOP_DISABLE);
- SetTextureStageState(1, D3DTSS_COLORARG1, D3DTA_TEXTURE);
- SetTextureStageState(1, D3DTSS_COLORARG2, D3DTA_DIFFUSE);
- SetTextureStageState(1, D3DTSS_ALPHAOP, D3DTOP_DISABLE);
- SetTextureStageState(1, D3DTSS_ALPHAARG1, D3DTA_TEXTURE);
- SetTextureStageState(1, D3DTSS_ALPHAARG2, D3DTA_DIFFUSE);
- SetTextureStageState(2, D3DTSS_COLOROP, D3DTOP_DISABLE);
- SetTextureStageState(2, D3DTSS_COLORARG1, D3DTA_TEXTURE);
- SetTextureStageState(2, D3DTSS_COLORARG2, D3DTA_DIFFUSE);
- SetTextureStageState(2, D3DTSS_ALPHAOP, D3DTOP_DISABLE);
- SetTextureStageState(2, D3DTSS_ALPHAARG1, D3DTA_TEXTURE);
- SetTextureStageState(2, D3DTSS_ALPHAARG2, D3DTA_DIFFUSE);
- SetTextureStageState(3, D3DTSS_COLOROP, D3DTOP_DISABLE);
- SetTextureStageState(3, D3DTSS_COLORARG1, D3DTA_TEXTURE);
- SetTextureStageState(3, D3DTSS_COLORARG2, D3DTA_DIFFUSE);
- SetTextureStageState(3, D3DTSS_ALPHAOP, D3DTOP_DISABLE);
- SetTextureStageState(3, D3DTSS_ALPHAARG1, D3DTA_TEXTURE);
- SetTextureStageState(3, D3DTSS_ALPHAARG2, D3DTA_DIFFUSE);
- SetTextureStageState(4, D3DTSS_COLOROP, D3DTOP_DISABLE);
- SetTextureStageState(4, D3DTSS_COLORARG1, D3DTA_TEXTURE);
- SetTextureStageState(4, D3DTSS_COLORARG2, D3DTA_DIFFUSE);
- SetTextureStageState(4, D3DTSS_ALPHAOP, D3DTOP_DISABLE);
- SetTextureStageState(4, D3DTSS_ALPHAARG1, D3DTA_TEXTURE);
- SetTextureStageState(4, D3DTSS_ALPHAARG2, D3DTA_DIFFUSE);
- SetTextureStageState(5, D3DTSS_COLOROP, D3DTOP_DISABLE);
- SetTextureStageState(5, D3DTSS_COLORARG1, D3DTA_TEXTURE);
- SetTextureStageState(5, D3DTSS_COLORARG2, D3DTA_DIFFUSE);
- SetTextureStageState(5, D3DTSS_ALPHAOP, D3DTOP_DISABLE);
- SetTextureStageState(5, D3DTSS_ALPHAARG1, D3DTA_TEXTURE);
- SetTextureStageState(5, D3DTSS_ALPHAARG2, D3DTA_DIFFUSE);
- SetTextureStageState(6, D3DTSS_COLOROP, D3DTOP_DISABLE);
- SetTextureStageState(6, D3DTSS_COLORARG1, D3DTA_TEXTURE);
- SetTextureStageState(6, D3DTSS_COLORARG2, D3DTA_DIFFUSE);
- SetTextureStageState(6, D3DTSS_ALPHAOP, D3DTOP_DISABLE);
- SetTextureStageState(6, D3DTSS_ALPHAARG1, D3DTA_TEXTURE);
- SetTextureStageState(6, D3DTSS_ALPHAARG2, D3DTA_DIFFUSE);
- SetTextureStageState(7, D3DTSS_COLOROP, D3DTOP_DISABLE);
- SetTextureStageState(7, D3DTSS_COLORARG1, D3DTA_TEXTURE);
- SetTextureStageState(7, D3DTSS_COLORARG2, D3DTA_DIFFUSE);
- SetTextureStageState(7, D3DTSS_ALPHAOP, D3DTOP_DISABLE);
- SetTextureStageState(7, D3DTSS_ALPHAARG1, D3DTA_TEXTURE);
- SetTextureStageState(7, D3DTSS_ALPHAARG2, D3DTA_DIFFUSE);
- SetTextureStageState(0, D3DTSS_TEXCOORDINDEX, 0);
- SetTextureStageState(1, D3DTSS_TEXCOORDINDEX, 1);
- SetTextureStageState(2, D3DTSS_TEXCOORDINDEX, 2);
- SetTextureStageState(3, D3DTSS_TEXCOORDINDEX, 3);
- SetTextureStageState(4, D3DTSS_TEXCOORDINDEX, 4);
- SetTextureStageState(5, D3DTSS_TEXCOORDINDEX, 5);
- SetTextureStageState(6, D3DTSS_TEXCOORDINDEX, 6);
- SetTextureStageState(7, D3DTSS_TEXCOORDINDEX, 7);
- SetSamplerState(0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR);
- SetSamplerState(0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR);
- SetSamplerState(0, D3DSAMP_MIPFILTER, D3DTEXF_LINEAR);
- SetSamplerState(1, D3DSAMP_MINFILTER, D3DTEXF_LINEAR);
- SetSamplerState(1, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR);
- SetSamplerState(1, D3DSAMP_MIPFILTER, D3DTEXF_LINEAR);
- SetSamplerState(2, D3DSAMP_MINFILTER, D3DTEXF_LINEAR);
- SetSamplerState(2, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR);
- SetSamplerState(2, D3DSAMP_MIPFILTER, D3DTEXF_LINEAR);
- SetSamplerState(3, D3DSAMP_MINFILTER, D3DTEXF_LINEAR);
- SetSamplerState(3, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR);
- SetSamplerState(3, D3DSAMP_MIPFILTER, D3DTEXF_LINEAR);
- SetSamplerState(4, D3DSAMP_MINFILTER, D3DTEXF_LINEAR);
- SetSamplerState(4, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR);
- SetSamplerState(4, D3DSAMP_MIPFILTER, D3DTEXF_LINEAR);
- SetSamplerState(5, D3DSAMP_MINFILTER, D3DTEXF_LINEAR);
- SetSamplerState(5, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR);
- SetSamplerState(5, D3DSAMP_MIPFILTER, D3DTEXF_LINEAR);
- SetSamplerState(6, D3DSAMP_MINFILTER, D3DTEXF_LINEAR);
- SetSamplerState(6, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR);
- SetSamplerState(6, D3DSAMP_MIPFILTER, D3DTEXF_LINEAR);
- SetSamplerState(7, D3DSAMP_MINFILTER, D3DTEXF_LINEAR);
- SetSamplerState(7, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR);
- SetSamplerState(7, D3DSAMP_MIPFILTER, D3DTEXF_LINEAR);
- SetSamplerState(0, D3DSAMP_ADDRESSU, D3DTADDRESS_WRAP);
- SetSamplerState(0, D3DSAMP_ADDRESSV, D3DTADDRESS_WRAP);
- SetSamplerState(1, D3DSAMP_ADDRESSU, D3DTADDRESS_WRAP);
- SetSamplerState(1, D3DSAMP_ADDRESSV, D3DTADDRESS_WRAP);
- SetSamplerState(2, D3DSAMP_ADDRESSU, D3DTADDRESS_WRAP);
- SetSamplerState(2, D3DSAMP_ADDRESSV, D3DTADDRESS_WRAP);
- SetSamplerState(3, D3DSAMP_ADDRESSU, D3DTADDRESS_WRAP);
- SetSamplerState(3, D3DSAMP_ADDRESSV, D3DTADDRESS_WRAP);
- SetSamplerState(4, D3DSAMP_ADDRESSU, D3DTADDRESS_WRAP);
- SetSamplerState(4, D3DSAMP_ADDRESSV, D3DTADDRESS_WRAP);
- SetSamplerState(5, D3DSAMP_ADDRESSU, D3DTADDRESS_WRAP);
- SetSamplerState(5, D3DSAMP_ADDRESSV, D3DTADDRESS_WRAP);
- SetSamplerState(6, D3DSAMP_ADDRESSU, D3DTADDRESS_WRAP);
- SetSamplerState(6, D3DSAMP_ADDRESSV, D3DTADDRESS_WRAP);
- SetSamplerState(7, D3DSAMP_ADDRESSU, D3DTADDRESS_WRAP);
- SetSamplerState(7, D3DSAMP_ADDRESSV, D3DTADDRESS_WRAP);
- SetTextureStageState(0, D3DTSS_TEXTURETRANSFORMFLAGS, 0);
- SetTextureStageState(1, D3DTSS_TEXTURETRANSFORMFLAGS, 0);
- SetTextureStageState(2, D3DTSS_TEXTURETRANSFORMFLAGS, 0);
- SetTextureStageState(3, D3DTSS_TEXTURETRANSFORMFLAGS, 0);
- SetTextureStageState(4, D3DTSS_TEXTURETRANSFORMFLAGS, 0);
- SetTextureStageState(5, D3DTSS_TEXTURETRANSFORMFLAGS, 0);
- SetTextureStageState(6, D3DTSS_TEXTURETRANSFORMFLAGS, 0);
- SetTextureStageState(7, D3DTSS_TEXTURETRANSFORMFLAGS, 0);
- SetTexture(0, NULL);
- SetTexture(1, NULL);
- SetTexture(2, NULL);
- SetTexture(3, NULL);
- SetTexture(4, NULL);
- SetTexture(5, NULL);
- SetTexture(6, NULL);
- SetTexture(7, NULL);
- SetPixelShader(0);
- SetFVF(D3DFVF_XYZ);
- D3DXVECTOR4 av4Null[STATEMANAGER_MAX_VCONSTANTS];
- memset(av4Null, 0, sizeof(av4Null));
- SetVertexShaderConstant(0, av4Null, STATEMANAGER_MAX_VCONSTANTS);
- SetPixelShaderConstant(0, av4Null, STATEMANAGER_MAX_PCONSTANTS);
- m_bForce = false;
- #ifdef _DEBUG
- int i, j;
- for (i = 0; i < STATEMANAGER_MAX_RENDERSTATES; i++)
- m_bRenderStateSavingFlag[i] = FALSE;
- for (j = 0; j < STATEMANAGER_MAX_TRANSFORMSTATES; j++)
- m_bTransformSavingFlag[j] = FALSE;
- for (j = 0; j < STATEMANAGER_MAX_STAGES; ++j)
- for (i = 0; i < STATEMANAGER_MAX_TEXTURESTATES; ++i)
- {
- m_bTextureStageStateSavingFlag[j][i] = FALSE;
- m_bSamplerStateSavingFlag[j][i] = FALSE;
- }
- #endif _DEBUG
- }
- // Material
- void CStateManager::SaveMaterial()
- {
- m_CopyState.m_D3DMaterial = m_CurrentState.m_D3DMaterial;
- }
- void CStateManager::SaveMaterial(const D3DMATERIAL9 * pMaterial)
- {
- // Check that we have set this up before, if not, the default is this.
- m_CopyState.m_D3DMaterial = m_CurrentState.m_D3DMaterial;
- SetMaterial(pMaterial);
- }
- void CStateManager::RestoreMaterial()
- {
- SetMaterial(&m_CopyState.m_D3DMaterial);
- }
- void CStateManager::SetMaterial(const D3DMATERIAL9 * pMaterial)
- {
- m_lpD3DDev->SetMaterial(pMaterial);
- m_CurrentState.m_D3DMaterial = *pMaterial;
- }
- void CStateManager::GetMaterial(D3DMATERIAL9 * pMaterial)
- {
- // Set the renderstate and remember it.
- *pMaterial = m_CurrentState.m_D3DMaterial;
- }
- // Renderstates
- DWORD CStateManager::GetRenderState(D3DRENDERSTATETYPE Type)
- {
- return m_CurrentState.m_RenderStates[Type];
- }
- void CStateManager::SaveRenderState(D3DRENDERSTATETYPE Type, DWORD dwValue)
- {
- #ifdef _DEBUG
- if (m_bRenderStateSavingFlag[Type])
- {
- Tracef(" CStateManager::SaveRenderState - This render state is already saved [%d, %d]\n", Type, dwValue);
- StateManager_Assert(!" This render state is already saved!");
- }
- m_bRenderStateSavingFlag[Type] = TRUE;
- #endif _DEBUG
- // Check that we have set this up before, if not, the default is this.
- m_CopyState.m_RenderStates[Type] = m_CurrentState.m_RenderStates[Type];
- SetRenderState(Type, dwValue);
- }
- void CStateManager::RestoreRenderState(D3DRENDERSTATETYPE Type)
- {
- #ifdef _DEBUG
- if (!m_bRenderStateSavingFlag[Type])
- {
- Tracef(" CStateManager::SaveRenderState - This render state was not saved [%d, %d]\n", Type);
- StateManager_Assert(!" This render state was not saved!");
- }
- m_bRenderStateSavingFlag[Type] = FALSE;
- #endif _DEBUG
- SetRenderState(Type, m_CopyState.m_RenderStates[Type]);
- }
- void CStateManager::SetRenderState(D3DRENDERSTATETYPE Type, DWORD Value)
- {
- if (m_CurrentState.m_RenderStates[Type] == Value)
- return;
- m_lpD3DDev->SetRenderState(Type, Value);
- m_CurrentState.m_RenderStates[Type] = Value;
- }
- void CStateManager::GetRenderState(D3DRENDERSTATETYPE Type, DWORD * pdwValue)
- {
- *pdwValue = m_CurrentState.m_RenderStates[Type];
- }
- // Textures
- void CStateManager::SaveTexture(DWORD dwStage, LPDIRECT3DBASETEXTURE9 pTexture)
- {
- // Check that we have set this up before, if not, the default is this.
- m_CopyState.m_Textures[dwStage] = m_CurrentState.m_Textures[dwStage];
- SetTexture(dwStage, pTexture);
- }
- void CStateManager::RestoreTexture(DWORD dwStage)
- {
- SetTexture(dwStage, m_CopyState.m_Textures[dwStage]);
- }
- void CStateManager::SetTexture(DWORD dwStage, LPDIRECT3DBASETEXTURE9 pTexture)
- {
- if (pTexture == m_CurrentState.m_Textures[dwStage])
- return;
- m_lpD3DDev->SetTexture(dwStage, pTexture);
- m_CurrentState.m_Textures[dwStage] = pTexture;
- }
- void CStateManager::GetTexture(DWORD dwStage, LPDIRECT3DBASETEXTURE9 * ppTexture)
- {
- *ppTexture = m_CurrentState.m_Textures[dwStage];
- }
- // Texture stage states
- void CStateManager::SaveTextureStageState(DWORD dwStage,D3DTEXTURESTAGESTATETYPE Type, DWORD dwValue)
- {
- // Check that we have set this up before, if not, the default is this.
- #ifdef _DEBUG
- if (m_bTextureStageStateSavingFlag[dwStage][Type])
- {
- Tracef(" CStateManager::SaveTextureStageState - This texture stage state is already saved [%d, %d]\n", dwStage, Type);
- StateManager_Assert(!" This texture stage state is already saved!");
- }
- m_bTextureStageStateSavingFlag[dwStage][Type] = TRUE;
- #endif _DEBUG
- m_CopyState.m_TextureStates[dwStage][Type] = m_CurrentState.m_TextureStates[dwStage][Type];
- SetTextureStageState(dwStage, Type, dwValue);
- }
- void CStateManager::RestoreTextureStageState(DWORD dwStage, D3DTEXTURESTAGESTATETYPE Type)
- {
- #ifdef _DEBUG
- if (!m_bTextureStageStateSavingFlag[dwStage][Type])
- {
- Tracef(" CStateManager::RestoreTextureStageState - This texture stage state was not saved [%d, %d]\n", dwStage, Type);
- StateManager_Assert(!" This texture stage state was not saved!");
- }
- m_bTextureStageStateSavingFlag[dwStage][Type] = FALSE;
- #endif _DEBUG
- SetTextureStageState(dwStage, Type, m_CopyState.m_TextureStates[dwStage][Type]);
- }
- void CStateManager::SetTextureStageState(DWORD dwStage, D3DTEXTURESTAGESTATETYPE Type, DWORD dwValue)
- {
- if (m_CurrentState.m_TextureStates[dwStage][Type] == dwValue)
- return;
- m_lpD3DDev->SetTextureStageState(dwStage, Type, dwValue);
- m_CurrentState.m_TextureStates[dwStage][Type] = dwValue;
- }
- void CStateManager::GetTextureStageState(DWORD dwStage, D3DTEXTURESTAGESTATETYPE Type, DWORD * pdwValue)
- {
- *pdwValue = m_CurrentState.m_TextureStates[dwStage][Type];
- }
- // Sampler states
- void CStateManager::SaveSamplerState(DWORD dwStage, D3DSAMPLERSTATETYPE Type, DWORD dwValue)
- {
- #ifdef _DEBUG
- if (m_bSamplerStateSavingFlag[dwStage][Type])
- {
- Tracef(" CStateManager::SaveTextureStageState - This texture stage state is already saved [%d, %d]\n", dwStage, Type);
- StateManager_Assert(!" This texture stage state is already saved!");
- }
- m_bSamplerStateSavingFlag[dwStage][Type] = TRUE;
- #endif _DEBUG
- m_CopyState.m_SamplerStates[dwStage][Type] = m_CurrentState.m_SamplerStates[dwStage][Type];
- SetSamplerState(dwStage, Type, dwValue);
- }
- void CStateManager::RestoreSamplerState(DWORD dwStage, D3DSAMPLERSTATETYPE Type)
- {
- #ifdef _DEBUG
- if (!m_bSamplerStateSavingFlag[dwStage][Type])
- {
- Tracef(" CStateManager::RestoreTextureStageState - This texture stage state was not saved [%d, %d]\n", dwStage, Type);
- StateManager_Assert(!" This texture stage state was not saved!");
- }
- m_bSamplerStateSavingFlag[dwStage][Type] = FALSE;
- #endif _DEBUG
- SetSamplerState(dwStage, Type, m_CopyState.m_SamplerStates[dwStage][Type]);
- }
- void CStateManager::SetSamplerState(DWORD dwStage, D3DSAMPLERSTATETYPE Type, DWORD dwValue)
- {
- if (m_CurrentState.m_SamplerStates[dwStage][Type] == dwValue)
- return;
- m_lpD3DDev->SetSamplerState(dwStage, Type, dwValue);
- m_CurrentState.m_SamplerStates[dwStage][Type] = dwValue;
- }
- void CStateManager::GetSamplerState(DWORD dwStage, D3DSAMPLERSTATETYPE Type, DWORD * pdwValue)
- {
- *pdwValue = m_CurrentState.m_SamplerStates[dwStage][Type];
- }
- // Vertex Shader
- void CStateManager::SaveVertexShader(LPDIRECT3DVERTEXSHADER9 dwShader)
- {
- m_CopyState.m_dwVertexShader = m_CurrentState.m_dwVertexShader;
- SetVertexShader(dwShader);
- }
- void CStateManager::RestoreVertexShader()
- {
- SetVertexShader(m_CopyState.m_dwVertexShader);
- }
- void CStateManager::SetVertexShader(LPDIRECT3DVERTEXSHADER9 dwShader)
- {
- //if (m_CurrentState.m_dwVertexShader == dwShader)
- // return;
- m_lpD3DDev->SetVertexShader(dwShader);
- m_CurrentState.m_dwVertexShader = dwShader;
- }
- void CStateManager::GetVertexShader(LPDIRECT3DVERTEXSHADER9 * pdwShader)
- {
- *pdwShader = m_CurrentState.m_dwVertexShader;
- }
- // Vertex Processing
- void CStateManager::SaveVertexProcessing(BOOL IsON)
- {
- if (m_CurrentState.m_bVertexProcessing = IsON)
- return;
- m_CopyState.m_bVertexProcessing = m_CurrentState.m_bVertexProcessing;
- m_lpD3DDev->SetSoftwareVertexProcessing(IsON);
- m_CurrentState.m_bVertexProcessing = IsON;
- }
- void CStateManager::RestoreVertexProcessing()
- {
- if (m_CopyState.m_bVertexProcessing = m_CurrentState.m_bVertexProcessing)
- return;
- m_lpD3DDev->SetSoftwareVertexProcessing(m_CopyState.m_bVertexProcessing);
- }
- // Vertex Declaration
- void CStateManager::SaveVertexDeclaration(LPDIRECT3DVERTEXDECLARATION9 dwShader)
- {
- m_CopyState.m_dwVertexDeclaration = m_CurrentState.m_dwVertexDeclaration;
- SetVertexDeclaration(dwShader);
- }
- void CStateManager::RestoreVertexDeclaration()
- {
- SetVertexDeclaration(m_CopyState.m_dwVertexDeclaration);
- }
- void CStateManager::SetVertexDeclaration(LPDIRECT3DVERTEXDECLARATION9 dwShader)
- {
- //if (m_CurrentState.m_dwVertexDeclaration == dwShader)
- // return;
- m_lpD3DDev->SetVertexDeclaration(dwShader);
- m_CurrentState.m_dwVertexDeclaration = dwShader;
- }
- void CStateManager::GetVertexDeclaration(LPDIRECT3DVERTEXDECLARATION9 * pdwShader)
- {
- *pdwShader = m_CurrentState.m_dwVertexDeclaration;
- }
- // FVF
- void CStateManager::SaveFVF(DWORD dwShader)
- {
- m_CopyState.m_dwFVF = m_CurrentState.m_dwFVF;
- SetFVF(dwShader);
- }
- void CStateManager::RestoreFVF()
- {
- SetFVF(m_CopyState.m_dwFVF);
- }
- void CStateManager::SetFVF(DWORD dwShader)
- {
- //if (m_CurrentState.m_dwFVF == dwShader)
- // return;
- m_lpD3DDev->SetFVF(dwShader);
- m_CurrentState.m_dwFVF = dwShader;
- }
- void CStateManager::GetFVF(DWORD * pdwShader)
- {
- *pdwShader = m_CurrentState.m_dwFVF;
- }
- // Pixel Shader
- void CStateManager::SavePixelShader(LPDIRECT3DPIXELSHADER9 dwShader)
- {
- m_CopyState.m_dwPixelShader = m_CurrentState.m_dwPixelShader;
- SetPixelShader(dwShader);
- }
- void CStateManager::RestorePixelShader()
- {
- SetPixelShader(m_CopyState.m_dwPixelShader);
- }
- void CStateManager::SetPixelShader(LPDIRECT3DPIXELSHADER9 dwShader)
- {
- if (m_CurrentState.m_dwPixelShader == dwShader)
- return;
- m_lpD3DDev->SetPixelShader(dwShader);
- m_CurrentState.m_dwPixelShader = dwShader;
- }
- void CStateManager::GetPixelShader(LPDIRECT3DPIXELSHADER9* pdwShader)
- {
- *pdwShader = m_CurrentState.m_dwPixelShader;
- }
- // *** These states are cached, but not protected from multiple sends of the same value.
- // Transform
- void CStateManager::SaveTransform(D3DTRANSFORMSTATETYPE Type, const D3DMATRIX* pMatrix)
- {
- #ifdef _DEBUG
- if (m_bTransformSavingFlag[Type])
- {
- Tracef(" CStateManager::SaveTransform - This transform is already saved [%d]\n", Type);
- StateManager_Assert(!" This trasform is already saved!");
- }
- m_bTransformSavingFlag[Type] = TRUE;
- #endif _DEBUG
- m_CopyState.m_Matrices[Type] = m_CurrentState.m_Matrices[Type];
- SetTransform(Type, (D3DXMATRIX *)pMatrix);
- }
- void CStateManager::RestoreTransform(D3DTRANSFORMSTATETYPE Type)
- {
- #ifdef _DEBUG
- if (!m_bTransformSavingFlag[Type])
- {
- Tracef(" CStateManager::RestoreTransform - This transform was not saved [%d]\n", Type);
- StateManager_Assert(!" This render state was not saved!");
- }
- m_bTransformSavingFlag[Type] = FALSE;
- #endif _DEBUG
- SetTransform(Type, &m_CopyState.m_Matrices[Type]);
- }
- // Don't cache-check the transform. To much to do
- void CStateManager::SetTransform(D3DTRANSFORMSTATETYPE Type, const D3DMATRIX* pMatrix)
- {
- if (m_bScene)
- {
- m_lpD3DDev->SetTransform(Type, pMatrix);
- }
- else
- {
- assert(D3DTS_VIEW==Type || D3DTS_PROJECTION==Type || D3DTS_WORLD==Type);
- }
- m_CurrentState.m_Matrices[Type] = *pMatrix;
- }
- void CStateManager::GetTransform(D3DTRANSFORMSTATETYPE Type, D3DMATRIX * pMatrix)
- {
- *pMatrix = m_CurrentState.m_Matrices[Type];
- }
- // SetVertexShaderConstant
- void CStateManager::SaveVertexShaderConstant(DWORD dwRegister,CONST void* pConstantData,DWORD dwConstantCount)
- {
- DWORD i;
- for (i = 0; i < dwConstantCount; i++)
- {
- StateManager_Assert((dwRegister + i) < STATEMANAGER_MAX_VCONSTANTS);
- m_CopyState.m_VertexShaderConstants[dwRegister + i] = m_CurrentState.m_VertexShaderConstants[dwRegister + i];
- }
- SetVertexShaderConstant(dwRegister, pConstantData, dwConstantCount);
- }
- void CStateManager::RestoreVertexShaderConstant(DWORD dwRegister, DWORD dwConstantCount)
- {
- SetVertexShaderConstant(dwRegister, &m_CopyState.m_VertexShaderConstants[dwRegister], dwConstantCount);
- }
- void CStateManager::SetVertexShaderConstant(DWORD dwRegister,CONST void* pConstantData,DWORD dwConstantCount)
- {
- m_lpD3DDev->SetVertexShaderConstantF(dwRegister, (const float*)pConstantData, dwConstantCount);
- // Set the renderstate and remember it.
- for (DWORD i = 0; i < dwConstantCount; i++)
- {
- StateManager_Assert((dwRegister + i) < STATEMANAGER_MAX_VCONSTANTS);
- m_CurrentState.m_VertexShaderConstants[dwRegister + i] = *(((D3DXVECTOR4*)pConstantData) + i);
- }
- }
- // SetPixelShaderConstant
- void CStateManager::SavePixelShaderConstant(DWORD dwRegister,CONST void* pConstantData,DWORD dwConstantCount)
- {
- DWORD i;
- for (i = 0; i < dwConstantCount; i++)
- {
- StateManager_Assert((dwRegister + i) < STATEMANAGER_MAX_VCONSTANTS);
- m_CopyState.m_PixelShaderConstants[dwRegister + i] = *(((D3DXVECTOR4*)pConstantData) + i);
- }
- SetPixelShaderConstant(dwRegister, pConstantData, dwConstantCount);
- }
- void CStateManager::RestorePixelShaderConstant(DWORD dwRegister, DWORD dwConstantCount)
- {
- SetPixelShaderConstant(dwRegister, &m_CopyState.m_PixelShaderConstants[dwRegister], dwConstantCount);
- }
- void CStateManager::SetPixelShaderConstant(DWORD dwRegister,CONST void* pConstantData,DWORD dwConstantCount)
- {
- m_lpD3DDev->SetVertexShaderConstantF(dwRegister, *(D3DXVECTOR4*)pConstantData, dwConstantCount);
- // Set the renderstate and remember it.
- for (DWORD i = 0; i < dwConstantCount; i++)
- {
- StateManager_Assert((dwRegister + i) < STATEMANAGER_MAX_VCONSTANTS);
- m_CurrentState.m_PixelShaderConstants[dwRegister + i] = *(((D3DXVECTOR4*)pConstantData) + i);
- }
- }
- void CStateManager::SaveStreamSource(UINT StreamNumber, LPDIRECT3DVERTEXBUFFER9 pStreamData,UINT Stride)
- {
- // Check that we have set this up before, if not, the default is this.
- m_CopyState.m_StreamData[StreamNumber] = m_CurrentState.m_StreamData[StreamNumber];
- SetStreamSource(StreamNumber, pStreamData, Stride);
- }
- void CStateManager::RestoreStreamSource(UINT StreamNumber)
- {
- SetStreamSource(StreamNumber,
- m_CopyState.m_StreamData[StreamNumber].m_lpStreamData,
- m_CopyState.m_StreamData[StreamNumber].m_Stride);
- }
- void CStateManager::SetStreamSource(UINT StreamNumber, LPDIRECT3DVERTEXBUFFER9 pStreamData, UINT Stride)
- {
- CStreamData kStreamData(pStreamData, Stride);
- if (m_CurrentState.m_StreamData[StreamNumber] == kStreamData)
- return;
- m_lpD3DDev->SetStreamSource(StreamNumber, pStreamData, 0, Stride);
- m_CurrentState.m_StreamData[StreamNumber] = kStreamData;
- }
- void CStateManager::SaveIndices(LPDIRECT3DINDEXBUFFER9 pIndexData, UINT BaseVertexIndex)
- {
- m_CopyState.m_IndexData = m_CurrentState.m_IndexData;
- SetIndices(pIndexData, BaseVertexIndex);
- }
- void CStateManager::RestoreIndices()
- {
- SetIndices(m_CopyState.m_IndexData.m_lpIndexData, m_CopyState.m_IndexData.m_BaseVertexIndex);
- }
- void CStateManager::SetIndices(LPDIRECT3DINDEXBUFFER9 pIndexData, UINT BaseVertexIndex)
- {
- CIndexData kIndexData(pIndexData, BaseVertexIndex);
- if (m_CurrentState.m_IndexData == kIndexData)
- return;
- m_lpD3DDev->SetIndices(pIndexData);
- m_CurrentState.m_IndexData = kIndexData;
- }
- HRESULT CStateManager::DrawPrimitive(D3DPRIMITIVETYPE PrimitiveType, UINT StartVertex, UINT PrimitiveCount)
- {
- return (m_lpD3DDev->DrawPrimitive(PrimitiveType, StartVertex, PrimitiveCount));
- }
- HRESULT CStateManager::DrawPrimitiveUP(D3DPRIMITIVETYPE PrimitiveType, UINT PrimitiveCount, const void* pVertexStreamZeroData, UINT VertexStreamZeroStride)
- {
- m_CurrentState.m_StreamData[0] = NULL;
- return (m_lpD3DDev->DrawPrimitiveUP(PrimitiveType, PrimitiveCount, pVertexStreamZeroData, VertexStreamZeroStride));
- }
- HRESULT CStateManager::DrawIndexedPrimitive(D3DPRIMITIVETYPE PrimitiveType, UINT minIndex, UINT NumVertices, UINT startIndex, UINT primCount)
- {
- return (m_lpD3DDev->DrawIndexedPrimitive(PrimitiveType, minIndex, 0, NumVertices, startIndex, primCount));
- }
- HRESULT CStateManager::DrawIndexedPrimitiveUP(D3DPRIMITIVETYPE PrimitiveType, UINT MinVertexIndex, UINT NumVertexIndices, UINT PrimitiveCount, CONST void * pIndexData, D3DFORMAT IndexDataFormat, CONST void * pVertexStreamZeroData, UINT VertexStreamZeroStride)
- {
- m_CurrentState.m_IndexData = NULL;
- m_CurrentState.m_StreamData[0] = NULL;
- return (m_lpD3DDev->DrawIndexedPrimitiveUP(PrimitiveType, MinVertexIndex, NumVertexIndices, PrimitiveCount, pIndexData, IndexDataFormat, pVertexStreamZeroData, VertexStreamZeroStride));
- }