summaryrefslogtreecommitdiffstats
path: root/trochoid_math.cginc
diff options
context:
space:
mode:
authoryum <yum.food.vr@gmail.com>2025-01-17 01:13:49 -0800
committeryum <yum.food.vr@gmail.com>2025-01-17 01:13:49 -0800
commitbee103e89fc83030bfc0251db5a78bb153042e1f (patch)
tree5298edf99718d13d64d69efe2a0ff63bed1337b4 /trochoid_math.cginc
parentb28359aefb16151c7c835dadfe27b969ea8fe702 (diff)
Use quad intrinsics to compute trochoid normals
Simple algo. Use quad intrinsics to get neighboring pixels' (x & y) positions in trochoid space. Compute tangent and bitangent from that. Then normal as cross product. There's some artifacting on diagonal boundaries.
Diffstat (limited to 'trochoid_math.cginc')
-rw-r--r--trochoid_math.cginc43
1 files changed, 27 insertions, 16 deletions
diff --git a/trochoid_math.cginc b/trochoid_math.cginc
index 3a5107e..82daf9c 100644
--- a/trochoid_math.cginc
+++ b/trochoid_math.cginc
@@ -17,16 +17,22 @@ float3 cyl2_to_troch_map(float3 v)
const float d = _Trochoid_d;
const float rrrr = (R - r) * R / r;
+ float rr_gcd = gcd(round(R), round(r));
+ float rr_lcm = (R * r) / rr_gcd;
+ float rr_lcm_factor = rr_lcm / R;
+ float toff = _Time[0] * _Trochoid_Speed;
+
float x =
- cos(v.x * R) * v.y * (R - r) * TROCH_POSITION_SCALE +
- cos(v.x * rrrr) * v.y * d * TROCH_POSITION_SCALE;
+ cos(v.x * rr_lcm_factor * R + toff * 2.3 + toff) * v.y * (R - r) * TROCH_POSITION_SCALE +
+ cos(v.x * rr_lcm_factor * rrrr - toff * 2.9 + toff) * v.y * d * TROCH_POSITION_SCALE;
float y =
- sin(v.x * R) * v.y * (R - r) * TROCH_POSITION_SCALE -
- sin(v.x * rrrr) * v.y * d * TROCH_POSITION_SCALE;
+ sin(v.x * rr_lcm_factor * R - toff * 3.1 + toff) * v.y * (R - r) * TROCH_POSITION_SCALE -
+ sin(v.x * rr_lcm_factor * rrrr + toff * 3.7 + toff) * v.y * d * TROCH_POSITION_SCALE;
float z =
- (v.x * v.y * R * TROCH_Z_THETA_SCALE +
- cos(v.x * R * 5) * v.y * TROCH_POSITION_SCALE +
- v.y * v.z);
+ (v.x * v.y * rr_lcm_factor * R * TROCH_Z_THETA_SCALE +
+ cos(v.x * rr_lcm_factor * R * 5 + toff * 4.1 + toff) * v.y * TROCH_POSITION_SCALE +
+ //v.y * v.z);
+ v.z);
return float3(x, y, z);
}
@@ -63,25 +69,30 @@ float3x3 cyl2_to_troch_jacobian(float3 v)
const float d = _Trochoid_d;
const float rrrr = (R - r) * R / r;
+ float rr_gcd = gcd(round(R), round(r));
+ float rr_lcm = (R * r) / rr_gcd;
+ float rr_lcm_factor = rr_lcm / R;
+ float toff = _Time[0] * _Trochoid_Speed;
+
#if 1
float3 df_dt = float3(
- -R * sin(v.x * R) * v.y * (R - r) * TROCH_POSITION_SCALE +
- -rrrr * sin(v.x * rrrr) * v.y * d * TROCH_POSITION_SCALE,
+ -R * rr_lcm_factor * sin(v.x * rr_lcm_factor * R + toff * 2.3 + toff) * v.y * (R - r) * TROCH_POSITION_SCALE +
+ -rrrr * rr_lcm_factor * sin(v.x * rr_lcm_factor * rrrr - toff * 2.9 + toff) * v.y * d * TROCH_POSITION_SCALE,
- R * cos(v.x * R) * v.y * (R - r) * TROCH_POSITION_SCALE -
- rrrr * cos(v.x * rrrr) * v.y * d * TROCH_POSITION_SCALE,
+ R * rr_lcm_factor * cos(v.x * rr_lcm_factor * R - toff * 3.1 + toff) * v.y * (R - r) * TROCH_POSITION_SCALE -
+ rrrr * rr_lcm_factor * cos(v.x * rr_lcm_factor * rrrr + toff * 3.7 + toff) * v.y * d * TROCH_POSITION_SCALE,
v.y * R * TROCH_Z_THETA_SCALE -
- R * 5 * sin(v.x * R * 5) * v.y * TROCH_POSITION_SCALE);
+ R * rr_lcm_factor *5 * sin(v.x * rr_lcm_factor * R * 5 + toff * 4.1 + toff) * v.y * TROCH_POSITION_SCALE);
#else
float3 df_dt = (cyl2_to_troch_map(v + float3(TROCH_EPSILON, 0, 0)) - cyl2_to_troch_map(v - float3(TROCH_EPSILON, 0, 0))) / (2 * TROCH_EPSILON);
#endif
#if 1
float3 df_dr = float3(
- ((R - r) * cos(v.x * R) + d * cos((R - r) * v.x * R / r)) * TROCH_POSITION_SCALE,
- ((R - r) * sin(v.x * R) - d * sin((R - r) * v.x * R / r)) * TROCH_POSITION_SCALE,
- cos(v.x * R * 5) * TROCH_POSITION_SCALE);
+ ((R - r) * rr_lcm_factor * cos(v.x * rr_lcm_factor * R + toff * 2.3) + d * rr_lcm_factor * cos((R - r) * v.x * rr_lcm_factor * R / r + toff * 2.9)) * TROCH_POSITION_SCALE,
+ ((R - r) * rr_lcm_factor * sin(v.x * rr_lcm_factor * R + toff * 3.1) - d * rr_lcm_factor * sin((R - r) * v.x * rr_lcm_factor * R / r + toff * 3.7)) * TROCH_POSITION_SCALE,
+ rr_lcm_factor * cos(v.x * rr_lcm_factor * R * 5 + toff * 4.1) * TROCH_POSITION_SCALE);
#else
float3 df_dr = (cyl2_to_troch_map(v + float3(0, TROCH_EPSILON, 0)) - cyl2_to_troch_map(v - float3(0, TROCH_EPSILON, 0))) / (2 * TROCH_EPSILON);
#endif
@@ -90,7 +101,7 @@ float3x3 cyl2_to_troch_jacobian(float3 v)
float3 df_dz = float3(
0,
0,
- v.y);
+ 1);
#else
float3 df_dz = (cyl2_to_troch_map(v + float3(0, 0, TROCH_EPSILON)) - cyl2_to_troch_map(v - float3(0, 0, TROCH_EPSILON))) / (2 * TROCH_EPSILON);
#endif