@google/model-viewer
Version:
Easily display interactive 3D models on the web and in AR!
89 lines • 3.68 kB
JavaScript
/* @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 { expect } from '@esm-bundle/chai';
import { Matrix4, Mesh, SphereGeometry, Vector3 } from 'three';
import { $scene } from '../../model-viewer-base.js';
import { ModelViewerElement } from '../../model-viewer.js';
import { assetPath } from '../helpers.js';
suite('ModelScene', () => {
let element;
let scene;
let dummyRadius;
let dummyMesh;
setup(() => {
// 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 SphereGeometry(dummyRadius, 32, 32));
element = new ModelViewerElement();
scene = element[$scene];
document.body.insertBefore(element, document.body.firstChild);
});
teardown(() => {
document.body.removeChild(element);
});
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);
scene.framedFoVDeg = 25;
const halfFov = (scene.framedFoVDeg / 2) * Math.PI / 180;
const expectedDistance = dummyRadius / Math.sin(halfFov);
expect(scene.idealCameraDistance())
.to.be.closeTo(expectedDistance, 0.0001);
});
test('idealAspect is set correctly', async () => {
scene.framedFoVDeg = 25;
await scene.setObject(dummyMesh);
expect(scene.idealAspect).to.be.closeTo(1, 0.001);
});
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