diff options
| author | yum <yum.food.vr@gmail.com> | 2024-07-26 15:14:29 -0700 |
|---|---|---|
| committer | yum <yum.food.vr@gmail.com> | 2024-07-26 15:14:29 -0700 |
| commit | aa932e9df0691f1de27fb44e06e8d786400c3d2a (patch) | |
| tree | b7193b584ab4341354965ab3489ffa3f8a1a88aa /tooner_lighting.cginc | |
| parent | 50699410bf33f143531eae080e1e0e068da504cd (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.cginc | 49 |
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) |
