using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.Rendering; using UnityEngine.UI; namespace SpriteShadersUltimate.Demo { public class Demo_GUI : MonoBehaviour { public static Demo_GUI instance; GameObject displayTitlePrefab; RectTransform propertyRect; CanvasGroup hudCG; Slider slider; float scrollArea; float targetHeight; void Awake() { instance = this; hudCG = transform.Find("Shader Hud").GetComponent(); displayTitlePrefab = transform.Find("Display Titles/Title Prefab").gameObject; propertyRect = transform.Find("Shader Hud/Properties/Rect").GetComponent(); slider = transform.Find("Shader Hud/Properties/Slider").GetComponent(); } void Update() { hudCG.alpha = Mathf.Lerp(hudCG.alpha, Demo_Shaders.instance.FadeInGUI() ? 1.1f : -0.1f, Time.unscaledDeltaTime * 7.5f); if(hudCG.alpha > 0.5f) { if (slider.gameObject.activeInHierarchy) { float strength = 100f / Mathf.Abs(scrollArea - 500f); if (Input.mouseScrollDelta.y > 0.01f) { slider.SetValueWithoutNotify(Mathf.Clamp01(slider.value - strength)); UpdateScroll(); } else if (Input.mouseScrollDelta.y < -0.01) { slider.SetValueWithoutNotify(Mathf.Clamp01(slider.value + strength)); UpdateScroll(); } } propertyRect.anchoredPosition = new Vector2(0, Mathf.Lerp(propertyRect.anchoredPosition.y, targetHeight, Time.unscaledDeltaTime * 8f)); } } public void CreateTitle(string title, Transform target) { GameObject newTitle = Instantiate(displayTitlePrefab); newTitle.transform.SetParent(displayTitlePrefab.transform.parent, true); newTitle.name = title; newTitle.GetComponent().target = target; newTitle.GetComponent().text = title; newTitle.SetActive(true); } public void UpdateHud() { //Toggle Interaction: if (Demo_Display.selected == null) { hudCG.blocksRaycasts = hudCG.interactable = false; return; } hudCG.blocksRaycasts = hudCG.interactable = true; //Set Title: Transform hud = transform.Find("Shader Hud"); hud.Find("Shader Title").GetComponent().text = Demo_Display.selected.gameObject.name; //Alternative Button: float currentY = 240f; if (Demo_Display.selected.HasAlternatives()) { propertyRect.Find("AlternativeButton").gameObject.SetActive(true); currentY = 240f - 60f; } else { propertyRect.Find("AlternativeButton").gameObject.SetActive(false); } //Properties: Transform properties = hud.Find("Properties"); GameObject colorPrefab = properties.Find("Color").gameObject; colorPrefab.SetActive(false); GameObject floatPrefab = properties.Find("Float").gameObject; floatPrefab.SetActive(false); GameObject vectorPrefab = properties.Find("Vector").gameObject; vectorPrefab.SetActive(false); //Clear Properties: for (int c = 0; c < propertyRect.childCount; c++) { Transform child = propertyRect.GetChild(c); if(child.gameObject.name != "AlternativeButton") { Destroy(propertyRect.GetChild(c).gameObject); } } //Create Properties: Material mat = Demo_Display.selected.InstantiateMaterial(); if (mat == null) { slider.gameObject.SetActive(false); return; } int index = mat.shader.FindPropertyIndex(Demo_Display.selected.firstProperty); int maxCount = mat.shader.GetPropertyCount(); bool hidden = false; while(index < maxCount) { string propertyName = mat.shader.GetPropertyName(index); ShaderPropertyType propertyType = mat.shader.GetPropertyType(index); index++; if (propertyName.StartsWith("_Enable")) { break; } else { if (!IsKeyword(propertyName)) { if (hidden) { if (propertyName == "_EnchantedLowColor" || propertyName == "_EnchantedHighColor" || propertyName == "_ShiftingColorA" || propertyName == "_ShiftingColorB") { //No Skipping } else { continue; //Skip hidden properties. } } else { if (propertyName == "_EnchantedLowColor" || propertyName == "_EnchantedHighColor" || propertyName == "_ShiftingColorA" || propertyName == "_ShiftingColorB") { continue; //Skipping if not Hidden } } RectTransform newRect = null; if (propertyType == ShaderPropertyType.Color) { GameObject newColor = Instantiate(colorPrefab); newColor.transform.SetParent(propertyRect, true); newColor.transform.position = colorPrefab.transform.position; newColor.transform.localScale = Vector3.one; newColor.SetActive(true); newRect = newColor.GetComponent(); newColor.GetComponent().SetTarget(mat, propertyName, Demo_Display.selected.gameObject.name); } else if (propertyType == ShaderPropertyType.Float || propertyType == ShaderPropertyType.Range) { GameObject newFloat = Instantiate(floatPrefab); newFloat.transform.SetParent(propertyRect, true); newFloat.transform.position = floatPrefab.transform.position; newFloat.transform.localScale = Vector3.one; newFloat.SetActive(true); newRect = newFloat.GetComponent(); newFloat.GetComponent().SetTarget(mat, propertyName, Demo_Display.selected.gameObject.name); } else if (propertyType == ShaderPropertyType.Vector) { GameObject newVector = Instantiate(vectorPrefab); newVector.transform.SetParent(propertyRect, true); newVector.transform.position = vectorPrefab.transform.position; newVector.transform.localScale = Vector3.one; newVector.SetActive(true); newRect = newVector.GetComponent(); newVector.GetComponent().SetTarget(mat, propertyName, Demo_Display.selected.gameObject.name); } if (newRect != null) { Vector2 anchoredPosition = newRect.anchoredPosition; anchoredPosition.y = currentY - newRect.sizeDelta.y * 0.5f; currentY -= newRect.sizeDelta.y; newRect.anchoredPosition = anchoredPosition; } } else { hidden = mat.GetFloat(propertyName) < 0.5f; } } } scrollArea = 240f - currentY; slider.SetValueWithoutNotify(0f); slider.gameObject.SetActive(scrollArea > 500f); targetHeight = 0f; } public static bool IsKeyword(string propName) { if (propName.StartsWith("_Toggle") || propName.EndsWith("Toggle") || propName.EndsWith("Invert") || propName == "PixelSnap" || propName == "_ShaderSpace" || propName == "_SmokeVertexSeed" || propName == "_ShaderFading" || propName == "_BakedMaterial" || propName == "_SpriteSheetFix" || propName == "_ForceAlpha" || propName == "_VertexTintFirst" || propName == "_PixelPerfectSpace" || propName == "_PixelPerfectUV" || propName == "_WindLocalWind" || propName == "_WindHighQualityNoise" || propName == "_WindIsParallax" || propName == "_WindFlip" || propName == "_SquishFlip") { return true; } return false; } //Buttons: public void BackButton() { if(Demo_Display.selected != null) { Demo_Display.selected.Deselect(); } } public void ResetMaterialButton() { if (Demo_Display.selected != null) { UpdateHud(); } } public void AlternativeButton() { if(Demo_Display.selected != null) { Demo_Display.selected.InstantiateMaterial(); Demo_Display.selected.ChangeIndex(); UpdateHud(); } } public void UpdateScroll() { targetHeight = slider.value * (scrollArea - 500f); } } }