Kaynağa Gözat

GFXD3D9Device generic shader support.

rextimmy 9 yıl önce
ebeveyn
işleme
7d82877f4e

+ 56 - 27
Engine/source/gfx/D3D9/gfxD3D9Device.cpp

@@ -33,6 +33,7 @@
 #include "gfx/D3D9/gfxD3D9OcclusionQuery.h"
 #include "gfx/D3D9/gfxD3D9OcclusionQuery.h"
 #include "gfx/D3D9/gfxD3D9Shader.h"
 #include "gfx/D3D9/gfxD3D9Shader.h"
 #include "windowManager/platformWindow.h"
 #include "windowManager/platformWindow.h"
+#include "materials/shaderData.h"
 #ifndef TORQUE_OS_XENON
 #ifndef TORQUE_OS_XENON
 #  include "windowManager/win32/win32Window.h"
 #  include "windowManager/win32/win32Window.h"
 #endif
 #endif
@@ -83,6 +84,9 @@ GFXD3D9Device::GFXD3D9Device( LPDIRECT3D9 d3d, U32 index )
 
 
    mOcclusionQuerySupported = false;
    mOcclusionQuerySupported = false;
 
 
+   for (U32 i = 0; i < GS_COUNT; ++i) 
+      mModelViewProjSC[i] = NULL;
+
    // Set up the Enum translation tables
    // Set up the Enum translation tables
    GFXD3D9EnumTranslate::init();
    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 */ )
 inline void GFXD3D9Device::setupGenericShaders( GenericShaderType type /* = GSColor */ )
 {
 {
-#ifdef WANT_TO_SIMULATE_UI_ON_360
-   if( mGenericShader[GSColor] == NULL )
-   {
-      mGenericShader[GSColor] =           createShader( "shaders/common/genericColorV.hlsl", 
-         "shaders/common/genericColorP.hlsl", 
-         2.f );
+   AssertFatal(type != GSTargetRestore, ""); //not used
 
 
-      mGenericShader[GSModColorTexture] = createShader( "shaders/common/genericModColorTextureV.hlsl", 
-         "shaders/common/genericModColorTextureP.hlsl", 
-         2.f );
-
-      mGenericShader[GSAddColorTexture] = createShader( "shaders/common/genericAddColorTextureV.hlsl", 
-         "shaders/common/genericAddColorTextureP.hlsl", 
-         2.f );
+   if (mGenericShader[GSColor] == NULL)
+   {
+      ShaderData *shaderData;
+
+      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);
+
+      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]);
 }
 }
 
 
 //-----------------------------------------------------------------------------
 //-----------------------------------------------------------------------------

+ 4 - 2
Engine/source/gfx/D3D9/gfxD3D9Device.h

@@ -150,6 +150,10 @@ protected:
    IDirect3DVertexShader9 *mLastVertShader;
    IDirect3DVertexShader9 *mLastVertShader;
    IDirect3DPixelShader9 *mLastPixShader;
    IDirect3DPixelShader9 *mLastPixShader;
 
 
+   GFXShaderRef mGenericShader[GS_COUNT];
+   GFXShaderConstBufferRef mGenericShaderBuffer[GS_COUNT];
+   GFXShaderConstHandle *mModelViewProjSC[GS_COUNT];
+
    S32 mCreateFenceType;
    S32 mCreateFenceType;
 
 
    LPDIRECT3D9       mD3D;        ///< D3D Handle
    LPDIRECT3D9       mD3D;        ///< D3D Handle
@@ -326,8 +330,6 @@ public:
    /// Reset
    /// Reset
    virtual void reset( D3DPRESENT_PARAMETERS &d3dpp ) = 0;
    virtual void reset( D3DPRESENT_PARAMETERS &d3dpp ) = 0;
 
 
-   GFXShaderRef mGenericShader[GS_COUNT];
-
    virtual void setupGenericShaders( GenericShaderType type  = GSColor );
    virtual void setupGenericShaders( GenericShaderType type  = GSColor );
 
 
    // Function only really used on the, however a centralized function for
    // Function only really used on the, however a centralized function for