@@ -13,27 +13,27 @@ import { Components } from "../../Components";
1313 * ([Objec3Ds](https://threejs.org/docs/#api/en/core/Object3D).
1414 */
1515export class SimpleRenderer extends BaseRenderer {
16- /** {@link Component.enabled } */
1716 enabled = true ;
1817
1918 /** The HTML container of the THREE.js canvas where the scene is rendered. */
20- container : HTMLElement | null ;
19+ container : HTMLElement ;
2120
2221 three : THREE . WebGLRenderer ;
2322
2423 protected _canvas : HTMLCanvasElement ;
2524 protected _parameters ?: Partial < THREE . WebGLRendererParameters > ;
25+ protected _resizeObserver : ResizeObserver | null = null ;
2626
27- protected onContainerUpdated = new Event < HTMLElement > ( ) ;
27+ protected onContainerUpdated = new Event ( ) ;
2828
2929 constructor (
3030 components : Components ,
31- container ? : HTMLElement ,
31+ container : HTMLElement ,
3232 parameters ?: Partial < THREE . WebGLRendererParameters > ,
3333 ) {
3434 super ( components ) ;
3535
36- this . container = container || null ;
36+ this . container = container ;
3737 this . _parameters = parameters ;
3838
3939 this . three = new THREE . WebGLRenderer ( {
@@ -92,10 +92,7 @@ export class SimpleRenderer extends BaseRenderer {
9292
9393 /** {@link Resizeable.resize } */
9494 resize = ( size ?: THREE . Vector2 ) => {
95- this . updateContainer ( ) ;
96- if ( ! this . container ) {
97- return ;
98- }
95+ this . onContainerUpdated . trigger ( ) ;
9996 const width = size ? size . x : this . container . clientWidth ;
10097 const height = size ? size . y : this . container . clientHeight ;
10198 this . three . setSize ( width , height ) ;
@@ -104,29 +101,33 @@ export class SimpleRenderer extends BaseRenderer {
104101 } ;
105102
106103 setupEvents ( active : boolean ) {
107- const dom = this . three . domElement ;
104+ const dom = this . three . domElement . parentElement ;
105+ if ( ! dom ) {
106+ throw new Error ( "This renderer needs to have an HTML container!" ) ;
107+ }
108+
109+ if ( this . _resizeObserver ) {
110+ this . _resizeObserver . disconnect ( ) ;
111+ this . _resizeObserver = null ;
112+ }
113+
108114 if ( active ) {
109- dom . addEventListener ( "resize" , this . resizeEvent ) ;
110- } else {
111- dom . removeEventListener ( "resize" , this . resizeEvent ) ;
115+ this . _resizeObserver = new ResizeObserver ( ( ) => this . resize ( ) ) ;
116+ this . _resizeObserver . observe ( dom ) ;
112117 }
113118 }
114119
115- private resizeEvent = ( ) => {
116- this . resize ( ) ;
117- } ;
118-
119120 private setupRenderer ( ) {
120121 this . three . localClippingEnabled = true ;
121122 if ( this . container ) {
122123 this . container . appendChild ( this . three . domElement ) ;
123124 }
124- this . updateContainer ( ) ;
125+ this . onContainerUpdated . trigger ( ) ;
125126 }
126127
127128 private onContextLost = ( event : any ) => {
128129 event . preventDefault ( ) ;
129- this . components . enabled = false ;
130+ this . enabled = false ;
130131 } ;
131132
132133 private onContextBack = ( ) => {
@@ -138,16 +139,6 @@ export class SimpleRenderer extends BaseRenderer {
138139 alpha : true ,
139140 ...this . _parameters ,
140141 } ) ;
141- this . components . enabled = true ;
142+ this . enabled = true ;
142143 } ;
143-
144- private updateContainer ( ) {
145- if ( ! this . container ) {
146- const parent = this . three . domElement . parentElement ;
147- if ( parent ) {
148- this . container = parent ;
149- this . onContainerUpdated . trigger ( parent ) ;
150- }
151- }
152- }
153144}
0 commit comments