summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authoryum <yum.food.vr@gmail.com>2025-10-12 21:52:50 -0700
committeryum <yum.food.vr@gmail.com>2025-10-12 21:52:50 -0700
commit228e555dbd07dd1a332a07770106dfd98f918c9b (patch)
tree8f058e1c897ba818dedc2564676f0278eddce128
parenta4bf31470f7e2855f13d922e3e7ad1c7767d9afd (diff)
fornite update
-rw-r--r--3ner.cginc12
-rw-r--r--3ner.shader96
-rw-r--r--brdf.cginc10
-rw-r--r--features.cginc21
-rw-r--r--globals.cginc24
-rw-r--r--interpolators.cginc2
-rw-r--r--vertex.cginc54
-rw-r--r--vertex_deformation.slang (renamed from custom31.slang)37
8 files changed, 160 insertions, 96 deletions
diff --git a/3ner.cginc b/3ner.cginc
index bac74ad..26b2a3d 100644
--- a/3ner.cginc
+++ b/3ner.cginc
@@ -28,14 +28,14 @@ v2f vert(appdata v) {
#endif
o.uv0 = v.uv0;
o.objPos = v.vertex;
-#if defined(_CUSTOM31_FRAGMENT_NORMALS) || defined(_CUSTOM31_TESSELLATION)
+#if defined(_VERTEX_DEFORMATION_FRAGMENT_NORMALS) || defined(_VERTEX_DEFORMATION_TESSELLATION)
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)
+#if !defined(_VERTEX_DEFORMATION_FRAGMENT_NORMALS)
deform_normal(o.objPos, o.normal.xyz, o.tangent.xyz);
#endif
deform(o.objPos);
@@ -158,7 +158,7 @@ v2f domain(
o.objPos = DOMAIN_INTERP(objPos);
#endif
-#if defined(_CUSTOM31_FRAGMENT_NORMALS) || defined(_CUSTOM31_TESSELLATION)
+#if defined(_VERTEX_DEFORMATION_FRAGMENT_NORMALS) || defined(_VERTEX_DEFORMATION_TESSELLATION)
o.objPos_orig = DOMAIN_INTERP(objPos_orig);
o.objPos = o.objPos_orig;
deform(o.objPos);
@@ -189,7 +189,7 @@ void geom(triangle v2f tri_in[3],
float3 n0 = v0.normal;
float3 n1 = v1.normal;
float3 n2 = v2.normal;
-#if defined(_CUSTOM31_FRAGMENT_NORMALS) || defined(_CUSTOM31_TESSELLATION)
+#if defined(_VERTEX_DEFORMATION_FRAGMENT_NORMALS) || defined(_VERTEX_DEFORMATION_TESSELLATION)
float3 tmp;
deform_normal(v0.objPos_orig, n0, tmp);
deform_normal(v1.objPos_orig, n1, tmp);
@@ -218,11 +218,11 @@ void geom(triangle v2f tri_in[3],
//endex
float4 frag(v2f i, uint facing : SV_IsFrontFace
-#if defined(_CUSTOM31_TUBES)
+#if defined(_VERTEX_DEFORMATION_TUBES)
, out float depth : SV_DepthLessEqual
#endif
) : SV_Target {
-#if defined(_CUSTOM31_FRAGMENT_NORMALS)
+#if defined(_VERTEX_DEFORMATION_FRAGMENT_NORMALS)
deform_normal(i.objPos_orig, i.normal, i.tangent.xyz);
#endif
diff --git a/3ner.shader b/3ner.shader
index aad3949..d8c9f56 100644
--- a/3ner.shader
+++ b/3ner.shader
@@ -55,61 +55,71 @@ Shader "yum_food/3ner"
[HideInInspector] m_end_Geometry_Shader("Geometry Shader", Float) = 0
//endex
- //ifex _Custom31_Enabled==0
- [HideInInspector] m_start_Custom31("Custom31", Float) = 0
- [ThryToggle(_CUSTOM31)] _Custom31_Enabled("Enable", Float) = 0
- [ThryToggle(_CUSTOM31_FRAGMENT_NORMALS)] _Custom31_Fragment_Normals_Enabled("Fragment normals", Float) = 0
- [ThryToggle(_CUSTOM31_TESSELLATION)] _Custom31_Tessellation_Enabled("Tesellation support", Float) = 1
-
- //ifex _Custom31_Tubes_Enabled==0
- [HideInInspector] m_start_Custom31_Tubes("Tubes", Float) = 0
- [ThryToggle(_CUSTOM31_TUBES)] _Custom31_Tubes_Enabled("Enable", Float) = 0
-
- //ifex _Custom31_XZ_Tube_Enabled==0
- [HideInInspector] m_start_Custom31_XZ_Tube("XZ Tube", Float) = 0
- [ThryToggle(_CUSTOM31_XZ_TUBE)] _Custom31_XZ_Tube_Enabled("Enable", Float) = 0
+ //ifex _Vertex_Deformation_Enabled==0
+ [HideInInspector] m_start_Vertex_Deformation("Vertex Deformation", Float) = 0
+ [ThryToggle(_VERTEX_DEFORMATION)] _Vertex_Deformation_Enabled("Enable", Float) = 0
+ [ThryToggle(_VERTEX_DEFORMATION_FRAGMENT_NORMALS)] _Vertex_Deformation_Fragment_Normals_Enabled("Fragment normals", Float) = 0
+ [ThryToggle(_VERTEX_DEFORMATION_TESSELLATION)] _Vertex_Deformation_Tessellation_Enabled("Tesellation support", Float) = 1
+
+ //ifex _Vertex_Deformation_Tubes_Enabled==0
+ [HideInInspector] m_start_Vertex_Deformation_Tubes("Tubes", Float) = 0
+ [ThryToggle(_VERTEX_DEFORMATION_TUBES)] _Vertex_Deformation_Tubes_Enabled("Enable", Float) = 0
+
+ //ifex _Vertex_Deformation_XZ_Tube_Enabled==0
+ [HideInInspector] m_start_Vertex_Deformation_XZ_Tube("XZ Tube", Float) = 0
+ [ThryToggle(_VERTEX_DEFORMATION_XZ_TUBE)] _Vertex_Deformation_XZ_Tube_Enabled("Enable", Float) = 0
// 0.999... limit prevents NaNs which show up at 1.0
- _Custom31_XZ_Tube_t("t", Range(-1,1)) = 0
- [HideInInspector] m_end_Custom31_XZ_Tube("XZ Tube", Float) = 0
+ _Vertex_Deformation_XZ_Tube_t("t", Range(-1,1)) = 0
+ [HideInInspector] m_end_Vertex_Deformation_XZ_Tube("XZ Tube", Float) = 0
//endex
- //ifex _Custom31_YZ_Tube_Enabled==0
- [HideInInspector] m_start_Custom31_YZ_Tube("YZ Tube", Float) = 0
- [ThryToggle(_CUSTOM31_YZ_TUBE)] _Custom31_YZ_Tube_Enabled("Enable", Float) = 0
- _Custom31_YZ_Tube_t("t", Range(-1,1)) = 0
- [HideInInspector] m_end_Custom31_YZ_Tube("YZ Tube", Float) = 0
+ //ifex _Vertex_Deformation_YZ_Tube_Enabled==0
+ [HideInInspector] m_start_Vertex_Deformation_YZ_Tube("YZ Tube", Float) = 0
+ [ThryToggle(_VERTEX_DEFORMATION_YZ_TUBE)] _Vertex_Deformation_YZ_Tube_Enabled("Enable", Float) = 0
+ _Vertex_Deformation_YZ_Tube_t("t", Range(-1,1)) = 0
+ [HideInInspector] m_end_Vertex_Deformation_YZ_Tube("YZ Tube", Float) = 0
//endex
- //ifex _Custom31_XY_Tube_Enabled==0
- [HideInInspector] m_start_Custom31_XY_Tube("XY Tube", Float) = 0
- [ThryToggle(_CUSTOM31_XY_TUBE)] _Custom31_XY_Tube_Enabled("Enable", Float) = 0
- _Custom31_XY_Tube_t("t", Range(-1,1)) = 0
- [HideInInspector] m_end_Custom31_XY_Tube("XY Tube", Float) = 0
+ //ifex _Vertex_Deformation_XY_Tube_Enabled==0
+ [HideInInspector] m_start_Vertex_Deformation_XY_Tube("XY Tube", Float) = 0
+ [ThryToggle(_VERTEX_DEFORMATION_XY_TUBE)] _Vertex_Deformation_XY_Tube_Enabled("Enable", Float) = 0
+ _Vertex_Deformation_XY_Tube_t("t", Range(-1,1)) = 0
+ [HideInInspector] m_end_Vertex_Deformation_XY_Tube("XY Tube", Float) = 0
//endex
- [HideInInspector] m_end_Custom31_Tubes("Tubes", Float) = 0
+ [HideInInspector] m_end_Vertex_Deformation_Tubes("Tubes", Float) = 0
//endex
- //ifex _UV_Scroll_Enabled==0
- [HideInInspector] m_start_UV_Scroll("UV Scroll", Float) = 0
- [ThryToggle(_UV_SCROLL)] _UV_Scroll_Enabled("Enable", Float) = 0
- _UV_Scroll_Speed("Speed (u, v, 0, 0)", Vector) = (0, -1, 0, 0)
- [HideInInspector] m_end_UV_Scroll("UV Scroll", Float) = 0
+ //ifex _Vertex_Deformation_Seal_Enabled==0
+ [HideInInspector] m_start_Vertex_Deformation_Seal("Seal", Float) = 0
+ [ThryToggle(_VERTEX_DEFORMATION_SEAL)] _Vertex_Deformation_Seal_Enabled("Enable", Float) = 0
+ _Vertex_Deformation_Seal_A("A", Range(0,1)) = 0.1
+ _Vertex_Deformation_Seal_k("k", Range(0,3)) = 1
+ _Vertex_Deformation_Seal_t("t", Range(0,1)) = 0.1
+ [HideInInspector] m_end_Vertex_Deformation_Seal("Seal", Float) = 0
//endex
- //ifex _Marble_Enabled==0
- [HideInInspector] m_start_Marble("Marble", Float) = 0
- [ThryToggle(_MARBLE)] _Marble_Enabled("Enable", Float) = 0
- [Gradient] _Marble_U_Ramp("U Ramp", 2D) = "white" {}
- [Gradient] _Marble_V_Ramp("V Ramp", 2D) = "white" {}
- [Gradient] _Marble_W_Ramp("W Ramp", 2D) = "white" {}
- _Marble_Scale("Scale", Vector) = (1, 1, 1, 0)
- _Marble_Strength("Strength", Float) = 1
- _Marble_Octaves("Octaves", Range(1, 10)) = 3
- [HideInInspector] m_end_Marble("Marble", Float) = 0
- //endex
+ [HideInInspector] m_end_Vertex_Deformation("Vertex Deformation", Float) = 0
+
+ //ifex _UV_Scroll_Enabled==0
+ [HideInInspector] m_start_UV_Scroll("UV Scroll", Float) = 0
+ [ThryToggle(_UV_SCROLL)] _UV_Scroll_Enabled("Enable", Float) = 0
+ _UV_Scroll_Speed("Speed (u, v, 0, 0)", Vector) = (0, -1, 0, 0)
+ [HideInInspector] m_end_UV_Scroll("UV Scroll", Float) = 0
+ //endex
+
+ //ifex _Marble_Enabled==0
+ [HideInInspector] m_start_Marble("Marble", Float) = 0
+ [ThryToggle(_MARBLE)] _Marble_Enabled("Enable", Float) = 0
+ [Gradient] _Marble_U_Ramp("U Ramp", 2D) = "white" {}
+ [Gradient] _Marble_V_Ramp("V Ramp", 2D) = "white" {}
+ [Gradient] _Marble_W_Ramp("W Ramp", 2D) = "white" {}
+ _Marble_Scale("Scale", Vector) = (1, 1, 1, 0)
+ _Marble_Strength("Strength", Float) = 1
+ _Marble_Octaves("Octaves", Range(1, 10)) = 3
+ [HideInInspector] m_end_Marble("Marble", Float) = 0
+ //endex
- [HideInInspector] m_end_Custom31("Custom31", Float) = 0
//endex
[HideInInspector] m_end_Gimmicks("Gimmicks", Float) = 0
diff --git a/brdf.cginc b/brdf.cginc
index d89558c..8352c08 100644
--- a/brdf.cginc
+++ b/brdf.cginc
@@ -138,7 +138,7 @@ float4 brdf(Pbr pbr, LightData data) {
// Direct
{
- float remainder = 1.0f;
+ float3 remainder = 1.0f;
#if defined(_CLEARCOAT)
float cc_f0 = 0.04f;
@@ -149,7 +149,7 @@ float4 brdf(Pbr pbr, LightData data) {
float3 direct_specular_cc = DFGcc * data.direct.color * data.direct.NoL_cc * pbr.cc_strength;
direct_specular_cc = max(0, direct_specular_cc);
specular += direct_specular_cc;
- remainder -= Fcc * pbr.cc_strength;
+ remainder = saturate(remainder - direct_specular_cc);
#endif
#if defined(_CLOTH_SHEEN)
@@ -173,7 +173,7 @@ float4 brdf(Pbr pbr, LightData data) {
float3 direct_specular = FDG * remainder * data.direct.color * data.direct.NoL * lerp(1.0f, pbr.albedo.xyz, pbr.metallic);
direct_specular = max(0, direct_specular);
specular += direct_specular;
- remainder -= F;
+ remainder = saturate(remainder - direct_specular);
float Fd = Fd_OrenNayar(pbr.roughness, data.common.NoV, data.direct.NoL, data.direct.LoV) / PI;
float3 direct_diffuse = Fd * remainder * (1.0f - pbr.metallic) * pbr.albedo.xyz * data.direct.color;
@@ -184,7 +184,7 @@ float4 brdf(Pbr pbr, LightData data) {
// Indirect
#if defined(FORWARD_BASE_PASS)
{
- float remainder = 1.0f;
+ float3 remainder = 1.0f;
float2 dfg_uv = float2(pbr.roughness, data.common.NoV);
#if defined(_CLEARCOAT)
@@ -192,7 +192,7 @@ float4 brdf(Pbr pbr, LightData data) {
float Fcc = F_Schlick(data.common.NoV, cc_f0, 1.0f);
float3 indirect_specular_cc = Fcc * data.indirect.specular_cc * pbr.cc_strength;
specular += indirect_specular_cc;
- remainder -= Fcc * pbr.cc_strength;
+ remainder = saturate(remainder - indirect_specular_cc);
#endif
#if defined(_CLOTH_SHEEN)
diff --git a/features.cginc b/features.cginc
index ce8d07d..5ab9cb6 100644
--- a/features.cginc
+++ b/features.cginc
@@ -23,16 +23,21 @@
#pragma shader_feature_local _CLOTH_SHEEN
//endex
-//ifex _Custom31_Enabled==0
-#pragma shader_feature_local _CUSTOM31
-#pragma shader_feature_local _CUSTOM31_FRAGMENT_NORMALS
+//ifex _Vertex_Deformation_Enabled==0
+#pragma shader_feature_local _VERTEX_DEFORMATION
+#pragma shader_feature_local _VERTEX_DEFORMATION_FRAGMENT_NORMALS
+#pragma shader_feature_local _VERTEX_DEFORMATION_TESSELLATION
//endex
-//ifex _Custom31_Tubes_Enabled==0
-#pragma shader_feature_local _CUSTOM31_TUBES
-#pragma shader_feature_local _CUSTOM31_XZ_TUBE
-#pragma shader_feature_local _CUSTOM31_YZ_TUBE
-#pragma shader_feature_local _CUSTOM31_XY_TUBE
+//ifex _Vertex_Deformation_Tubes_Enabled==0
+#pragma shader_feature_local _VERTEX_DEFORMATION_TUBES
+#pragma shader_feature_local _VERTEX_DEFORMATION_XZ_TUBE
+#pragma shader_feature_local _VERTEX_DEFORMATION_YZ_TUBE
+#pragma shader_feature_local _VERTEX_DEFORMATION_XY_TUBE
+//endex
+
+//ifex _Vertex_Deformation_Seal_Enabled==0
+#pragma shader_feature_local _VERTEX_DEFORMATION_SEAL
//endex
//ifex _Unlit==0
diff --git a/globals.cginc b/globals.cginc
index 3ba2e60..c460285 100644
--- a/globals.cginc
+++ b/globals.cginc
@@ -58,15 +58,21 @@ float3 _Cloth_Sheen_Color;
texture2D _Cloth_Sheen_DFG_LUT;
#endif // _CLOTH_SHEEN
-#if defined(_CUSTOM31_XY_TUBE)
-float _Custom31_XY_Tube_t;
-#endif // _CUSTOM31_XY_TUBE
-#if defined(_CUSTOM31_XZ_TUBE)
-float _Custom31_XZ_Tube_t;
-#endif // _CUSTOM31_XZ_TUBE
-#if defined(_CUSTOM31_YZ_TUBE)
-float _Custom31_YZ_Tube_t;
-#endif // _CUSTOM31_YZ_TUBE
+#if defined(_VERTEX_DEFORMATION_XY_TUBE)
+float _Vertex_Deformation_XY_Tube_t;
+#endif // _VERTEX_DEFORMATION_XY_TUBE
+#if defined(_VERTEX_DEFORMATION_XZ_TUBE)
+float _Vertex_Deformation_XZ_Tube_t;
+#endif // _VERTEX_DEFORMATION_XZ_TUBE
+#if defined(_VERTEX_DEFORMATION_YZ_TUBE)
+float _Vertex_Deformation_YZ_Tube_t;
+#endif // _VERTEX_DEFORMATION_YZ_TUBE
+
+#if defined(_VERTEX_DEFORMATION_SEAL)
+float _Vertex_Deformation_Seal_A;
+float _Vertex_Deformation_Seal_k;
+float _Vertex_Deformation_Seal_t;
+#endif // _VERTEX_DEFORMATION_SEAL
#if defined(_UV_SCROLL)
float2 _UV_Scroll_Speed;
diff --git a/interpolators.cginc b/interpolators.cginc
index f9f389c..842861a 100644
--- a/interpolators.cginc
+++ b/interpolators.cginc
@@ -25,7 +25,7 @@ struct v2f {
float3 normal : TEXCOORD4;
float4 tangent : TEXCOORD5;
UNITY_LIGHTING_COORDS(6,7)
-#if defined(_CUSTOM31_FRAGMENT_NORMALS) || defined(_CUSTOM31_TESSELLATION)
+#if defined(_VERTEX_DEFORMATION_FRAGMENT_NORMALS) || defined(_VERTEX_DEFORMATION_TESSELLATION)
float3 objPos_orig : TEXCOORD8;
#endif
diff --git a/vertex.cginc b/vertex.cginc
index 58c5209..730adfe 100644
--- a/vertex.cginc
+++ b/vertex.cginc
@@ -1,51 +1,67 @@
#ifndef __VERTEX_INC
#define __VERTEX_INC
-#include "custom31.hlsl"
+#include "vertex_deformation.hlsl"
void deform(inout float3 objPos) {
float t_eps = 1e-9;
-#if defined(_CUSTOM31_XZ_TUBE)
+#if defined(_VERTEX_DEFORMATION_XZ_TUBE)
{
- float t = clamp(_Custom31_XZ_Tube_t, -1+t_eps, 1-t_eps);;
+ float t = clamp(_Vertex_Deformation_XZ_Tube_t, -1+t_eps, 1-t_eps);;
objPos = plane_to_tube(objPos.xyz, t);
}
-#endif // _CUSTOM31_XZ_TUBE
-#if defined(_CUSTOM31_YZ_TUBE)
+#endif // _VERTEX_DEFORMATION_XZ_TUBE
+#if defined(_VERTEX_DEFORMATION_YZ_TUBE)
{
- float t = clamp(_Custom31_YZ_Tube_t, -1+t_eps, 1-t_eps);
+ float t = clamp(_Vertex_Deformation_YZ_Tube_t, -1+t_eps, 1-t_eps);
objPos = plane_to_tube(objPos.yxz, t);
objPos = objPos.yxz;
}
-#endif // _CUSTOM31_YZ_TUBE
-#if defined(_CUSTOM31_XY_TUBE)
+#endif // _VERTEX_DEFORMATION_YZ_TUBE
+#if defined(_VERTEX_DEFORMATION_XY_TUBE)
{
- float t = clamp(_Custom31_XY_Tube_t, -1+t_eps, 1-t_eps);
+ float t = clamp(_Vertex_Deformation_XY_Tube_t, -1+t_eps, 1-t_eps);
objPos = plane_to_tube(objPos.xzy, t);
objPos = objPos.xzy;
}
-#endif // _CUSTOM31_XY_TUBE
+#endif // _VERTEX_DEFORMATION_XY_TUBE
+#if defined(_VERTEX_DEFORMATION_SEAL)
+ {
+ float A = _Vertex_Deformation_Seal_A;
+ float k = _Vertex_Deformation_Seal_k;
+ float t = _Time[3] * _Vertex_Deformation_Seal_t;
+ objPos = seal(objPos.xyz, A, k, t);
+ }
+#endif // _VERTEX_DEFORMATION_SEAL
}
void deform_normal(float3 objPos, inout float3 objNorm, inout float3 objTan) {
-#if defined(_CUSTOM31_XZ_TUBE)
+#if defined(_VERTEX_DEFORMATION_XZ_TUBE)
{
- float t = _Custom31_XZ_Tube_t;
+ float t = _Vertex_Deformation_XZ_Tube_t;
plane_to_tube_normal(objPos, objNorm, objTan, t);
}
-#endif // _CUSTOM31_XZ_TUBE
-#if defined(_CUSTOM31_YZ_TUBE)
+#endif // _VERTEX_DEFORMATION_XZ_TUBE
+#if defined(_VERTEX_DEFORMATION_YZ_TUBE)
{
- float t = _Custom31_YZ_Tube_t;
+ float t = _Vertex_Deformation_YZ_Tube_t;
plane_to_tube_normal(objPos.yxz, objNorm.yxz, objTan.yxz, t);
}
-#endif // _CUSTOM31_YZ_TUBE
-#if defined(_CUSTOM31_XY_TUBE)
+#endif // _VERTEX_DEFORMATION_YZ_TUBE
+#if defined(_VERTEX_DEFORMATION_XY_TUBE)
{
- float t = _Custom31_XY_Tube_t;
+ float t = _Vertex_Deformation_XY_Tube_t;
plane_to_tube_normal(objPos.xzy, objNorm.xzy, objTan.xzy, t);
}
-#endif // _CUSTOM31_XY_TUBE
+#endif // _VERTEX_DEFORMATION_XY_TUBE
+#if defined(_VERTEX_DEFORMATION_SEAL)
+ {
+ float A = _Vertex_Deformation_Seal_A;
+ float k = _Vertex_Deformation_Seal_k;
+ float t = _Time[0] * _Vertex_Deformation_Seal_t;
+ seal_normal(objPos, objNorm, objTan, A, k, t);
+ }
+#endif // _VERTEX_DEFORMATION_SEAL
}
void propagateObjPos(inout v2f i) {
diff --git a/custom31.slang b/vertex_deformation.slang
index 441daeb..63ce1a4 100644
--- a/custom31.slang
+++ b/vertex_deformation.slang
@@ -4,7 +4,7 @@
#define PI 3.14159265f
#define PI_RCP 0.31830988f
-// Differentiable absolute value.
+// Differentiable versions of common operators.
#define dabs(x) length(float2(x, 1e-6))
#define dlerp(x, y, t) ((x) * (1-t) + (y) * t)
@@ -29,8 +29,8 @@
); \
float jac_det = determinant(jacobian); \
float3x3 itjac = inverse(transpose(jacobian), jac_det); \
- normal = normalize(mul(itjac, normal)) * sign(jac_det); \
- tangent = normalize(mul(jacobian, tangent))
+ normal = mul(itjac, normal) * sign(jac_det); \
+ tangent = mul(jacobian, tangent)
// Syntactic sugar - wraps the previous three macros.
#define R3R3_NORMALS(normal, tangent, fun, ...) \
@@ -39,7 +39,7 @@
R3R3_DEFORM_NORMAL_AND_TANGENT(normal, tangent)
float3x3 inverse(float3x3 m, float det) {
- if (abs(det) < 1e-6) {
+ if (abs(det) < 1e-9) {
return float3x3(
1,0,0,
0,1,0,
@@ -71,7 +71,7 @@ public float3 plane_to_tube(float3 xyz, no_diff float t) {
float z0 = xyz.z;
float theta = x0 * PI;
- float radius = min(1e3, (1.0f / (t * t))) * sign(t) ;
+ float radius = ((1.0f - z0) / (t * t + 1e-3)) * sign(t);
float x = sin(theta / radius) * radius * PI_RCP;
// The z0 term here is required to make the jacobian invertible.
@@ -85,5 +85,32 @@ public void plane_to_tube_normal(float3 xyz, inout float3 normal,
R3R3_NORMALS(normal, tangent, plane_to_tube, t);
}
+[Differentiable]
+public float3 seal(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 seal_normal(float3 xyz, inout float3 normal,
+ inout float3 tangent, float A, float k, float t) {
+ R3R3_NORMALS(normal, tangent, seal, A, k, t);
+}
+
#endif // __CUSTOM31_INC