File
Constructor
constructor(globalService: GlobalService)
|
Methods
|
cleanEngine
|
cleanEngine()
|
|
Returns: void
|
|
cleanWebGl
|
cleanWebGl(gl: any)
|
|
Returns: void
|
|
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");
}
}