File

src/app/models/engine-integration.ts

Constructor

constructor(globalService: GlobalService)

Methods

cleanEngine
cleanEngine()
Returns: void
cleanWebGl
cleanWebGl(gl: any)
Returns: void

Properties

camera
camera: UniversalCamera | ArcRotateCamera | ArcRotateCamera
engine
engine: Engine | Engine
globalService
globalService: GlobalService
scene
scene: Scene | Scene
import { Engine,Scene,Material, Camera, ArcRotateCamera, UniversalCamera } from "@babylonjs/core";
import { ArcRotateCamera as  CameraCabri, Engine as  EngineCabri, Scene as SceneCabri}  from "babylon4.1";
import { AppUtils } from "../app-utils";
import { GlobalService } from "../services/global.service";

declare var window: {
	webGLCleanup: any;
};
export class EngineIntegration {
	engine: EngineCabri|Engine;
	scene: SceneCabri|Scene;
	camera : UniversalCamera|ArcRotateCamera | CameraCabri;
    
	constructor(public globalService: GlobalService) {}

	cleanEngine() {
		return new Promise<void>(async resolve => {
			try {
                const gl = this.engine._gl;
				if (this.engine) {
					this.engine.stopRenderLoop();
				}
				if (this.scene) {
					this.scene.clearCachedVertexData();
					this.scene.cleanCachedTextureBuffer();

					// custom materials deletion to prevent PBR undisposable bug
					for (let material of this.scene.materials.slice(0)) {
						await new Promise<void>(resolve2 => {
							material.onDisposeObservable.addOnce(() => {
								(material as any).isDisposed = true;
								material = null;
								resolve2();
							});
							material.dispose(true, true, false);
						});
					}
					this.scene.materials = (this.scene.materials as any[]).filter(material => {
                            return material !== null && !(material as any).isDisposed;
					});

					// clean textures
					if (this.scene.textures) {
						const textures = [];

						this.scene.textures.forEach(tex => {
							textures.push(tex);
						});
						textures.forEach((tex, index) => {
							// console.log(tex);
							const webGLTexture = tex._texture?._hardwareTexture?.underlyingResource ?? null;
							this.engine._gl.deleteTexture(webGLTexture);
							// this.engine._gl.deleteTexture(tex._texture._webGLTexture);
							tex.dispose();
							textures[index] = null;
						});
					}
					this.scene.dispose();
					this.scene = null;
				}
				if (this.engine) {
					try {
						this.engine.wipeCaches(true);
					} catch (e) {
						console.error(e);
					}

					if (
						this.globalService.lowPerformanceMode ||
						!this.globalService.isChrome ||
						this.globalService.isSafari ||
						(this.globalService.isIos && this.globalService.isCordova)
					) {
						this.engine.dispose();
						this.engine = null;
					}
				}

                this.cleanWebGl(gl);

				AppUtils.clearWebGL(gl, true);
			} catch (e) {
				console.error("cleancabri error", e);
			} finally {
				resolve();
			}
		});
	}


    cleanWebGl(gl = null){
        throw new Error("Need to be implemented");
    }
}

results matching ""

    No results matching ""