File
Constructor
constructor(cabriService: CabriDataService, platform: Platform, appComponent: AppComponent, globalService: GlobalService)
|
Methods
|
loadBabylonJS
|
loadBabylonJS()
|
|
Returns: void
|
|
recurringLoadScript
|
recurringLoadScript(index: number)
|
|
Returns: void
|
|
endOfLoading
|
endOfLoading()
|
|
Returns: void
|
|
stopRender
|
stopRender(stop: any)
|
|
Returns: void
|
|
waitEndOfLoading
|
waitEndOfLoading()
|
|
Returns: any
|
|
waitCabri
|
waitCabri()
|
|
Returns: any
|
|
waitPlatform
|
waitPlatform()
|
|
Returns: any
|
|
appComponent
|
appComponent: AppComponent
|
|
cabriService
|
cabriService: CabriDataService
|
|
Private engine
|
engine: Engine
|
|
globalService
|
globalService: GlobalService
|
|
Public loadingEnded
|
loadingEnded: boolean
|
Default value: false
|
|
platform
|
platform: Platform
|
|
Private resolveBabylonJS
|
resolveBabylonJS: any
|
|
Private scriptsCabri
|
scriptsCabri: string[]
|
import { AppUtils } from './../app-utils';
import { Platform } from "@ionic/angular";
import { CabriDataService } from "../services/cabri-data.service";
import { get } from "scriptjs";
import { AppComponent } from "../app.component";
import postal from "postal";
import { environment } from "src/environments/environment";
import { Engine } from "babylon4.1";
import { GlobalService } from "../services/global.service";
declare var window: {
store: any;
document: any;
weareready: any;
postal: any;
cabriTS: any;
Globals: { FileToLoad: string; Debug: any; Holo: any; HoloFaces: any };
runtimeInitialized: any;
params: any;
isIos : boolean;
};
export class CabriLoader {
private engine: Engine;
private scriptsCabri = [
"assets/cabri2/lib/jquery-3.1.1/jquery-3.5.1.min.js",
// not necessary?:
"assets/cabri2/lib/jquery-ui-1.12.0.custom/jquery-ui.min.js",
// not necessary?:
"assets/cabri2/lib/jquery.ui.touch-punch.js",
"assets/cabri2/lib/algebrite.bundle-for-browser.js",
"assets/cabri2/lib/encoding.js",
"assets/cabri2/lib/encoding-indexes.js",
"assets/cabri2/lib/jszip.js",
// not necessary?:
"assets/cabri2/lib/pep.js",
// not necessary?:
"assets/cabri2/lib/simple-keyboard-layouts.js",
"assets/cabri2/lib/tincan-min.js",
// not necessary?:
"assets/cabri2/lib/web-animations.min.js",
"assets/cabri2/custom1.js",
"assets/cabri2/cabriassets.js",
"assets/cabri2/emcc-out/cdk.js",
"assets/cabri2/globals.js",
"chunk-vendors.js"
];
public loadingEnded = false;
postalSub: any;
constructor(
public cabriService: CabriDataService,
public platform: Platform,
public appComponent: AppComponent,
public globalService: GlobalService
) {
window.postal = postal;
window.isIos = this.platform.is("ios");
}
private resolveBabylonJS;
loadBabylonJS() {
return new Promise<void>(resolve => {
this.resolveBabylonJS = resolve;
if(!environment.ose){
const index = 0;
if(!this.globalService.lowPerformanceMode){
this.scriptsCabri.unshift("assets/js/opencv.js");
} else {
(window as any).cv = {message: 'opencv not loaded in low perf mode'};
}
this.recurringLoadScript(index);
} else {
window.document.querySelector("#cabriHidden").appendChild(window.document.querySelector("#CabriMainWrapper"));
this.loadingEnded = true;
this.platform.ready().then(() => {
resolve();
});
}
});
}
recurringLoadScript(index: number) {
get(this.scriptsCabri[index], () => {
const nbScripts = this.scriptsCabri.length;
index++;
if (index < nbScripts) {
this.appComponent.tempProgress = (index / (nbScripts - 1)) * 100; // progressbar
setTimeout(() => {
this.recurringLoadScript(index); // load next script
}, 100);
} else {
// missing cabri variable
window.Globals.Debug = new Array();
// clean cabri assets
for(const key in (window as any).CabriAssets){
if((window as any).CabriAssets.hasOwnProperty(key)){
(window as any).CabriAssets[key] = "";
}
}
//
// end of loading script
//
this.postalSub = postal.subscribe({
channel: "electron",
topic: "babylone.ready",
callback: async (data, envelope) => {
this.postalSub.unsubscribe();
this.postalSub = null;
this.endOfLoading();
}
});
// wait webpack end of loading for slow device
const waitWebPack = setInterval(() => {
console.log("wait runtime initialized");
if (window.runtimeInitialized) {
clearInterval(waitWebPack);
// load cabri APP
get("app.js", () => {
// function "weareready" are not directly accessible
const waitCabri = setInterval(() => {
try {
if (typeof window.weareready !== "undefined") {
clearInterval(waitCabri);
let holoMode = localStorage.getItem("holoMode");
const savedActivity = JSON.parse(localStorage.getItem("savedActivity"));
if (!holoMode && history?.state?.navigationId === 1 && this.globalService.onActivityPage) {
// when not passed from gabarits (reload page)
if (savedActivity?._params) {
savedActivity._params.find(item => {
if (item.name === "holo") {
holoMode = item.value;
}
});
}
}
if (savedActivity && savedActivity.id) {
if (savedActivity.id === "8") {
// solides vue différentes sur les quatre faces
window.Globals.HoloFaces = 4;
} else {
window.Globals.HoloFaces = 1;
}
}
localStorage.removeItem("holoMode");
if (holoMode === "1") {
window.Globals.Holo = 1;
window.params.append("holo", "1");
} else if (holoMode === "-1") {
window.Globals.Holo = -1;
window.params.append("holo", "-1");
} else {
// window.Globals.Holo = 0;
window.params.append("holo", "0");
}
window.Globals.FileToLoad = "assets/cabri2/default.clmc";
window.params.append("clmc", "assets/cabri2/default.clmc");
window.weareready();
}
} catch (error) {
// console.error(error);
throw error;
}
}, 300);
});
}
}, 300);
}
});
}
endOfLoading() {
window.store.getters.cabri.Cps.setActiveState(false);
this.globalService.webGl1 = window.store.getters.cabri.Engine.webGLVersion === 1;
if (this.globalService.webGl1) {
this.globalService._lowPerformanceMode = true;
this.globalService.lowPerformanceModeSetStorageValue();
}
AppUtils.debug("window.store.getters.cabri.engine.webGLVersion = ", window.store.getters.cabri.Engine.webGLVersion);
this.stopRender(true);
this.cabriService.savedDomMirrorMode = false;
this.cabriService.savedDomHoloMode = "0";
this.cabriService.currentSavedActivityId = "default";
window.document.querySelector("#cabriHidden").appendChild(window.document.querySelector("#CabriMainWrapper"));
this.loadingEnded = true;
environment.kidaia ? (window.document.title = "Kidaia") : (window.document.title = "Mathia");
this.resolveBabylonJS();
}
stopRender(stop = null) {
window.store.getters.cabri.Engine.stopRenderLoop();
}
waitEndOfLoading(): Promise<void> {
return new Promise(async resolve => {
await Promise.all([this.waitCabri(), this.waitPlatform()]);
resolve();
});
}
waitCabri(): Promise<void> {
return new Promise(resolve => {
const waitEndOfLoading = setInterval(() => {
// console.error(this.loadingEnded);
if (this.loadingEnded) {
clearInterval(waitEndOfLoading);
resolve();
}
}, 100);
});
}
waitPlatform(): Promise<void> {
return new Promise(resolve => {
this.platform.ready().then(() => {
resolve();
});
});
}
}