// Copyright (c) Microsoft Corporation. // Licensed under the MIT License. using System; using System.Collections.Generic; using UnityEngine; namespace Microsoft.MixedReality.Toolkit.UI { /// /// Theme Engine to control the material used based on state changes /// Changes the material for the first Renderer component on the initialized GameObject /// public class InteractableMaterialTheme : InteractableThemeBase { /// public override bool IsEasingSupported => false; private Material initMaterial; private Material material = null; private Renderer renderer; public InteractableMaterialTheme() { Types = new Type[] { typeof(Renderer) }; Name = "Material Theme"; } /// public override ThemeDefinition GetDefaultThemeDefinition() { return new ThemeDefinition() { ThemeType = GetType(), StateProperties = new List() { new ThemeStateProperty() { Name = "Material", Type = ThemePropertyTypes.Material, Values = new List(), Default = new ThemePropertyValue() { Material = null } }, }, CustomProperties = new List(), }; } /// public override void Init(GameObject host, ThemeDefinition settings) { renderer = host.GetComponent(); if (renderer != null) { initMaterial = renderer.material; } else { Debug.LogError($"Host GameObject {host} does not have a {typeof(Renderer).Name} component. InteractableMaterialTheme cannot execute."); } base.Init(host, settings); } /// public override void Reset() { if (renderer != null) { renderer.material = initMaterial; } } /// public override ThemePropertyValue GetProperty(ThemeStateProperty property) { ThemePropertyValue start = new ThemePropertyValue(); if (renderer != null) { material = renderer.material; start.Material = material; } return start; } /// public override void SetValue(ThemeStateProperty property, int index, float percentage) { SetValue(property, property.Values[index]); } /// protected override void SetValue(ThemeStateProperty property, ThemePropertyValue value) { if (renderer != null) { material = value.Material; renderer.material = material; } } } }