summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authoryum <yum.food.vr@gmail.com>2024-09-10 23:45:40 -0700
committeryum <yum.food.vr@gmail.com>2024-09-10 23:45:40 -0700
commitdfb1ece3e78cf013866d18a3a234e2f4bf8834f8 (patch)
tree81bbb45d39d6e2758b9b62632a4873821ac8d278
parent2712f07c0d06a15e6624b3045207d301a1592886 (diff)
Start work on new halo tech
-rw-r--r--Editor/tooner.cs20
-rw-r--r--feature_macros.cginc1
-rw-r--r--halos.cginc137
-rw-r--r--tooner.shader8
-rw-r--r--tooner_lighting.cginc33
5 files changed, 184 insertions, 15 deletions
diff --git a/Editor/tooner.cs b/Editor/tooner.cs
index c1c4331..a5f4757 100644
--- a/Editor/tooner.cs
+++ b/Editor/tooner.cs
@@ -1356,6 +1356,25 @@ public class ToonerGUI : ShaderGUI {
EditorGUI.indentLevel -= 1;
}
+ void DoGimmickHalo00() {
+ MaterialProperty bc;
+ bc = FindProperty("_Gimmick_Halo00_Enable_Static");
+ bool enabled = (bc.floatValue != 0.0);
+ EditorGUI.BeginChangeCheck();
+ enabled = EditorGUILayout.Toggle("Halo 00", enabled);
+ EditorGUI.EndChangeCheck();
+ bc.floatValue = enabled ? 1.0f : 0.0f;
+ SetKeyword("_GIMMICK_HALO_00", enabled);
+
+ if (!enabled) {
+ return;
+ }
+
+ EditorGUI.indentLevel += 1;
+
+ EditorGUI.indentLevel -= 1;
+ }
+
void DoGimmickPixellate() {
MaterialProperty bc;
bc = FindProperty("_Gimmick_Pixellate_Enable_Static");
@@ -1536,6 +1555,7 @@ public class ToonerGUI : ShaderGUI {
DoGimmickSpherizeLocation();
DoGimmickEyes00();
DoGimmickEyes01();
+ DoGimmickHalo00();
DoGimmickPixellate();
DoGimmickTrochoid();
DoGimmickFaceMeWorldY();
diff --git a/feature_macros.cginc b/feature_macros.cginc
index cdae09d..f4857a6 100644
--- a/feature_macros.cginc
+++ b/feature_macros.cginc
@@ -140,6 +140,7 @@
#pragma shader_feature_local _ _GIMMICK_SPHERIZE_LOCATION
#pragma shader_feature_local _ _GIMMICK_EYES_00
#pragma shader_feature_local _ _GIMMICK_EYES_01
+#pragma shader_feature_local _ _GIMMICK_HALO_00
#pragma shader_feature_local _ _PIXELLATE
#pragma shader_feature_local _ _TROCHOID
#pragma shader_feature_local _ _FACE_ME_WORLD_Y
diff --git a/halos.cginc b/halos.cginc
new file mode 100644
index 0000000..aa0b731
--- /dev/null
+++ b/halos.cginc
@@ -0,0 +1,137 @@
+#ifndef __HALOS_INC
+#define __HALOS_INC
+
+#include "globals.cginc"
+#include "interpolators.cginc"
+#include "math.cginc"
+
+#if defined(_GIMMICK_HALO_00)
+struct Halo00Params {
+ float3 period;
+ float3 count;
+ float2 uv;
+};
+struct Halo00PBR {
+ float4 albedo;
+ float3 normal;
+};
+
+float halo00_map(float3 p, float2 e)
+{
+ return length(p) - 0.1;
+}
+
+float halo00_map_dr(
+ float3 p,
+ Halo00Params params,
+ out float3 which
+ )
+{
+ which = round(p / params.period);
+ // Direction to nearest neighboring cell.
+ float3 min_d = p - params.period * which;
+ float3 o = sign(min_d);
+
+ float d = 1E9;
+ float3 which_tmp = which;
+ for (int xi = 0; xi < 1; xi++)
+ for (int yi = 0; yi < 1; yi++)
+ {
+ float3 rid = which + float3(xi, yi, 0) * o;
+ rid = clamp(rid, ceil(-(params.count)*0.5), floor((params.count-1)*0.5));
+ float3 r = p - params.period * rid;
+ float2 e = 0;
+ /*
+ float2 e = float2(
+ rand3(rid / 100.0),
+ rand3(rid / 100.0 + 1));
+ */
+ float cur_d = halo00_map(r, e);
+ which_tmp =
+ (cur_d < d ? rid : which_tmp);
+ d = min(d, cur_d);
+ }
+
+ which = which_tmp;
+ return d;
+}
+
+float3 halo00_calc_normal(float3 p, Halo00Params params)
+{
+ const float3 small_step = float3(0.0001, 0.0, 0.0);
+
+ // TODO do we need full central differences?
+ float3 which;
+ float gradient_x = halo00_map_dr(p + small_step.xyy, params, which) -
+ halo00_map_dr(p - small_step.xyy, params, which);
+ float gradient_y = halo00_map_dr(p + small_step.yxy, params, which) -
+ halo00_map_dr(p - small_step.yxy, params, which);
+ float gradient_z = halo00_map_dr(p + small_step.yyx, params, which) -
+ halo00_map_dr(p - small_step.yyx, params, which);
+
+ float3 normal = float3(gradient_x, gradient_y, gradient_z);
+
+ return normalize(normal);
+}
+
+void __halo00_march(float3 ro, float3 rd, Halo00Params params, out Halo00PBR result)
+{
+ float total_distance_traveled = 0.0;
+ const float MINIMUM_HIT_DISTANCE = 0.001;
+ const float MAXIMUM_TRACE_DISTANCE = 10.0;
+
+ ro -= (1 - (params.count % 2)) * params.period * 0.5;
+
+#define HALO00_MARCH_STEPS 30
+ float distance_to_closest;
+ float3 current_position;
+ float3 which;
+ for (int i = 0; i < HALO00_MARCH_STEPS; i++)
+ {
+ current_position = ro + total_distance_traveled * rd;
+
+ distance_to_closest = halo00_map_dr(current_position, params, which);
+
+ if (distance_to_closest < MINIMUM_HIT_DISTANCE)
+ {
+ break;
+ }
+
+ if (total_distance_traveled > MAXIMUM_TRACE_DISTANCE)
+ {
+ break;
+ }
+ total_distance_traveled += distance_to_closest;
+ }
+
+ if (distance_to_closest < MINIMUM_HIT_DISTANCE) {
+ result.albedo = 1;
+ result.normal = halo00_calc_normal(current_position, params);
+ return;
+ }
+
+ result.albedo = 0;
+ result.normal = 0;
+ return;
+}
+
+Halo00PBR halo00_march(float3 worldPos, float2 uv)
+{
+ Halo00PBR result;
+ Halo00Params params;
+ params.period = 0.2;
+ params.count = 5;
+ params.uv = uv;
+
+ float3 camera_position = mul(unity_WorldToObject, float4(_WorldSpaceCameraPos.xyz, 1));
+ float3 ro = camera_position;
+ float3 rd = normalize(mul(unity_WorldToObject, float4(worldPos - _WorldSpaceCameraPos.xyz, 1)));
+
+ __halo00_march(ro, rd, params, result);
+
+ return result;
+}
+
+#endif // _GIMMICK_HALO_00
+
+#endif // _HALOS_INC
diff --git a/tooner.shader b/tooner.shader
index cbb14b5..2cdfde7 100644
--- a/tooner.shader
+++ b/tooner.shader
@@ -3,7 +3,7 @@ Shader "yum_food/tooner"
// Unity fucking sucks ass and sometimes incorrectly uses an old cached
// version of the shader. Bump the nonce below to encourage it to use the
// current version.
- // Build nonce: 18
+ // Build nonce: 19
Properties
{
_Color("Base color", Color) = (0.8, 0.8, 0.8, 1)
@@ -187,7 +187,7 @@ Shader "yum_food/tooner"
_Proximity_Dimming_Factor("Proximity dimming max distance", Float) = 0
_Shading_Mode("Shading mode", Range(0, 1)) = 0
- _Mesh_Normals_Mode("Normals mode", Float) = 0.0
+ _Mesh_Normals_Mode("Normals mode", Float) = 3
_Flatten_Mesh_Normals_Str("Flatten mesh normals strength", Float) = 100.0
[MaterialToggle] _Confabulate_Normals("Confabulate mesh normals", Float) = 0.0
@@ -457,6 +457,8 @@ Shader "yum_food/tooner"
_Gimmick_Eyes01_Enable_Static("Enable eyes 01", Float) = 0.0
_Gimmick_Eyes01_Radius("Radius (meters, obj space)", Float) = 1.0
+ _Gimmick_Halo00_Enable_Static("Enable halo", Float) = 0.0
+
_Gimmick_Pixellate_Enable_Static("Enable pixellation", Float) = 0.0
_Gimmick_Pixellate_Resolution_U("Resolution (U)", Float) = 64
_Gimmick_Pixellate_Resolution_V("Resolution (V)", Float) = 64
@@ -557,6 +559,7 @@ Shader "yum_food/tooner"
#include "tooner_lighting.cginc"
ENDCG
}
+ /*
Pass {
Tags {
"RenderType"="Opaque"
@@ -636,6 +639,7 @@ Shader "yum_food/tooner"
#include "mochie_shadow_caster.cginc"
ENDCG
}
+ */
}
CustomEditor "ToonerGUI"
}
diff --git a/tooner_lighting.cginc b/tooner_lighting.cginc
index 3a49112..8c03644 100644
--- a/tooner_lighting.cginc
+++ b/tooner_lighting.cginc
@@ -7,6 +7,7 @@
#include "clones.cginc"
#include "eyes.cginc"
#include "globals.cginc"
+#include "halos.cginc"
#include "interpolators.cginc"
#include "iq_sdf.cginc"
#include "math.cginc"
@@ -374,7 +375,6 @@ void geom(triangle v2f tri_in[3],
struct RorschachPBR {
float4 albedo;
};
-
float rorschach_map_sdf(float3 p, float2 e, float3 period, float center_randomization)
{
float r = _Rorschach_Radius * min(period.x, min(period.y, period.z));
@@ -393,7 +393,6 @@ float rorschach_map_dr(
float3 period,
float3 count,
float center_randomization,
- float2 uv,
out float3 which
)
{
@@ -442,7 +441,7 @@ RorschachPBR get_rorschach(float2 uv, RorschachParams p)
float3 which;
float3 period = float3(1 / (p.count_x+1), 1 / (p.count_y+1), 1);
float3 count = float3(p.count_x, p.count_y, 1);
- float d = rorschach_map_dr(ro, period, count, p.center_randomization, uv, which);
+ float d = rorschach_map_dr(ro, period, count, p.center_randomization, which);
d *= max(p.count_x + 1, p.count_y + 1);
@@ -1318,16 +1317,6 @@ float4 effect(inout v2f i)
}
#endif
-#if defined(_RENDERING_CUTOUT)
-#if defined(_RENDERING_CUTOUT_STOCHASTIC)
- float ar = rand2(i.uv0);
- clip(albedo.a - ar);
-#else
- clip(albedo.a - _Alpha_Cutoff);
-#endif
- albedo.a = 1;
-#endif
-
PbrOverlay ov;
getOverlayAlbedoRoughnessMetallic(ov, i);
@@ -1352,6 +1341,24 @@ float4 effect(inout v2f i)
raw_normal.z * i.normal
);
+#if defined(_GIMMICK_HALO_00)
+ {
+ Halo00PBR pbr = halo00_march(i.worldPos, i.uv0);
+ albedo = pbr.albedo;
+ normal = pbr.normal;
+ }
+#endif
+
+#if defined(_RENDERING_CUTOUT)
+#if defined(_RENDERING_CUTOUT_STOCHASTIC)
+ float ar = rand2(i.uv0);
+ clip(albedo.a - ar);
+#else
+ clip(albedo.a - _Alpha_Cutoff);
+#endif
+ albedo.a = 1;
+#endif
+
#if defined(_METALLIC_MAP)
float metallic = _MetallicTex.SampleBias(GET_SAMPLER_PBR,
UV_SCOFF(i, _MetallicTex_ST, 0), _Global_Sample_Bias);