yum/3ner
A toon shader for Unity's BIRP.
git clone https://git.yummers.dev/yum/3ner
c09509e
master
1using UnityEditor ; 2using UnityEngine ; 3 4// ─── Operation base class ───────────────────────────────────────────────────── 5 6[ System . Serializable ] 7public abstract class DeformOperation 8{ 9public abstract string GetDisplayName (); 10public virtual void DrawParameters () { } 11public abstract void ApplyTo ( FoldPipelineBuilder builder ); 12 13public static DeformOperation Create ( FoldSlot slot ) => 14slot . opcode switch 15{ 16TubeToPlaneOp . Opcode => new TubeToPlaneOp ( slot ), 17PlaneToTubeOp . Opcode => new PlaneToTubeOp ( slot ), 18PlaneToHemiOctahedronOp . Opcode => new PlaneToHemiOctahedronOp ( slot ), 19HemiOctahedronToPlaneOp . Opcode => new HemiOctahedronToPlaneOp ( slot ), 20ScaleOp . Opcode => new ScaleOp ( slot ), 21TranslateOp . Opcode => new TranslateOp ( slot ), 22PlaneToOctahedronOp . Opcode => new PlaneToOctahedronOp ( slot ), 23OctahedronToPlaneOp . Opcode => new OctahedronToPlaneOp ( slot ), 24RotateOp . Opcode => new RotateOp ( slot ), 25PointAlignOp . Opcode => new PointAlignOp ( slot ), 26AxisAlignOp . Opcode => new AxisAlignOp ( slot ), 27NormConversionOp . Opcode => new NormConversionOp ( slot ), 28SealOp . Opcode => new SealOp ( slot ), 29SineWavesOp . Opcode => new SineWavesOp (), 30FBMOp . Opcode => new FBMOp (), 31 _=> null 32}; 33 34protected static void DrawPrsParams ( ref Vector3 p , ref Vector3 r , ref Vector3 s , ref float t ) 35{ 36p = EditorGUILayout . Vector3Field ( "Origin (p)" , p ); 37r = EditorGUILayout . Vector3Field ( "R Axis" , r ); 38s = EditorGUILayout . Vector3Field ( "S Axis" , s ); 39t = EditorGUILayout . Slider ( "Interpolation (t)" , t , 0f , 1f ); 40} 41 42protected static void DrawAlignParams ( ref Vector3 po , ref Vector3 pp , ref Vector3 r , ref float t ) 43{ 44po = EditorGUILayout . Vector3Field ( "Origin Point (po)" , po ); 45pp = EditorGUILayout . Vector3Field ( "Target Point (pp)" , pp ); 46r = EditorGUILayout . Vector3Field ( "Rotation Axis (r)" , r ); 47t = EditorGUILayout . Slider ( "Interpolation (t)" , t , 0f , 1f ); 48} 49} 50 51// ─── Concrete operations ────────────────────────────────────────────────────── 52 53[ System . Serializable ] 54public class TubeToPlaneOp : DeformOperation 55{ 56public const int Opcode = 1 ; 57public Vector3 p = Vector3 . zero , r = Vector3 . right , s = Vector3 . forward ; 58public float t = 1f ; 59public TubeToPlaneOp () { } 60public TubeToPlaneOp ( FoldSlot slot ) { p = slot . vec0 ; r = slot . vec1 ; s = slot . vec2 ; t = slot . float0 ; } 61public override string GetDisplayName () => "Tube to Plane" ; 62public override void DrawParameters () => DrawPrsParams ( ref p , ref r , ref s , ref t ); 63public override void ApplyTo ( FoldPipelineBuilder b ) => b . TubeToPlane ( p , r , s , t ); 64} 65 66[ System . Serializable ] 67public class PlaneToTubeOp : DeformOperation 68{ 69public const int Opcode = 2 ; 70public Vector3 p = Vector3 . zero , r = Vector3 . right , s = Vector3 . forward ; 71public float t = 1f ; 72public PlaneToTubeOp () { } 73public PlaneToTubeOp ( FoldSlot slot ) { p = slot . vec0 ; r = slot . vec1 ; s = slot . vec2 ; t = slot . float0 ; } 74public override string GetDisplayName () => "Plane to Tube" ; 75public override void DrawParameters () => DrawPrsParams ( ref p , ref r , ref s , ref t ); 76public override void ApplyTo ( FoldPipelineBuilder b ) => b . PlaneToTube ( p , r , s , t ); 77} 78 79[ System . Serializable ] 80public class PlaneToHemiOctahedronOp : DeformOperation 81{ 82public const int Opcode = 9 ; 83public Vector3 p = Vector3 . zero , r = Vector3 . right , s = Vector3 . forward ; 84public float t = 1f ; 85public PlaneToHemiOctahedronOp () { } 86public PlaneToHemiOctahedronOp ( FoldSlot slot ) { p = slot . vec0 ; r = slot . vec1 ; s = slot . vec2 ; t = slot . float0 ; } 87public override string GetDisplayName () => "Plane to Hemi-Octahedron" ; 88public override void DrawParameters () => DrawPrsParams ( ref p , ref r , ref s , ref t ); 89public override void ApplyTo ( FoldPipelineBuilder b ) => b . PlaneToHemiOctahedron ( p , r , s , t ); 90} 91 92[ System . Serializable ] 93public class HemiOctahedronToPlaneOp : DeformOperation 94{ 95public const int Opcode = 10 ; 96public Vector3 p = Vector3 . zero , r = Vector3 . right , s = Vector3 . forward ; 97public float t = 1f ; 98public HemiOctahedronToPlaneOp () { } 99public HemiOctahedronToPlaneOp ( FoldSlot slot ) { p = slot . vec0 ; r = slot . vec1 ; s = slot . vec2 ; t = slot . float0 ; } 100public override string GetDisplayName () => "Hemi-Octahedron to Plane" ; 101public override void DrawParameters () => DrawPrsParams ( ref p , ref r , ref s , ref t ); 102public override void ApplyTo ( FoldPipelineBuilder b ) => b . HemiOctahedronToPlane ( p , r , s , t ); 103} 104 105[ System . Serializable ] 106public class PlaneToOctahedronOp : DeformOperation 107{ 108public const int Opcode = 13 ; 109public Vector3 p = Vector3 . zero , r = Vector3 . right , s = Vector3 . forward ; 110public float t = 1f ; 111public PlaneToOctahedronOp () { } 112public PlaneToOctahedronOp ( FoldSlot slot ) { p = slot . vec0 ; r = slot . vec1 ; s = slot . vec2 ; t = slot . float0 ; } 113public override string GetDisplayName () => "Plane to Octahedron" ; 114public override void DrawParameters () => DrawPrsParams ( ref p , ref r , ref s , ref t ); 115public override void ApplyTo ( FoldPipelineBuilder b ) => b . PlaneToOctahedron ( p , r , s , t ); 116} 117 118[ System . Serializable ] 119public class OctahedronToPlaneOp : DeformOperation 120{ 121public const int Opcode = 14 ; 122public Vector3 p = Vector3 . zero , r = Vector3 . right , s = Vector3 . forward ; 123public float t = 1f ; 124public OctahedronToPlaneOp () { } 125public OctahedronToPlaneOp ( FoldSlot slot ) { p = slot . vec0 ; r = slot . vec1 ; s = slot . vec2 ; t = slot . float0 ; } 126public override string GetDisplayName () => "Octahedron to Plane" ; 127public override void DrawParameters () => DrawPrsParams ( ref p , ref r , ref s , ref t ); 128public override void ApplyTo ( FoldPipelineBuilder b ) => b . OctahedronToPlane ( p , r , s , t ); 129} 130 131[ System . Serializable ] 132public class PointAlignOp : DeformOperation 133{ 134public const int Opcode = 3 ; 135public Vector3 po = Vector3 . zero , pp = Vector3 . up , r = Vector3 . right ; 136public float t = 1f ; 137public PointAlignOp () { } 138public PointAlignOp ( FoldSlot slot ) { po = slot . vec0 ; pp = slot . vec1 ; r = slot . vec2 ; t = slot . float0 ; } 139public override string GetDisplayName () => "Point Align" ; 140public override void DrawParameters () => DrawAlignParams ( ref po , ref pp , ref r , ref t ); 141public override void ApplyTo ( FoldPipelineBuilder b ) => b . PointAlign ( po , pp , r , t ); 142} 143 144[ System . Serializable ] 145public class AxisAlignOp : DeformOperation 146{ 147public const int Opcode = 4 ; 148public Vector3 po = Vector3 . zero , pp = Vector3 . up , r = Vector3 . right ; 149public float t = 1f ; 150public AxisAlignOp () { } 151public AxisAlignOp ( FoldSlot slot ) { po = slot . vec0 ; pp = slot . vec1 ; r = slot . vec2 ; t = slot . float0 ; } 152public override string GetDisplayName () => "Axis Align" ; 153public override void DrawParameters () => DrawAlignParams ( ref po , ref pp , ref r , ref t ); 154public override void ApplyTo ( FoldPipelineBuilder b ) => b . AxisAlign ( po , pp , r , t ); 155} 156 157[ System . Serializable ] 158public class ScaleOp : DeformOperation 159{ 160public const int Opcode = 11 ; 161public Vector3 k = Vector3 . one ; 162public float t = 1f ; 163 164public ScaleOp () { } 165public ScaleOp ( FoldSlot slot ) { k = slot . vec0 ; t = slot . float0 ; } 166 167public override string GetDisplayName () => "Scale" ; 168public override void DrawParameters () 169{ 170k = EditorGUILayout . Vector3Field ( "Scale" , k ); 171t = EditorGUILayout . Slider ( "Interpolation (t)" , t , 0f , 1f ); 172} 173public override void ApplyTo ( FoldPipelineBuilder b ) => b . Scale ( k , t ); 174} 175 176[ System . Serializable ] 177public class TranslateOp : DeformOperation 178{ 179public const int Opcode = 12 ; 180public Vector3 offset = Vector3 . zero ; 181public float t = 1f ; 182 183public TranslateOp () { } 184public TranslateOp ( FoldSlot slot ) { offset = slot . vec0 ; t = slot . float0 ; } 185 186public override string GetDisplayName () => "Translate" ; 187public override void DrawParameters () 188{ 189offset = EditorGUILayout . Vector3Field ( "Offset" , offset ); 190t = EditorGUILayout . Slider ( "Interpolation (t)" , t , 0f , 1f ); 191} 192public override void ApplyTo ( FoldPipelineBuilder b ) => b . Translate ( offset , t ); 193} 194 195[ System . Serializable ] 196public class RotateOp : DeformOperation 197{ 198public const int Opcode = 15 ; 199public Vector3 center = Vector3 . zero , axis = Vector3 . up ; 200public float angleDeg = 90f , t = 1f ; 201 202public RotateOp () { } 203public RotateOp ( FoldSlot slot ) { center = slot . vec0 ; axis = slot . vec1 ; angleDeg = slot . float0 * Mathf . Rad2Deg ; t = slot . float1 ; } 204 205public override string GetDisplayName () => "Rotate" ; 206public override void DrawParameters () 207{ 208center = EditorGUILayout . Vector3Field ( "Center" , center ); 209axis = EditorGUILayout . Vector3Field ( "Axis" , axis ); 210angleDeg = EditorGUILayout . Slider ( "Angle" , angleDeg , 0f , 360f ); 211t = EditorGUILayout . Slider ( "Interpolation (t)" , t , 0f , 1f ); 212} 213public override void ApplyTo ( FoldPipelineBuilder b ) => b . Rotate ( center , axis , angleDeg * Mathf . Deg2Rad , t ); 214} 215 216[ System . Serializable ] 217public class NormConversionOp : DeformOperation 218{ 219public const int Opcode = 5 ; 220public float inputK = 2f , outputK = 1f , t = 1f ; 221 222public NormConversionOp () { } 223public NormConversionOp ( FoldSlot slot ) { inputK = slot . float0 ; outputK = slot . float1 ; t = slot . float2 ; } 224 225public override string GetDisplayName () => $"Norm Conversion (L { FormatNorm ( inputK )} →L { FormatNorm ( outputK )} )" ; 226string FormatNorm ( float k ) => float . IsPositiveInfinity ( k ) ? "∞" : k . ToString ( "F1" ); 227 228public override void DrawParameters () 229{ 230EditorGUILayout . BeginHorizontal (); 231EditorGUILayout . LabelField ( "Input Norm (k)" , GUILayout . Width ( 120 )); 232inputK = EditorGUILayout . FloatField ( inputK ); 233if ( GUILayout . Button ( "L∞" , GUILayout . Width ( 30 ))) inputK = float . PositiveInfinity ; 234EditorGUILayout . EndHorizontal (); 235 236EditorGUILayout . BeginHorizontal (); 237EditorGUILayout . LabelField ( "Output Norm (k)" , GUILayout . Width ( 120 )); 238outputK = EditorGUILayout . FloatField ( outputK ); 239if ( GUILayout . Button ( "L∞" , GUILayout . Width ( 30 ))) outputK = float . PositiveInfinity ; 240EditorGUILayout . EndHorizontal (); 241 242t = EditorGUILayout . Slider ( "Interpolation (t)" , t , 0f , 1f ); 243EditorGUILayout . HelpBox ( "Common: L1=diamond, L2=sphere, L∞=cube" , MessageType . Info ); 244} 245 246public override void ApplyTo ( FoldPipelineBuilder b ) => b . NormConversion ( inputK , outputK , t ); 247} 248 249[ System . Serializable ] 250public class SealOp : DeformOperation 251{ 252public const int Opcode = 6 ; 253public float A = 0.1f , k = 2f , st = 0.8f , t = 1f ; 254 255public SealOp () { } 256public SealOp ( FoldSlot slot ) { A = slot . float0 ; k = slot . float1 ; st = slot . float2 ; t = slot . float3 ; } 257 258public override string GetDisplayName () => "Seal" ; 259public override void DrawParameters () 260{ 261A = EditorGUILayout . FloatField ( "Amplitude (A)" , A ); 262k = EditorGUILayout . FloatField ( "Smoothness (k)" , k ); 263st = EditorGUILayout . FloatField ( "Scale (st)" , st ); 264t = EditorGUILayout . Slider ( "Interpolation (t)" , t , 0f , 1f ); 265} 266public override void ApplyTo ( FoldPipelineBuilder b ) => b . Seal ( A , k , st , t ); 267} 268 269[ System . Serializable ] 270public class SineWavesOp : DeformOperation 271{ 272public const int Opcode = 7 ; 273public override string GetDisplayName () => "Sine Waves" ; 274public override void DrawParameters () => EditorGUILayout . HelpBox ( "Uses shader-side parameters" , MessageType . Info ); 275public override void ApplyTo ( FoldPipelineBuilder b ) => b . SineWaves (); 276} 277 278[ System . Serializable ] 279public class FBMOp : DeformOperation 280{ 281public const int Opcode = 8 ; 282public override string GetDisplayName () => "FBM (Fractal Brownian Motion)" ; 283public override void DrawParameters () => EditorGUILayout . HelpBox ( "Uses shader-side parameters" , MessageType . Info ); 284public override void ApplyTo ( FoldPipelineBuilder b ) => b . FBM (); 285}