diff options
| author | yum <yum.food.vr@gmail.com> | 2024-07-18 16:50:14 -0700 |
|---|---|---|
| committer | yum <yum.food.vr@gmail.com> | 2024-07-18 16:50:14 -0700 |
| commit | e97073efc2c960ad2d28c0649615ef0d6b69a93b (patch) | |
| tree | 2cc15e0b83b13111af01158d254782b8b8db3b60 | |
| parent | 82b36c1c14013e82e15ca48dc766eb7aa4198e63 (diff) | |
Add spherize vertex location gimmick
| -rw-r--r-- | Editor/tooner.cs | 32 | ||||
| -rw-r--r-- | feature_macros.cginc | 1 | ||||
| -rw-r--r-- | globals.cginc | 7 | ||||
| -rw-r--r-- | tooner.shader | 5 | ||||
| -rw-r--r-- | tooner_lighting.cginc | 34 | ||||
| -rw-r--r-- | tooner_outline_pass.cginc | 24 |
6 files changed, 94 insertions, 9 deletions
diff --git a/Editor/tooner.cs b/Editor/tooner.cs index 78b9a51..bcdc160 100644 --- a/Editor/tooner.cs +++ b/Editor/tooner.cs @@ -958,6 +958,37 @@ public class ToonerGUI : ShaderGUI { EditorGUI.indentLevel -= 1; } + void DoGimmickSpherizeLocation() { + MaterialProperty bc; + bc = FindProperty("_Gimmick_Spherize_Location_Enable_Static"); + bool enabled = (bc.floatValue != 0.0); + EditorGUI.BeginChangeCheck(); + enabled = EditorGUILayout.Toggle("Spherize location", enabled); + EditorGUI.EndChangeCheck(); + bc.floatValue = enabled ? 1.0f : 0.0f; + SetKeyword("_GIMMICK_SPHERIZE_LOCATION", enabled); + + if (!enabled) { + return; + } + + EditorGUI.indentLevel += 1; + + bc = FindProperty("_Gimmick_Spherize_Location_Enable_Dynamic"); + enabled = (bc.floatValue != 0.0); + EditorGUI.BeginChangeCheck(); + enabled = EditorGUILayout.Toggle("Enable (runtime switch)", enabled); + EditorGUI.EndChangeCheck(); + bc.floatValue = enabled ? 1.0f : 0.0f; + + bc = FindProperty("_Gimmick_Spherize_Location_Strength"); + editor.RangeProperty(bc, "Strength"); + bc = FindProperty("_Gimmick_Spherize_Location_Radius"); + editor.FloatProperty(bc, "Radius"); + + EditorGUI.indentLevel -= 1; + } + void DoGimmickEyes00() { MaterialProperty bc; bc = FindProperty("_Gimmick_Eyes00_Enable_Static"); @@ -1041,6 +1072,7 @@ public class ToonerGUI : ShaderGUI { DoGimmickFlatColor(); DoGimmickQuantizeLocation(); DoGimmickShearLocation(); + DoGimmickSpherizeLocation(); DoGimmickEyes00(); DoGimmickPixellate(); DoGimmickTrochoid(); diff --git a/feature_macros.cginc b/feature_macros.cginc index 8246737..9247d92 100644 --- a/feature_macros.cginc +++ b/feature_macros.cginc @@ -88,6 +88,7 @@ #pragma shader_feature_local _ _GIMMICK_QUANTIZE_LOCATION #pragma shader_feature_local _ _GIMMICK_QUANTIZE_LOCATION_AUDIOLINK #pragma shader_feature_local _ _GIMMICK_SHEAR_LOCATION +#pragma shader_feature_local _ _GIMMICK_SPHERIZE_LOCATION #pragma shader_feature_local _ _GIMMICK_EYES_00 #pragma shader_feature_local _ _PIXELLATE #pragma shader_feature_local _ _TROCHOID diff --git a/globals.cginc b/globals.cginc index b2d3eec..0ed9a54 100644 --- a/globals.cginc +++ b/globals.cginc @@ -361,6 +361,13 @@ float4 _Gimmick_Shear_Location_Mesh_Renderer_Rotation; float4 _Gimmick_Shear_Location_Mesh_Renderer_Scale; #endif +#if defined(_GIMMICK_SPHERIZE_LOCATION) +float _Gimmick_Spherize_Location_Enable_Static; +float _Gimmick_Spherize_Location_Enable_Dynamic; +float _Gimmick_Spherize_Location_Strength; +float _Gimmick_Spherize_Location_Radius; +#endif + #if defined(_GIMMICK_EYES_00) float _Gimmick_Eyes00_Enable_Static; texture2D _Gimmick_Eyes00_Effect_Mask; diff --git a/tooner.shader b/tooner.shader index d68feeb..47eea22 100644 --- a/tooner.shader +++ b/tooner.shader @@ -265,6 +265,11 @@ Shader "yum_food/tooner" _Gimmick_Shear_Location_Mesh_Renderer_Rotation("Mesh renderer rotation", Vector) = (0, 0, 0, 0) _Gimmick_Shear_Location_Mesh_Renderer_Scale("Mesh renderer scale", Vector) = (0, 0, 0, 0) + _Gimmick_Spherize_Location_Enable_Static("Enable spherize location gimmick", Float) = 0.0 + _Gimmick_Spherize_Location_Enable_Dynamic("Enable spherize location gimmick", Float) = 0.0 + _Gimmick_Spherize_Location_Strength("Strength", Range(0, 1)) = 0 + _Gimmick_Spherize_Location_Radius("Strength", Float) = 1 + _Gimmick_Vertex_Normal_Slide_Enable_Static("Enable vertex normal slide", Float) = 0.0 _Gimmick_Vertex_Normal_Slide_Enable_Dynamic("Enable vertex normal slide", Float) = 0.0 _Gimmick_Vertex_Normal_Slide_Distance("Vertex normal slide distance", Float) = 0.01 diff --git a/tooner_lighting.cginc b/tooner_lighting.cginc index ec3e22b..8215ea8 100644 --- a/tooner_lighting.cginc +++ b/tooner_lighting.cginc @@ -109,16 +109,20 @@ v2f vert(appdata v) } #endif +#if !defined(_SCROLL) && defined(_GIMMICK_SPHERIZE_LOCATION) + if (_Gimmick_Spherize_Location_Enable_Dynamic) { + float3 p = v.vertex.xyz; + float r = _Gimmick_Spherize_Location_Radius; + float s = _Gimmick_Spherize_Location_Strength; + float l = length(p); + p *= lerp(1, (r / l), s); + v.vertex.xyz = p; + } +#endif #if !defined(_SCROLL) && defined(_GIMMICK_SHEAR_LOCATION) if (_Gimmick_Shear_Location_Enable_Dynamic) { float3 p = v.vertex.xyz; - - float r = 0.0; - float3 sc = lerp( - _Gimmick_Shear_Location_Strength.xyz, - 1, - abs(p) < r); - + float3 sc = _Gimmick_Shear_Location_Strength.xyz; float3x3 shear_matrix = float3x3( sc.x, 0, 0, 0, sc.y, 0, @@ -372,6 +376,18 @@ void geom(triangle v2f tri_in[3], float3 v1_objPos = mul(unity_WorldToObject, float4(v1.worldPos, 1)); float3 v2_objPos = mul(unity_WorldToObject, float4(v2.worldPos, 1)); +#if defined(_GIMMICK_SPHERIZE_LOCATION) + if (_Gimmick_Spherize_Location_Enable_Dynamic) { + float r = _Gimmick_Spherize_Location_Radius; + float s = _Gimmick_Spherize_Location_Strength; + float l0 = length(v0_objPos); + float l1 = length(v1_objPos); + float l2 = length(v2_objPos); + v0_objPos *= lerp(1, (r / l0), s); + v1_objPos *= lerp(1, (r / l1), s); + v2_objPos *= lerp(1, (r / l2), s); + } +#endif #if defined(_GIMMICK_SHEAR_LOCATION) if (_Gimmick_Shear_Location_Enable_Dynamic) { v0_objPos = mul(float3x3( @@ -389,10 +405,12 @@ void geom(triangle v2f tri_in[3], 0, _Gimmick_Shear_Location_Strength.y, 0, 0, 0, _Gimmick_Shear_Location_Strength.z), v2_objPos); + } +#endif +#if defined(_GIMMICK_SHEAR_LOCATION) || defined(_GIMMICK_SPHERIZE_LOCATION) v0.worldPos.xyz = mul(unity_ObjectToWorld, v0_objPos); v1.worldPos.xyz = mul(unity_ObjectToWorld, v1_objPos); v2.worldPos.xyz = mul(unity_ObjectToWorld, v2_objPos); - } #endif v0.pos = UnityObjectToClipPos(v0_objPos); diff --git a/tooner_outline_pass.cginc b/tooner_outline_pass.cginc index 40e725f..479194c 100644 --- a/tooner_outline_pass.cginc +++ b/tooner_outline_pass.cginc @@ -51,6 +51,14 @@ v2f vert(appdata v) objPos.xyz += v.normal * _Outline_Width * outline_mask * _Outline_Width_Multiplier; #endif +#if !defined(_SCROLL) && defined(_GIMMICK_SPHERIZE_LOCATION) + if (_Gimmick_Spherize_Location_Enable_Dynamic) { + float r = _Gimmick_Spherize_Location_Radius; + float s = _Gimmick_Spherize_Location_Strength; + float l = length(objPos.xyz); + objPos.xyz *= lerp(1, (r / l), s); + } +#endif #if !defined(_SCROLL) && defined(_GIMMICK_SHEAR_LOCATION) if (_Gimmick_Shear_Location_Enable_Dynamic) { objPos = mul(float4x4( @@ -276,6 +284,18 @@ void geom(triangle v2f tri_in[3], float3 v1_objPos = mul(unity_WorldToObject, float4(v1.worldPos, 1)); float3 v2_objPos = mul(unity_WorldToObject, float4(v2.worldPos, 1)); +#if defined(_GIMMICK_SPHERIZE_LOCATION) + if (_Gimmick_Spherize_Location_Enable_Dynamic) { + float r = _Gimmick_Spherize_Location_Radius; + float s = _Gimmick_Spherize_Location_Strength; + float l0 = length(v0_objPos); + float l1 = length(v1_objPos); + float l2 = length(v2_objPos); + v0_objPos *= lerp(1, (r / l0), s); + v1_objPos *= lerp(1, (r / l1), s); + v2_objPos *= lerp(1, (r / l2), s); + } +#endif #if defined(_GIMMICK_SHEAR_LOCATION) if (_Gimmick_Shear_Location_Enable_Dynamic) { v0_objPos = mul(float3x3( @@ -293,10 +313,12 @@ void geom(triangle v2f tri_in[3], 0, _Gimmick_Shear_Location_Strength.y, 0, 0, 0, _Gimmick_Shear_Location_Strength.z), v2_objPos); + } +#endif +#if defined(_GIMMICK_SHEAR_LOCATION) || defined(_GIMMICK_SPHERIZE_LOCATION) v0.worldPos.xyz = mul(unity_ObjectToWorld, v0_objPos); v1.worldPos.xyz = mul(unity_ObjectToWorld, v1_objPos); v2.worldPos.xyz = mul(unity_ObjectToWorld, v2_objPos); - } #endif v0.pos = UnityObjectToClipPos(v0_objPos); |
