Skip to content

Commit e44e32a

Browse files
committed
feat: fix simple renderer resize event
1 parent fd0c0f4 commit e44e32a

1 file changed

Lines changed: 21 additions & 30 deletions

File tree

packages/components/src/core/Worlds/src/simple-renderer.ts

Lines changed: 21 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -13,27 +13,27 @@ import { Components } from "../../Components";
1313
* ([Objec3Ds](https://threejs.org/docs/#api/en/core/Object3D).
1414
*/
1515
export 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

Comments
 (0)