diff options
| -rw-r--r-- | Editor/tooner.cs | 69 | ||||
| -rw-r--r-- | downstairs_02.cginc | 261 | ||||
| -rw-r--r-- | globals.cginc | 16 | ||||
| -rw-r--r-- | iq_sdf.cginc | 18 | ||||
| -rw-r--r-- | tooner.shader | 18 | ||||
| -rw-r--r-- | tooner_lighting.cginc | 27 |
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; |
