summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authoryum <yum.food.vr@gmail.com>2025-10-11 22:08:17 -0700
committeryum <yum.food.vr@gmail.com>2025-10-12 11:14:39 -0700
commitb056c6935128dd7e4a9572a946bab5c4bc08da32 (patch)
tree1de16ab073383a5277a19354fbf0d63feaa5090f
parentdc8a6dfb9d78316b8c58c587bc606468377b0fe3 (diff)
gay behavior
-rw-r--r--3ner.cginc39
-rw-r--r--3ner.shader8
-rw-r--r--custom31.slang79
-rw-r--r--features.cginc5
-rw-r--r--globals.cginc3
-rw-r--r--interpolators.cginc3
-rw-r--r--lighting.cginc2
-rw-r--r--vertex.cginc31
8 files changed, 155 insertions, 15 deletions
diff --git a/3ner.cginc b/3ner.cginc
index 1b5e358..4b98812 100644
--- a/3ner.cginc
+++ b/3ner.cginc
@@ -13,6 +13,7 @@
#include "lighting.cginc"
#include "globals.cginc"
#include "interpolators.cginc"
+#include "vertex.cginc"
v2f vert(appdata v) {
v2f o;
@@ -24,14 +25,20 @@ v2f vert(appdata v) {
#if defined(_TESSELLATION)
o.tpos = v.vertex;
#endif
- o.pos = UnityObjectToClipPos(v.vertex);
- o.uv0 = v.uv0;
- o.objPos = v.vertex;
- o.worldPos = mul(unity_ObjectToWorld, v.vertex);
- o.eyeVec.xyz = o.worldPos.xyz - _WorldSpaceCameraPos;
- o.normal = UnityObjectToWorldNormal(v.normal);
- o.tangent.xyz = UnityObjectToWorldNormal(v.tangent.xyz);
- o.tangent.w = v.tangent.w;
+ o.uv0 = v.uv0;
+ o.objPos = v.vertex;
+#if defined(_CUSTOM31_FRAGMENT_NORMALS)
+ o.objPos_orig = v.vertex;
+#endif
+
+ // Normal and tangent are in object space.
+ o.normal = v.normal;
+ o.tangent = v.tangent;
+#if !defined(_CUSTOM31_FRAGMENT_NORMALS)
+ deform_normal(o.objPos, o.normal.xyz, o.tangent.xyz);
+#endif
+ deform(o.objPos);
+ propagateObjPos(o);
UNITY_TRANSFER_LIGHTING(o, v.uv1);
UNITY_TRANSFER_FOG_COMBINED_WITH_EYE_VEC(o, o.pos);
@@ -148,13 +155,13 @@ v2f domain(
#else
o.objPos = DOMAIN_INTERP(objPos);
#endif
-
+#if defined(_CUSTOM31_FRAGMENT_NORMALS)
+ o.objPos_orig = DOMAIN_INTERP(objPos_orig);
+#endif
o.normal = DOMAIN_INTERP(normal);
o.tangent = DOMAIN_INTERP(tangent);
- o.worldPos = mul(unity_ObjectToWorld, float4(o.objPos, 1));
- o.pos = UnityObjectToClipPos(o.objPos);
- o.eyeVec.xyz = o.worldPos - _WorldSpaceCameraPos;
+ propagateObjPos(o);
UNITY_TRANSFER_INSTANCE_ID(patch[0], o);
UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o);
@@ -166,6 +173,14 @@ float4 frag(v2f i, uint facing : SV_IsFrontFace
, out float depth : SV_DepthLessEqual
#endif
) : SV_Target {
+#if defined(_CUSTOM31_FRAGMENT_NORMALS)
+ deform_normal(i.objPos_orig, i.normal, i.tangent.xyz);
+#endif
+
+ // Convert normal and tangent to world space.
+ i.normal = UnityObjectToWorldNormal(i.normal);
+ i.tangent.xyz = UnityObjectToWorldNormal(i.tangent.xyz);
+
i.normal *= facing ? 1 : -1;
i.normal = normalize(i.normal);
i.tangent.xyz = normalize(i.tangent.xyz);
diff --git a/3ner.shader b/3ner.shader
index d4954f5..47d414b 100644
--- a/3ner.shader
+++ b/3ner.shader
@@ -42,11 +42,15 @@ Shader "yum_food/3ner"
[HideInInspector] m_start_Gimmicks("Gimmicks", Float) = 0
//ifex _Custom31_Enabled==0
[HideInInspector] m_start_Custom31("Custom31", Float) = 0
- [ToggleUI] _Custom31_Enabled("Enable", Float) = 0
+ [ThryToggle(_CUSTOM31)] _Custom31_Enabled("Enable", Float) = 0
+ [ThryToggle(_CUSTOM31_FRAGMENT_NORMALS)] _Custom31_Fragment_Normals_Enabled("Fragment normals", Float) = 0
//ifex _Custom31_Tubes_Enabled==0
[HideInInspector] m_start_Custom31_Tubes("Tubes", Float) = 0
- [ToggleUI] _Custom31_Tubes_Enabled("Enable", Float) = 0
+ [ThryToggle(_CUSTOM31_TUBES)] _Custom31_Tubes_Enabled("Enable", Float) = 0
+ _Custom31_Tubes_A("A", Range(0,1)) = 0
+ _Custom31_Tubes_k("k", Range(0,8)) = 1
+ _Custom31_Tubes_tk("time factor", Range(0,10)) = 1
[HideInInspector] m_end_Custom31_Tubes("Tubes", Float) = 0
//endex
diff --git a/custom31.slang b/custom31.slang
new file mode 100644
index 0000000..4b0e003
--- /dev/null
+++ b/custom31.slang
@@ -0,0 +1,79 @@
+#ifndef __CUSTOM31_INC
+#define __CUSTOM31_INC
+
+#define PI 3.14159265f
+
+float3x3 inverse(float3x3 m) {
+ float det =
+ m._11 * (m._22 * m._33 - m._23 * m._32) -
+ m._12 * (m._21 * m._33 - m._23 * m._31) +
+ m._13 * (m._21 * m._32 - m._22 * m._31);
+
+ if (abs(det) < 1e-6) {
+ return float3x3(
+ 1,0,0,
+ 0,1,0,
+ 0,0,1);
+ }
+
+ float invDet = 1.0f / det;
+ float3x3 inv;
+
+ inv._11 = (m._22 * m._33 - m._23 * m._32) * invDet;
+ inv._12 = (m._13 * m._32 - m._12 * m._33) * invDet;
+ inv._13 = (m._12 * m._23 - m._13 * m._22) * invDet;
+ inv._21 = (m._23 * m._31 - m._21 * m._33) * invDet;
+ inv._22 = (m._11 * m._33 - m._13 * m._31) * invDet;
+ inv._23 = (m._13 * m._21 - m._11 * m._23) * invDet;
+ inv._31 = (m._21 * m._32 - m._22 * m._31) * invDet;
+ inv._32 = (m._31 * m._12 - m._11 * m._32) * invDet;
+ inv._33 = (m._11 * m._22 - m._12 * m._21) * invDet;
+
+ return inv;
+}
+
+[Differentiable]
+public float3 c31_deform(float3 xyz, no_diff float A, no_diff float k, no_diff float t) {
+ float x = xyz.x;
+ float y = xyz.y;
+ float z = xyz.z;
+
+ float x0 = x + sin(y * k) * 0.1;
+ float y0 = y + sin(x * k * 2) * 0.5 + cos(z);
+ float z0 = (z + sin(x * y * k * PI + t) * A) * (1.0 + sin(y * k) * sin(x * k));
+
+ x0 += z0 * 0.1 * sin(z0 * PI + 1.5);
+ y0 += z0 * 0.1 * sin(z0 * PI + 1.5);
+
+ x0 -= 0.0;
+ y0 -= 1.2;
+
+ return float3(
+ x0, y0, z0
+ );
+}
+
+// Deform a normal vector using the inverse transpose of the jacobian.
+public void c31_deform_normal(float3 xyz, inout float3 normal, inout float3 tangent, float A, float k, float t) {
+ // Compute jacobian using autodiff applied to basis vectors.
+ DifferentialPair<float3> dp_x = diffPair(xyz, float3(1, 0, 0));
+ DifferentialPair<float3> dp_y = diffPair(xyz, float3(0, 1, 0));
+ DifferentialPair<float3> dp_z = diffPair(xyz, float3(0, 0, 1));
+
+ DifferentialPair<float3> dp_x_out = fwd_diff(c31_deform)(dp_x, A, k, t);
+ DifferentialPair<float3> dp_y_out = fwd_diff(c31_deform)(dp_y, A, k, t);
+ DifferentialPair<float3> dp_z_out = fwd_diff(c31_deform)(dp_z, A, k, t);
+
+ // Transform normal and tangent using jacobian
+ float3x3 jacobian = float3x3(
+ float3(dp_x_out.d.x, dp_y_out.d.x, dp_z_out.d.x),
+ float3(dp_x_out.d.y, dp_y_out.d.y, dp_z_out.d.y),
+ float3(dp_x_out.d.z, dp_y_out.d.z, dp_z_out.d.z)
+ );
+ float3x3 itjac = inverse(transpose(jacobian));
+ normal = normalize(mul(itjac, normal));
+ tangent = normalize(mul(jacobian, tangent));
+}
+
+#endif // __CUSTOM31_INC
+
diff --git a/features.cginc b/features.cginc
index e3e7f6a..d6ba34d 100644
--- a/features.cginc
+++ b/features.cginc
@@ -23,6 +23,11 @@
#pragma shader_feature_local _CLOTH_SHEEN
//endex
+//ifex _Custom31_Enabled==0
+#pragma shader_feature_local _CUSTOM31
+#pragma shader_feature_local _CUSTOM31_FRAGMENT_NORMALS
+//endex
+
//ifex _Custom31_Tubes_Enabled==0
#pragma shader_feature_local _CUSTOM31_TUBES
//endex
diff --git a/globals.cginc b/globals.cginc
index ee997e9..f615136 100644
--- a/globals.cginc
+++ b/globals.cginc
@@ -59,6 +59,9 @@ texture2D _Cloth_Sheen_DFG_LUT;
#if defined(_CUSTOM31_TUBES)
float _Custom31_Tubes_Speed;
+float _Custom31_Tubes_A;
+float _Custom31_Tubes_k;
+float _Custom31_Tubes_tk;
#endif // _CUSTOM31_TUBES
#endif // __GLOBALS_INC
diff --git a/interpolators.cginc b/interpolators.cginc
index 7fa53d5..9041e15 100644
--- a/interpolators.cginc
+++ b/interpolators.cginc
@@ -25,6 +25,9 @@ struct v2f {
float3 normal : TEXCOORD4;
float4 tangent : TEXCOORD5;
UNITY_LIGHTING_COORDS(6,7)
+#if defined(_CUSTOM31_FRAGMENT_NORMALS)
+ float3 objPos_orig : TEXCOORD8;
+#endif
UNITY_VERTEX_INPUT_INSTANCE_ID
UNITY_VERTEX_OUTPUT_STEREO
diff --git a/lighting.cginc b/lighting.cginc
index 6668459..17f1a0a 100644
--- a/lighting.cginc
+++ b/lighting.cginc
@@ -203,7 +203,7 @@ void GetLighting(v2f i, Pbr pbr, out LightData data) {
data.indirect.double_LoV = saturate(2.0f * indirect_LoV * indirect_LoV - 1.0f);
data.indirect.diffuse = getIndirectDiffuse(i, pbr, data.indirect);
- data.indirect.specular = getIndirectSpecular(i, pbr.roughness_perceptual, view_dir, data.indirect.dir);
+ data.indirect.specular = getIndirectSpecular(i, pbr.roughness, view_dir, data.indirect.dir);
#if defined(_CLEARCOAT)
data.indirect.specular_cc = getIndirectSpecular(i, pbr.cc_roughness, view_dir, dir_cc);
#endif
diff --git a/vertex.cginc b/vertex.cginc
new file mode 100644
index 0000000..0140ff2
--- /dev/null
+++ b/vertex.cginc
@@ -0,0 +1,31 @@
+#ifndef __VERTEX_INC
+#define __VERTEX_INC
+
+#include "custom31.hlsl"
+
+void deform(inout float3 objPos) {
+#if defined(_CUSTOM31_TUBES)
+ float A = _Custom31_Tubes_A;
+ float k = _Custom31_Tubes_k;
+ float t = _Time[2] * _Custom31_Tubes_tk;
+ objPos = c31_deform(objPos, A, k, t);
+#endif // _CUSTOM31_TUBES
+}
+
+void deform_normal(float3 objPos, inout float3 objNorm, inout float3 objTan) {
+#if defined(_CUSTOM31_TUBES)
+ float A = _Custom31_Tubes_A;
+ float k = _Custom31_Tubes_k;
+ float t = _Time[2] * _Custom31_Tubes_tk;
+ c31_deform_normal(objPos, objNorm, objTan, A, k, t);
+#endif // _CUSTOM31_TUBES
+}
+
+void propagateObjPos(inout v2f i) {
+ i.worldPos = mul(unity_ObjectToWorld, float4(i.objPos, 1));
+ i.pos = UnityObjectToClipPos(i.objPos);
+ i.eyeVec.xyz = i.worldPos - _WorldSpaceCameraPos;
+}
+
+#endif // __VERTEX_INC
+