diff --git a/Engine/source/gfx/D3D9/gfxD3D9Device.cpp b/Engine/source/gfx/D3D9/gfxD3D9Device.cpp index c6610ed14..6c09beedd 100644 --- a/Engine/source/gfx/D3D9/gfxD3D9Device.cpp +++ b/Engine/source/gfx/D3D9/gfxD3D9Device.cpp @@ -33,6 +33,7 @@ #include "gfx/D3D9/gfxD3D9OcclusionQuery.h" #include "gfx/D3D9/gfxD3D9Shader.h" #include "windowManager/platformWindow.h" +#include "materials/shaderData.h" #ifndef TORQUE_OS_XENON # include "windowManager/win32/win32Window.h" #endif @@ -83,6 +84,9 @@ GFXD3D9Device::GFXD3D9Device( LPDIRECT3D9 d3d, U32 index ) mOcclusionQuerySupported = false; + for (U32 i = 0; i < GS_COUNT; ++i) + mModelViewProjSC[i] = NULL; + // Set up the Enum translation tables GFXD3D9EnumTranslate::init(); @@ -139,40 +143,65 @@ GFXD3D9Device::~GFXD3D9Device() } //------------------------------------------------------------------------------ -// setupGenericShaders - This function is totally not needed on PC because there -// is fixed-function support in D3D9 +// setupGenericShaders //------------------------------------------------------------------------------ inline void GFXD3D9Device::setupGenericShaders( GenericShaderType type /* = GSColor */ ) { -#ifdef WANT_TO_SIMULATE_UI_ON_360 - if( mGenericShader[GSColor] == NULL ) + AssertFatal(type != GSTargetRestore, ""); //not used + + if (mGenericShader[GSColor] == NULL) { - mGenericShader[GSColor] = createShader( "shaders/common/genericColorV.hlsl", - "shaders/common/genericColorP.hlsl", - 2.f ); + ShaderData *shaderData; - mGenericShader[GSModColorTexture] = createShader( "shaders/common/genericModColorTextureV.hlsl", - "shaders/common/genericModColorTextureP.hlsl", - 2.f ); + shaderData = new ShaderData(); + shaderData->setField("DXVertexShaderFile", "shaders/common/fixedFunction/colorV.hlsl"); + shaderData->setField("DXPixelShaderFile", "shaders/common/fixedFunction/colorP.hlsl"); + shaderData->setField("pixVersion", "3.0"); + shaderData->registerObject(); + mGenericShader[GSColor] = shaderData->getShader(); + mGenericShaderBuffer[GSColor] = mGenericShader[GSColor]->allocConstBuffer(); + mModelViewProjSC[GSColor] = mGenericShader[GSColor]->getShaderConstHandle("$modelView"); + Sim::getRootGroup()->addObject(shaderData); - mGenericShader[GSAddColorTexture] = createShader( "shaders/common/genericAddColorTextureV.hlsl", - "shaders/common/genericAddColorTextureP.hlsl", - 2.f ); + shaderData = new ShaderData(); + shaderData->setField("DXVertexShaderFile", "shaders/common/fixedFunction/modColorTextureV.hlsl"); + shaderData->setField("DXPixelShaderFile", "shaders/common/fixedFunction/modColorTextureP.hlsl"); + shaderData->setField("pixVersion", "3.0"); + shaderData->registerObject(); + mGenericShader[GSModColorTexture] = shaderData->getShader(); + mGenericShaderBuffer[GSModColorTexture] = mGenericShader[GSModColorTexture]->allocConstBuffer(); + mModelViewProjSC[GSModColorTexture] = mGenericShader[GSModColorTexture]->getShaderConstHandle("$modelView"); + Sim::getRootGroup()->addObject(shaderData); + + shaderData = new ShaderData(); + shaderData->setField("DXVertexShaderFile", "shaders/common/fixedFunction/addColorTextureV.hlsl"); + shaderData->setField("DXPixelShaderFile", "shaders/common/fixedFunction/addColorTextureP.hlsl"); + shaderData->setField("pixVersion", "3.0"); + shaderData->registerObject(); + mGenericShader[GSAddColorTexture] = shaderData->getShader(); + mGenericShaderBuffer[GSAddColorTexture] = mGenericShader[GSAddColorTexture]->allocConstBuffer(); + mModelViewProjSC[GSAddColorTexture] = mGenericShader[GSAddColorTexture]->getShaderConstHandle("$modelView"); + Sim::getRootGroup()->addObject(shaderData); + + shaderData = new ShaderData(); + shaderData->setField("DXVertexShaderFile", "shaders/common/fixedFunction/textureV.hlsl"); + shaderData->setField("DXPixelShaderFile", "shaders/common/fixedFunction/textureP.hlsl"); + shaderData->setField("pixVersion", "3.0"); + shaderData->registerObject(); + mGenericShader[GSTexture] = shaderData->getShader(); + mGenericShaderBuffer[GSTexture] = mGenericShader[GSTexture]->allocConstBuffer(); + mModelViewProjSC[GSTexture] = mGenericShader[GSTexture]->getShaderConstHandle("$modelView"); + Sim::getRootGroup()->addObject(shaderData); + + //Force an update + mViewportDirty = true; } - mGenericShader[type]->process(); + MatrixF tempMatrix = mProjectionMatrix * mViewMatrix * mWorldMatrix[mWorldStackSize]; + mGenericShaderBuffer[type]->setSafe(mModelViewProjSC[type], tempMatrix); - MatrixF world, view, proj; - mWorldMatrix[mWorldStackSize].transposeTo( world ); - mViewMatrix.transposeTo( view ); - mProjectionMatrix.transposeTo( proj ); - - mTempMatrix = world * view * proj; - - setVertexShaderConstF( VC_WORLD_PROJ, (F32 *)&mTempMatrix, 4 ); -#else - disableShaders(); -#endif + setShader(mGenericShader[type]); + setShaderConstBuffer(mGenericShaderBuffer[type]); } //----------------------------------------------------------------------------- diff --git a/Engine/source/gfx/D3D9/gfxD3D9Device.h b/Engine/source/gfx/D3D9/gfxD3D9Device.h index ef1c9be5d..dfb880915 100644 --- a/Engine/source/gfx/D3D9/gfxD3D9Device.h +++ b/Engine/source/gfx/D3D9/gfxD3D9Device.h @@ -150,6 +150,10 @@ protected: IDirect3DVertexShader9 *mLastVertShader; IDirect3DPixelShader9 *mLastPixShader; + GFXShaderRef mGenericShader[GS_COUNT]; + GFXShaderConstBufferRef mGenericShaderBuffer[GS_COUNT]; + GFXShaderConstHandle *mModelViewProjSC[GS_COUNT]; + S32 mCreateFenceType; LPDIRECT3D9 mD3D; ///< D3D Handle @@ -326,8 +330,6 @@ public: /// Reset virtual void reset( D3DPRESENT_PARAMETERS &d3dpp ) = 0; - GFXShaderRef mGenericShader[GS_COUNT]; - virtual void setupGenericShaders( GenericShaderType type = GSColor ); // Function only really used on the, however a centralized function for