@@ -2443,6 +2443,75 @@ fn ray_vs_obb_test() {
24432443 assert_eq ! ( approx( result. unwrap( ) , vec3f( 6.33623 , -4.17592 , 2.52359 ) , 0.0001 ) , true ) ;
24442444}
24452445
2446+ #[ test]
2447+ fn ray_vs_sphere_test ( ) {
2448+ let sp = Vec3f :: zero ( ) ;
2449+ let r = 100.0 ;
2450+
2451+ // hit w/ intersection point
2452+ let rp = Vec3f :: new ( 0.0 , 0.0 , -1000.0 ) ;
2453+ let rv = Vec3f :: unit_z ( ) ;
2454+ let result = ray_vs_sphere ( rp, rv, sp, r) ;
2455+ assert_eq ! ( result. is_some( ) , true ) ;
2456+ if let Some ( ip) = result {
2457+ assert_eq ! ( ip, Vec3f :: new( 0.0 , 0.0 , -100.0 ) ) ;
2458+ }
2459+
2460+ let rp = Vec3f :: new ( 0.0 , 0.0 , 1000.0 ) ;
2461+ let rv = -Vec3f :: unit_z ( ) ;
2462+ let result = ray_vs_sphere ( rp, rv, sp, r) ;
2463+ assert_eq ! ( result. is_some( ) , true ) ;
2464+ if let Some ( ip) = result {
2465+ assert_eq ! ( ip, Vec3f :: new( 0.0 , 0.0 , 100.0 ) ) ;
2466+ }
2467+
2468+ let rp = Vec3f :: new ( -500.0 , 0.0 , 0.0 ) ;
2469+ let rv = Vec3f :: unit_x ( ) ;
2470+ let result = ray_vs_sphere ( rp, rv, sp, r) ;
2471+ assert_eq ! ( result. is_some( ) , true ) ;
2472+ if let Some ( ip) = result {
2473+ assert_eq ! ( ip, Vec3f :: new( -100.0 , 0.0 , 0.0 ) ) ;
2474+ }
2475+
2476+ let rp = Vec3f :: new ( 500.0 , 0.0 , 0.0 ) ;
2477+ let rv = -Vec3f :: unit_x ( ) ;
2478+ let result = ray_vs_sphere ( rp, rv, sp, r) ;
2479+ assert_eq ! ( result. is_some( ) , true ) ;
2480+ if let Some ( ip) = result {
2481+ assert_eq ! ( ip, Vec3f :: new( 100.0 , 0.0 , 0.0 ) ) ;
2482+ }
2483+
2484+ // misses around axis
2485+ // +
2486+ // - 0 +
2487+ // -
2488+ let rp = Vec3f :: new ( 101.0 , 0.0 , -1000.0 ) ;
2489+ let rv = Vec3f :: unit_z ( ) ;
2490+ let result = ray_vs_sphere ( rp, rv, sp, r) ;
2491+ assert_eq ! ( result. is_none( ) , true ) ;
2492+
2493+ let rp = Vec3f :: new ( -101.0 , 0.0 , -1000.0 ) ;
2494+ let rv = Vec3f :: unit_z ( ) ;
2495+ let result = ray_vs_sphere ( rp, rv, sp, r) ;
2496+ assert_eq ! ( result. is_none( ) , true ) ;
2497+
2498+ let rp = Vec3f :: new ( 0.0 , -101.0 , -1000.0 ) ;
2499+ let rv = Vec3f :: unit_z ( ) ;
2500+ let result = ray_vs_sphere ( rp, rv, sp, r) ;
2501+ assert_eq ! ( result. is_none( ) , true ) ;
2502+
2503+ let rp = Vec3f :: new ( 0.0 , 101.0 , -1000.0 ) ;
2504+ let rv = Vec3f :: unit_z ( ) ;
2505+ let result = ray_vs_sphere ( rp, rv, sp, r) ;
2506+ assert_eq ! ( result. is_none( ) , true ) ;
2507+
2508+ // hits, not testing intersection points
2509+ let rp = Vec3f :: new ( 10.0 , 1000.0 , -1000.0 ) ;
2510+ let rv = normalize ( Vec3f :: unit_z ( ) + ( -Vec3f :: unit_y ( ) ) ) ;
2511+ let result = ray_vs_sphere ( rp, rv, sp, r) ;
2512+ assert_eq ! ( result. is_some( ) , true ) ;
2513+ }
2514+
24462515#[ test]
24472516fn sphere_vs_frustum_test ( ) {
24482517 let planes = Mat4f :: new (
0 commit comments