Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .gitmodules
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
[submodule "packages/shared-assets/models/glTF-Sample-Assets"]
path = packages/shared-assets/models/glTF-Sample-Assets
url = git@github.com:KhronosGroup/glTF-Sample-Assets
url = https://github.com/KhronosGroup/glTF-Sample-Assets.git
51 changes: 10 additions & 41 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@
},
"homepage": "https://github.com/google/model-viewer#readme",
"devDependencies": {
"@types/chai": "^4.3.20",
"@typescript-eslint/eslint-plugin": "^8.26.1",
"@typescript-eslint/parser": "^8.26.1",
"clang-format": "^1.8.0",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,12 +14,11 @@
*/

import {ModelViewerElement} from '@google/model-viewer';
import {Renderer} from '@google/model-viewer/lib/three-components/Renderer.js';
import {expect} from 'chai';
import {DotScreenEffect, Effect, EffectPass, GridEffect} from 'postprocessing';
import {Camera} from 'three';

import {Renderer} from '@google/model-viewer/lib/three-components/Renderer.js';

import {$effectComposer, $normalPass, $renderPass, $scene} from '../effect-composer.js';
import {EffectComposer} from '../model-viewer-effects.js';

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,9 +14,8 @@
*/

import {ModelViewerElement} from '@google/model-viewer';
import {expect} from 'chai';

import {Renderer} from '@google/model-viewer/lib/three-components/Renderer.js';
import {expect} from 'chai';

import {ColorGradeEffect, EffectComposer} from '../../model-viewer-effects.js';
import {ArraysAreEqual, assetPath, AverageHSL, CompareArrays, createModelViewerElement, rafPasses, screenshot, waitForEvent} from '../utilities.js';
Expand Down
3 changes: 2 additions & 1 deletion packages/model-viewer/src/constants.ts
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,8 @@ export const IS_FIREFOX = /firefox/i.test(navigator.userAgent);
export const IS_OCULUS = /OculusBrowser/.test(navigator.userAgent);
export const IS_IOS_CHROME = IS_IOS && /CriOS\//.test(navigator.userAgent);
export const IS_IOS_SAFARI = IS_IOS && IS_SAFARI;
export const IS_IOS_THIRDPARTY = IS_IOS && /CriOS\/|EdgiOS\/|FxiOS\/|GSA\/|DuckDuckGo\//.test(navigator.userAgent);
export const IS_IOS_THIRDPARTY = IS_IOS &&
/CriOS\/|EdgiOS\/|FxiOS\/|GSA\/|DuckDuckGo\//.test(navigator.userAgent);
export const IS_IOS_GSA = IS_IOS && /GSA\//.test(navigator.userAgent);

export const IS_SCENEVIEWER_CANDIDATE = IS_ANDROID && !IS_FIREFOX && !IS_OCULUS;
Expand Down
5 changes: 3 additions & 2 deletions packages/model-viewer/src/features/loading.ts
Original file line number Diff line number Diff line change
Expand Up @@ -205,8 +205,9 @@ export const LoadingMixin = <T extends Constructor<ModelViewerElementBase>>(
*
* The default value is "auto". The only supported alternative values are
* "lazy" and "eager". Auto is equivalent to lazy, which loads the model
* when it is near the viewport for reveal = "auto", and when dismissPoster()
* is called for reveal = "manual". Eager loads the model immediately.
* when it is near the viewport for reveal = "auto", and when
* dismissPoster() is called for reveal = "manual". Eager loads the model
* immediately.
*/
@property({type: String})
loading: LoadingAttributeValue = LoadingStrategy.AUTO;
Expand Down
74 changes: 37 additions & 37 deletions packages/model-viewer/src/test/three-components/ARRenderer-spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -241,43 +241,43 @@ suite('ARRenderer', () => {
expect(scale.z).to.be.equal(1);
});

test('prevents default WebXR select when beforexrselect is triggered on interactive elements', () => {
const button = document.createElement('button');
const event = new CustomEvent('beforexrselect', {
bubbles: true,
cancelable: true
});
Object.defineProperty(event, 'composedPath', {
value: () => [button, (arRenderer as any).overlay]
});

let defaultPrevented = false;
event.preventDefault = () => {
defaultPrevented = true;
};

(arRenderer as any).overlay.dispatchEvent(event);
expect(defaultPrevented).to.be.equal(true);
});

test('does not prevent default WebXR select on non-interactive elements', () => {
const div = document.createElement('div');
const event = new CustomEvent('beforexrselect', {
bubbles: true,
cancelable: true
});
Object.defineProperty(event, 'composedPath', {
value: () => [div, (arRenderer as any).overlay]
});

let defaultPrevented = false;
event.preventDefault = () => {
defaultPrevented = true;
};

(arRenderer as any).overlay.dispatchEvent(event);
expect(defaultPrevented).to.be.equal(false);
});
test(
'prevents default WebXR select when beforexrselect is triggered on interactive elements',
() => {
const button = document.createElement('button');
const event = new CustomEvent(
'beforexrselect', {bubbles: true, cancelable: true});
Object.defineProperty(event, 'composedPath', {
value: () => [button, (arRenderer as any).overlay]
});

let defaultPrevented = false;
event.preventDefault = () => {
defaultPrevented = true;
};

(arRenderer as any).overlay.dispatchEvent(event);
expect(defaultPrevented).to.be.equal(true);
});

test(
'does not prevent default WebXR select on non-interactive elements',
() => {
const div = document.createElement('div');
const event = new CustomEvent(
'beforexrselect', {bubbles: true, cancelable: true});
Object.defineProperty(event, 'composedPath', {
value: () => [div, (arRenderer as any).overlay]
});

let defaultPrevented = false;
event.preventDefault = () => {
defaultPrevented = true;
};

(arRenderer as any).overlay.dispatchEvent(event);
expect(defaultPrevented).to.be.equal(false);
});

suite('presentation ends', () => {
setup(async () => {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -73,24 +73,27 @@ suite('TextureUtils', () => {
expect(texture.name).to.be.eq(EQUI_URL);
expect(texture.mapping).to.be.eq(EquirectangularReflectionMapping);
});
test('decodes a gainmap and disposes intermediate render targets', async () => {
const GAINMAP_URL = assetPath('environments/spruit_sunrise_1k_HDR.jpg');
const THREE = await import('three');
let disposeCount = 0;
const originalDispose = THREE.WebGLRenderTarget.prototype.dispose;
THREE.WebGLRenderTarget.prototype.dispose = function() {
disposeCount++;
return originalDispose.call(this);
};

try {
const texture = await textureUtils.loadEquirect(GAINMAP_URL);
texture.dispose();
expect(disposeCount).to.be.greaterThan(0);
} finally {
THREE.WebGLRenderTarget.prototype.dispose = originalDispose;
}
});
test(
'decodes a gainmap and disposes intermediate render targets',
async () => {
const GAINMAP_URL =
assetPath('environments/spruit_sunrise_1k_HDR.jpg');
const THREE = await import('three');
let disposeCount = 0;
const originalDispose = THREE.WebGLRenderTarget.prototype.dispose;
THREE.WebGLRenderTarget.prototype.dispose = function() {
disposeCount++;
return originalDispose.call(this);
};

try {
const texture = await textureUtils.loadEquirect(GAINMAP_URL);
texture.dispose();
expect(disposeCount).to.be.greaterThan(0);
} finally {
THREE.WebGLRenderTarget.prototype.dispose = originalDispose;
}
});
test('loads a valid KTX2 texture from URL', async () => {
let texture = await textureUtils.loadImage(KTX2_URL, false);
texture.dispose();
Expand Down
Loading
Loading