diff options
| -rw-r--r-- | Editor/tooner.cs | 9 | ||||
| -rw-r--r-- | downstairs_02.cginc | 136 | ||||
| -rw-r--r-- | globals.cginc | 4 | ||||
| -rw-r--r-- | tooner.shader | 4 | ||||
| -rw-r--r-- | tooner_lighting.cginc | 2 |
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; { |
