Skip to content

Commit 7556436

Browse files
authored
Remove preload event (#3799)
* refactored loading * fixed extraneous load events * removed preload and model-load events
1 parent 801db36 commit 7556436

File tree

7 files changed

+41
-100
lines changed

7 files changed

+41
-100
lines changed

packages/model-viewer/src/features/environment.ts

Lines changed: 4 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,9 @@
1414
*/
1515

1616
import {property} from 'lit/decorators.js';
17-
import {Event as ThreeEvent, Texture} from 'three';
17+
import {Texture} from 'three';
1818

19-
import ModelViewerElementBase, {$needsRender, $onModelLoad, $progressTracker, $renderer, $scene, $shouldAttemptPreload} from '../model-viewer-base.js';
20-
import {PreloadEvent} from '../three-components/CachingGLTFLoader.js';
19+
import ModelViewerElementBase, {$needsRender, $progressTracker, $renderer, $scene, $shouldAttemptPreload} from '../model-viewer-base.js';
2120
import {clamp, Constructor, deserializeUrl} from '../utilities.js';
2221

2322
export const BASE_OPACITY = 0.5;
@@ -29,7 +28,6 @@ export const $currentEnvironmentMap = Symbol('currentEnvironmentMap');
2928
export const $currentBackground = Symbol('currentBackground');
3029
export const $updateEnvironment = Symbol('updateEnvironment');
3130
const $cancelEnvironmentUpdate = Symbol('cancelEnvironmentUpdate');
32-
const $onPreload = Symbol('onPreload');
3331

3432
export declare interface EnvironmentInterface {
3533
environmentImage: string|null;
@@ -65,22 +63,6 @@ export const EnvironmentMixin = <T extends Constructor<ModelViewerElementBase>>(
6563

6664
private[$cancelEnvironmentUpdate]: ((...args: any[]) => any)|null = null;
6765

68-
private[$onPreload] = (event: ThreeEvent) => {
69-
if ((event as PreloadEvent).element === this) {
70-
this[$updateEnvironment]();
71-
}
72-
};
73-
74-
connectedCallback() {
75-
super.connectedCallback();
76-
this[$renderer].loader.addEventListener('preload', this[$onPreload]);
77-
}
78-
79-
disconnectedCallback() {
80-
super.disconnectedCallback();
81-
this[$renderer].loader.removeEventListener('preload', this[$onPreload]);
82-
}
83-
8466
updated(changedProperties: Map<string|number|symbol, unknown>) {
8567
super.updated(changedProperties);
8668

@@ -110,13 +92,6 @@ export const EnvironmentMixin = <T extends Constructor<ModelViewerElementBase>>(
11092
return this[$scene].bakedShadows.size > 0;
11193
}
11294

113-
[$onModelLoad]() {
114-
super[$onModelLoad]();
115-
116-
this[$scene].setEnvironmentAndSkybox(
117-
this[$currentEnvironmentMap], this[$currentBackground]);
118-
}
119-
12095
async[$updateEnvironment]() {
12196
const {skyboxImage, environmentImage} = this;
12297

@@ -138,8 +113,7 @@ export const EnvironmentMixin = <T extends Constructor<ModelViewerElementBase>>(
138113
await textureUtils.generateEnvironmentMapAndSkybox(
139114
deserializeUrl(skyboxImage),
140115
environmentImage,
141-
(progress: number) =>
142-
updateEnvProgress(clamp(progress, 0, 1) * 0.99));
116+
(progress: number) => updateEnvProgress(clamp(progress, 0, 1)));
143117

144118
if (this[$currentEnvironmentMap] !== environmentMap) {
145119
this[$currentEnvironmentMap] = environmentMap;
@@ -163,11 +137,7 @@ export const EnvironmentMixin = <T extends Constructor<ModelViewerElementBase>>(
163137
throw errorOrPromise;
164138
}
165139
} finally {
166-
requestAnimationFrame(() => {
167-
requestAnimationFrame(() => {
168-
updateEnvProgress(1.0);
169-
});
170-
});
140+
updateEnvProgress(1.0);
171141
}
172142
}
173143
}

packages/model-viewer/src/model-viewer-base.ts

Lines changed: 27 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -18,11 +18,12 @@ import {property} from 'lit/decorators.js';
1818
import {Event as ThreeEvent, Vector2, Vector3} from 'three';
1919

2020
import {HAS_INTERSECTION_OBSERVER, HAS_RESIZE_OBSERVER} from './constants.js';
21+
import {$updateEnvironment} from './features/environment.js';
2122
import {makeTemplate} from './template.js';
2223
import {$evictionPolicy, CachingGLTFLoader} from './three-components/CachingGLTFLoader.js';
2324
import {ModelScene} from './three-components/ModelScene.js';
2425
import {ContextLostEvent, Renderer} from './three-components/Renderer.js';
25-
import {clamp, debounce, timePasses} from './utilities.js';
26+
import {clamp, debounce} from './utilities.js';
2627
import {dataUrlToBlob} from './utilities/data-conversion.js';
2728
import {ProgressTracker} from './utilities/progress-tracker.js';
2829

@@ -257,17 +258,6 @@ export default class ModelViewerElementBase extends ReactiveElement {
257258
this[$scene] =
258259
new ModelScene({canvas: this[$canvas], element: this, width, height});
259260

260-
this[$scene].addEventListener('model-load', async (event) => {
261-
this[$markLoaded]();
262-
this[$onModelLoad]();
263-
264-
// Give loading async tasks a chance to complete.
265-
await timePasses();
266-
267-
this.dispatchEvent(
268-
new CustomEvent('load', {detail: {url: (event as any).url}}));
269-
});
270-
271261
// Update initial size on microtask timing so that subclasses have a
272262
// chance to initialize
273263
Promise.resolve().then(() => {
@@ -579,43 +569,55 @@ export default class ModelViewerElementBase extends ReactiveElement {
579569

580570
/**
581571
* Parses the element for an appropriate source URL and
582-
* sets the views to use the new model based off of the `preload`
583-
* attribute.
572+
* sets the views to use the new model based.
584573
*/
585574
async[$updateSource]() {
586-
if (this.loaded || !this[$shouldAttemptPreload]()) {
575+
const scene = this[$scene];
576+
if (this.loaded || !this[$shouldAttemptPreload]() ||
577+
this.src === scene.url) {
587578
return;
588579
}
589580

590581
if (this.generateSchema) {
591-
this[$scene].updateSchema(this.src);
582+
scene.updateSchema(this.src);
592583
}
593584
this[$updateStatus]('Loading');
594585
// If we are loading a new model, we need to stop the animation of
595586
// the current one (if any is playing). Otherwise, we might lose
596587
// the reference to the scene root and running actions start to
597588
// throw exceptions and/or behave in unexpected ways:
598-
this[$scene].stopAnimation();
589+
scene.stopAnimation();
599590

600591
const updateSourceProgress = this[$progressTracker].beginActivity();
601592
const source = this.src;
602593
try {
603-
await this[$scene].setSource(
594+
const srcUpdated = scene.setSource(
604595
source,
605596
(progress: number) =>
606597
updateSourceProgress(clamp(progress, 0, 1) * 0.95));
607598

608-
const detail = {url: source};
609-
this.dispatchEvent(new CustomEvent('preload', {detail}));
599+
const envUpdated = (this as any)[$updateEnvironment]();
600+
601+
await Promise.all([srcUpdated, envUpdated]);
602+
603+
this[$markLoaded]();
604+
this[$onModelLoad]();
605+
606+
// Wait for shaders to compile and pixels to be drawn.
607+
await new Promise<void>(resolve => {
608+
requestAnimationFrame(() => {
609+
requestAnimationFrame(() => {
610+
this.dispatchEvent(
611+
new CustomEvent('load', {detail: {url: source}}));
612+
resolve();
613+
});
614+
});
615+
});
610616
} catch (error) {
611617
this.dispatchEvent(new CustomEvent(
612618
'error', {detail: {type: 'loadfailure', sourceError: error}}));
613619
} finally {
614-
requestAnimationFrame(() => {
615-
requestAnimationFrame(() => {
616-
updateSourceProgress(1.0);
617-
});
618-
});
620+
updateSourceProgress(1.0);
619621
}
620622
}
621623
}

packages/model-viewer/src/test/features/loading-spec.ts

Lines changed: 8 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -53,16 +53,11 @@ suite('Loading', () => {
5353

5454
test('does not load when hidden from render tree', async () => {
5555
let loadDispatched = false;
56-
let preloadDispatched = false;
5756
const loadHandler = () => {
5857
loadDispatched = true;
5958
};
60-
const preloadHandler = () => {
61-
preloadDispatched = true;
62-
};
6359

6460
element.addEventListener('load', loadHandler);
65-
element.addEventListener('preload', preloadHandler);
6661

6762
element.style.display = 'none';
6863

@@ -75,10 +70,8 @@ suite('Loading', () => {
7570
await timePasses(500); // Arbitrary time to allow model to load
7671

7772
element.removeEventListener('load', loadHandler);
78-
element.removeEventListener('preload', preloadHandler);
7973

8074
expect(loadDispatched).to.be.false;
81-
expect(preloadDispatched).to.be.false;
8275
});
8376

8477
suite('load', () => {
@@ -162,29 +155,22 @@ suite('Loading', () => {
162155

163156
suite('loading', () => {
164157
suite('src changes quickly', () => {
165-
test('eventually notifies that current src is preloaded', async () => {
158+
test('eventually notifies that current src is loaded', async () => {
166159
element.loading = 'eager';
167160
element.src = CUBE_GLB_PATH;
168161

169-
await timePasses();
162+
const loadCubeEvent =
163+
waitForEvent(element, 'load') as Promise<CustomEvent>;
170164

171-
let preloadEvent = null;
172-
const onPreload = (event: CustomEvent) => {
173-
if (event.detail.url === HORSE_GLB_PATH) {
174-
preloadEvent = event;
175-
}
176-
};
177-
element.addEventListener<any>('preload', onPreload);
165+
await timePasses();
178166

179167
element.src = HORSE_GLB_PATH;
180168

181-
await until(() => element.loaded);
182-
183-
await timePasses();
184-
185-
element.removeEventListener<any>('preload', onPreload);
169+
const loadCube = await loadCubeEvent;
170+
const loadHorse = await waitForEvent(element, 'load') as CustomEvent;
186171

187-
expect(preloadEvent).to.be.ok;
172+
expect(loadCube.detail.url).to.be.eq(CUBE_GLB_PATH);
173+
expect(loadHorse.detail.url).to.be.eq(HORSE_GLB_PATH);
188174
});
189175
});
190176

packages/model-viewer/src/test/three-components/ModelScene-spec.ts

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -44,15 +44,6 @@ suite('ModelScene', () => {
4444
document.body.removeChild(element);
4545
});
4646

47-
suite('setModelSource', () => {
48-
test('fires a model-load event when loaded', async function() {
49-
let fired = false;
50-
scene.addEventListener('model-load', () => fired = true);
51-
await scene.setSource(assetPath('models/Astronaut.glb'));
52-
expect(fired).to.be.ok;
53-
});
54-
});
55-
5647
suite('with a model', () => {
5748
setup(async () => {
5849
await scene.setSource(assetPath('models/Astronaut.glb'));

packages/model-viewer/src/three-components/ARRenderer.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -231,7 +231,7 @@ export class ARRenderer extends EventDispatcher {
231231

232232
this.oldTarget.copy(scene.getTarget());
233233

234-
scene.addEventListener('model-load', this.onUpdateScene);
234+
scene.element.addEventListener('load', this.onUpdateScene);
235235

236236
const radians = HIT_ANGLE_DEG * Math.PI / 180;
237237
const ray = this.placeOnWall === true ?
@@ -350,7 +350,7 @@ export class ARRenderer extends EventDispatcher {
350350
scene.setTarget(point.x, point.y, point.z);
351351
scene.xrCamera = null;
352352

353-
scene.removeEventListener('model-load', this.onUpdateScene);
353+
scene.element.removeEventListener('load', this.onUpdateScene);
354354
scene.orientHotspots(0);
355355
element.requestUpdate('cameraTarget');
356356
element.requestUpdate('maxCameraOrbit');

packages/model-viewer/src/three-components/ModelScene.ts

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -204,8 +204,6 @@ export class ModelScene extends Scene {
204204

205205
this.boundingSphere.radius = framingInfo.framedRadius;
206206
this.idealAspect = framingInfo.fieldOfViewAspect;
207-
208-
this.dispatchEvent({type: 'model-load', url: this.url});
209207
return;
210208
}
211209

@@ -272,7 +270,6 @@ export class ModelScene extends Scene {
272270

273271
this.updateShadow();
274272
this.setShadowIntensity(this.shadowIntensity);
275-
this.dispatchEvent({type: 'model-load', url: this.url});
276273
}
277274

278275
reset() {

packages/modelviewer.dev/data/docs.json

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -220,11 +220,6 @@
220220
"htmlName": "posterDismissed",
221221
"description": "Fires when the poster has fully transitioned away. Additional delay from the \"load\" event can be caused by the renderer compiling its shaders."
222222
},
223-
{
224-
"name": "preload",
225-
"htmlName": "preload",
226-
"description": "When <span class='attribute'>loading=\"eager\"</span> this event is fired when preloading is done."
227-
},
228223
{
229224
"name": "model-visibility",
230225
"htmlName": "modelVisibility",

0 commit comments

Comments
 (0)