Allow resetting material variable

This commit is contained in:
Simon Lübeß
2025-02-14 15:34:33 +01:00
parent 24295731f3
commit 25e1c53a08
4 changed files with 47 additions and 12 deletions
+12
View File
@@ -248,6 +248,18 @@ public class Material : Asset
return .Ok; return .Ok;
} }
public Result<void, SetVariableError> 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, bool value) => SetVariable!(name, value);
public void SetVariable(StringView name, bool2 value) => SetVariable!(name, value); public void SetVariable(StringView name, bool2 value) => SetVariable!(name, value);
public void SetVariable(StringView name, bool3 value) => SetVariable!(name, value); public void SetVariable(StringView name, bool3 value) => SetVariable!(name, value);
+20 -5
View File
@@ -1059,11 +1059,13 @@ static class ScriptGlue
if (!material.IsRuntimeInstance) if (!material.IsRuntimeInstance)
{ {
material = new Material(material, true); using (material = new Material(material, true))
{
material.Identifier = scope $"(Instance) {material.Identifier}"; material.Identifier = scope $"(Instance) {material.Identifier}";
Content.ManageAsset(material); Content.ManageAsset(material);
spriteRenderer.Material = material.Handle; spriteRenderer.Material = material.Handle;
} }
}
assetId = spriteRenderer.Material; assetId = spriteRenderer.Material;
} }
@@ -1178,11 +1180,13 @@ static class ScriptGlue
if (!material.IsRuntimeInstance) if (!material.IsRuntimeInstance)
{ {
material = new Material(material, true); using (material = new Material(material, true))
{
material.Identifier = scope $"(Instance) {material.Identifier}"; material.Identifier = scope $"(Instance) {material.Identifier}";
Content.ManageAsset(material); Content.ManageAsset(material);
meshRenderer.Material = material.Handle; meshRenderer.Material = material.Handle;
} }
}
assetId = meshRenderer.Material; assetId = meshRenderer.Material;
} }
@@ -1420,11 +1424,22 @@ static class ScriptGlue
Material material = GetAssetOrThrow!<Material>(assetHandle); Material material = GetAssetOrThrow!<Material>(assetHandle);
char8* rawVariableName = Mono.mono_string_to_utf8(managedVariableName); 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<uint8>(rawData, dataLength));
material.[Friend]SetVariableRaw(variableName, elementType, rows, columns , arrayLength, Span<uint8>(rawData, dataLength)); Mono.mono_free(rawVariableName);
}
[RegisterCall("ScriptGlue::Material_ResetVariable")]
static void Material_ResetVariable(AssetHandle assetHandle, MonoString* managedVariableName)
{
Material material = GetAssetOrThrow!<Material>(assetHandle);
char8* rawVariableName = Mono.mono_string_to_utf8(managedVariableName);
material.ResetVariable(StringView(rawVariableName));
Mono.mono_free(rawVariableName);
} }
#endregion #endregion
+5
View File
@@ -15,4 +15,9 @@ public class Material : Asset
ScriptGlue.Material_SetVariable(_uuid, name, ScriptGlue.ShaderVariableType.Float, 1, 4, 1, &value, sizeof(float4)); ScriptGlue.Material_SetVariable(_uuid, name, ScriptGlue.ShaderVariableType.Float, 1, 4, 1, &value, sizeof(float4));
} }
} }
public void ResetVariable(string name)
{
ScriptGlue.Material_ResetVariable(_uuid, name);
}
} }
+4 -1
View File
@@ -399,7 +399,10 @@ internal static class ScriptGlue
} }
[MethodImpl(MethodImplOptions.InternalCall)] [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 #endregion