From 25e1c53a088bf6d4c73fd4ea625aec0b775abf2b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20L=C3=BCbe=C3=9F?= Date: Fri, 14 Feb 2025 15:34:33 +0100 Subject: [PATCH] Allow resetting material variable --- GlitchyEngine/src/Renderer/Material.bf | 12 ++++++++ GlitchyEngine/src/Scripting/ScriptGlue.bf | 37 ++++++++++++++++------- ScriptCore/Graphics/Material.cs | 5 +++ ScriptCore/ScriptGlue.cs | 5 ++- 4 files changed, 47 insertions(+), 12 deletions(-) diff --git a/GlitchyEngine/src/Renderer/Material.bf b/GlitchyEngine/src/Renderer/Material.bf index 4ff972b..798ad46 100644 --- a/GlitchyEngine/src/Renderer/Material.bf +++ b/GlitchyEngine/src/Renderer/Material.bf @@ -248,6 +248,18 @@ public class Material : Asset return .Ok; } + public Result ResetVariable(StringView name) + { + if(!_variables.TryGetValue(name, let variable)) + { + return .Err(.VariableNotFound); + } + + variable.IsUnset = true; + + return .Ok; + } + public void SetVariable(StringView name, bool value) => SetVariable!(name, value); public void SetVariable(StringView name, bool2 value) => SetVariable!(name, value); public void SetVariable(StringView name, bool3 value) => SetVariable!(name, value); diff --git a/GlitchyEngine/src/Scripting/ScriptGlue.bf b/GlitchyEngine/src/Scripting/ScriptGlue.bf index 79a9321..d2d1283 100644 --- a/GlitchyEngine/src/Scripting/ScriptGlue.bf +++ b/GlitchyEngine/src/Scripting/ScriptGlue.bf @@ -1059,10 +1059,12 @@ static class ScriptGlue if (!material.IsRuntimeInstance) { - material = new Material(material, true); - material.Identifier = scope $"(Instance) {material.Identifier}"; - Content.ManageAsset(material); - spriteRenderer.Material = material.Handle; + using (material = new Material(material, true)) + { + material.Identifier = scope $"(Instance) {material.Identifier}"; + Content.ManageAsset(material); + spriteRenderer.Material = material.Handle; + } } assetId = spriteRenderer.Material; @@ -1178,10 +1180,12 @@ static class ScriptGlue if (!material.IsRuntimeInstance) { - material = new Material(material, true); - material.Identifier = scope $"(Instance) {material.Identifier}"; - Content.ManageAsset(material); - meshRenderer.Material = material.Handle; + using (material = new Material(material, true)) + { + material.Identifier = scope $"(Instance) {material.Identifier}"; + Content.ManageAsset(material); + meshRenderer.Material = material.Handle; + } } assetId = meshRenderer.Material; @@ -1420,11 +1424,22 @@ static class ScriptGlue Material material = GetAssetOrThrow!(assetHandle); char8* rawVariableName = Mono.mono_string_to_utf8(managedVariableName); - defer Mono.mono_free(rawVariableName); - StringView variableName = StringView(rawVariableName); + material.[Friend]SetVariableRaw(StringView(rawVariableName), elementType, rows, columns , arrayLength, Span(rawData, dataLength)); - material.[Friend]SetVariableRaw(variableName, elementType, rows, columns , arrayLength, Span(rawData, dataLength)); + Mono.mono_free(rawVariableName); + } + + [RegisterCall("ScriptGlue::Material_ResetVariable")] + static void Material_ResetVariable(AssetHandle assetHandle, MonoString* managedVariableName) + { + Material material = GetAssetOrThrow!(assetHandle); + + char8* rawVariableName = Mono.mono_string_to_utf8(managedVariableName); + + material.ResetVariable(StringView(rawVariableName)); + + Mono.mono_free(rawVariableName); } #endregion diff --git a/ScriptCore/Graphics/Material.cs b/ScriptCore/Graphics/Material.cs index 6b7e94b..1255ea7 100644 --- a/ScriptCore/Graphics/Material.cs +++ b/ScriptCore/Graphics/Material.cs @@ -15,4 +15,9 @@ public class Material : Asset ScriptGlue.Material_SetVariable(_uuid, name, ScriptGlue.ShaderVariableType.Float, 1, 4, 1, &value, sizeof(float4)); } } + + public void ResetVariable(string name) + { + ScriptGlue.Material_ResetVariable(_uuid, name); + } } diff --git a/ScriptCore/ScriptGlue.cs b/ScriptCore/ScriptGlue.cs index cbf4bff..ae35f44 100644 --- a/ScriptCore/ScriptGlue.cs +++ b/ScriptCore/ScriptGlue.cs @@ -399,7 +399,10 @@ internal static class ScriptGlue } [MethodImpl(MethodImplOptions.InternalCall)] - internal static extern unsafe bool Material_SetVariable(UUID assetId, String variableName, ShaderVariableType elementType, int rows, int columns, int arrayLength, void* rawData, int dataLength); + internal static extern unsafe bool Material_SetVariable(UUID assetId, string variableName, ShaderVariableType elementType, int rows, int columns, int arrayLength, void* rawData, int dataLength); + + [MethodImpl(MethodImplOptions.InternalCall)] + internal static extern bool Material_ResetVariable(UUID assetId, string variableName); #endregion