summaryrefslogtreecommitdiff
path: root/Assets/ThirdParty/AmplifyShaderEditor/Plugins/Editor/CustomDrawers/EditableIf.cs
diff options
context:
space:
mode:
Diffstat (limited to 'Assets/ThirdParty/AmplifyShaderEditor/Plugins/Editor/CustomDrawers/EditableIf.cs')
-rw-r--r--Assets/ThirdParty/AmplifyShaderEditor/Plugins/Editor/CustomDrawers/EditableIf.cs294
1 files changed, 294 insertions, 0 deletions
diff --git a/Assets/ThirdParty/AmplifyShaderEditor/Plugins/Editor/CustomDrawers/EditableIf.cs b/Assets/ThirdParty/AmplifyShaderEditor/Plugins/Editor/CustomDrawers/EditableIf.cs
new file mode 100644
index 00000000..e94e02ed
--- /dev/null
+++ b/Assets/ThirdParty/AmplifyShaderEditor/Plugins/Editor/CustomDrawers/EditableIf.cs
@@ -0,0 +1,294 @@
+// Amplify Shader Editor - Visual Shader Editing Tool
+// Copyright (c) Amplify Creations, Lda <info@amplify.pt>
+//
+// Donated by BinaryCats
+// https://forum.unity.com/threads/best-tool-asset-store-award-amplify-shader-editor-node-based-shader-creation-tool.430959/page-60#post-3414465
+//////////////////////
+// README / HOW TO USE
+//////////////////////
+// Examples:
+//
+// Floats:
+//
+// x Equals value
+// EditableIf( _float1, Equalto, 1)
+// This will allow the value to be edited, if the property _float1 is equal to 1. (_float1==1)
+// Note: NotEqualTo is also a valid argument which will do the opposite of this example.EditableIf(_float1, NotEqualTo, 1) (NotEqualTo != 1)
+//
+// x Greater than value
+// EditableIf(_Float1,GreaterThan,1)
+// This will allow the value to be edited if the property _float1 is Greater than 1. (_float1>1)
+//
+// x Greater Than Or Equal to value
+// EditableIf(_Float1,GreaterThanOrEqualTo,1)
+// This will allow the value to be edited if the property _float1 is Greater than or equal to 1. (_float1>=1)
+//
+//
+// x Less Than value
+// EditableIf(_Float1,LessThan,1)
+// This will allow the value to be edited if the property _float1 is Less than 1. (_float1<1)
+//
+// x Less Than Or Equal to value
+// EditableIf(_Float1,LessThanOrEqualTo,1)
+// This will allow the value to be edited if the property _float1 is Less than or equal to 1. (_float1<=1)
+//
+//
+// Colour:
+//
+// x Equals r,g,b,a
+// EditableIf(_Color0,EqualTo,255,255,255,255)
+// This will allow the value to be edited, if the property _Color0 R,G,B and A value all Equal 255. (_Color0.R==255 && _Color0.G==255 & _Color0.B == 255 && _Color0.A == 255)
+//
+// x Equals alpha
+// EditableIf(_Color0,EqualTo,null,null,null,255)
+// This will allow the value to be edited, if the property _Color0 Alpha value is Equal to 255. (_Color0.A == 255)
+//
+// a Greater than blue
+// EditableIf(_Color0,GreaterThan,null,null,125)
+// This will allow the value to be edited, if the property _Color0 Blue value is Greater Than 125. (_Color0.B > 125)
+// Note: as I do not want to check the Red or Green Values, i have entered "null" for the parameter
+// Note: I have not inputted a value to check for Alpha, as i do not want to check it. Simularly, if I wanted to Only check the Red Value I could have used EditableIf(_Color0,GreaterThan,125)
+//
+// Like wise with floats GreaterThanOrEqualTo, LessThan, LessThanOrEqualTo
+//
+// Vector:
+// Vector Checks work the same as colour checks
+//
+// Texture:
+// x Does Not have a Texture
+// EditableIf(_TextureSample0,Equals,null)
+// This will allow the value to be edited, if the property _TextureSample0 does NOT have a texture
+//
+// x Does have a Texture
+// EditableIf(_TextureSample0,NotEqualTo,null)
+// This will allow the value to be edited, if the property _TextureSample0 does have a texture
+
+using UnityEngine;
+using UnityEditor;
+using System;
+
+public enum ComparisonOperators
+{
+ EqualTo, NotEqualTo, GreaterThan, LessThan, EqualsOrGreaterThan, EqualsOrLessThan, ContainsFlags,
+ DoesNotContainsFlags
+}
+
+public class EditableIf : MaterialPropertyDrawer
+{
+ ComparisonOperators op;
+ string FieldName = "";
+ object ExpectedValue;
+ bool InputError;
+ public EditableIf()
+ {
+ InputError = true;
+ }
+ public EditableIf( object fieldname, object comparison, object expectedvalue )
+ {
+ if( expectedvalue.ToString().ToLower() == "true" )
+ {
+ expectedvalue = (System.Single)1;
+ }
+ else if( expectedvalue.ToString().ToLower() == "false" )
+ {
+ expectedvalue = (System.Single)0;
+
+ }
+ Init( fieldname, comparison, expectedvalue );
+
+ }
+ public EditableIf( object fieldname, object comparison, object expectedvaluex, object expectedvaluey )
+ {
+ float? x = expectedvaluex as float?;
+ float? y = expectedvaluey as float?;
+ float? z = float.NegativeInfinity;
+ float? w = float.NegativeInfinity;
+ x = GetVectorValue( x );
+ y = GetVectorValue( y );
+
+ Init( fieldname, comparison, new Vector4( x.Value, y.Value, z.Value, w.Value ) );
+ }
+ public EditableIf( object fieldname, object comparison, object expectedvaluex, object expectedvaluey, object expectedvaluez )
+ {
+ float? x = expectedvaluex as float?;
+ float? y = expectedvaluey as float?;
+ float? z = expectedvaluez as float?;
+ float? w = float.NegativeInfinity;
+ x = GetVectorValue( x );
+ y = GetVectorValue( y );
+ z = GetVectorValue( z );
+
+ Init( fieldname, comparison, new Vector4( x.Value, y.Value, z.Value, w.Value ) );
+
+ }
+ public EditableIf( object fieldname, object comparison, object expectedvaluex, object expectedvaluey, object expectedvaluez, object expectedvaluew )
+ {
+ var x = expectedvaluex as float?;
+ var y = expectedvaluey as float?;
+ var z = expectedvaluez as float?;
+ var w = expectedvaluew as float?;
+ x = GetVectorValue( x );
+ y = GetVectorValue( y );
+ z = GetVectorValue( z );
+ w = GetVectorValue( w );
+
+ Init( fieldname, comparison, new Vector4( x.Value, y.Value, z.Value, w.Value ) );
+
+ }
+
+ private void Init( object fieldname, object comparison, object expectedvalue )
+ {
+ FieldName = fieldname.ToString();
+ var names = Enum.GetNames( typeof( ComparisonOperators ) );
+ var name = comparison.ToString().ToLower().Replace( " ", "" );
+
+ for( int i = 0; i < names.Length; i++ )
+ {
+ if( names[ i ].ToLower() == name )
+ {
+ op = (ComparisonOperators)i;
+ break;
+ }
+ }
+
+ ExpectedValue = expectedvalue;
+ }
+
+ private static float? GetVectorValue( float? x )
+ {
+ if( x.HasValue == false )
+ {
+ x = float.NegativeInfinity;
+ }
+
+ return x;
+ }
+
+ // Draw the property inside the given rect
+ public override void OnGUI( Rect position, MaterialProperty prop, String label, MaterialEditor editor )
+ {
+ if( InputError )
+ {
+ EditorGUI.LabelField( position, "EditableIf Attribute Error: Input parameters are invalid!" );
+ return;
+ }
+ var LHSprop = MaterialEditor.GetMaterialProperty( prop.targets, FieldName );
+ if( string.IsNullOrEmpty( LHSprop.name ) )
+ {
+ LHSprop = MaterialEditor.GetMaterialProperty( prop.targets, "_" + FieldName.Replace( " ", "" ) );
+ if( string.IsNullOrEmpty( LHSprop.name ) )
+ {
+ EditorGUI.LabelField( position, "EditableIf Attribute Error: " + FieldName + " Does not exist!" );
+ return;
+ }
+ }
+ object LHSVal = null;
+
+ bool test = false;
+ switch( LHSprop.type )
+ {
+ case MaterialProperty.PropType.Color:
+ case MaterialProperty.PropType.Vector:
+ LHSVal = LHSprop.type == MaterialProperty.PropType.Color ? (Vector4)LHSprop.colorValue : LHSprop.vectorValue;
+ var v4 = ExpectedValue as Vector4?;
+ v4 = v4.HasValue ? v4 : new Vector4( (System.Single)ExpectedValue, float.NegativeInfinity, float.NegativeInfinity, float.NegativeInfinity );
+
+ if( LHSprop.type == MaterialProperty.PropType.Color )
+ {
+ test = VectorCheck( (Vector4)LHSVal, op, v4 / 255 );
+
+ }
+ else
+ test = VectorCheck( (Vector4)LHSVal, op, v4 );
+ break;
+ case MaterialProperty.PropType.Range:
+ case MaterialProperty.PropType.Float:
+ LHSVal = LHSprop.floatValue;
+ test = ( Check( LHSVal, op, ExpectedValue ) );
+ break;
+ case MaterialProperty.PropType.Texture:
+ LHSVal = LHSprop.textureValue;
+ test = ( CheckObject( LHSVal, op, ExpectedValue ) );
+ break;
+ }
+
+ GUI.enabled = test;
+ editor.DefaultShaderProperty( position, prop, label );
+ GUI.enabled = true;
+ }
+
+ private bool VectorCheck( Vector4 LHS, ComparisonOperators op, object expectedValue )
+ {
+ var RHS = (Vector4)expectedValue;
+ if( RHS.x != float.NegativeInfinity )
+ {
+ if( !Check( LHS.x, op, RHS.x ) )
+ return false;
+ }
+ if( RHS.y != float.NegativeInfinity )
+ {
+ if( !Check( LHS.y, op, RHS.y ) )
+ return false;
+ }
+ if( RHS.z != float.NegativeInfinity )
+ {
+ if( !Check( LHS.z, op, RHS.z ) )
+ return false;
+ }
+ if( RHS.w != float.NegativeInfinity )
+ {
+ if( !Check( LHS.w, op, RHS.w ) )
+ return false;
+ }
+
+ return true;
+ }
+
+ protected bool Check( object LHS, ComparisonOperators op, object RHS )
+ {
+ if( !( LHS is IComparable ) || !( RHS is IComparable ) )
+ throw new Exception( "Check using non basic type" );
+
+ switch( op )
+ {
+ case ComparisonOperators.EqualTo:
+ return ( (IComparable)LHS ).CompareTo( RHS ) == 0;
+
+ case ComparisonOperators.NotEqualTo:
+ return ( (IComparable)LHS ).CompareTo( RHS ) != 0;
+
+ case ComparisonOperators.EqualsOrGreaterThan:
+ return ( (IComparable)LHS ).CompareTo( RHS ) >= 0;
+
+ case ComparisonOperators.EqualsOrLessThan:
+ return ( (IComparable)LHS ).CompareTo( RHS ) <= 0;
+
+ case ComparisonOperators.GreaterThan:
+ return ( (IComparable)LHS ).CompareTo( RHS ) > 0;
+
+ case ComparisonOperators.LessThan:
+ return ( (IComparable)LHS ).CompareTo( RHS ) < 0;
+ case ComparisonOperators.ContainsFlags:
+ return ( (int)LHS & (int)RHS ) != 0; // Dont trust LHS values, it has been casted to a char and then to an int again, first bit will be the sign
+ case ComparisonOperators.DoesNotContainsFlags:
+ return ( ( (int)LHS & (int)RHS ) == (int)LHS ); // Dont trust LHS values, it has been casted to a char and then to an int again, first bit will be the sign
+
+ default:
+ break;
+ }
+ return false;
+ }
+ private bool CheckObject( object LHS, ComparisonOperators comparasonOperator, object RHS )
+ {
+ switch( comparasonOperator )
+ {
+ case ComparisonOperators.EqualTo:
+ return ( LHS == null );
+
+ case ComparisonOperators.NotEqualTo:
+ return ( LHS != null );
+ }
+ return true;
+ }
+
+}