@@ -17,7 +17,8 @@ import {ACESFilmicToneMapping, Event, EventDispatcher, GammaEncoding, PCFSoftSha
17
17
import { RoughnessMipmapper } from 'three/examples/jsm/utils/RoughnessMipmapper' ;
18
18
19
19
import { $updateEnvironment } from '../features/environment.js' ;
20
- import { $canvas , $tick , $updateSize } from '../model-viewer-base.js' ;
20
+ import { ModelViewerGlobalConfig } from '../features/loading.js' ;
21
+ import ModelViewerElementBase , { $canvas , $tick , $updateSize } from '../model-viewer-base.js' ;
21
22
import { clamp , isDebugMode , resolveDpr } from '../utilities.js' ;
22
23
23
24
import { ARRenderer } from './ARRenderer.js' ;
@@ -28,6 +29,7 @@ import {ModelScene} from './ModelScene.js';
28
29
import TextureUtils from './TextureUtils.js' ;
29
30
30
31
export interface RendererOptions {
32
+ powerPreference : string ;
31
33
debug ?: boolean ;
32
34
}
33
35
@@ -44,6 +46,8 @@ const MAX_AVG_CHANGE_MS = 2;
44
46
const SCALE_STEPS = [ 1 , 0.79 , 0.62 , 0.5 , 0.4 , 0.31 , 0.25 ] ;
45
47
const DEFAULT_LAST_STEP = 3 ;
46
48
49
+ export const DEFAULT_POWER_PREFERENCE : string = 'high-performance' ;
50
+
47
51
/**
48
52
* Registers canvases with Canvas2DRenderingContexts and renders them
49
53
* all in the same WebGLRenderingContext, spitting out textures to apply
@@ -56,15 +60,35 @@ const DEFAULT_LAST_STEP = 3;
56
60
* the texture.
57
61
*/
58
62
export class Renderer extends EventDispatcher {
59
- private static _singleton = new Renderer ( { debug : isDebugMode ( ) } ) ;
63
+ private static _singleton = new Renderer ( {
64
+ powerPreference :
65
+ ( ( ( self as any ) . ModelViewerElement || { } ) as ModelViewerGlobalConfig )
66
+ . powerPreference ||
67
+ DEFAULT_POWER_PREFERENCE ,
68
+ debug : isDebugMode ( )
69
+ } ) ;
60
70
61
71
static get singleton ( ) {
62
72
return this . _singleton ;
63
73
}
64
74
65
75
static resetSingleton ( ) {
66
- this . _singleton . dispose ( ) ;
67
- this . _singleton = new Renderer ( { debug : isDebugMode ( ) } ) ;
76
+ const elements = this . _singleton . dispose ( ) ;
77
+ for ( const element of elements ) {
78
+ element . disconnectedCallback ( ) ;
79
+ }
80
+
81
+ this . _singleton = new Renderer ( {
82
+ powerPreference :
83
+ ( ( ( self as any ) . ModelViewerElement || { } ) as ModelViewerGlobalConfig )
84
+ . powerPreference ||
85
+ DEFAULT_POWER_PREFERENCE ,
86
+ debug : isDebugMode ( )
87
+ } ) ;
88
+
89
+ for ( const element of elements ) {
90
+ element . connectedCallback ( ) ;
91
+ }
68
92
}
69
93
70
94
public threeRenderer ! : WebGLRenderer ;
@@ -105,7 +129,7 @@ export class Renderer extends EventDispatcher {
105
129
this . lastStep = i - 1 ;
106
130
}
107
131
108
- constructor ( options ? : RendererOptions ) {
132
+ constructor ( options : RendererOptions ) {
109
133
super ( ) ;
110
134
111
135
this . dpr = resolveDpr ( ) ;
@@ -118,7 +142,7 @@ export class Renderer extends EventDispatcher {
118
142
canvas : this . canvas3D ,
119
143
alpha : true ,
120
144
antialias : true ,
121
- powerPreference : 'high-performance' as WebGLPowerPreference ,
145
+ powerPreference : options . powerPreference as WebGLPowerPreference ,
122
146
preserveDrawingBuffer : true
123
147
} ) ;
124
148
this . threeRenderer . autoClear = true ;
@@ -129,8 +153,7 @@ export class Renderer extends EventDispatcher {
129
153
this . threeRenderer . shadowMap . type = PCFSoftShadowMap ;
130
154
this . threeRenderer . shadowMap . autoUpdate = false ;
131
155
132
- this . debugger =
133
- options != null && ! ! options . debug ? new Debugger ( this ) : null ;
156
+ this . debugger = ! ! options . debug ? new Debugger ( this ) : null ;
134
157
this . threeRenderer . debug = { checkShaderErrors : ! ! this . debugger } ;
135
158
136
159
// ACESFilmicToneMapping appears to be the most "saturated",
@@ -466,7 +489,7 @@ export class Renderer extends EventDispatcher {
466
489
}
467
490
}
468
491
469
- dispose ( ) {
492
+ dispose ( ) : Array < ModelViewerElementBase > {
470
493
if ( this . textureUtils != null ) {
471
494
this . textureUtils . dispose ( ) ;
472
495
}
@@ -482,12 +505,17 @@ export class Renderer extends EventDispatcher {
482
505
this . textureUtils = null ;
483
506
( this as any ) . threeRenderer = null ;
484
507
485
- this . scenes . clear ( ) ;
508
+ const elements = [ ] ;
509
+ for ( const scene of this . scenes ) {
510
+ elements . push ( scene . element ) ;
511
+ }
486
512
487
513
this . canvas3D . removeEventListener (
488
514
'webglcontextlost' , this . onWebGLContextLost ) ;
489
515
this . canvas3D . removeEventListener (
490
516
'webglcontextrestored' , this . onWebGLContextRestored ) ;
517
+
518
+ return elements ;
491
519
}
492
520
493
521
onWebGLContextLost = ( event : Event ) => {
0 commit comments