yum/3ner
A toon shader for Unity's BIRP.
git clone https://git.yummers.dev/yum/3ner
82ef107
master
1using System ; 2using UnityEngine ; 3 4namespace Yum . Fold 5{ 6[ Serializable ] 7public sealed class FoldOperator 8{ 9// Packed shader/animation storage. Named fields, defaults and jumpback 10// policies live in the per-operator definitions in FoldOperators.cs. 11public bool enabled ; 12public int opcode ; 13public float float0 , float1 , float2 , float3 ; 14public Vector4 vector0 , vector1 , vector2 , vector3 ; 15 16public static FoldOperator Defaults ( int opcode ) => FoldOperators . Defaults ( opcode ); 17public FoldOperator JumpbackDefaults () => FoldOperators . Jumpback ( this ); 18public static FoldOperator AnimationDefaults ( int opcode ) => Defaults ( opcode ). JumpbackDefaults (); 19 20public FoldOperator Copy () => ( FoldOperator ) MemberwiseClone (); 21public static string Prefix ( int slot ) => "_Vertex_Deformation_Slot_" + slot + "_" ; 22public static FoldOperator Read ( Material material , int slot ) 23{ 24string p = Prefix ( slot ); 25return new FoldOperator { 26enabled = material . GetFloat ( p + "Enabled" ) > .5f , 27opcode = material . GetInteger ( p + "Opcode" ), 28float0 = material . GetFloat ( p + "Float_0" ), float1 = material . GetFloat ( p + "Float_1" ), 29float2 = material . GetFloat ( p + "Float_2" ), float3 = material . GetFloat ( p + "Float_3" ), 30vector0 = material . GetVector ( p + "Vector_0" ), vector1 = material . GetVector ( p + "Vector_1" ), 31vector2 = material . GetVector ( p + "Vector_2" ), vector3 = material . GetVector ( p + "Vector_3" ) 32}; 33} 34 35public void Write ( Material material , int slot ) 36{ 37string p = Prefix ( slot ); 38material . SetFloat ( p + "Enabled" , enabled ? 1 : 0 ); 39material . SetInteger ( p + "Opcode" , opcode ); 40material . SetFloat ( p + "Float_0" , float0 ); material . SetFloat ( p + "Float_1" , float1 ); 41material . SetFloat ( p + "Float_2" , float2 ); material . SetFloat ( p + "Float_3" , float3 ); 42material . SetVector ( p + "Vector_0" , vector0 ); material . SetVector ( p + "Vector_1" , vector1 ); 43material . SetVector ( p + "Vector_2" , vector2 ); material . SetVector ( p + "Vector_3" , vector3 ); 44} 45 46static readonly int [][] PropertyIds = CreatePropertyIds (); 47static int [][] CreatePropertyIds () 48{ 49var ids = new int [ 16 ][]; 50string [] names = { "Enabled" , "Opcode" , "Float_0" , "Float_1" , "Float_2" , "Float_3" , "Vector_0" , "Vector_1" , "Vector_2" , "Vector_3" }; 51for ( int i = 0 ; i < 16 ; i ++ ) 52{ 53ids [ i ] = new int [ names . Length ]; 54for ( int j = 0 ; j < names . Length ; j ++ ) ids [ i ][ j ] = Shader . PropertyToID ( Prefix ( i ) + names [ j ]); 55} 56return ids ; 57} 58public void Write ( MaterialPropertyBlock block , int slot ) 59{ 60var ids = PropertyIds [ slot ]; 61block . SetFloat ( ids [ 0 ], enabled ? 1 : 0 ); 62block . SetInteger ( ids [ 1 ], opcode ); 63block . SetFloat ( ids [ 2 ], float0 ); block . SetFloat ( ids [ 3 ], float1 ); 64block . SetFloat ( ids [ 4 ], float2 ); block . SetFloat ( ids [ 5 ], float3 ); 65block . SetVector ( ids [ 6 ], vector0 ); block . SetVector ( ids [ 7 ], vector1 ); 66block . SetVector ( ids [ 8 ], vector2 ); block . SetVector ( ids [ 9 ], vector3 ); 67} 68} 69 70[ ExecuteAlways , DisallowMultipleComponent , RequireComponent ( typeof ( Renderer ))] 71[ AddComponentMenu ( "Yum Food/Fold Stack" )] 72public sealed class FoldStack : MonoBehaviour 73{ 74public FoldMaterialAnimator [] materials = Array . Empty < FoldMaterialAnimator > (); 75 76public static bool Compatible ( Material material ) 77{ 78if ( ! material || ! material . shader || material . shader . name != "yum_food/3ner" ) return false ; 79if ( material . HasProperty ( "_ShaderOptimizerEnabled" ) && material . GetFloat ( "_ShaderOptimizerEnabled" ) != 0 ) return false ; 80if ( ! material . HasProperty ( "_Vertex_Deformation_Enabled" )) return false ; 81for ( int i = 0 ; i < 16 ; i ++ ) 82{ 83string p = FoldOperator . Prefix ( i ); 84if ( ! material . HasProperty ( p + "Enabled" ) || ! material . HasProperty ( p + "Opcode" )) return false ; 85for ( int j = 0 ; j < 4 ; j ++ ) 86if ( ! material . HasProperty ( p + "Float_" + j ) || ! material . HasProperty ( p + "Vector_" + j )) return false ; 87} 88return true ; 89} 90 91public void Apply () 92{ 93foreach ( var material in materials ) if ( material ) material . Apply (); 94} 95void OnEnable () => Apply (); 96void OnDisable () 97{ 98foreach ( var material in materials ) if ( material ) material . Restore (); 99} 100} 101}