Browse Source

Add note of Direct3D9 bool shader constants possibly having no effect.
Add support for Color shader parameters inside a Variant (same as Vector4.)
Parse bool shader parameters in Material & RenderPath.

Lasse Öörni 12 years ago
parent
commit
dcb39bf810

+ 4 - 8
Source/Engine/Graphics/Direct3D9/D3D9Graphics.cpp

@@ -1034,21 +1034,17 @@ void Graphics::SetShaderParameter(StringHash param, float value)
 
 
 void Graphics::SetShaderParameter(StringHash param, bool value)
 void Graphics::SetShaderParameter(StringHash param, bool value)
 {
 {
+    /// \todo Bool constants possibly have no effect on Direct3D9
     HashMap<StringHash, ShaderParameter>::Iterator i = shaderParameters_.Find(param);
     HashMap<StringHash, ShaderParameter>::Iterator i = shaderParameters_.Find(param);
     if (i == shaderParameters_.End() || i->second_.register_ >= MAX_CONSTANT_REGISTERS)
     if (i == shaderParameters_.End() || i->second_.register_ >= MAX_CONSTANT_REGISTERS)
         return;
         return;
 
 
-    BOOL data[4];
-
-    data[0] = value;
-    data[1] = false;
-    data[2] = false;
-    data[3] = false;
+    BOOL data = value;
 
 
     if (i->second_.type_ == VS)
     if (i->second_.type_ == VS)
-        impl_->device_->SetVertexShaderConstantB(i->second_.register_, &data[0], 1);
+        impl_->device_->SetVertexShaderConstantB(i->second_.register_, &data, 1);
     else
     else
-        impl_->device_->SetPixelShaderConstantB(i->second_.register_, &data[0], 1);
+        impl_->device_->SetPixelShaderConstantB(i->second_.register_, &data, 1);
 }
 }
 
 
 void Graphics::SetShaderParameter(StringHash param, const Color& color)
 void Graphics::SetShaderParameter(StringHash param, const Color& color)

+ 10 - 3
Source/Engine/Graphics/Material.cpp

@@ -218,9 +218,7 @@ bool Material::Load(const XMLElement& source)
     while (parameterElem)
     while (parameterElem)
     {
     {
         String name = parameterElem.GetAttribute("name");
         String name = parameterElem.GetAttribute("name");
-        Variant value = parameterElem.GetVectorVariant("value");
-        SetShaderParameter(name, value);
-        
+        SetShaderParameter(name, ParseShaderParameterValue(parameterElem.GetAttribute("value")));
         parameterElem = parameterElem.GetNext("parameter");
         parameterElem = parameterElem.GetNext("parameter");
     }
     }
     
     
@@ -477,6 +475,15 @@ String Material::GetTextureUnitName(TextureUnit unit)
     return textureUnitNames[unit];
     return textureUnitNames[unit];
 }
 }
 
 
+Variant Material::ParseShaderParameterValue(const String& value)
+{
+    String valueTrimmed = value.Trimmed();
+    if (valueTrimmed.Length() && IsAlpha(valueTrimmed[0]))
+        return Variant(ToBool(valueTrimmed));
+    else
+        return ToVectorVariant(valueTrimmed);
+}
+
 void Material::CheckOcclusion()
 void Material::CheckOcclusion()
 {
 {
     // Determine occlusion by checking the base pass of each technique
     // Determine occlusion by checking the base pass of each technique

+ 2 - 0
Source/Engine/Graphics/Material.h

@@ -147,6 +147,8 @@ public:
     
     
     /// Return name for texture unit.
     /// Return name for texture unit.
     static String GetTextureUnitName(TextureUnit unit);
     static String GetTextureUnitName(TextureUnit unit);
+    /// Parse a shader parameter value from a string. Retunrs either a bool, a float, or a 2 to 4-component vector.
+    static Variant ParseShaderParameterValue(const String& value);
     
     
 private:
 private:
     /// Re-evaluate occlusion rendering.
     /// Re-evaluate occlusion rendering.

+ 5 - 1
Source/Engine/Graphics/OpenGL/OGLGraphics.cpp

@@ -1246,7 +1246,11 @@ void Graphics::SetShaderParameter(StringHash param, const Variant& value)
     case VAR_VECTOR4:
     case VAR_VECTOR4:
         SetShaderParameter(param, value.GetVector4());
         SetShaderParameter(param, value.GetVector4());
         break;
         break;
-        
+
+    case VAR_COLOR:
+        SetShaderParameter(param, value.GetColor());
+        break;
+
     default:
     default:
         // Unsupported parameter type, do nothing
         // Unsupported parameter type, do nothing
         break;
         break;

+ 1 - 1
Source/Engine/Graphics/OpenGL/OGLGraphics.h

@@ -142,7 +142,7 @@ public:
     void SetShaderParameter(StringHash param, const Vector4& vector);
     void SetShaderParameter(StringHash param, const Vector4& vector);
     /// Set shader 4x3 matrix constant.
     /// Set shader 4x3 matrix constant.
     void SetShaderParameter(StringHash param, const Matrix3x4& matrix);
     void SetShaderParameter(StringHash param, const Matrix3x4& matrix);
-    /// Set shader constant from a variant. Supported variant types: bool, float, vector2, vector3, vector4.
+    /// Set shader constant from a variant. Supported variant types: bool, float, vector2, vector3, vector4, color.
     void SetShaderParameter(StringHash param, const Variant& value);
     void SetShaderParameter(StringHash param, const Variant& value);
     /// Check whether a shader parameter group needs update. Does not actually check whether parameters exist in the shaders.
     /// Check whether a shader parameter group needs update. Does not actually check whether parameters exist in the shaders.
     bool NeedParameterUpdate(ShaderParameterGroup group, const void* source);
     bool NeedParameterUpdate(ShaderParameterGroup group, const void* source);

+ 2 - 3
Source/Engine/Graphics/RenderPath.cpp

@@ -22,6 +22,7 @@
 
 
 #include "Precompiled.h"
 #include "Precompiled.h"
 #include "Graphics.h"
 #include "Graphics.h"
+#include "Material.h"
 #include "RenderPath.h"
 #include "RenderPath.h"
 #include "StringUtils.h"
 #include "StringUtils.h"
 #include "XMLFile.h"
 #include "XMLFile.h"
@@ -146,9 +147,7 @@ void RenderPathCommand::Load(const XMLElement& element)
             while (parameterElem)
             while (parameterElem)
             {
             {
                 String name = parameterElem.GetAttribute("name");
                 String name = parameterElem.GetAttribute("name");
-                Variant value = parameterElem.GetVectorVariant("value");
-                shaderParameters_[name] = value;
-                
+                shaderParameters_[name] = Material::ParseShaderParameterValue(parameterElem.GetAttribute("value"));
                 parameterElem = parameterElem.GetNext("parameter");
                 parameterElem = parameterElem.GetNext("parameter");
             }
             }
         }
         }

+ 2 - 2
Source/Tools/ShaderCompiler/ShaderCompiler.cpp

@@ -503,8 +503,8 @@ void CompileVariation(CompiledVariation* variation)
             
             
             if (isSampler)
             if (isSampler)
             {
             {
-                // Skip if it's a G-buffer sampler
-                if (!name.Contains("Buffer"))
+                // Skip if it's a G-buffer sampler, which are aliases for the standard texture units
+                if (name != "AlbedoBuffer" && name != "NormalBuffer" && name != "DepthBuffer" && name != "LightBuffer")
                 {
                 {
                     Parameter newTextureUnit(name, reg, 1);
                     Parameter newTextureUnit(name, reg, 1);
                     variation->textureUnits_.Push(newTextureUnit);
                     variation->textureUnits_.Push(newTextureUnit);