summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Editor/tooner.cs69
-rw-r--r--downstairs_02.cginc261
-rw-r--r--globals.cginc16
-rw-r--r--iq_sdf.cginc18
-rw-r--r--tooner.shader18
-rw-r--r--tooner_lighting.cginc27
6 files changed, 313 insertions, 96 deletions
diff --git a/Editor/tooner.cs b/Editor/tooner.cs
index 118c0fa..0d59420 100644
--- a/Editor/tooner.cs
+++ b/Editor/tooner.cs
@@ -1827,14 +1827,17 @@ public class ToonerGUI : ShaderGUI {
bc = FindProperty("_Gimmick_DS2_Emission_Factor");
FloatProperty(bc, "Emission factor");
- bc = FindProperty("_Gimmick_DS2_00_Enable_Dynamic");
- enabled = (bc.floatValue != 0.0);
- EditorGUI.BeginChangeCheck();
- enabled = Toggle("Enable effect 00", enabled);
- EditorGUI.EndChangeCheck();
- bc.floatValue = enabled ? 1.0f : 0.0f;
+ bc = FindProperty("_Gimmick_DS2_Choice");
+ FloatProperty(bc, "Choice");
+ float choice = bc.floatValue;
- if (enabled) {
+ if (Mathf.Round(choice) == -1) {
+ EditorGUI.indentLevel += 1;
+
+ EditorGUI.indentLevel -= 1;
+ }
+
+ if (Mathf.Round(choice) == 0) {
EditorGUI.indentLevel += 1;
bc = FindProperty("_Gimmick_DS2_00_Domain_Warping_Octaves");
@@ -1849,14 +1852,7 @@ public class ToonerGUI : ShaderGUI {
EditorGUI.indentLevel -= 1;
}
- bc = FindProperty("_Gimmick_DS2_01_Enable_Dynamic");
- enabled = (bc.floatValue != 0.0);
- EditorGUI.BeginChangeCheck();
- enabled = Toggle("Enable effect 01", enabled);
- EditorGUI.EndChangeCheck();
- bc.floatValue = enabled ? 1.0f : 0.0f;
-
- if (enabled) {
+ if (Mathf.Round(choice) == 1) {
EditorGUI.indentLevel += 1;
bc = FindProperty("_Gimmick_DS2_01_Period");
@@ -1878,27 +1874,29 @@ public class ToonerGUI : ShaderGUI {
EditorGUI.indentLevel -= 1;
}
- bc = FindProperty("_Gimmick_DS2_02_Enable_Dynamic");
- enabled = (bc.floatValue != 0.0);
- EditorGUI.BeginChangeCheck();
- enabled = Toggle("Enable effect 02", enabled);
- EditorGUI.EndChangeCheck();
- bc.floatValue = enabled ? 1.0f : 0.0f;
-
- if (enabled) {
+ if (Mathf.Round(choice) == 2) {
EditorGUI.indentLevel += 1;
+ bc = FindProperty("_Gimmick_DS2_02_Period");
+ VectorProperty(bc, "Period");
+ bc = FindProperty("_Gimmick_DS2_02_Count");
+ VectorProperty(bc, "Count");
+ bc = FindProperty("_Gimmick_DS2_02_Edge_Length");
+ FloatProperty(bc, "Edge length");
+
+ bc = FindProperty("_Gimmick_DS2_02_Domain_Warping_Octaves");
+ FloatProperty(bc, "Domain warping octaves");
+ bc = FindProperty("_Gimmick_DS2_02_Domain_Warping_Strength");
+ FloatProperty(bc, "Domain warping strength");
+ bc = FindProperty("_Gimmick_DS2_02_Domain_Warping_Scale");
+ FloatProperty(bc, "Domain warping scale");
+ bc = FindProperty("_Gimmick_DS2_02_Domain_Warping_Speed");
+ FloatProperty(bc, "Domain warping speed");
+
EditorGUI.indentLevel -= 1;
}
- bc = FindProperty("_Gimmick_DS2_03_Enable_Dynamic");
- enabled = (bc.floatValue != 0.0);
- EditorGUI.BeginChangeCheck();
- enabled = Toggle("Enable effect 03", enabled);
- EditorGUI.EndChangeCheck();
- bc.floatValue = enabled ? 1.0f : 0.0f;
-
- if (enabled) {
+ if (Mathf.Round(choice) == 3) {
EditorGUI.indentLevel += 1;
bc = FindProperty("_Gimmick_DS2_03_Period");
@@ -1908,6 +1906,15 @@ public class ToonerGUI : ShaderGUI {
bc = FindProperty("_Gimmick_DS2_03_Edge_Length");
FloatProperty(bc, "Edge length");
+ bc = FindProperty("_Gimmick_DS2_03_Domain_Warping_Octaves");
+ FloatProperty(bc, "Domain warping octaves");
+ bc = FindProperty("_Gimmick_DS2_03_Domain_Warping_Strength");
+ FloatProperty(bc, "Domain warping strength");
+ bc = FindProperty("_Gimmick_DS2_03_Domain_Warping_Scale");
+ FloatProperty(bc, "Domain warping scale");
+ bc = FindProperty("_Gimmick_DS2_03_Domain_Warping_Speed");
+ FloatProperty(bc, "Domain warping speed");
+
EditorGUI.indentLevel -= 1;
}
diff --git a/downstairs_02.cginc b/downstairs_02.cginc
index 844731c..56884da 100644
--- a/downstairs_02.cginc
+++ b/downstairs_02.cginc
@@ -4,6 +4,7 @@
#include "iq_sdf.cginc"
#include "math.cginc"
#include "oklab.cginc"
+#include "poi.cginc"
#ifndef __DOWNSTAIRS_02_INC
#define __DOWNSTAIRS_02_INC
@@ -113,10 +114,12 @@ Gimmick_DS2_Output Gimmick_DS2_00(v2f i)
uv *= 2;
uv -= 1;
float2 warping_speed_vector = normalize(float2(97, 101));
+ const float t = _Time[0] * 10;
+ const float warping_strength_anim = smoothstep(0, 1, sin(t*0.31));
for (uint ii = 0; ii < _Gimmick_DS2_00_Domain_Warping_Octaves; ii++)
{
float2 noise = _Gimmick_DS2_Noise.SampleLevel(linear_repeat_s, uv * _Gimmick_DS2_00_Domain_Warping_Scale + _Time[0] * _Gimmick_DS2_00_Domain_Warping_Speed * warping_speed_vector, 0);
- uv += noise * _Gimmick_DS2_00_Domain_Warping_Strength;
+ uv += noise * _Gimmick_DS2_00_Domain_Warping_Strength * warping_strength_anim;
}
float3 camera_position = float3(0.0, 0.0, -5.0);
@@ -127,8 +130,9 @@ Gimmick_DS2_Output Gimmick_DS2_00(v2f i)
float which;
bool hit = __ds2_00_march(ro, rd, normal, which);
- float3 shaded_color = LRGBtoOKLCH(float3(0.7, 0, 0));
- shaded_color[2] = which * TAU * 1.1 + _Time[1];
+ float3 shaded_color = LRGBtoOKLCH(float3(1, .05, .12));
+ shaded_color[0] += smoothstep(-1, 1, sin(t*2.3 + which * TAU * 1.1)) * .5;
+ shaded_color[2] += smoothstep(-1, 1, sin(t*2.9 + which * TAU * 1.1)) * .05;
shaded_color = OKLCHtoLRGB(shaded_color);
shaded_color *= hit;
@@ -255,10 +259,34 @@ Gimmick_DS2_Output Gimmick_DS2_01(inout v2f i)
return o;
}
-float ds2_02_map(float3 p, out float which)
+// which == -10 -> capped cylinder
+// which == 1 -> cylinder
+float ds2_10_map_repeated(float3 p, out float which)
{
float depth = .2;
- which = 0;
+ float d0 = distance_from_capped_cylinder(abs(p) - float3(0, .45, depth * .5), .05, .02);
+ float d1 = distance_from_cylinder(abs(p) - float3(0, 0, depth * .5), float3(0, 0, .015));
+ which = d0 < d1 ? -10 : 1;
+ return min(d0, d1);
+}
+
+float ds2_10_map_dr(
+ float3 p,
+ float3 period,
+ float3 count,
+ out float which
+ )
+{
+ which = round(p / period);
+ float3 rid = clamp(which, ceil(-(count)*0.5), floor((count-1)*0.5));
+ float3 r = p - period * rid;
+ return ds2_10_map_repeated(r, which);
+}
+
+float ds2_10_map(float3 p, out float which)
+{
+ float depth = .2;
+ which = -10;
// Create frame for lights.
float d0 = distance_from_box(p - float3(0, 0, depth), float3(.50, .50, depth));
@@ -266,50 +294,42 @@ float ds2_02_map(float3 p, out float which)
float d2 = op_sub(d1, d0);
// Create lights.
- float light_spacing = .12;
- float d3 = d2;
- which = -1;
- for (uint i = 0; i < 3; i++) {
- float d4 = distance_from_capped_cylinder(abs(p) - float3(i * light_spacing + light_spacing * .5, .45, depth * .5), .05, .03);
- d3 = min(d3, d4);
- }
- for (uint i = 0; i < 3; i++) {
- float d4 = distance_from_cylinder(abs(p) - float3(i * light_spacing + light_spacing * .5, 0, depth * .5), float3(0, 0, .025));
- which = d4 < d3 ? ((int) i + 1) * 2 + (sign(p.x) > 0 ? 1 : 0) : which;
- d3 = min(d3, d4);
- }
+ float light_spacing = .17;
+ float which_tmp;
+ float d3 = ds2_10_map_dr(p, float3(light_spacing, 1, 1), float3(5, 1, 1), which_tmp);
+ which = d3 < d2 ? which_tmp : which;
- return d3;
+ return min(d2, d3);
}
-float3 ds2_02_calc_normal(float3 p)
+float3 ds2_10_calc_normal(float3 p)
{
float3 small_step = float3(1E-5, 0.0, 0.0);
float which;
- float center = ds2_02_map(p, which);
+ float center = ds2_10_map(p, which);
return normalize(float3(
- ds2_02_map(p + small_step.xyz, which) - center,
- ds2_02_map(p + small_step.zxy, which) - center,
- ds2_02_map(p + small_step.yzx, which) - center
+ ds2_10_map(p + small_step.xyz, which) - center,
+ ds2_10_map(p + small_step.zxy, which) - center,
+ ds2_10_map(p + small_step.yzx, which) - center
));
}
-Gimmick_DS2_Output Gimmick_DS2_02(inout v2f i)
+Gimmick_DS2_Output Gimmick_DS2_10(inout v2f i)
{
float3 camera_position = mul(unity_WorldToObject, float4(_WorldSpaceCameraPos, 1));
float3 ro = i.objPos;
float3 rd = normalize(i.objPos - camera_position);
- #define DS2_02_MARCH_STEPS 30
+ #define DS2_10_MARCH_STEPS 30
float total_distance_traveled = 0.0;
const float MINIMUM_HIT_DISTANCE = 1E-3;
- const float MAXIMUM_TRACE_DISTANCE = 30.0;
+ const float MAXIMUM_TRACE_DISTANCE = 1;
float distance_to_closest;
float which;
- for (uint ii = 0; ii < DS2_02_MARCH_STEPS; ii++)
+ for (uint ii = 0; ii < DS2_10_MARCH_STEPS; ii++)
{
float3 current_position = ro + total_distance_traveled * rd;
- distance_to_closest = ds2_02_map(current_position, which);
+ distance_to_closest = ds2_10_map(current_position, which);
total_distance_traveled += distance_to_closest;
if (distance_to_closest < MINIMUM_HIT_DISTANCE ||
total_distance_traveled > MAXIMUM_TRACE_DISTANCE) {
@@ -318,60 +338,192 @@ Gimmick_DS2_Output Gimmick_DS2_02(inout v2f i)
}
float3 normal = i.normal;
+ const float3 final_position = ro + total_distance_traveled * rd;
bool hit = distance_to_closest < MINIMUM_HIT_DISTANCE;
- float3 color = (which == -1 ? 0.01 : 1.5);
+ float3 color = (which == -10 ? 0.01 : 1.5);
if (hit) {
- normal = ds2_02_calc_normal(ro + total_distance_traveled * rd);
+ normal = ds2_10_calc_normal(final_position);
normal = UnityObjectToWorldNormal(normal);
}
Gimmick_DS2_Output o;
- o.albedo = hit ? float4(color, 1) : 0;
+ //o.albedo = hit ? float4(color, 1) : 0;
+ o.albedo = hit ? 1 : 0;
o.emission = color;
o.normal = normal;
o.metallic = 0;
o.roughness = 0.3;
- o.worldPos = mul(unity_ObjectToWorld, float4(ro + total_distance_traveled * rd, 1));
+ o.worldPos = mul(unity_ObjectToWorld, float4(final_position, 1));
+
return o;
}
-float ds2_03_map(float3 p)
+float ds2_02_map(float3 p)
{
- float edge = _Gimmick_DS2_03_Edge_Length;
+ float edge = _Gimmick_DS2_02_Edge_Length;
float thickness = edge*10;
return distance_from_round_box(p - float3(0, 0, thickness*.99), float3(edge, edge, thickness), edge * .1);
}
-float3 ds2_03_nudge_p(float3 p, float3 which)
+float3 ds2_02_nudge_p(float3 p, float3 which)
{
- float noise = _Gimmick_DS2_Noise.SampleLevel(linear_repeat_s, which.xy * _Gimmick_DS2_03_Period.xy * .2 + _Time[0] * .1, 0);
+ float noise = _Gimmick_DS2_Noise.SampleLevel(linear_repeat_s, which.xy * _Gimmick_DS2_02_Period.xy * .2 + _Time[0] * .1, 0);
return p - float3(0, 0, noise * .01);
- //return p + sin(e*TAU+_Time[0]*4) * _Gimmick_DS2_03_Edge_Length * .2 - noise;
+ //return p + sin(e*TAU+_Time[0]*4) * _Gimmick_DS2_02_Edge_Length * .2 - noise;
//return p;
}
-float ds2_03_map_dr(
+float ds2_02_map_dr(
float3 p,
float3 period,
float3 count,
out float3 which
)
{
- which = round(p / period);
+ which = floor(p / period);
// Direction to nearest neighboring cell.
float3 min_d = p - period * which;
float3 o = sign(min_d);
float d = 1E9;
float3 which_tmp = which;
- for (uint xi = 0; xi < 2; xi++)
- for (uint yi = 0; yi < 2; yi++)
+ for (uint xi = 0; xi < 1; xi++)
+ for (uint yi = 0; yi < 1; yi++)
{
float3 rid = which + float3(xi, yi, 0) * o;
rid = clamp(rid, ceil(-(count)*0.5), floor((count-1)*0.5));
float3 r = p - period * rid;
+ r = ds2_02_nudge_p(r, rid);
+ float cur_d = ds2_02_map(r);
+ which_tmp = cur_d < d ? rid : which_tmp;
+ d = min(d, cur_d);
+ }
+
+ which = which_tmp;
+ return d;
+}
+
+float3 ds2_02_calc_normal(float3 p)
+{
+ float3 small_step = float3(1E-5, 0.0, 0.0);
+ float3 which;
+ float center = ds2_02_map_dr(p, _Gimmick_DS2_02_Period.xyz, _Gimmick_DS2_02_Count.xyz, which);
+ return normalize(float3(
+ ds2_02_map_dr(p + small_step.xyz, _Gimmick_DS2_02_Period.xyz, _Gimmick_DS2_02_Count.xyz, which) - center,
+ ds2_02_map_dr(p + small_step.zxy, _Gimmick_DS2_02_Period.xyz, _Gimmick_DS2_02_Count.xyz, which) - center,
+ ds2_02_map_dr(p + small_step.yzx, _Gimmick_DS2_02_Period.xyz, _Gimmick_DS2_02_Count.xyz, which) - center
+ ));
+}
+
+Gimmick_DS2_Output Gimmick_DS2_02(inout v2f i)
+{
+ float3 camera_position = mul(unity_WorldToObject, float4(_WorldSpaceCameraPos, 1));
+ float3 ro = i.objPos;
+ float3 rd = normalize(i.objPos - camera_position);
+
+ float2 warping_speed_vector = normalize(float2(97, 101));
+ for (uint ii = 0; ii < _Gimmick_DS2_02_Domain_Warping_Octaves; ii++)
+ {
+ float2 noise = _Gimmick_DS2_Noise.SampleLevel(linear_repeat_s, ro.xy * _Gimmick_DS2_02_Domain_Warping_Scale + _Time[0] * _Gimmick_DS2_02_Domain_Warping_Speed * warping_speed_vector, 0);
+ ro.xy += noise * _Gimmick_DS2_02_Domain_Warping_Strength;
+ }
+
+ #define DS2_02_MARCH_STEPS 40
+ float total_distance_traveled = 0.0;
+ const float MINIMUM_HIT_DISTANCE = 1E-4;
+ const float MAXIMUM_TRACE_DISTANCE = 1E-1;
+ float distance_to_closest;
+ float3 which;
+ for (uint ii = 0; ii < DS2_02_MARCH_STEPS; ii++)
+ {
+ float3 current_position = ro + total_distance_traveled * rd;
+ distance_to_closest = ds2_02_map_dr(current_position, _Gimmick_DS2_02_Period.xyz, _Gimmick_DS2_02_Count.xyz, which);
+ total_distance_traveled += distance_to_closest;
+ if (distance_to_closest < MINIMUM_HIT_DISTANCE ||
+ total_distance_traveled > MAXIMUM_TRACE_DISTANCE) {
+ break;
+ }
+ }
+
+ bool hit = distance_to_closest < MINIMUM_HIT_DISTANCE;
+ float3 final_position = ro + total_distance_traveled * rd;
+ float3 normal = hit ? UnityObjectToWorldNormal(ds2_02_calc_normal(final_position)) : i.normal;
+
+ float3 light_dir = normalize(float3(0.5, -0.5, -0.5));
+ float3 light_color = float3(1, 1, 1);
+ float ndotl = saturate(dot(normal, light_dir));
+ float wrap_factor = 0.7;
+ float4 wrapped = pow(max(1E-4, (ndotl + wrap_factor) / (1 + wrap_factor)), 1 + wrap_factor);
+ float3 light_intensity = light_color * wrapped;
+ float3 color = hit ? 1 : 0;
+ color *= _Gimmick_DS2_Noise.SampleLevel(linear_repeat_s, which.xy * _Gimmick_DS2_02_Period.xy * .1 + _Time[0] * warping_speed_vector * .01, 0);
+ // Reinterpret greyscale as OKLCH.
+ //color = saturate(color * 2 - (sin(_Time[0] + 1) * .5 + .6));
+ color = saturate(color * 2 - 0.4);
+ float hue_noise = _Gimmick_DS2_Noise.SampleLevel(linear_repeat_s, which.xy * _Gimmick_DS2_02_Period.xy * .1 - _Time[0] * warping_speed_vector.yx * .02, 0);
+ color = OKLCHtoLRGB(float3(
+ color.x * 20,
+ color.x * 10,
+ color.x * TAU * .2 + hue_noise * 10 + _Time[0] * 10
+ ));
+ color = max(color, 0.005);
+ color *= light_intensity;
+
+ Gimmick_DS2_Output o;
+ o.albedo = float4(color, 1);
+ o.emission = o.albedo;
+ o.normal = normal;
+ o.metallic = 0;
+ o.roughness = 0;
+ // Depth gets all fucked up unless we use i.objPos instead of ro, which is domain warped.
+ o.worldPos = mul(unity_ObjectToWorld, float4(i.objPos + rd * total_distance_traveled, 1));
+ return o;
+}
+
+float ds2_03_map(float3 p, float3 rid)
+{
+ float edge = _Gimmick_DS2_03_Edge_Length;
+ float thickness = edge * .5;
+
+ float3 pp = p - float3(0, 0, thickness*1);
+
+ float wave_str = 0;
+ float t = _Time[3];
+ for (uint i = 0; i < 6; i++) {
+ float wave_r = fmod(t + 50 * i, 300) - 5;
+ float wave_d2 = dot(rid.xy, rid.xy) * .01 - wave_r;
+ wave_str += (1 / (1 + exp(-wave_d2*.3)) - 0.5) * 2;
+ }
+ wave_str += (_Gimmick_DS2_Noise.SampleLevel(linear_repeat_s, rid.xy * .001 + t *.001, 0) * 2 - 1) * .75;
+ float4 quat = get_quaternion(float3(0, 1, 0), wave_str * PI);
+ pp = rotate_vector(pp, quat);
+ return distance_from_hex_prism(pp, float2(edge, thickness));
+}
+
+float3 ds2_03_nudge_p(float3 p, float3 which)
+{
+ return p - float3(_Gimmick_DS2_03_Period.x, _Gimmick_DS2_03_Period.y * (which.x % 2 == 0), 0) * .5;
+}
+
+float ds2_03_map_dr(
+ float3 p,
+ float3 period,
+ float3 count,
+ out float3 which
+ )
+{
+ which = floor(p / period);
+
+ float d = 1E9;
+ float3 which_tmp = which;
+ for (uint xi = 0; xi < 3; xi++)
+ for (uint yi = 0; yi < 3; yi++)
+ {
+ float3 rid = which + (float3(xi, yi, 0) - 1);
+ rid = clamp(rid, ceil(-(count)*0.5), floor((count-1)*0.5));
+ float3 r = p - period * rid;
r = ds2_03_nudge_p(r, rid);
- float cur_d = ds2_03_map(r);
+ float cur_d = ds2_03_map(r, rid);
which_tmp = cur_d < d ? rid : which_tmp;
d = min(d, cur_d);
}
@@ -398,10 +550,17 @@ Gimmick_DS2_Output Gimmick_DS2_03(inout v2f i)
float3 ro = i.objPos;
float3 rd = normalize(i.objPos - camera_position);
- #define DS2_03_MARCH_STEPS 30
+ float2 warping_speed_vector = normalize(float2(97, 101));
+ for (uint ii = 0; ii < _Gimmick_DS2_03_Domain_Warping_Octaves; ii++)
+ {
+ float2 noise = _Gimmick_DS2_Noise.SampleLevel(linear_repeat_s, ro.xy * _Gimmick_DS2_03_Domain_Warping_Scale + _Time[0] * _Gimmick_DS2_03_Domain_Warping_Speed * warping_speed_vector, 0);
+ ro.xy += noise * _Gimmick_DS2_03_Domain_Warping_Strength;
+ }
+
+ #define DS2_03_MARCH_STEPS 3
float total_distance_traveled = 0.0;
- const float MINIMUM_HIT_DISTANCE = 1E-3;
- const float MAXIMUM_TRACE_DISTANCE = 30.0;
+ const float MINIMUM_HIT_DISTANCE = 1E-4;
+ const float MAXIMUM_TRACE_DISTANCE = 1E-1;
float distance_to_closest;
float3 which;
for (uint ii = 0; ii < DS2_03_MARCH_STEPS; ii++)
@@ -416,22 +575,26 @@ Gimmick_DS2_Output Gimmick_DS2_03(inout v2f i)
}
bool hit = distance_to_closest < MINIMUM_HIT_DISTANCE;
- float3 normal = hit ? UnityObjectToWorldNormal(ds2_03_calc_normal(ro + total_distance_traveled * rd)) : i.normal;
+ float3 final_position = ro + total_distance_traveled * rd;
+ float3 normal = hit ? UnityObjectToWorldNormal(ds2_03_calc_normal(final_position)) : i.normal;
float3 light_dir = normalize(float3(0.5, -0.5, -0.5));
float3 light_color = float3(1, 1, 1);
float ndotl = saturate(dot(normal, light_dir));
- float wrap_factor = 0.5;
+ float wrap_factor = 0.7;
float4 wrapped = pow(max(1E-4, (ndotl + wrap_factor) / (1 + wrap_factor)), 1 + wrap_factor);
float3 light_intensity = light_color * wrapped;
+ float3 color = hit ? 1 : 0;
+ color *= light_intensity;
Gimmick_DS2_Output o;
- o.albedo = hit ? float4(light_intensity, 1) : 0;
+ o.albedo = float4(color, 1);
o.emission = o.albedo;
o.normal = normal;
o.metallic = 0;
o.roughness = 0;
- o.worldPos = mul(unity_ObjectToWorld, float4(ro + total_distance_traveled * rd, 1));
+ // Depth gets all fucked up unless we use i.objPos instead of ro, which is domain warped.
+ o.worldPos = mul(unity_ObjectToWorld, float4(i.objPos + rd * total_distance_traveled, 1));
return o;
}
diff --git a/globals.cginc b/globals.cginc
index 40e216d..d4a1406 100644
--- a/globals.cginc
+++ b/globals.cginc
@@ -760,8 +760,8 @@ float3 _Gimmick_Eyes02_Emission;
float _Gimmick_DS2_Enable_Static;
texture2D _Gimmick_DS2_Mask;
texture2D _Gimmick_DS2_Noise;
+float _Gimmick_DS2_Choice;
// 00
-float _Gimmick_DS2_00_Enable_Dynamic;
float _Gimmick_DS2_Albedo_Factor;
float _Gimmick_DS2_Emission_Factor;
float _Gimmick_DS2_00_Domain_Warping_Octaves;
@@ -769,7 +769,6 @@ float _Gimmick_DS2_00_Domain_Warping_Strength;
float _Gimmick_DS2_00_Domain_Warping_Scale;
float _Gimmick_DS2_00_Domain_Warping_Speed;
// 01
-float _Gimmick_DS2_01_Enable_Dynamic;
float4 _Gimmick_DS2_01_Period;
float4 _Gimmick_DS2_01_Count;
float _Gimmick_DS2_01_Radius;
@@ -778,12 +777,21 @@ float _Gimmick_DS2_01_Domain_Warping_Strength;
float _Gimmick_DS2_01_Domain_Warping_Scale;
float _Gimmick_DS2_01_Domain_Warping_Speed;
// 02
-float _Gimmick_DS2_02_Enable_Dynamic;
+float4 _Gimmick_DS2_02_Period;
+float4 _Gimmick_DS2_02_Count;
+float _Gimmick_DS2_02_Edge_Length;
+float _Gimmick_DS2_02_Domain_Warping_Octaves;
+float _Gimmick_DS2_02_Domain_Warping_Strength;
+float _Gimmick_DS2_02_Domain_Warping_Scale;
+float _Gimmick_DS2_02_Domain_Warping_Speed;
// 03
-float _Gimmick_DS2_03_Enable_Dynamic;
float4 _Gimmick_DS2_03_Period;
float4 _Gimmick_DS2_03_Count;
float _Gimmick_DS2_03_Edge_Length;
+float _Gimmick_DS2_03_Domain_Warping_Octaves;
+float _Gimmick_DS2_03_Domain_Warping_Strength;
+float _Gimmick_DS2_03_Domain_Warping_Scale;
+float _Gimmick_DS2_03_Domain_Warping_Speed;
#endif
#if defined(_PIXELLATE)
diff --git a/iq_sdf.cginc b/iq_sdf.cginc
index fa5f2c5..4f5608e 100644
--- a/iq_sdf.cginc
+++ b/iq_sdf.cginc
@@ -114,6 +114,24 @@ float distance_from_capped_cylinder(float3 p, float h, float r)
return min(max(d.x,d.y),0.0) + length(max(d,0.0));
}
+float distance_from_hex_prism(float3 p, float2 h)
+{
+ float3 q = abs(p);
+
+ const float3 k = float3(-0.8660254, 0.5, 0.57735);
+ p = abs(p);
+ p.xy -= 2.0*min(dot(k.xy, p.xy), 0.0)*k.xy;
+ float2 d = float2(
+ length(p.xy - float2(clamp(p.x, -k.z*h.x, k.z*h.x), h.x))*sign(p.y - h.x),
+ p.z-h.y );
+ return min(max(d.x,d.y),0.0) + length(max(d,0.0));
+}
+/*
+float sdHexPrism( vec3 p, vec2 h )
+{
+}
+*/
+
float3 op_rep(in float3 p, in float3 c)
{
return glsl_mod(p+0.5*c,c)-0.5*c;
diff --git a/tooner.shader b/tooner.shader
index fe6627c..1b8773d 100644
--- a/tooner.shader
+++ b/tooner.shader
@@ -797,18 +797,17 @@ Shader "yum_food/tooner"
_Gimmick_Eyes02_Emission ("Emission", Color) = (0, 0, 0, 1)
_Gimmick_DS2_Enable_Static ("Enable (static)", Float) = 0
+ _Gimmick_DS2_Choice ("Choice", Float) = 0
_Gimmick_DS2_Noise ("Noise", 2D) = "black" {}
_Gimmick_DS2_Mask("Mask", 2D) = "white" {}
_Gimmick_DS2_Albedo_Factor("Albedo factor", Float) = 1
_Gimmick_DS2_Emission_Factor("Emission factor", Float) = 1
// Effect 00
- _Gimmick_DS2_00_Enable_Dynamic("Enable effect 00 (dynamic)", Float) = 0
_Gimmick_DS2_00_Domain_Warping_Octaves("Domain warping octaves", Float) = 3
_Gimmick_DS2_00_Domain_Warping_Strength("Domain warping strength", Float) = 1
_Gimmick_DS2_00_Domain_Warping_Scale("Domain warping scale", Float) = 1
_Gimmick_DS2_00_Domain_Warping_Speed("Domain warping speed", Float) = 1
// Effect 01
- _Gimmick_DS2_01_Enable_Dynamic("Enable effect 01 (dynamic)", Float) = 0
_Gimmick_DS2_01_Period("Period", Vector) = (1, 1, 1, 1)
_Gimmick_DS2_01_Count("Count", Vector) = (1, 1, 1, 1)
_Gimmick_DS2_01_Radius("Radius", Float) = 1
@@ -817,12 +816,21 @@ Shader "yum_food/tooner"
_Gimmick_DS2_01_Domain_Warping_Scale("Domain warping scale", Float) = 1
_Gimmick_DS2_01_Domain_Warping_Speed("Domain warping speed", Float) = 1
// Effect 02
- _Gimmick_DS2_02_Enable_Dynamic("Enable effect 02 (dynamic)", Float) = 0
+ _Gimmick_DS2_02_Period("Period", Vector) = (1, 1, 1, 1)
+ _Gimmick_DS2_02_Count("Count", Vector) = (1, 1, 1, 1)
+ _Gimmick_DS2_02_Edge_Length("Edge length", Float) = 0.1
+ _Gimmick_DS2_02_Domain_Warping_Octaves("Domain warping octaves", Float) = 3
+ _Gimmick_DS2_02_Domain_Warping_Strength("Domain warping strength", Float) = 1
+ _Gimmick_DS2_02_Domain_Warping_Scale("Domain warping scale", Float) = 1
+ _Gimmick_DS2_02_Domain_Warping_Speed("Domain warping speed", Float) = 1
// Effect 03
- _Gimmick_DS2_03_Enable_Dynamic("Enable effect 03 (dynamic)", Float) = 0
_Gimmick_DS2_03_Period("Period", Vector) = (1, 1, 1, 1)
_Gimmick_DS2_03_Count("Count", Vector) = (1, 1, 1, 1)
_Gimmick_DS2_03_Edge_Length("Edge length", Float) = 0.1
+ _Gimmick_DS2_03_Domain_Warping_Octaves("Domain warping octaves", Float) = 3
+ _Gimmick_DS2_03_Domain_Warping_Strength("Domain warping strength", Float) = 1
+ _Gimmick_DS2_03_Domain_Warping_Scale("Domain warping scale", Float) = 1
+ _Gimmick_DS2_03_Domain_Warping_Speed("Domain warping speed", Float) = 1
_Gimmick_Halo00_Enable_Static("Enable halo", Float) = 0.0
@@ -1011,6 +1019,7 @@ Shader "yum_food/tooner"
{
Tags {
"VRCFallback"="ToonCutout"
+ "DisableBatching"="True"
}
Pass {
Tags {
@@ -1018,6 +1027,7 @@ Shader "yum_food/tooner"
"Queue"="Geometry"
"LightMode"="ForwardBase"
"LTCGI"="ALWAYS"
+ "DisableBatching"="True"
}
Blend [_SrcBlend] [_DstBlend]
ZWrite [_ZWrite]
diff --git a/tooner_lighting.cginc b/tooner_lighting.cginc
index 21d97b0..059653b 100644
--- a/tooner_lighting.cginc
+++ b/tooner_lighting.cginc
@@ -2751,14 +2751,25 @@ float4 effect(inout v2f i, out float depth)
#if defined(_GIMMICK_DS2)
Gimmick_DS2_Output ds2 = (Gimmick_DS2_Output)0;
// TODO if these remain mutually exclusive, we should use an enum + switch
- if (_Gimmick_DS2_00_Enable_Dynamic) {
- ds2 = Gimmick_DS2_00(i);
- } else if (_Gimmick_DS2_01_Enable_Dynamic) {
- ds2 = Gimmick_DS2_01(i);
- } else if (_Gimmick_DS2_02_Enable_Dynamic) {
- ds2 = Gimmick_DS2_02(i);
- } else if (_Gimmick_DS2_03_Enable_Dynamic) {
- ds2 = Gimmick_DS2_03(i);
+ switch (round(_Gimmick_DS2_Choice)) {
+ case 0:
+ ds2 = Gimmick_DS2_00(i);
+ break;
+ case 1:
+ ds2 = Gimmick_DS2_01(i);
+ break;
+ case 2:
+ ds2 = Gimmick_DS2_02(i);
+ break;
+ case 3:
+ ds2 = Gimmick_DS2_03(i);
+ break;
+ case 10:
+ ds2 = Gimmick_DS2_10(i);
+ break;
+ default:
+ ds2 = (Gimmick_DS2_Output)0;
+ break;
}
float ds2_mask = _Gimmick_DS2_Mask.SampleLevel(linear_clamp_s, i.uv0, 0);
albedo = ds2.albedo * _Gimmick_DS2_Albedo_Factor * ds2_mask;