UNPKG

@google/model-viewer

Version:

Easily display interactive 3D models on the web and in AR!

106 lines 4.36 kB
/* @license * Copyright 2019 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the 'License'); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an 'AS IS' BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ import { Matrix4, Mesh, SphereBufferGeometry, Vector3 } from 'three'; import ModelViewerElementBase, { $canvas } from '../../model-viewer-base.js'; import { DEFAULT_FOV_DEG } from '../../three-components/ModelScene.js'; import { ModelScene } from '../../three-components/ModelScene.js'; import { assetPath } from '../helpers.js'; const expect = chai.expect; suite('ModelScene', () => { let nextId = 0; let tagName; let ModelViewerElement; let element; let scene; let dummyRadius; let dummyMesh; setup(() => { tagName = `model-viewer-modelscene-${nextId++}`; ModelViewerElement = class extends ModelViewerElementBase { static get is() { return tagName; } }; customElements.define(tagName, ModelViewerElement); // Set the radius of the sphere to 0.5 so that it's size is 1 // for testing scaling. dummyRadius = 0.5; dummyMesh = new Mesh(new SphereBufferGeometry(dummyRadius, 32, 32)); element = new ModelViewerElement(); scene = new ModelScene({ element: element, canvas: element[$canvas], width: 200, height: 100, }); }); suite('setModelSource', () => { test('fires a model-load event when loaded', async function () { let fired = false; scene.addEventListener('model-load', () => fired = true); await scene.setSource(assetPath('models/Astronaut.glb')); expect(fired).to.be.ok; }); }); suite('with a model', () => { setup(async () => { await scene.setSource(assetPath('models/Astronaut.glb')); }); suite('setShadowIntensity', () => { test('can increase intensity and reset it to zero', () => { scene.setShadowIntensity(1); const shadow = scene.shadow; expect(shadow).to.be.ok; expect(shadow.getIntensity()).to.be.equal(1); scene.setShadowIntensity(0); expect(shadow.getIntensity()).to.be.equal(0); }); test('shadow is only created when intensity is greater than zero', () => { expect(scene.shadow).to.be.not.ok; scene.setShadowIntensity(1); expect(scene.shadow).to.be.ok; }); }); }); suite('setSize', () => { test('updates visual and buffer size', () => { scene.setSize(500, 200); expect(scene.width).to.be.equal(500); expect(scene.height).to.be.equal(200); }); test('model is not scaled', async () => { dummyMesh.geometry.applyMatrix4(new Matrix4().makeScale(1, 3, 10)); await scene.setObject(dummyMesh); scene.setSize(1000, 500); expect(scene.scale).to.be.eql(new Vector3(1, 1, 1)); }); test('idealCameraDistance is set correctly', async () => { await scene.setObject(dummyMesh); const halfFov = (DEFAULT_FOV_DEG / 2) * Math.PI / 180; const expectedDistance = dummyRadius / Math.sin(halfFov); expect(scene.idealCameraDistance).to.be.closeTo(expectedDistance, 0.0001); }); test('fieldOfViewAspect is set correctly', async () => { await scene.setObject(dummyMesh); expect(scene.fieldOfViewAspect).to.be.closeTo(1, 0.0001); }); test('cannot set the canvas smaller than 1x1', () => { scene.setSize(0, 0); expect(scene.width).to.be.equal(1); expect(scene.height).to.be.equal(1); }); }); }); //# sourceMappingURL=ModelScene-spec.js.map