Get an array of descriptions of all the properties this Procedural Material has.
This can be used to build generic GUI that can be used to edit the properties of any Procedural Material
without knowing the properties of it in advance.
var scrolling : Vector2;
function OnGUI () {
if (renderer.sharedMaterial as ProceduralMaterial) {
var windowRect = new Rect (Screen.width-250, 30, 220, Screen.height-60);
GUI.Window (0, windowRect, ProceduralPropertiesGUI, "Procedural Properties");
}
}
function ProceduralPropertiesGUI (windowId : int) {
scrolling = GUILayout.BeginScrollView (scrolling);
var substance = renderer.sharedMaterial as ProceduralMaterial;
var inputs = substance.GetProceduralPropertyDescriptions ();
for (var i : int = 0; i < inputs.Length; i++) {
var input = inputs[i];
var type = input.type;
if (type == ProceduralPropertyType.Boolean) {
var inputBool = substance.GetProceduralBoolean (input.name);
var oldInputBool = inputBool;
inputBool = GUILayout.Toggle (inputBool, input.name);
if (inputBool != oldInputBool)
substance.SetProceduralBoolean (input.name, inputBool);
}
else if (type == ProceduralPropertyType.Float) {
if (input.hasRange) {
GUILayout.Label (input.name);
var inputFloat = substance.GetProceduralFloat (input.name);
var oldInputFloat = inputFloat;
inputFloat = GUILayout.HorizontalSlider (inputFloat, input.minimum, input.maximum);
if (inputFloat != oldInputFloat)
substance.SetProceduralFloat (input.name, inputFloat);
}
}
else if (type == ProceduralPropertyType.Vector2 ||
type == ProceduralPropertyType.Vector3 ||
type == ProceduralPropertyType.Vector4
) {
if (input.hasRange) {
GUILayout.Label (input.name);
var vectorComponentAmount = 4;
if (type == ProceduralPropertyType.Vector2) vectorComponentAmount = 2;
if (type == ProceduralPropertyType.Vector3) vectorComponentAmount = 3;
var inputVector = substance.GetProceduralVector (input.name);
var oldInputVector = inputVector;
for (var c : int = 0; c < vectorComponentAmount; c++)
inputVector[c] = GUILayout.HorizontalSlider (
inputVector[c], input.minimum, input.maximum);
if (inputVector != oldInputVector)
substance.SetProceduralVector (input.name, inputVector);
}
}
else if (type == ProceduralPropertyType.Color3 || type == ProceduralPropertyType.Color4) {
GUILayout.Label (input.name);
var colorComponentAmount = (type == ProceduralPropertyType.Color3 ? 3 : 4);
var colorInput = substance.GetProceduralColor (input.name);
var oldColorInput = colorInput;
for (var d : int = 0; d < colorComponentAmount; d++)
colorInput[d] = GUILayout.HorizontalSlider (colorInput[d], 0, 1);
if (colorInput != oldColorInput)
substance.SetProceduralColor (input.name, colorInput);
}
else if (type == ProceduralPropertyType.Enum) {
GUILayout.Label (input.name);
var enumInput = substance.GetProceduralEnum (input.name);
var oldEnumInput = enumInput;
var enumOptions = input.enumOptions;
enumInput = GUILayout.SelectionGrid (enumInput, enumOptions, 1);
if (enumInput != oldEnumInput)
substance.SetProceduralEnum (input.name, enumInput);
}
}
substance.RebuildTextures();
GUILayout.EndScrollView();
}
using UnityEngine;
using System.Collections;
public class example : MonoBehaviour {
public Vector2 scrolling;
void OnGUI() {
if (renderer.sharedMaterial as ProceduralMaterial) {
Rect windowRect = new Rect(Screen.width - 250, 30, 220, Screen.height - 60);
GUI.Window(0, windowRect, ProceduralPropertiesGUI, "Procedural Properties");
}
}
void ProceduralPropertiesGUI(int windowId) {
scrolling = GUILayout.BeginScrollView(scrolling);
ProceduralMaterial substance = renderer.sharedMaterial as ProceduralMaterial;
ProceduralPropertyDescription[] inputs = substance.GetProceduralPropertyDescriptions();
int i = 0;
while (i < inputs.Length) {
ProceduralPropertyDescription input = inputs[i];
ProceduralPropertyType type = input.type;
if (type == ProceduralPropertyType.Boolean) {
bool inputBool = substance.GetProceduralBoolean(input.name);
bool oldInputBool = inputBool;
inputBool = GUILayout.Toggle(inputBool, input.name);
if (inputBool != oldInputBool)
substance.SetProceduralBoolean(input.name, inputBool);
} else
if (type == ProceduralPropertyType.Float)
if (input.hasRange) {
GUILayout.Label(input.name);
float inputFloat = substance.GetProceduralFloat(input.name);
float oldInputFloat = inputFloat;
inputFloat = GUILayout.HorizontalSlider(inputFloat, input.minimum, input.maximum);
if (inputFloat != oldInputFloat)
substance.SetProceduralFloat(input.name, inputFloat);
}
else
if (type == ProceduralPropertyType.Vector2 || type == ProceduralPropertyType.Vector3 || type == ProceduralPropertyType.Vector4)
if (input.hasRange) {
GUILayout.Label(input.name);
int vectorComponentAmount = 4;
if (type == ProceduralPropertyType.Vector2)
vectorComponentAmount = 2;
if (type == ProceduralPropertyType.Vector3)
vectorComponentAmount = 3;
Vector4 inputVector = substance.GetProceduralVector(input.name);
Vector4 oldInputVector = inputVector;
int c = 0;
while (c < vectorComponentAmount) {
inputVector[c] = GUILayout.HorizontalSlider(inputVector[c], input.minimum, input.maximum);
c++;
}
if (inputVector != oldInputVector)
substance.SetProceduralVector(input.name, inputVector);
}
else
if (type == ProceduralPropertyType.Color3 || type == ProceduralPropertyType.Color4) {
GUILayout.Label(input.name);
int colorComponentAmount = ((type == ProceduralPropertyType.Color3) ? 3 : 4);
Color colorInput = substance.GetProceduralColor(input.name);
Color oldColorInput = colorInput;
int d = 0;
while (d < colorComponentAmount) {
colorInput[d] = GUILayout.HorizontalSlider(colorInput[d], 0, 1);
d++;
}
if (colorInput != oldColorInput)
substance.SetProceduralColor(input.name, colorInput);
} else
if (type == ProceduralPropertyType.Enum) {
GUILayout.Label(input.name);
int enumInput = substance.GetProceduralEnum(input.name);
int oldEnumInput = enumInput;
string[] enumOptions = input.enumOptions;
enumInput = GUILayout.SelectionGrid(enumInput, enumOptions, 1);
if (enumInput != oldEnumInput)
substance.SetProceduralEnum(input.name, enumInput);
}
i++;
}
substance.RebuildTextures();
GUILayout.EndScrollView();
}
}
import UnityEngine
import System.Collections
class example(MonoBehaviour):
public scrolling as Vector2
def OnGUI():
if (renderer.sharedMaterial as ProceduralMaterial):
windowRect as Rect = Rect((Screen.width - 250), 30, 220, (Screen.height - 60))
GUI.Window(0, windowRect, ProceduralPropertiesGUI, 'Procedural Properties')
def ProceduralPropertiesGUI(windowId as int):
scrolling = GUILayout.BeginScrollView(scrolling)
substance as ProceduralMaterial = renderer.sharedMaterial
inputs as (ProceduralPropertyDescription) = substance.GetProceduralPropertyDescriptions()
i as int = 0
while i < inputs.Length:
input as ProceduralPropertyDescription = inputs[i]
type as ProceduralPropertyType = input.type
if type == ProceduralPropertyType.Boolean:
inputBool as bool = substance.GetProceduralBoolean(input.name)
oldInputBool as bool = inputBool
inputBool = GUILayout.Toggle(inputBool, input.name)
if inputBool != oldInputBool:
substance.SetProceduralBoolean(input.name, inputBool)
elif type == ProceduralPropertyType.Float:
if input.hasRange:
GUILayout.Label(input.name)
inputFloat as single = substance.GetProceduralFloat(input.name)
oldInputFloat as single = inputFloat
inputFloat = GUILayout.HorizontalSlider(inputFloat, input.minimum, input.maximum)
if inputFloat != oldInputFloat:
substance.SetProceduralFloat(input.name, inputFloat)
elif ((type == ProceduralPropertyType.Vector2) or (type == ProceduralPropertyType.Vector3)) or (type == ProceduralPropertyType.Vector4):
if input.hasRange:
GUILayout.Label(input.name)
vectorComponentAmount as int = 4
if type == ProceduralPropertyType.Vector2:
vectorComponentAmount = 2
if type == ProceduralPropertyType.Vector3:
vectorComponentAmount = 3
inputVector as Vector4 = substance.GetProceduralVector(input.name)
oldInputVector as Vector4 = inputVector
c as int = 0
while c < vectorComponentAmount:
inputVector[c] = GUILayout.HorizontalSlider(inputVector[c], input.minimum, input.maximum)
c++
if inputVector != oldInputVector:
substance.SetProceduralVector(input.name, inputVector)
elif (type == ProceduralPropertyType.Color3) or (type == ProceduralPropertyType.Color4):
GUILayout.Label(input.name)
colorComponentAmount as int = (3 if (type == ProceduralPropertyType.Color3) else 4)
colorInput as Color = substance.GetProceduralColor(input.name)
oldColorInput as Color = colorInput
d as int = 0
while d < colorComponentAmount:
colorInput[d] = GUILayout.HorizontalSlider(colorInput[d], 0, 1)
d++
if colorInput != oldColorInput:
substance.SetProceduralColor(input.name, colorInput)
elif type == ProceduralPropertyType.Enum:
GUILayout.Label(input.name)
enumInput as int = substance.GetProceduralEnum(input.name)
oldEnumInput as int = enumInput
enumOptions as (string) = input.enumOptions
enumInput = GUILayout.SelectionGrid(enumInput, enumOptions, 1)
if enumInput != oldEnumInput:
substance.SetProceduralEnum(input.name, enumInput)
i++
substance.RebuildTextures()
GUILayout.EndScrollView()