@@ -2373,44 +2373,24 @@ float CheapTorusIntersect( vec3 rayOrigin, vec3 rayDirection, float torusHoleSiz
2373
2373
float t0, t1;
2374
2374
float t = INFINITY;
2375
2375
2376
- // Torus Inside (Hyperboloid )
2376
+ // Torus Outside (partial Sphere, with top and bottom portions removed )
2377
2377
// quadratic equation coefficients
2378
- float a = (rd.x * rd.x) + (rd.z * rd.z) - (rd.y * rd.y);
2379
- float b = 2.0 * ((rd.x * ro.x) + (rd.z * ro.z) - (rd.y * ro.y));
2380
- float c = (ro.x * ro.x) + (ro.z * ro.z) - (ro.y * ro.y) - torusHoleSize;
2381
-
2382
- solveQuadratic(a, b, c, t0, t1);
2378
+ float a = dot(rd, rd);
2379
+ float b = 2.0 * dot(rd, ro);
2380
+ float c = dot(ro, ro) - (torusHoleSize + 2.0);
2383
2381
2384
- if (t1 > 0.0)
2385
- {
2386
- ip = ro + (rd * t1);
2387
- if (abs(ip.y) < 1.0)
2388
- {
2389
- n = vec3( ip.x, -ip.y, ip.z );
2390
- n = dot(rd, n) < 0.0 ? n : -n;
2391
- t = t1;
2392
- }
2393
- }
2382
+ solveQuadratic(a, b, c, t0, t1);
2394
2383
2395
2384
if (t0 > 0.0)
2396
2385
{
2397
2386
ip = ro + (rd * t0);
2398
2387
if (abs(ip.y) < 1.0)
2399
2388
{
2400
- n = vec3( ip.x, -ip.y, ip.z );
2401
- n = dot(rd, n) < 0.0 ? n : -n;
2389
+ n = ip;
2402
2390
t = t0;
2403
2391
}
2404
2392
}
2405
2393
2406
- // Torus Outside (partial Sphere, with top and bottom portions removed)
2407
- // quadratic equation coefficients
2408
- a = dot(rd, rd);
2409
- b = 2.0 * dot(rd, ro);
2410
- c = dot(ro, ro) - (torusHoleSize + 2.0);
2411
-
2412
- solveQuadratic(a, b, c, t0, t1);
2413
-
2414
2394
if (t1 > 0.0 && t1 < t)
2415
2395
{
2416
2396
ip = ro + (rd * t1);
@@ -2421,16 +2401,36 @@ float CheapTorusIntersect( vec3 rayOrigin, vec3 rayDirection, float torusHoleSiz
2421
2401
}
2422
2402
}
2423
2403
2404
+ // Torus Inside (Hyperboloid)
2405
+ // quadratic equation coefficients
2406
+ a = (rd.x * rd.x) + (rd.z * rd.z) - (rd.y * rd.y);
2407
+ b = 2.0 * ((rd.x * ro.x) + (rd.z * ro.z) - (rd.y * ro.y));
2408
+ c = (ro.x * ro.x) + (ro.z * ro.z) - (ro.y * ro.y) - torusHoleSize;
2409
+
2410
+ solveQuadratic(a, b, c, t0, t1);
2411
+
2424
2412
if (t0 > 0.0 && t0 < t)
2425
2413
{
2426
2414
ip = ro + (rd * t0);
2427
2415
if (abs(ip.y) < 1.0)
2428
2416
{
2429
- n = ip;
2417
+ n = vec3( ip.x, -ip.y, ip.z );
2418
+ n = dot(rd, n) < 0.0 ? n : -n;
2430
2419
t = t0;
2431
2420
}
2432
2421
}
2433
2422
2423
+ if (t1 > 0.0 && t1 < t)
2424
+ {
2425
+ ip = ro + (rd * t1);
2426
+ if (abs(ip.y) < 1.0)
2427
+ {
2428
+ n = vec3( ip.x, -ip.y, ip.z );
2429
+ n = dot(rd, n) < 0.0 ? n : -n;
2430
+ t = t1;
2431
+ }
2432
+ }
2433
+
2434
2434
return t;
2435
2435
}
2436
2436
` ;
0 commit comments