| <!DOCTYPE html> <!-- webkit-test-runner [ ModelElementEnabled=true ModelProcessEnabled=true ] --> |
| <meta charset="utf-8"> |
| <title><model> entity transform</title> |
| <script src="../resources/testharness.js"></script> |
| <script src="../resources/testharnessreport.js"></script> |
| <script src="resources/model-element-test-utils.js"></script> |
| <script src="resources/model-utils.js"></script> |
| <script src="../resources/js-test-pre.js"></script> |
| <body> |
| <script> |
| 'use strict'; |
| internals.disableModelLoadDelaysForTesting(); |
| |
| promise_test(async t => { |
| const [model, source] = createModelAndSource(t); |
| assert_3d_matrix_is_identity(model.entityTransform, true); |
| }, `<model> with empty source has entityTransform = identity`); |
| |
| promise_test(async t => { |
| const [model, source] = createModelAndSource(t, "resources/2x2x2-positive.usdz"); |
| await model.ready; |
| let originalTransform = model.entityTransform; |
| assert_3d_matrix_is_identity(originalTransform, false); |
| let scaledTransform = originalTransform.scale(2, 2, 2); |
| model.entityTransform = scaledTransform; |
| assert_3d_matrix_equals(model.entityTransform, scaledTransform); |
| }, `<model> gets the updated entityTransform after change`); |
| |
| promise_test(async t => { |
| const [model, source] = createModelAndSource(t, "resources/2x2x2-positive.usdz"); |
| await model.ready; |
| let firstModelTransform = model.entityTransform; |
| |
| source.src = "resources/heart.usdz"; |
| await model.ready; |
| let secondModelTransform = model.entityTransform; |
| assert_3d_matrix_not_equals(firstModelTransform, secondModelTransform); |
| }, `<model> gets the updated entityTransform after model source change`); |
| |
| promise_test(async t => { |
| const [model, source] = createModelAndSource(t, "resources/2x2x2-positive.usdz"); |
| await model.ready; |
| assert_3d_matrix_is_identity(model.entityTransform, false); |
| |
| return new Promise((resolve, reject) => { |
| model.addEventListener("error", event => { |
| assert_3d_matrix_is_identity(model.entityTransform, true); |
| resolve(); |
| }); |
| source.remove(); |
| }); |
| }, `<model> gets the identity entityTransform after model source removal`); |
| |
| promise_test(async t => { |
| const [model, source] = createModelAndSource(t, "resources/2x2x2-positive.usdz"); |
| await model.ready; |
| let originalTransform = model.entityTransform; |
| assert_equals(model.stageMode, ""); |
| assert_3d_matrix_is_identity(originalTransform, false); |
| |
| let scaledTransform = originalTransform.scale(2000, 2000, 2000); |
| model.entityTransform = scaledTransform; |
| |
| assert_3d_matrix_equals(model.entityTransform, scaledTransform); |
| model.stageMode = "orbit"; |
| |
| await new Promise((resolve) => t.step_timeout(resolve, 100)); |
| |
| assert_equals(model.stageMode, "orbit"); |
| assert_3d_matrix_not_equals(model.entityTransform, scaledTransform); |
| assert_3d_matrix_not_equals(model.entityTransform, originalTransform); |
| let orbitFitTransform = model.entityTransform; |
| |
| shouldThrowErrorName(function() { |
| model.entityTransform = scaledTransform; |
| assert_3d_matrix_not_equals(model.entityTransform, scaledTransform); |
| }, "InvalidStateError"); |
| |
| model.stageMode = "none"; |
| await new Promise((resolve) => t.step_timeout(resolve, 100)); |
| |
| assert_equals(model.stageMode, "none"); |
| assert_3d_matrix_not_equals(model.entityTransform, scaledTransform); |
| assert_3d_matrix_not_equals(model.entityTransform, originalTransform); |
| assert_3d_matrix_equals(model.entityTransform, orbitFitTransform); |
| }, `<model> ignores entityTransform when stagemode is set`); |
| |
| promise_test(async t => { |
| const [model, source] = createModelAndSource(t, "resources/cube.usdz"); |
| await model.ready; |
| |
| const angle = 57.64999999999886; |
| const rotationAmount = 10; |
| |
| for (var iteration = 0; iteration < 6; ++iteration) { |
| try { |
| const matrix = new DOMMatrixReadOnly(); |
| const newMatrix = matrix.translate(0, 0, -10).rotate(0, angle + iteration * rotationAmount, 0); |
| model.entityTransform = newMatrix; |
| assert_3d_matrix_equals(model.entityTransform, newMatrix); |
| } catch (error) { |
| console.error('Error setting transform: ' + error.name); |
| } |
| } |
| }, `<model> gets the updated entityTransform after rotation`); |
| |
| promise_test(async t => { |
| const model1 = document.createElement("model"); |
| model1.setAttribute("width", "40cm"); |
| model1.setAttribute("height", "20cm"); |
| document.body.appendChild(model1); |
| model1.appendChild(makeSource("resources/flat-rectangle.usdz")); |
| |
| const model2 = document.createElement("model"); |
| model2.setAttribute("width", "80cm"); |
| model2.setAttribute("height", "20cm"); |
| document.body.appendChild(model2); |
| model2.appendChild(makeSource("resources/flat-rectangle.usdz")); |
| |
| await model1.ready; |
| await model2.ready; |
| |
| // Since the model should fit within the width of the portal, |
| // the scale ratio between entity transforms of the two models should |
| // match the scale ratio of their widths. |
| assert_3d_matrix_approx_equals(model1.entityTransform.scale3d(2), model2.entityTransform); |
| }, `<model> with source that has zero depth should still scale to fit the portal`); |
| |
| </script> |
| </body> |