Browse Source

Support for bool & int constants in materials on OpenGL & Direct3D11. Added int uniform support to OpenGL. Removed code duplication for setting a Variant shader parameter.

Lasse Öörni 9 years ago
parent
commit
72c2e82ee8

+ 2 - 0
Docs/Reference.dox

@@ -1091,6 +1091,8 @@ These differences need to be observed when using the low-level rendering functio
 
 - Alpha-to-coverage is not supported on Direct3D9.
 
+- Bool and int shader uniforms are not supported on Direct3D9.
+
 OpenGL ES 2.0 has further limitations:
 
 - Of the DXT formats, only DXT1 compressed textures will be uploaded as compressed, and only if the EXT_texture_compression_dxt1 extension is present. Other DXT formats will be uploaded as uncompressed RGBA. ETC1 (Android) and PVRTC (iOS) compressed textures are supported through the .ktx and .pvr file formats.

+ 12 - 55
Source/Urho3D/Graphics/Direct3D11/D3D11Graphics.cpp

@@ -1129,6 +1129,18 @@ void Graphics::SetShaderParameter(StringHash param, float value)
     buffer->SetParameter(i->second_.offset_, sizeof(float), &value);
 }
 
+void Graphics::SetShaderParameter(StringHash param, int value)
+{
+    HashMap<StringHash, ShaderParameter>::Iterator i;
+    if (!impl_->shaderProgram_ || (i = impl_->shaderProgram_->parameters_.Find(param)) == impl_->shaderProgram_->parameters_.End())
+        return;
+
+    ConstantBuffer* buffer = i->second_.bufferPtr_;
+    if (!buffer->IsDirty())
+        impl_->dirtyConstantBuffers_.Push(buffer);
+    buffer->SetParameter(i->second_.offset_, sizeof(int), &value);
+}
+
 void Graphics::SetShaderParameter(StringHash param, bool value)
 {
     HashMap<StringHash, ShaderParameter>::Iterator i;
@@ -1225,61 +1237,6 @@ void Graphics::SetShaderParameter(StringHash param, const Matrix3x4& matrix)
     buffer->SetParameter(i->second_.offset_, sizeof(Matrix3x4), &matrix);
 }
 
-void Graphics::SetShaderParameter(StringHash param, const Variant& value)
-{
-    switch (value.GetType())
-    {
-    case VAR_BOOL:
-        SetShaderParameter(param, value.GetBool());
-        break;
-
-    case VAR_FLOAT:
-    case VAR_DOUBLE:
-        SetShaderParameter(param, value.GetFloat());
-        break;
-
-    case VAR_VECTOR2:
-        SetShaderParameter(param, value.GetVector2());
-        break;
-
-    case VAR_VECTOR3:
-        SetShaderParameter(param, value.GetVector3());
-        break;
-
-    case VAR_VECTOR4:
-        SetShaderParameter(param, value.GetVector4());
-        break;
-
-    case VAR_COLOR:
-        SetShaderParameter(param, value.GetColor());
-        break;
-
-    case VAR_MATRIX3:
-        SetShaderParameter(param, value.GetMatrix3());
-        break;
-
-    case VAR_MATRIX3X4:
-        SetShaderParameter(param, value.GetMatrix3x4());
-        break;
-
-    case VAR_MATRIX4:
-        SetShaderParameter(param, value.GetMatrix4());
-        break;
-
-    case VAR_BUFFER:
-        {
-            const PODVector<unsigned char>& buffer = value.GetBuffer();
-            if (buffer.Size() >= sizeof(float))
-                SetShaderParameter(param, reinterpret_cast<const float*>(&buffer[0]), buffer.Size() / sizeof(float));
-        }
-        break;
-
-    default:
-        // Unsupported parameter type, do nothing
-        break;
-    }
-}
-
 bool Graphics::NeedParameterUpdate(ShaderParameterGroup group, const void* source)
 {
     if ((unsigned)(size_t)shaderParameterSources_[group] == M_MAX_UNSIGNED || shaderParameterSources_[group] != source)

+ 14 - 56
Source/Urho3D/Graphics/Direct3D9/D3D9Graphics.cpp

@@ -1237,9 +1237,22 @@ void Graphics::SetShaderParameter(StringHash param, float value)
         impl_->device_->SetPixelShaderConstantF(i->second_.register_, &data.x_, 1);
 }
 
+void Graphics::SetShaderParameter(StringHash param, int value)
+{
+    /// \todo Int constants seem to have no effect on Direct3D9
+    HashMap<StringHash, ShaderParameter>::Iterator i;
+    if (!impl_->shaderProgram_ || (i = impl_->shaderProgram_->parameters_.Find(param)) == impl_->shaderProgram_->parameters_.End())
+        return;
+
+    if (i->second_.type_ == VS)
+        impl_->device_->SetVertexShaderConstantI(i->second_.register_, &value, 1);
+    else
+        impl_->device_->SetPixelShaderConstantI(i->second_.register_, &value, 1);
+}
+
 void Graphics::SetShaderParameter(StringHash param, bool value)
 {
-    /// \todo Bool constants possibly have no effect on Direct3D9
+    /// \todo Bool constants seem to have no effect on Direct3D9
     HashMap<StringHash, ShaderParameter>::Iterator i;
     if (!impl_->shaderProgram_ || (i = impl_->shaderProgram_->parameters_.Find(param)) == impl_->shaderProgram_->parameters_.End())
         return;
@@ -1356,61 +1369,6 @@ void Graphics::SetShaderParameter(StringHash param, const Matrix3x4& matrix)
         impl_->device_->SetPixelShaderConstantF(i->second_.register_, matrix.Data(), 3);
 }
 
-void Graphics::SetShaderParameter(StringHash param, const Variant& value)
-{
-    switch (value.GetType())
-    {
-    case VAR_BOOL:
-        SetShaderParameter(param, value.GetBool());
-        break;
-
-    case VAR_FLOAT:
-    case VAR_DOUBLE:
-        SetShaderParameter(param, value.GetFloat());
-        break;
-
-    case VAR_VECTOR2:
-        SetShaderParameter(param, value.GetVector2());
-        break;
-
-    case VAR_VECTOR3:
-        SetShaderParameter(param, value.GetVector3());
-        break;
-
-    case VAR_VECTOR4:
-        SetShaderParameter(param, value.GetVector4());
-        break;
-
-    case VAR_COLOR:
-        SetShaderParameter(param, value.GetColor());
-        break;
-
-    case VAR_MATRIX3:
-        SetShaderParameter(param, value.GetMatrix3());
-        break;
-
-    case VAR_MATRIX3X4:
-        SetShaderParameter(param, value.GetMatrix3x4());
-        break;
-
-    case VAR_MATRIX4:
-        SetShaderParameter(param, value.GetMatrix4());
-        break;
-
-    case VAR_BUFFER:
-        {
-            const PODVector<unsigned char>& buffer = value.GetBuffer();
-            if (buffer.Size() >= sizeof(float))
-                SetShaderParameter(param, reinterpret_cast<const float*>(&buffer[0]), buffer.Size() / sizeof(float));
-        }
-        break;
-
-    default:
-        // Unsupported parameter type, do nothing
-        break;
-    }
-}
-
 bool Graphics::NeedParameterUpdate(ShaderParameterGroup group, const void* source)
 {
     if ((unsigned)(size_t)shaderParameterSources_[group] == M_MAX_UNSIGNED || shaderParameterSources_[group] != source)

+ 59 - 0
Source/Urho3D/Graphics/Graphics.cpp

@@ -106,6 +106,65 @@ bool Graphics::ToggleFullscreen()
     return SetMode(width_, height_, !fullscreen_, borderless_, resizable_, highDPI_, vsync_, tripleBuffer_, multiSample_);
 }
 
+void Graphics::SetShaderParameter(StringHash param, const Variant& value)
+{
+    switch (value.GetType())
+    {
+    case VAR_BOOL:
+        SetShaderParameter(param, value.GetBool());
+        break;
+
+    case VAR_INT:
+        SetShaderParameter(param, value.GetInt());
+        break;
+
+    case VAR_FLOAT:
+    case VAR_DOUBLE:
+        SetShaderParameter(param, value.GetFloat());
+        break;
+
+    case VAR_VECTOR2:
+        SetShaderParameter(param, value.GetVector2());
+        break;
+
+    case VAR_VECTOR3:
+        SetShaderParameter(param, value.GetVector3());
+        break;
+
+    case VAR_VECTOR4:
+        SetShaderParameter(param, value.GetVector4());
+        break;
+
+    case VAR_COLOR:
+        SetShaderParameter(param, value.GetColor());
+        break;
+
+    case VAR_MATRIX3:
+        SetShaderParameter(param, value.GetMatrix3());
+        break;
+
+    case VAR_MATRIX3X4:
+        SetShaderParameter(param, value.GetMatrix3x4());
+        break;
+
+    case VAR_MATRIX4:
+        SetShaderParameter(param, value.GetMatrix4());
+        break;
+
+    case VAR_BUFFER:
+        {
+            const PODVector<unsigned char>& buffer = value.GetBuffer();
+            if (buffer.Size() >= sizeof(float))
+                SetShaderParameter(param, reinterpret_cast<const float*>(&buffer[0]), buffer.Size() / sizeof(float));
+        }
+        break;
+
+    default:
+        // Unsupported parameter type, do nothing
+        break;
+    }
+}
+
 IntVector2 Graphics::GetWindowPosition() const
 {
     if (window_)

+ 2 - 0
Source/Urho3D/Graphics/Graphics.h

@@ -158,6 +158,8 @@ public:
     void SetShaderParameter(StringHash param, const float* data, unsigned count);
     /// Set shader float constant.
     void SetShaderParameter(StringHash param, float value);
+    /// Set shader integer constant.
+    void SetShaderParameter(StringHash param, int value);
     /// Set shader boolean constant.
     void SetShaderParameter(StringHash param, bool value);
     /// Set shader color constant.

+ 3 - 3
Source/Urho3D/Graphics/Material.cpp

@@ -655,7 +655,7 @@ bool Material::Load(const JSONValue& source)
     }
     batchedParameterUpdate_ = false;
 
-    // Load shader parameter animationss
+    // Load shader parameter animations
     JSONObject paramAnimationsObject = source.Get("shaderParameterAnimations").GetObject();
     for (JSONObject::ConstIterator it = paramAnimationsObject.Begin(); it != paramAnimationsObject.End(); it++)
     {
@@ -766,7 +766,7 @@ bool Material::Save(XMLElement& dest) const
     {
         XMLElement parameterElem = dest.CreateChild("parameter");
         parameterElem.SetString("name", j->second_.name_);
-        if (j->second_.value_.GetType() != VAR_BUFFER)
+        if (j->second_.value_.GetType() != VAR_BUFFER && j->second_.value_.GetType() != VAR_INT && j->second_.value_.GetType() != VAR_BOOL)
             parameterElem.SetVectorVariant("value", j->second_.value_);
         else
         {
@@ -865,7 +865,7 @@ bool Material::Save(JSONValue& dest) const
     for (HashMap<StringHash, MaterialShaderParameter>::ConstIterator j = shaderParameters_.Begin();
          j != shaderParameters_.End(); ++j)
     {
-        if (j->second_.value_.GetType() != VAR_BUFFER)
+        if (j->second_.value_.GetType() != VAR_BUFFER && j->second_.value_.GetType() != VAR_INT && j->second_.value_.GetType() != VAR_BOOL)
             shaderParamsVal.Set(j->second_.name_, j->second_.value_.ToString());
         else
         {

+ 21 - 55
Source/Urho3D/Graphics/OpenGL/OGLGraphics.cpp

@@ -1249,6 +1249,27 @@ void Graphics::SetShaderParameter(StringHash param, float value)
     }
 }
 
+void Graphics::SetShaderParameter(StringHash param, int value)
+{
+    if (impl_->shaderProgram_)
+    {
+        const ShaderParameter* info = impl_->shaderProgram_->GetParameter(param);
+        if (info)
+        {
+            if (info->bufferPtr_)
+            {
+                ConstantBuffer* buffer = info->bufferPtr_;
+                if (!buffer->IsDirty())
+                    impl_->dirtyConstantBuffers_.Push(buffer);
+                buffer->SetParameter(info->offset_, sizeof(int), &value);
+                return;
+            }
+
+            glUniform1i(info->location_, value);
+        }
+    }
+}
+
 void Graphics::SetShaderParameter(StringHash param, bool value)
 {
     // \todo Not tested
@@ -1465,61 +1486,6 @@ void Graphics::SetShaderParameter(StringHash param, const Matrix3x4& matrix)
     }
 }
 
-void Graphics::SetShaderParameter(StringHash param, const Variant& value)
-{
-    switch (value.GetType())
-    {
-    case VAR_BOOL:
-        SetShaderParameter(param, value.GetBool());
-        break;
-
-    case VAR_FLOAT:
-    case VAR_DOUBLE:
-        SetShaderParameter(param, value.GetFloat());
-        break;
-
-    case VAR_VECTOR2:
-        SetShaderParameter(param, value.GetVector2());
-        break;
-
-    case VAR_VECTOR3:
-        SetShaderParameter(param, value.GetVector3());
-        break;
-
-    case VAR_VECTOR4:
-        SetShaderParameter(param, value.GetVector4());
-        break;
-
-    case VAR_COLOR:
-        SetShaderParameter(param, value.GetColor());
-        break;
-
-    case VAR_MATRIX3:
-        SetShaderParameter(param, value.GetMatrix3());
-        break;
-
-    case VAR_MATRIX3X4:
-        SetShaderParameter(param, value.GetMatrix3x4());
-        break;
-
-    case VAR_MATRIX4:
-        SetShaderParameter(param, value.GetMatrix4());
-        break;
-
-    case VAR_BUFFER:
-        {
-            const PODVector<unsigned char>& buffer = value.GetBuffer();
-            if (buffer.Size() >= sizeof(float))
-                SetShaderParameter(param, reinterpret_cast<const float*>(&buffer[0]), buffer.Size() / sizeof(float));
-        }
-        break;
-
-    default:
-        // Unsupported parameter type, do nothing
-        break;
-    }
-}
-
 bool Graphics::NeedParameterUpdate(ShaderParameterGroup group, const void* source)
 {
     return impl_->shaderProgram_ ? impl_->shaderProgram_->NeedParameterUpdate(group, source) : false;

+ 14 - 3
bin/Data/Scripts/Editor/EditorMaterial.as

@@ -308,7 +308,9 @@ void RefreshMaterialShaderParameters()
         VariantType type = editMaterial.shaderParameters[parameterNames[i]].type;
         Variant value = editMaterial.shaderParameters[parameterNames[i]];
         UIElement@ parent = CreateAttributeEditorParent(list, parameterNames[i], 0, 0);
-        uint numCoords = type - VAR_FLOAT + 1;
+        uint numCoords = 1;
+        if (type >= VAR_VECTOR2 && type <= VAR_VECTOR4)
+            numCoords = type - VAR_FLOAT + 1;
 
         Array<String> coordValues = value.ToString().Split(' ');
 
@@ -571,7 +573,10 @@ void EditShaderParameter(StringHash eventType, VariantMap& eventData)
 
     Variant oldValue = editMaterial.shaderParameters[name];
     Array<String> coordValues = oldValue.ToString().Split(' ');
-    coordValues[coordinate] = String(attrEdit.text.ToFloat());
+    if (oldValue.type != VAR_BOOL)
+        coordValues[coordinate] = String(attrEdit.text.ToFloat());
+    else
+        coordValues[coordinate] = attrEdit.text;
 
     String valueString;
     for (uint i = 0; i < coordValues.length; ++i)
@@ -582,7 +587,7 @@ void EditShaderParameter(StringHash eventType, VariantMap& eventData)
 
     Variant newValue;
     newValue.FromString(oldValue.type, valueString);
-    
+
     BeginMaterialEdit();
     editMaterial.shaderParameters[name] = newValue;
     EndMaterialEdit();
@@ -615,6 +620,12 @@ void CreateShaderParameter(StringHash eventType, VariantMap& eventData)
     case 3:
         newValue = Vector4(0, 0, 0, 0);
         break;
+    case 4:
+        newValue = int(0);
+        break;
+    case 5:
+        newValue = false;
+        break;
     }
 
     BeginMaterialEdit();

+ 6 - 0
bin/Data/UI/EditorMaterialWindow.xml

@@ -220,6 +220,12 @@
                                             <element type="Text" style="EditorEnumAttributeText">
                                                 <attribute name="Text" value="Vector4" />
                                             </element>
+                                            <element type="Text" style="EditorEnumAttributeText">
+                                                <attribute name="Text" value="Int" />
+                                            </element>
+                                            <element type="Text" style="EditorEnumAttributeText">
+                                                <attribute name="Text" value="Bool" />
+                                            </element>
                                         </element>
                                     </element>
                                 </element>