summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authoryum <yum.food.vr@gmail.com>2024-07-18 16:50:14 -0700
committeryum <yum.food.vr@gmail.com>2024-07-18 16:50:14 -0700
commite97073efc2c960ad2d28c0649615ef0d6b69a93b (patch)
tree2cc15e0b83b13111af01158d254782b8b8db3b60
parent82b36c1c14013e82e15ca48dc766eb7aa4198e63 (diff)
Add spherize vertex location gimmick
-rw-r--r--Editor/tooner.cs32
-rw-r--r--feature_macros.cginc1
-rw-r--r--globals.cginc7
-rw-r--r--tooner.shader5
-rw-r--r--tooner_lighting.cginc34
-rw-r--r--tooner_outline_pass.cginc24
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);