| // Copyright (c) 2015, Google Inc. Please see the AUTHORS file for details. |
| // All rights reserved. Use of this source code is governed by a BSD-style |
| // license that can be found in the LICENSE file. |
| |
| library vector_math.test.frustum_test; |
| |
| import 'package:test/test.dart'; |
| |
| import 'package:vector_math/vector_math.dart'; |
| |
| import 'test_utils.dart'; |
| |
| void testFrustumContainsVector3() { |
| final Frustum frustum = |
| new Frustum.matrix(makeFrustumMatrix(-1.0, 1.0, -1.0, 1.0, 1.0, 100.0)); |
| |
| expect(frustum.containsVector3($v3(0.0, 0.0, 0.0)), isFalse); |
| expect(frustum.containsVector3($v3(0.0, 0.0, -50.0)), isTrue); |
| expect(frustum.containsVector3($v3(0.0, 0.0, -1.001)), isTrue); |
| expect(frustum.containsVector3($v3(-1.0, -1.0, -1.001)), isTrue); |
| expect(frustum.containsVector3($v3(-1.1, -1.1, -1.001)), isFalse); |
| expect(frustum.containsVector3($v3(1.0, 1.0, -1.001)), isTrue); |
| expect(frustum.containsVector3($v3(1.1, 1.1, -1.001)), isFalse); |
| expect(frustum.containsVector3($v3(0.0, 0.0, -99.999)), isTrue); |
| expect(frustum.containsVector3($v3(-99.999, -99.999, -99.999)), isTrue); |
| expect(frustum.containsVector3($v3(-100.1, -100.1, -100.1)), isFalse); |
| expect(frustum.containsVector3($v3(99.999, 99.999, -99.999)), isTrue); |
| expect(frustum.containsVector3($v3(100.1, 100.1, -100.1)), isFalse); |
| expect(frustum.containsVector3($v3(0.0, 0.0, -101.0)), isFalse); |
| } |
| |
| void testFrustumIntersectsWithSphere() { |
| final Frustum frustum = |
| new Frustum.matrix(makeFrustumMatrix(-1.0, 1.0, -1.0, 1.0, 1.0, 100.0)); |
| |
| expect( |
| frustum.intersectsWithSphere( |
| new Sphere.centerRadius($v3(0.0, 0.0, 0.0), 0.0)), |
| isFalse); |
| expect( |
| frustum.intersectsWithSphere( |
| new Sphere.centerRadius($v3(0.0, 0.0, 0.0), 0.9)), |
| isFalse); |
| expect( |
| frustum.intersectsWithSphere( |
| new Sphere.centerRadius($v3(0.0, 0.0, 0.0), 1.1)), |
| isTrue); |
| expect( |
| frustum.intersectsWithSphere( |
| new Sphere.centerRadius($v3(0.0, 0.0, -50.0), 0.0)), |
| isTrue); |
| expect( |
| frustum.intersectsWithSphere( |
| new Sphere.centerRadius($v3(0.0, 0.0, -1.001), 0.0)), |
| isTrue); |
| expect( |
| frustum.intersectsWithSphere( |
| new Sphere.centerRadius($v3(-1.0, -1.0, -1.001), 0.0)), |
| isTrue); |
| expect( |
| frustum.intersectsWithSphere( |
| new Sphere.centerRadius($v3(-1.1, -1.1, -1.001), 0.0)), |
| isFalse); |
| expect( |
| frustum.intersectsWithSphere( |
| new Sphere.centerRadius($v3(-1.1, -1.1, -1.001), 0.5)), |
| isTrue); |
| expect( |
| frustum.intersectsWithSphere( |
| new Sphere.centerRadius($v3(1.0, 1.0, -1.001), 0.0)), |
| isTrue); |
| expect( |
| frustum.intersectsWithSphere( |
| new Sphere.centerRadius($v3(1.1, 1.1, -1.001), 0.0)), |
| isFalse); |
| expect( |
| frustum.intersectsWithSphere( |
| new Sphere.centerRadius($v3(1.1, 1.1, -1.001), 0.5)), |
| isTrue); |
| expect( |
| frustum.intersectsWithSphere( |
| new Sphere.centerRadius($v3(0.0, 0.0, -99.999), 0.5)), |
| isTrue); |
| expect( |
| frustum.intersectsWithSphere( |
| new Sphere.centerRadius($v3(0.0, 0.0, -99.999), 0.0)), |
| isTrue); |
| expect( |
| frustum.intersectsWithSphere( |
| new Sphere.centerRadius($v3(-99.999, -99.999, -99.999), 0.0)), |
| isTrue); |
| expect( |
| frustum.intersectsWithSphere( |
| new Sphere.centerRadius($v3(-100.1, -100.1, -100.1), 0.0)), |
| isFalse); |
| expect( |
| frustum.intersectsWithSphere( |
| new Sphere.centerRadius($v3(-100.1, -100.1, -100.1), 0.5)), |
| isTrue); |
| expect( |
| frustum.intersectsWithSphere( |
| new Sphere.centerRadius($v3(99.999, 99.999, -99.999), 0.0)), |
| isTrue); |
| expect( |
| frustum.intersectsWithSphere( |
| new Sphere.centerRadius($v3(100.1, 100.1, -100.1), 0.0)), |
| isFalse); |
| expect( |
| frustum.intersectsWithSphere( |
| new Sphere.centerRadius($v3(100.1, 100.1, -100.1), 0.2)), |
| isTrue); |
| expect( |
| frustum.intersectsWithSphere( |
| new Sphere.centerRadius($v3(0.0, 0.0, -101.0), 0.0)), |
| isFalse); |
| expect( |
| frustum.intersectsWithSphere( |
| new Sphere.centerRadius($v3(0.0, 0.0, -101.0), 1.1)), |
| isTrue); |
| } |
| |
| void testFrustumIntersectsWithAabb3() { |
| final Frustum frustum = |
| new Frustum.matrix(makeFrustumMatrix(-1.0, 1.0, -1.0, 1.0, 1.0, 100.0)); |
| |
| expect( |
| frustum.intersectsWithAabb3(new Aabb3.minMax( |
| $v3(500.0, 500.0, 500.0), $v3(1000.0, 1000.0, 1000.0))), |
| isFalse); |
| expect( |
| frustum.intersectsWithAabb3(new Aabb3.minMax( |
| $v3(-150.0, -150.0, -150.0), $v3(150.0, 150.0, 150.0))), |
| isTrue); |
| expect( |
| frustum.intersectsWithAabb3( |
| new Aabb3.minMax($v3(-1.5, -1.5, -1.5), $v3(1.5, 1.5, 1.5))), |
| isTrue); |
| expect( |
| frustum.intersectsWithAabb3( |
| new Aabb3.minMax($v3(0.0, 0.0, -50.0), $v3(1.0, 1.0, -49.0))), |
| isTrue); |
| expect( |
| frustum.intersectsWithAabb3( |
| new Aabb3.minMax($v3(0.0, 0.0, 50.0), $v3(1.0, 1.0, 51.0))), |
| isFalse); |
| expect( |
| frustum.intersectsWithAabb3( |
| new Aabb3.minMax($v3(0.0, 0.0, -0.99), $v3(1.0, 1.0, 1.0))), |
| isFalse); |
| expect( |
| frustum.intersectsWithAabb3( |
| new Aabb3.minMax($v3(0.0, 0.0, -1.0), $v3(1.0, 1.0, 1.0))), |
| isTrue); |
| expect( |
| frustum.intersectsWithAabb3( |
| new Aabb3.minMax($v3(0.0, 1.0, -10.0), $v3(1.0, 2.0, 15.0))), |
| isTrue); |
| expect( |
| frustum.intersectsWithAabb3( |
| new Aabb3.minMax($v3(1.1, 1.1, -1.0), $v3(2.0, 2.0, 0.0))), |
| isFalse); |
| } |
| |
| void testFrustumCalculateCorners() { |
| final Frustum frustum = |
| new Frustum.matrix(makeFrustumMatrix(-1.0, 1.0, -1.0, 1.0, 1.0, 100.0)); |
| |
| final c0 = new Vector3.zero(); |
| final c1 = new Vector3.zero(); |
| final c2 = new Vector3.zero(); |
| final c3 = new Vector3.zero(); |
| final c4 = new Vector3.zero(); |
| final c5 = new Vector3.zero(); |
| final c6 = new Vector3.zero(); |
| final c7 = new Vector3.zero(); |
| |
| frustum.calculateCorners(c0, c1, c2, c3, c4, c5, c6, c7); |
| |
| relativeTest(c0.x, 100.0); |
| relativeTest(c0.y, -100.0); |
| relativeTest(c0.z, -100.0); |
| relativeTest(c1.x, 100.0); |
| relativeTest(c1.y, 100.0); |
| relativeTest(c1.z, -100.0); |
| relativeTest(c2.x, 1.0); |
| relativeTest(c2.y, 1.0); |
| relativeTest(c2.z, -1.0); |
| relativeTest(c3.x, 1.0); |
| relativeTest(c3.y, -1.0); |
| relativeTest(c3.z, -1.0); |
| relativeTest(c4.x, -100.0); |
| relativeTest(c4.y, -100.0); |
| relativeTest(c4.z, -100.0); |
| relativeTest(c5.x, -100.0); |
| relativeTest(c5.y, 100.0); |
| relativeTest(c5.z, -100.0); |
| relativeTest(c6.x, -1.0); |
| relativeTest(c6.y, 1.0); |
| relativeTest(c6.z, -1.0); |
| relativeTest(c7.x, -1.0); |
| relativeTest(c7.y, -1.0); |
| relativeTest(c7.z, -1.0); |
| } |
| |
| void main() { |
| group('Frustum', () { |
| test('ContainsVector3', testFrustumContainsVector3); |
| test('IntersectsWithSphere', testFrustumIntersectsWithSphere); |
| test('IntersectsWithAabb3', testFrustumIntersectsWithAabb3); |
| test('CalculateCorners', testFrustumCalculateCorners); |
| }); |
| } |