summaryrefslogtreecommitdiffstats
path: root/tooner_lighting.cginc
diff options
context:
space:
mode:
authoryum <yum.food.vr@gmail.com>2024-07-26 15:14:29 -0700
committeryum <yum.food.vr@gmail.com>2024-07-26 15:14:29 -0700
commitaa932e9df0691f1de27fb44e06e8d786400c3d2a (patch)
treeb7193b584ab4341354965ab3489ffa3f8a1a88aa /tooner_lighting.cginc
parent50699410bf33f143531eae080e1e0e068da504cd (diff)
Add facing quad gimmick
Gimmick makes the quad face the camera, pivoting around the world-space Y axis and the local coordinate system origin.
Diffstat (limited to 'tooner_lighting.cginc')
-rw-r--r--tooner_lighting.cginc49
1 files changed, 44 insertions, 5 deletions
diff --git a/tooner_lighting.cginc b/tooner_lighting.cginc
index f34f97b..cdc6e34 100644
--- a/tooner_lighting.cginc
+++ b/tooner_lighting.cginc
@@ -100,12 +100,45 @@ v2f vert(appdata v)
#define TAU PI * 2.0
float theta = v.uv0.x * TAU;
float r0 = length(v.vertex.xyz);
+ v.vertex.xyz = trochoid_map(theta, r0, v.vertex.z);
+ }
+#endif
+#if defined(_FACE_ME_WORLD_Y)
+ if (_FaceMeWorldY_Enable_Dynamic) {
+ // Undo object coordinate system rotation.
+ float3x3 rotation = float3x3(
+ normalize(unity_ObjectToWorld._m00_m10_m20),
+ normalize(unity_ObjectToWorld._m01_m11_m21),
+ normalize(unity_ObjectToWorld._m02_m12_m22));
+ rotation = transpose(rotation);
+ float3 unrotated = mul(transpose(rotation),
+ v.vertex.xyz);
+ float4 pos = mul(unity_ObjectToWorld,
+ float4(unrotated, v.vertex.w));
+ float3 unrotated_n = mul(transpose(rotation),
+ v.normal);
+ float3 n = UnityObjectToWorldNormal(unrotated_n);
+
+ float3 origin = mul(unity_ObjectToWorld, float4(0, 0, 0, 1)).xyz;
+ float3 view_dir = _WorldSpaceCameraPos - origin;
+ // Project onto xz plane
+ n.y = 0;
+ view_dir.y = 0;
+ // Normalize
+ n = normalize(n);
+ view_dir = normalize(view_dir);
+ // Calculate angles and rotate
+ float ct = dot(view_dir, n);
+ float3 n_cross_v = cross(view_dir, n);
+ float st = length(n_cross_v);
+ st *= sign(n_cross_v.y);
+ float2x2 rot = float2x2(
+ ct, -st,
+ st, ct);
+ pos.xz = mul(rot, pos.xz - origin.xz) + origin.xz;
- float x = v.vertex.x;
- float y = v.vertex.y;
- float z = v.vertex.z;
-
- v.vertex.xyz = trochoid_map(theta, r0, z);
+ v.vertex = mul(unity_WorldToObject, pos);
+ o.normal = view_dir;
}
#endif
@@ -140,7 +173,13 @@ v2f vert(appdata v)
o.screenPos = ComputeGrabScreenPos(o.pos);
#endif
+#if defined(_FACE_ME_WORLD_Y)
+ if (!_FaceMeWorldY_Enable_Dynamic) {
+ o.normal = UnityObjectToWorldNormal(v.normal);
+ }
+#else
o.normal = UnityObjectToWorldNormal(v.normal);
+#endif
o.tangent = float4(UnityObjectToWorldDir(v.tangent.xyz), v.tangent.w);
o.uv = v.uv0;
#if defined(LIGHTMAP_ON)