| <!DOCTYPE html> |
| <script src="/resources/testharness.js"></script> |
| <script src="/resources/testharnessreport.js"></script> |
| <script src="resources/webxr_test_constants.js"></script> |
| <script src="resources/webxr_test_asserts.js"></script> |
| |
| <script> |
| |
| let constructor_test_name = "XRRay constructors work"; |
| |
| let constructor_tests = function() { |
| // Constructor tests for XRRay. |
| // Spec: https://immersive-web.github.io/webxr/#xrray-interface |
| |
| // |
| // Constructor 1 - from origin and direction |
| // |
| |
| { |
| // Check defaults - should be 0,0,0,1 for origin and 0,0,-1,0 for direction, |
| // identity matrix for the transform: |
| let xrRay = new XRRay(); |
| assert_point_approx_equals( |
| xrRay.origin, {x : 0.0, y : 0.0, z : 0.0, w : 1.0}, |
| FLOAT_EPSILON, "origin-default:"); |
| assert_point_approx_equals( |
| xrRay.direction, {x : 0.0, y : 0.0, z : -1.0, w : 0.0}, |
| FLOAT_EPSILON, "direction-default:"); |
| assert_matrix_approx_equals( |
| xrRay.matrix, IDENTITY_MATRIX, |
| FLOAT_EPSILON, "matrix-default:"); |
| } |
| |
| { |
| // Check custom value for origin, default for direction: |
| let originDict = {x : 11.0, y : 12.0, z : 13.0, w : 1.0}; |
| let xrRay2 = new XRRay(DOMPoint.fromPoint(originDict)); |
| let xrRay3 = new XRRay(DOMPointReadOnly.fromPoint(originDict)); |
| let matrix1 = [ 1, 0, 0, 0, |
| 0, 1, 0, 0, |
| 0, 0, 1, 0, |
| 11, 12, 13, 1]; |
| |
| assert_point_approx_equals( |
| xrRay2.origin, originDict, |
| FLOAT_EPSILON, "origin-custom-direction-default:"); |
| assert_point_approx_equals( |
| xrRay2.direction, {x : 0.0, y : 0.0, z : -1.0, w : 0.0}, |
| FLOAT_EPSILON, "direction-custom-direction-default:"); |
| assert_matrix_approx_equals( |
| xrRay2.matrix, matrix1, |
| FLOAT_EPSILON, "matrix-custom-direction-default:"); |
| |
| assert_ray_approx_equals(xrRay2, xrRay3, FLOAT_EPSILON, "ray2-ray3-direction-default:"); |
| } |
| |
| { |
| // Check custom values - ray rotated from -Z onto +X, |
| // not placed at origin: |
| // - from DOMPoint |
| // - from DOMPointReadOnly |
| let originDict = {x : 10.0, y : 10.0, z : 10.0, w : 1.0}; |
| let directionDict = {x : 10.0, y : 0.0, z : 0.0, w : 0.0}; |
| let directionNorm = {x : 1.0, y : 0.0, z : 0.0, w : 0.0}; |
| // column-major |
| let matrix1 = [ 0, 0, 1, 0, |
| 0, 1, 0, 0, |
| -1, 0, 0, 0, |
| 10, 10, 10, 1]; |
| |
| let xrRay2 = new XRRay( |
| DOMPoint.fromPoint(originDict), |
| DOMPoint.fromPoint(directionDict)); |
| |
| let xrRay3 = new XRRay( |
| DOMPointReadOnly.fromPoint(originDict), |
| DOMPointReadOnly.fromPoint(directionDict)); |
| |
| assert_point_approx_equals( |
| xrRay2.origin, originDict, |
| FLOAT_EPSILON, "origin-custom:"); |
| assert_point_approx_equals( |
| xrRay2.direction, directionNorm, |
| FLOAT_EPSILON, "direction-custom:"); |
| assert_matrix_approx_equals( |
| xrRay2.matrix, matrix1, |
| FLOAT_EPSILON, "matrix-custom:"); |
| |
| assert_ray_approx_equals(xrRay2, xrRay3, FLOAT_EPSILON, "ray2-ray3:"); |
| } |
| |
| { |
| // Check that we throw exception on direction too close to 0,0,0: |
| let originDict = {x : 10.0, y : 10.0, z : 10.0, w : 1.0}; |
| let directionDict = {x : 0.0, y : 0.0, z : 0.0, w : 0.0}; |
| |
| try { |
| let xrRay = new XRRay( |
| DOMPoint.fromPoint(originDict), |
| DOMPoint.fromPoint(directionDict)); |
| |
| assert(false, "origin-custom-direction-zero:exception not thrown"); |
| } |
| catch(e) |
| { |
| if(e instanceof DOMException) { |
| assert_equals(e.name, "InvalidStateError", "origin-custom-direction-zero:incorrect DOM exception thrown"); |
| } else { |
| assert(false, "origin-custom-direction-zero:other exception thrown: " + e); |
| } |
| } |
| } |
| |
| // |
| // Constructor 2 - from rigid transform. |
| // |
| |
| { |
| // Not placed at origin, ray rotated by 135 degrees around Y: |
| let originDict = {x : 10.0, y : 10.0, z : 10.0, w : 1.0}; |
| let directionQuaternionDict = { x : 0, y : 0.9239, z : 0, w : 0.3827 }; |
| let directionNorm2 = { x : -0.707, y : 0.0, z : 0.707, w : 0.0 }; |
| let matrix2 = [-0.707, 0, -0.707, 0, |
| 0., 1, 0, 0, |
| 0.707, 0, -0.707, 0, |
| 10., 10, 10., 1]; |
| |
| let xrRay4 = new XRRay( |
| new XRRigidTransform( |
| DOMPoint.fromPoint(originDict), |
| DOMPoint.fromPoint(directionQuaternionDict))); |
| |
| assert_point_approx_equals( |
| xrRay4.origin, originDict, |
| FLOAT_EPSILON, "origin-custom-rigid:"); |
| assert_point_approx_equals( |
| xrRay4.direction, directionNorm2, |
| FLOAT_EPSILON, "direction-custom-rigid:"); |
| |
| assert_matrix_approx_equals( |
| xrRay4.matrix, matrix2, |
| FLOAT_EPSILON, "matrix-custom-rigid:"); |
| } |
| }; |
| |
| test(constructor_tests, constructor_test_name); |
| |
| </script> |