package RaycastTests import Raycast constant EPSILON = 0.0001 @Test function testProjection2d() let ray = ray2d(vec2(-5, 3), vec2(1, 1)) var test = vec2(-4, 8).project(ray) test.intersects.assertTrue() test.point.assertEquals(vec2(-2, 6)) test.distance.assertEquals(4.2426, EPSILON) test = vec2(-9, 0).project(ray) test.intersects.assertTrue() test.point.assertEquals(ray.origin) test.distance.assertEquals(0, EPSILON) test = vec2(-9, 0).project(ray2d(vec2(-5, 3), vec2(0, 0))) test.intersects.assertFalse() @Test function testLine() let ray = ray2d(vec2(4, 2), vec2(-1, 1)) var test = ray.castToLine(vec2(-3, -2), vec2(2, 4)) test.intersects.assertTrue() test.distance.assertEquals(2.8284, EPSILON) test.point.assertEquals(vec2(2, 4)) test = ray.castToLine(vec2(-3, -2), vec2(5, 1)) test.intersects.assertFalse() test = ray.castToLine(vec2(-3, -2), vec2(-4, -1)) test.intersects.assertFalse() test = ray.castToLine(vec2(-3, -2), vec2(0.50001, 0.00001)) test.intersects.assertTrue() test.distance.assertEquals(0, EPSILON) @Test function testRay() let ray = ray2d(vec2(4, 2), vec2(-1, 1)) var test = ray.castToRay(vec2(-3, -2), vec2(1.5, 4)) test.intersects.assertTrue() test.point.assertEquals(vec2(0, 6)) test.distance.assertEquals(5.65685, EPSILON) test = ray.castToRay(vec2(-3, -2), vec2(-1, 1)) test.intersects.assertFalse() test = ray.castToRay(vec2(-3, -2), vec2(3.50001, 2.00001)) test.intersects.assertTrue() test.distance.assertEquals(0, EPSILON) @Test function testSegment() let ray = ray2d(vec2(4, 2), vec2(-1, 1)) var test = ray.castToSegment(vec2(8, 5), vec2(-4, 3)) test.intersects.assertTrue() test.point.assertEquals(vec2(2, 4)) test.distance.assertEquals(2.8284, EPSILON) test = ray.castToSegment(vec2(0, 6), vec2(4, 2)) test.intersects.assertFalse() test = ray.castToSegment(vec2(6, 25), vec2(5, -2)) test.intersects.assertFalse() test = ray.castToSegment(vec2(3, 1), vec2(5, 3)) test.intersects.assertTrue() test.point.assertEquals(vec2(4, 2)) test.distance.assertEquals(0, EPSILON) @Test function testCircle() let ray = ray2d(vec2(0, 6), vec2(1, -1)) var test = ray.castToCircle(vec2(2, 4), 1.414213) test.first.intersects.assertTrue() test.first.point.assertEquals(vec2(1, 5)) test.first.distance.assertEquals(1.414213, EPSILON) test.second.intersects.assertTrue() test.second.point.assertEquals(vec2(3, 3)) test.second.distance.assertEquals(4.2426, EPSILON) test = ray.castToCircle(vec2(-2, 4), 2.828427) test.first.intersects.assertTrue() test.first.point.assertEquals(vec2(0, 6)) test.first.distance.assertEquals(0, EPSILON) test.second.intersects.assertFalse() test = ray.castToCircle(vec2(-1, 7), 2.828427) test.first.intersects.assertTrue() test.first.point.assertEquals(vec2(1, 5)) test.first.distance.assertEquals(1.414213, EPSILON) test.second.intersects.assertFalse() test = ray.castToCircle(vec2(-2, 8), 2.828427) test.first.intersects.assertTrue() test.first.point.assertEquals(vec2(0, 6)) test.first.distance.assertEquals(0, EPSILON) test.second.intersects.assertFalse() test = ray.castToCircle(vec2(-3, -2), 3.5) test.first.intersects.assertFalse() test.second.intersects.assertFalse() test = ray.castToCircle(vec2(-2, 8), 1) test.first.intersects.assertFalse() test.second.intersects.assertFalse() @Test function testProjection3d() let ray = ray3d(vec3(-5, 3, 0), vec3(1, 1, 0)) var test = vec3(-4, 8, 12).project(ray) test.intersects.assertTrue() test.point.assertEquals(vec3(-2, 6, 0)) test.distance.assertEquals(4.2426, EPSILON) test = vec3(-9, 0, -1).project(ray) test.intersects.assertTrue() test.point.assertEquals(ray.origin) test.distance.assertEquals(0, EPSILON) test = vec3(-9, 0, 45).project(ray3d(vec3(-5, 3, 8), vec3(0, 0, 0))) test.intersects.assertFalse() @Test function testPlane() let ray = ray3d(vec3(0, 0, 0), vec3(0, -1, 1)) var test = ray.castToPlane(vec3(1, -5, 5), vec3(0, -1, 1)) test.intersects.assertTrue() test.point.assertEquals(vec3(0, -5, 5)) test.distance.assertEquals(7.071, EPSILON) test.backface.assertFalse() test = ray.castToPlane(vec3(1, -5, 5), vec3(0, 1, -1)) test.intersects.assertTrue() test.backface.assertTrue() test = ray.castToPlane(vec3(1, -5, 5), vec3(0, 1, 1)) test.intersects.assertFalse() test = ray.castToPlane(vec3(1, 5, 5), vec3(0, -1, 1)) test.intersects.assertTrue() test.distance.assertEquals(0, EPSILON) test = ray.castToPlane(vec3(1, 6, 5), vec3(0, -1, 1)) test.intersects.assertFalse() @Test function testDisk() let ray = ray3d(vec3(0, 0, 0), vec3(0, -1, 1)) var test = ray.castToDisk(vec3(1, -5, 5), vec3(0, -1, 1), 25) test.intersects.assertTrue() test.point.assertEquals(vec3(0, -5, 5)) test.distance.assertEquals(7.071, EPSILON) test.backface.assertFalse() test = ray.castToDisk(vec3(1, -5, 5), vec3(0, -1, 1), 0.5) test.intersects.assertFalse() @Test function testSphere() let ray = ray3d(vec3(2, 1, -6), vec3(1, 0, 1)) var test = ray.castToSphere(vec3(5, 4, -3), 3) test.first.intersects.assertTrue() test.first.point.assertEquals(vec3(5, 1, -3)) test.first.distance.assertEquals(4.2426, EPSILON) test.first.backface.assertFalse() test.second.intersects.assertFalse() test = ray.castToSphere(vec3(3, 1, -2), 3) test.first.intersects.assertTrue() test.first.point.assertEquals(vec3(3, 1, -5)) test.first.distance.assertEquals(1.4142, EPSILON) test.first.backface.assertFalse() test.second.intersects.assertTrue() test.second.point.assertEquals(vec3(6, 1, -2)) test.second.distance.assertEquals(5.6568, EPSILON) test.second.intersects.assertTrue() test = ray.castToSphere(vec3(3, 1, -5), 3) test.first.intersects.assertTrue() test.first.point.assertEquals(vec3(5.121321, 1, -2.87868)) test.first.distance.assertEquals(4.4142, EPSILON) test.first.backface.assertTrue() test.second.intersects.assertFalse() test = ray.castToSphere(vec3(-2, 1, -8), 3) test.first.intersects.assertFalse() test.second.intersects.assertFalse() test = ray.castToSphere(vec3(1, 5, -2), 3) test.first.intersects.assertFalse() test.second.intersects.assertFalse() @Test function testTriangle() let ray = ray3d(vec3(-2, 1, 3), vec3(-0.2, 0.7, 0.3)) var test = ray.castToTriangle(vec3(1, 6, 8), vec3(-5, 9, 5), vec3(-7, 7, 7)) test.intersects.assertTrue() test.point.assertEquals(vec3(-4, 8, 6)) test.distance.assertEquals(7.874, EPSILON) test.backface.assertTrue() test = ray.castToTriangle(vec3(1, 6, 8), vec3(-7, 7, 7), vec3(-5, 9, 5)) test.intersects.assertTrue() test.point.assertEquals(vec3(-4, 8, 6)) test.distance.assertEquals(7.874, EPSILON) test.backface.assertFalse() test = ray.castToTriangle(vec3(-2, 1, 3), vec3(-4, 8, 5), vec3(-6, 15, 9)) test.intersects.assertFalse() test = ray.castToTriangle(vec3(8, -1, 5), vec3(-2, 1, 3), vec3(-6, 0, 9)) test.intersects.assertTrue() test.point.assertEquals(vec3(-2, 1, 3)) test.distance.assertEquals(0, EPSILON) test.backface.assertTrue() test = ray.castToTriangle(vec3(0, 0, 0), vec3(1, 1, 1), vec3(-1, -1, -1)) test.intersects.assertFalse()