summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Editor/tooner.cs9
-rw-r--r--downstairs_02.cginc136
-rw-r--r--globals.cginc4
-rw-r--r--tooner.shader4
-rw-r--r--tooner_lighting.cginc2
5 files changed, 92 insertions, 63 deletions
diff --git a/Editor/tooner.cs b/Editor/tooner.cs
index 0d59420..e229331 100644
--- a/Editor/tooner.cs
+++ b/Editor/tooner.cs
@@ -1906,15 +1906,6 @@ 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 56884da..b48d548 100644
--- a/downstairs_02.cginc
+++ b/downstairs_02.cginc
@@ -354,7 +354,6 @@ Gimmick_DS2_Output Gimmick_DS2_10(inout v2f i)
o.metallic = 0;
o.roughness = 0.3;
o.worldPos = mul(unity_ObjectToWorld, float4(final_position, 1));
-
return o;
}
@@ -485,24 +484,21 @@ 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);
+ float3 pp = p - float3(0, 0, thickness*1.5);
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);
+ float3 noise = (_Gimmick_DS2_Noise.SampleLevel(linear_repeat_s, rid.xy * .001 + t *.001, 0) * 2 - 1);
+ wave_str += noise.x;
+ float4 quat = get_quaternion(normalize(noise*2-1), 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;
+ return p - float3(_Gimmick_DS2_03_Period.x * 0.65, _Gimmick_DS2_03_Period.y * 0.5, 0);
}
float ds2_03_map_dr(
@@ -513,13 +509,15 @@ float ds2_03_map_dr(
)
{
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 < 3; xi++)
- for (uint yi = 0; yi < 3; yi++)
+ for (uint xi = 0; xi < 1; xi++)
{
- float3 rid = which + (float3(xi, yi, 0) - 1);
+ float3 rid = which + float3(xi, 0, 0) * o;
rid = clamp(rid, ceil(-(count)*0.5), floor((count-1)*0.5));
float3 r = p - period * rid;
r = ds2_03_nudge_p(r, rid);
@@ -532,15 +530,15 @@ float ds2_03_map_dr(
return d;
}
-float3 ds2_03_calc_normal(float3 p)
+float3 ds2_03_calc_normal(float3 p, float3 period, float3 count)
{
float3 small_step = float3(1E-5, 0.0, 0.0);
float3 which;
- float center = ds2_03_map_dr(p, _Gimmick_DS2_03_Period.xyz, _Gimmick_DS2_03_Count.xyz, which);
+ float center = ds2_03_map_dr(p, period, count, which);
return normalize(float3(
- ds2_03_map_dr(p + small_step.xyz, _Gimmick_DS2_03_Period.xyz, _Gimmick_DS2_03_Count.xyz, which) - center,
- ds2_03_map_dr(p + small_step.zxy, _Gimmick_DS2_03_Period.xyz, _Gimmick_DS2_03_Count.xyz, which) - center,
- ds2_03_map_dr(p + small_step.yzx, _Gimmick_DS2_03_Period.xyz, _Gimmick_DS2_03_Count.xyz, which) - center
+ ds2_03_map_dr(p + small_step.xyz, period, count, which) - center,
+ ds2_03_map_dr(p + small_step.zxy, period, count, which) - center,
+ ds2_03_map_dr(p + small_step.yzx, period, count, which) - center
));
}
@@ -550,33 +548,81 @@ Gimmick_DS2_Output Gimmick_DS2_03(inout v2f i)
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_03_Domain_Warping_Octaves; ii++)
+ #define DS2_03_MARCH_STEPS 2
+ float total_distance_traveled = 0.0;
+ const float MINIMUM_HIT_DISTANCE = 2E-4;
+ const float MAXIMUM_TRACE_DISTANCE = 1E-1;
+ const float3 period = float3(
+ _Gimmick_DS2_03_Period.x * 2,
+ _Gimmick_DS2_03_Period.yz);
+ const float3 count = float3(
+ _Gimmick_DS2_03_Count.x * 0.5,
+ _Gimmick_DS2_03_Count.yz);
+
+ const float overstep_amount = 3;
+ bool hit1;
+ float total_distance_traveled1 = 0;
+ float3 which1;
{
- 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;
+ float distance_to_closest1;
+ for (uint ii = 0; ii < DS2_03_MARCH_STEPS; ii++)
+ {
+ float3 current_position = ro + total_distance_traveled1 * rd;
+ distance_to_closest1 = ds2_03_map_dr(current_position, period, count, which1)*overstep_amount;
+ total_distance_traveled1 += distance_to_closest1;
+ if (distance_to_closest1 < MINIMUM_HIT_DISTANCE ||
+ total_distance_traveled1 > MAXIMUM_TRACE_DISTANCE) {
+ break;
+ }
+ }
+
+ hit1 = distance_to_closest1 < MINIMUM_HIT_DISTANCE;
}
- #define DS2_03_MARCH_STEPS 3
- 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_03_MARCH_STEPS; ii++)
+ bool hit2;
+ float total_distance_traveled2 = 0;
+ float3 which2;
{
- float3 current_position = ro + total_distance_traveled * rd;
- distance_to_closest = ds2_03_map_dr(current_position, _Gimmick_DS2_03_Period.xyz, _Gimmick_DS2_03_Count.xyz, which);
- total_distance_traveled += distance_to_closest;
- if (distance_to_closest < MINIMUM_HIT_DISTANCE ||
- total_distance_traveled > MAXIMUM_TRACE_DISTANCE) {
- break;
+ ro.xy += period.xy * .5;
+ float distance_to_closest2;
+ for (uint ii = 0; ii < DS2_03_MARCH_STEPS; ii++)
+ {
+ float3 current_position = ro + total_distance_traveled2 * rd;
+ distance_to_closest2 = ds2_03_map_dr(current_position, period, count, which2)*overstep_amount;
+ total_distance_traveled2 += distance_to_closest2;
+ if (distance_to_closest2 < MINIMUM_HIT_DISTANCE ||
+ total_distance_traveled2 > MAXIMUM_TRACE_DISTANCE) {
+ break;
+ }
}
+
+ hit2 = distance_to_closest2 < MINIMUM_HIT_DISTANCE;
}
- bool hit = distance_to_closest < MINIMUM_HIT_DISTANCE;
- float3 final_position = ro + total_distance_traveled * rd;
- float3 normal = hit ? UnityObjectToWorldNormal(ds2_03_calc_normal(final_position)) : i.normal;
+ float3 final_position1 = i.objPos + total_distance_traveled1 * rd;
+ float3 final_position2 = (i.objPos + float3(period.xy * .5, 0)) + total_distance_traveled2 * rd;
+
+ float3 normal1 = hit1 ? UnityObjectToWorldNormal(ds2_03_calc_normal(final_position1, period, count)) : i.normal;
+ float3 normal2 = hit2 ? UnityObjectToWorldNormal(ds2_03_calc_normal(final_position2, period, count)) : i.normal;
+
+ float3 final_position;
+ float3 normal;
+ if (hit1 && hit2) {
+ final_position = total_distance_traveled1 < total_distance_traveled2 ? final_position1 : final_position2;
+ normal = total_distance_traveled1 < total_distance_traveled2 ? normal1 : normal2;
+ } else if (hit1) {
+ final_position = final_position1;
+ normal = normal1;
+ } else if (hit2) {
+ final_position = final_position2;
+ normal = normal2;
+ } else {
+ final_position = i.objPos;
+ normal = i.normal;
+ }
+ bool hit = hit1 || hit2;
+
+ float3 final_pos_world = mul(unity_ObjectToWorld, float4(final_position, 1));
float3 light_dir = normalize(float3(0.5, -0.5, -0.5));
float3 light_color = float3(1, 1, 1);
@@ -584,17 +630,17 @@ Gimmick_DS2_Output Gimmick_DS2_03(inout v2f i)
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;
+
+ float3 color = hit ? light_intensity : 0;
Gimmick_DS2_Output o;
o.albedo = float4(color, 1);
- o.emission = o.albedo;
+ //o.emission = o.albedo;
+ o.emission = 0;
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));
+ o.metallic = 1;
+ o.roughness = 0.1;
+ o.worldPos = final_pos_world;
return o;
}
diff --git a/globals.cginc b/globals.cginc
index d4a1406..204ea50 100644
--- a/globals.cginc
+++ b/globals.cginc
@@ -788,10 +788,6 @@ float _Gimmick_DS2_02_Domain_Warping_Speed;
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/tooner.shader b/tooner.shader
index 1b8773d..056edb7 100644
--- a/tooner.shader
+++ b/tooner.shader
@@ -827,10 +827,6 @@ Shader "yum_food/tooner"
_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
diff --git a/tooner_lighting.cginc b/tooner_lighting.cginc
index 059653b..efb3336 100644
--- a/tooner_lighting.cginc
+++ b/tooner_lighting.cginc
@@ -2774,7 +2774,7 @@ float4 effect(inout v2f i, out float depth)
float ds2_mask = _Gimmick_DS2_Mask.SampleLevel(linear_clamp_s, i.uv0, 0);
albedo = ds2.albedo * _Gimmick_DS2_Albedo_Factor * ds2_mask;
normal = ds2.normal;
- metallic = ds2.metallic;
+ metallic = ds2.metallic * ds2_mask;
roughness = ds2.roughness;
i.worldPos = ds2.worldPos;
{