@babylonjs/viewer 7.34.4 → 7.35.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (34) hide show
  1. package/configuration/configuration.js.map +1 -1
  2. package/configuration/configurationCompatibility.js.map +1 -1
  3. package/configuration/mappers.js +2 -1
  4. package/configuration/mappers.js.map +1 -1
  5. package/configuration/renderOnlyLoader.js.map +1 -1
  6. package/configuration/types/index.js.map +1 -1
  7. package/helper/index.js.map +1 -1
  8. package/initializer.js.map +1 -1
  9. package/labs/environmentSerializer.js.map +1 -1
  10. package/labs/texture.js +2 -1
  11. package/labs/texture.js.map +1 -1
  12. package/labs/viewerLabs.js.map +1 -1
  13. package/loader/modelLoader.js.map +1 -1
  14. package/loader/plugins/index.js.map +1 -1
  15. package/loader/plugins/msftLodLoaderPlugin.js.map +1 -1
  16. package/managers/sceneManager.js.map +1 -1
  17. package/managers/telemetryManager.d.ts +1 -1
  18. package/managers/telemetryManager.js.map +1 -1
  19. package/model/modelAnimation.js.map +1 -1
  20. package/model/viewerModel.js.map +1 -1
  21. package/optimizer/custom/extended.js.map +1 -1
  22. package/optimizer/custom/index.js.map +1 -1
  23. package/package.json +5 -5
  24. package/templating/eventManager.js.map +1 -1
  25. package/templating/plugins/hdButtonPlugin.js +2 -1
  26. package/templating/plugins/hdButtonPlugin.js.map +1 -1
  27. package/templating/plugins/printButton.js +2 -1
  28. package/templating/plugins/printButton.js.map +1 -1
  29. package/templating/templateManager.js.map +1 -1
  30. package/templating/viewerTemplatePlugin.js.map +1 -1
  31. package/viewer/defaultViewer.js.map +1 -1
  32. package/viewer/renderOnlyViewer.js.map +1 -1
  33. package/viewer/viewer.js.map +1 -1
  34. package/viewer/viewerManager.js.map +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"telemetryManager.js","sourceRoot":"","sources":["../../../../tools/viewer/src/managers/telemetryManager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,2CAA6B;AAiClD;;GAEG;AACH;IAAA;QACI;;WAEG;QACI,iCAA4B,GAA8B,IAAI,UAAU,EAAE,CAAC;QAI1E,WAAM,GAA8D,IAAI,CAAC,aAAa,CAAC;IAgGnG,CAAC;IA3FG,sBAAW,uCAAS;QAHpB;;WAEG;aACH;YACI,OAAO,IAAI,CAAC,MAAM,CAAC;QACvB,CAAC;;;OAAA;IAED;;;;OAIG;IACI,2CAAgB,GAAvB,UAAwB,MAAsB,EAAE,QAAiB;QAC7D,IAAI,CAAC,MAAM,EAAE;YACT,OAAO;SACV;QACD,IAAI,SAAS,GAAG,IAAI,CAAC;QAErB,OAAO,SAAS,EAAE;YACd,IAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,EAAE,CAAC;YAChC,IAAI,KAAK,KAAK,CAAC,EAAE;gBACb,SAAS,GAAG,KAAK,CAAC;aACrB;iBAAM;gBACH,IAAI,CAAC,SAAS,CAAC,aAAa,EAAE,QAAQ,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;aAC7D;SACJ;IACL,CAAC;IAMD,sBAAW,oCAAM;QAJjB;;;WAGG;aACH,UAAkB,OAAgB;YAC9B,IAAI,OAAO,EAAE;gBACT,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,aAAa,CAAC;aACpC;iBAAM;gBACH,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,cAAc,CAAC;aACrC;QACL,CAAC;;;OAAA;IAED;;OAEG;IACK,yCAAc,GAAtB;QACI,gBAAgB;IACpB,CAAC;IAED;;;;;OAKG;IACK,wCAAa,GAArB,UAAsB,KAAa,EAAE,QAAiB,EAAE,OAAa;QACjE,IAAM,aAAa,GAAkB;YACjC,QAAQ,UAAA;YACR,KAAK,EAAE,KAAK;YACZ,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,IAAI,EAAE,IAAI,IAAI,EAAE;YAChB,GAAG,EAAE,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE;YAC/D,MAAM,EAAE,IAAI;SACf,CAAC;QAEF,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE;YAC7B,KAAK,IAAM,IAAI,IAAI,OAAO,EAAE;gBACxB,IAAI,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,EAAE;oBACpD,aAAqB,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;iBAChD;aACJ;SACJ;aAAM,IAAI,OAAO,EAAE;YAChB,aAAa,CAAC,MAAM,GAAG,OAAO,CAAC;SAClC;QAED,IAAI,CAAC,4BAA4B,CAAC,eAAe,CAAC,aAAa,CAAC,CAAC;IACrE,CAAC;IAMD,sBAAW,qCAAO;QAJlB;;;WAGG;aACH;YACI,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE;gBACzB,qCAAqC;gBACrC,IAAI,CAAC,iBAAiB,GAAG,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,OAAO,CAAC,CAAC;aAC1F;YACD,OAAO,IAAI,CAAC,iBAAiB,CAAC;QAClC,CAAC;;;OAAA;IAED;;OAEG;IACI,kCAAO,GAAd;QACI,IAAI,CAAC,4BAA4B,CAAC,KAAK,EAAE,CAAC;IAC9C,CAAC;IACL,uBAAC;AAAD,CAAC,AAxGD,IAwGC;;AAED,MAAM,CAAC,IAAM,gBAAgB,GAAG,IAAI,gBAAgB,EAAE,CAAC","sourcesContent":["import { Observable } from \"core/Misc/observable\";\r\nimport type { AbstractEngine } from \"core/Engines/abstractEngine\";\r\n\r\n/**\r\n * The data structure of a telemetry event.\r\n */\r\nexport interface TelemetryData {\r\n /**\r\n *\r\n */\r\n event: string;\r\n /**\r\n *\r\n */\r\n session: string;\r\n /**\r\n *\r\n */\r\n date: Date;\r\n /**\r\n *\r\n */\r\n now: number;\r\n /**\r\n *\r\n */\r\n viewerId?: string;\r\n /**\r\n *\r\n */\r\n detail: any;\r\n}\r\n\r\n/**\r\n * Receives Telemetry events and raises events to the API\r\n */\r\nexport class TelemetryManager {\r\n /**\r\n *\r\n */\r\n public onEventBroadcastedObservable: Observable<TelemetryData> = new Observable();\r\n\r\n private _currentSessionId: string;\r\n\r\n private _event: (event: string, viewerId?: string, details?: any) => void = this._eventEnabled;\r\n\r\n /**\r\n * Receives a telemetry event\r\n */\r\n public get broadcast() {\r\n return this._event;\r\n }\r\n\r\n /**\r\n * Log a Telemetry event for errors raised on the WebGL context.\r\n * @param engine The Babylon engine with the WebGL context.\r\n * @param viewerId\r\n */\r\n public flushWebGLErrors(engine: AbstractEngine, viewerId?: string) {\r\n if (!engine) {\r\n return;\r\n }\r\n let logErrors = true;\r\n\r\n while (logErrors) {\r\n const error = engine.getError();\r\n if (error === 0) {\r\n logErrors = false;\r\n } else {\r\n this.broadcast(\"WebGL Error\", viewerId, { error: error });\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Enable or disable telemetry events\r\n * @param enabled Boolean, true if events are enabled\r\n */\r\n public set enable(enabled: boolean) {\r\n if (enabled) {\r\n this._event = this._eventEnabled;\r\n } else {\r\n this._event = this._eventDisabled;\r\n }\r\n }\r\n\r\n /**\r\n * Called on event when disabled, typically do nothing here\r\n */\r\n private _eventDisabled(): void {\r\n // nothing to do\r\n }\r\n\r\n /**\r\n * Called on event when enabled\r\n * @param event - The name of the Telemetry event\r\n * @param viewerId\r\n * @param details An additional value, or an object containing a list of property/value pairs\r\n */\r\n private _eventEnabled(event: string, viewerId?: string, details?: any): void {\r\n const telemetryData: TelemetryData = {\r\n viewerId,\r\n event: event,\r\n session: this.session,\r\n date: new Date(),\r\n now: window.performance ? window.performance.now() : Date.now(),\r\n detail: null,\r\n };\r\n\r\n if (typeof details === \"object\") {\r\n for (const attr in details) {\r\n if (Object.prototype.hasOwnProperty.call(details, attr)) {\r\n (telemetryData as any)[attr] = details[attr];\r\n }\r\n }\r\n } else if (details) {\r\n telemetryData.detail = details;\r\n }\r\n\r\n this.onEventBroadcastedObservable.notifyObservers(telemetryData);\r\n }\r\n\r\n /**\r\n * Returns the current session ID or creates one if it doesn't exist\r\n * @returns The current session ID\r\n */\r\n public get session(): string {\r\n if (!this._currentSessionId) {\r\n //String + Timestamp + Random Integer\r\n this._currentSessionId = \"SESSION_\" + Date.now() + Math.floor(Math.random() * 0x10000);\r\n }\r\n return this._currentSessionId;\r\n }\r\n\r\n /**\r\n * Disposes the telemetry manager\r\n */\r\n public dispose() {\r\n this.onEventBroadcastedObservable.clear();\r\n }\r\n}\r\n\r\nexport const telemetryManager = new TelemetryManager();\r\n"]}
1
+ {"version":3,"file":"telemetryManager.js","sourceRoot":"","sources":["../../../../tools/viewer/src/managers/telemetryManager.ts"],"names":[],"mappings":"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","sourcesContent":["import { Observable } from \"core/Misc/observable\";\r\nimport type { AbstractEngine } from \"core/Engines/abstractEngine\";\r\n\r\n/**\r\n * The data structure of a telemetry event.\r\n */\r\nexport interface TelemetryData {\r\n /**\r\n *\r\n */\r\n event: string;\r\n /**\r\n *\r\n */\r\n session: string;\r\n /**\r\n *\r\n */\r\n date: Date;\r\n /**\r\n *\r\n */\r\n now: number;\r\n /**\r\n *\r\n */\r\n viewerId?: string;\r\n /**\r\n *\r\n */\r\n detail: any;\r\n}\r\n\r\n/**\r\n * Receives Telemetry events and raises events to the API\r\n */\r\nexport class TelemetryManager {\r\n /**\r\n *\r\n */\r\n public onEventBroadcastedObservable: Observable<TelemetryData> = new Observable();\r\n\r\n private _currentSessionId: string;\r\n\r\n private _event: (event: string, viewerId?: string, details?: any) => void = this._eventEnabled;\r\n\r\n /**\r\n * Receives a telemetry event\r\n */\r\n public get broadcast() {\r\n return this._event;\r\n }\r\n\r\n /**\r\n * Log a Telemetry event for errors raised on the WebGL context.\r\n * @param engine The Babylon engine with the WebGL context.\r\n * @param viewerId\r\n */\r\n public flushWebGLErrors(engine: AbstractEngine, viewerId?: string) {\r\n if (!engine) {\r\n return;\r\n }\r\n let logErrors = true;\r\n\r\n while (logErrors) {\r\n const error = engine.getError();\r\n if (error === 0) {\r\n logErrors = false;\r\n } else {\r\n this.broadcast(\"WebGL Error\", viewerId, { error: error });\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Enable or disable telemetry events\r\n * @param enabled Boolean, true if events are enabled\r\n */\r\n public set enable(enabled: boolean) {\r\n if (enabled) {\r\n this._event = this._eventEnabled;\r\n } else {\r\n this._event = this._eventDisabled;\r\n }\r\n }\r\n\r\n /**\r\n * Called on event when disabled, typically do nothing here\r\n */\r\n private _eventDisabled(): void {\r\n // nothing to do\r\n }\r\n\r\n /**\r\n * Called on event when enabled\r\n * @param event - The name of the Telemetry event\r\n * @param viewerId\r\n * @param details An additional value, or an object containing a list of property/value pairs\r\n */\r\n private _eventEnabled(event: string, viewerId?: string, details?: any): void {\r\n const telemetryData: TelemetryData = {\r\n viewerId,\r\n event: event,\r\n session: this.session,\r\n date: new Date(),\r\n now: window.performance ? window.performance.now() : Date.now(),\r\n detail: null,\r\n };\r\n\r\n if (typeof details === \"object\") {\r\n for (const attr in details) {\r\n if (Object.prototype.hasOwnProperty.call(details, attr)) {\r\n (telemetryData as any)[attr] = details[attr];\r\n }\r\n }\r\n } else if (details) {\r\n telemetryData.detail = details;\r\n }\r\n\r\n this.onEventBroadcastedObservable.notifyObservers(telemetryData);\r\n }\r\n\r\n /**\r\n * Returns the current session ID or creates one if it doesn't exist\r\n * @returns The current session ID\r\n */\r\n public get session(): string {\r\n if (!this._currentSessionId) {\r\n //String + Timestamp + Random Integer\r\n this._currentSessionId = \"SESSION_\" + Date.now() + Math.floor(Math.random() * 0x10000);\r\n }\r\n return this._currentSessionId;\r\n }\r\n\r\n /**\r\n * Disposes the telemetry manager\r\n */\r\n public dispose() {\r\n this.onEventBroadcastedObservable.clear();\r\n }\r\n}\r\n\r\nexport const telemetryManager = new TelemetryManager();\r\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"modelAnimation.js","sourceRoot":"","sources":["../../../../tools/viewer/src/model/modelAnimation.ts"],"names":[],"mappings":"AAIA;;GAEG;AACH,MAAM,CAAN,IAAY,iBAGX;AAHD,WAAY,iBAAiB;IACzB,yDAAI,CAAA;IACJ,yDAAI,CAAA;AACR,CAAC,EAHW,iBAAiB,KAAjB,iBAAiB,QAG5B;AAED;;GAEG;AACH,MAAM,CAAN,IAAY,cAMX;AAND,WAAY,cAAc;IACtB,mDAAI,CAAA;IACJ,yDAAO,CAAA;IACP,uDAAM,CAAA;IACN,yDAAO,CAAA;IACP,qDAAK,CAAA;AACT,CAAC,EANW,cAAc,KAAd,cAAc,QAMzB;AAED;;GAEG;AACH,MAAM,CAAN,IAAY,cAaX;AAbD,WAAY,cAAc;IACtB,uDAAU,CAAA;IACV,+DAAc,CAAA;IACd,2DAAY,CAAA;IACZ,+DAAc,CAAA;IACd,6DAAa,CAAA;IACb,iEAAe,CAAA;IACf,yEAAmB,CAAA;IACnB,6DAAa,CAAA;IACb,qEAAiB,CAAA;IACjB,iEAAe,CAAA;IACf,kEAAgB,CAAA;IAChB,4DAAa,CAAA;AACjB,CAAC,EAbW,cAAc,KAAd,cAAc,QAazB;AAmGD;;;GAGG;AACH;IAII;;;OAGG;IACH,6BAAoB,eAA+B;QAAnD,iBAQC;QARmB,oBAAe,GAAf,eAAe,CAAgB;QAC/C,IAAI,CAAC,MAAM,GAAG,cAAc,CAAC,IAAI,CAAC;QAClC,IAAI,CAAC,SAAS,GAAG,iBAAiB,CAAC,IAAI,CAAC;QAExC,IAAI,CAAC,eAAe,CAAC,wBAAwB,CAAC,GAAG,CAAC;YAC9C,KAAI,CAAC,MAAM,GAAG,cAAc,CAAC,KAAK,CAAC;YACnC,KAAI,CAAC,IAAI,EAAE,CAAC;QAChB,CAAC,CAAC,CAAC;IACP,CAAC;IAKD,sBAAW,qCAAI;QAHf;;WAEG;aACH;YACI,OAAO,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC;QACrC,CAAC;;;OAAA;IAKD,sBAAW,sCAAK;QAHhB;;WAEG;aACH;YACI,OAAO,IAAI,CAAC,MAAM,CAAC;QACvB,CAAC;;;OAAA;IAKD,sBAAW,2CAAU;QAHrB;;WAEG;aACH;YACI,OAAO,IAAI,CAAC,eAAe,CAAC,UAAU,CAAC;QAC3C,CAAC;QAED;;WAEG;aACH,UAAsB,KAAa;YAC/B,IAAI,CAAC,eAAe,CAAC,UAAU,GAAG,KAAK,CAAC;QAC5C,CAAC;;;OAPA;IAcD,sBAAW,uCAAM;QALjB;;;;WAIG;aACH;YACI,OAAO,IAAI,CAAC,eAAe,CAAC,EAAE,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC;QAC/D,CAAC;;;OAAA;IAQD,sBAAW,6CAAY;QANvB;;;;;WAKG;aACH;YACI,IAAI,IAAI,CAAC,eAAe,CAAC,kBAAkB,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,eAAe,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,iBAAiB,CAAC,CAAC,CAAC,EAAE;gBACzH,OAAO,IAAI,CAAC,eAAe,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,YAAY,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC;aAC7H;iBAAM;gBACH,OAAO,CAAC,CAAC;aACZ;QACL,CAAC;;;OAAA;IAKD,sBAAW,oCAAG;QAHd;;WAEG;aACH;YACI,mCAAmC;YACnC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,eAAe,CAAC,WAAW,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE;gBAC9D,IAAM,UAAU,GAAe,IAAI,CAAC,eAAe,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;gBACnE,IAAM,UAAU,GAAG,UAAU,CAAC,aAAa,EAAE,CAAC;gBAC9C,IAAI,CAAC,UAAU,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE;oBACnC,SAAS;iBACZ;gBACD,KAAK,IAAI,GAAG,GAAG,CAAC,EAAE,GAAG,GAAG,UAAU,CAAC,MAAM,EAAE,EAAE,GAAG,EAAE;oBAC9C,IAAI,UAAU,CAAC,GAAG,CAAC,CAAC,SAAS,IAAI,UAAU,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,cAAc,EAAE;wBACvE,OAAO,UAAU,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,cAAc,CAAC;qBACnD;iBACJ;aACJ;YACD,OAAO,CAAC,CAAC;QACb,CAAC;;;OAAA;IAKD,sBAAW,yCAAQ;QAHnB;;WAEG;aACH;YACI,OAAO,IAAI,CAAC,SAAS,CAAC;QAC1B,CAAC;QAED;;;;WAIG;aACH,UAAoB,KAAwB;YACxC,IAAI,KAAK,KAAK,IAAI,CAAC,SAAS,EAAE;gBAC1B,OAAO;aACV;YAED,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;YAEvB,IAAI,IAAI,CAAC,KAAK,KAAK,cAAc,CAAC,OAAO,EAAE;gBACvC,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,KAAK,iBAAiB,CAAC,IAAI,CAAC,CAAC;aACxE;iBAAM;gBACH,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE,CAAC;gBAC7B,IAAI,CAAC,MAAM,GAAG,cAAc,CAAC,IAAI,CAAC;aACrC;QACL,CAAC;;;OApBA;IAsBD;;OAEG;IACH,mCAAK,GAAL;QACI,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE,CAAC;IACjC,CAAC;IAED;;OAEG;IACH,qCAAO,GAAP;QACI,IAAI,IAAI,CAAC,KAAK,KAAK,cAAc,CAAC,MAAM,EAAE;YACtC,IAAI,CAAC,eAAe,CAAC,OAAO,EAAE,CAAC;SAClC;aAAM;YACH,IAAI,CAAC,KAAK,EAAE,CAAC;SAChB;IACL,CAAC;IAED;;;OAGG;IACH,uCAAS,GAAT,UAAU,WAAmB;QACzB,IAAI,CAAC,eAAe,CAAC,SAAS,CAAC,WAAW,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;IAC5E,CAAC;IAED;;OAEG;IACI,mCAAK,GAAZ;QACI,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,KAAK,iBAAiB,CAAC,IAAI,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;QACtF,IAAI,IAAI,CAAC,eAAe,CAAC,SAAS,EAAE;YAChC,IAAI,CAAC,MAAM,GAAG,cAAc,CAAC,OAAO,CAAC;SACxC;IACL,CAAC;IAED;;OAEG;IACH,mCAAK,GAAL;QACI,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE,CAAC;QAC7B,IAAI,CAAC,MAAM,GAAG,cAAc,CAAC,MAAM,CAAC;IACxC,CAAC;IAED;;;OAGG;IACI,kCAAI,GAAX;QACI,mDAAmD;QACnD,IAAI,IAAI,CAAC,MAAM,KAAK,cAAc,CAAC,KAAK,EAAE;YACtC,OAAO;SACV;QACD,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE,CAAC;QAC5B,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,SAAS,EAAE;YACjC,IAAI,CAAC,MAAM,GAAG,cAAc,CAAC,OAAO,CAAC;SACxC;IACL,CAAC;IAED;;OAEG;IACI,qCAAO,GAAd;QACI,IAAI,CAAC,eAAe,CAAC,OAAO,EAAE,CAAC;IACnC,CAAC;IACL,0BAAC;AAAD,CAAC,AArLD,IAqLC","sourcesContent":["import type { Vector3 } from \"core/Maths/math.vector\";\r\n// eslint-disable-next-line import/no-internal-modules\r\nimport type { AnimationGroup, Animatable } from \"core/Animations/index\";\r\n\r\n/**\r\n * Animation play mode enum - is the animation looping or playing once\r\n */\r\nexport enum AnimationPlayMode {\r\n ONCE,\r\n LOOP,\r\n}\r\n\r\n/**\r\n * An enum representing the current state of an animation object\r\n */\r\nexport enum AnimationState {\r\n INIT,\r\n PLAYING,\r\n PAUSED,\r\n STOPPED,\r\n ENDED,\r\n}\r\n\r\n/**\r\n * The different type of easing functions available\r\n */\r\nexport enum EasingFunction {\r\n Linear = 0,\r\n CircleEase = 1,\r\n BackEase = 2,\r\n BounceEase = 3,\r\n CubicEase = 4,\r\n ElasticEase = 5,\r\n ExponentialEase = 6,\r\n PowerEase = 7,\r\n QuadraticEase = 8,\r\n QuarticEase = 9,\r\n QuinticEase = 10,\r\n SineEase = 11,\r\n}\r\n\r\n/**\r\n * Defines a simple animation to be applied to a model (scale).\r\n */\r\nexport interface ModelAnimationConfiguration {\r\n /**\r\n * Time of animation, in seconds\r\n */\r\n time: number;\r\n\r\n /**\r\n * Scale to apply\r\n */\r\n scaling?: Vector3;\r\n\r\n /**\r\n * Easing function to apply\r\n * See SPECTRE.EasingFunction\r\n */\r\n easingFunction?: number;\r\n\r\n /**\r\n * An Easing mode to apply to the easing function\r\n * See BABYLON.EasingFunction\r\n */\r\n easingMode?: number;\r\n}\r\n\r\n/**\r\n * This interface can be implemented to define new types of ModelAnimation objects.\r\n */\r\nexport interface IModelAnimation {\r\n /**\r\n * Current animation state (playing, stopped etc')\r\n */\r\n readonly state: AnimationState;\r\n /**\r\n * the name of the animation\r\n */\r\n readonly name: string;\r\n /**\r\n * Get the max numbers of frame available in the animation group\r\n *\r\n * In correlation to an array, this would be \".length\"\r\n */\r\n readonly frames: number;\r\n /**\r\n * Get the current frame playing right now.\r\n * This can be used to poll the frame currently playing (and, for example, display a progress bar with the data)\r\n *\r\n * In correlation to an array, this would be the current index\r\n */\r\n readonly currentFrame: number;\r\n /**\r\n * Animation's FPS value\r\n */\r\n readonly fps: number;\r\n /**\r\n * Get or set the animation's speed ration (Frame-to-fps)\r\n */\r\n speedRatio: number;\r\n /**\r\n * Gets or sets the aimation's play mode.\r\n */\r\n playMode: AnimationPlayMode;\r\n /**\r\n * Start the animation\r\n */\r\n start(): void;\r\n /**\r\n * Stop the animation.\r\n * This will fail silently if the animation group is already stopped.\r\n */\r\n stop(): void;\r\n /**\r\n * Pause the animation\r\n * This will fail silently if the animation is not currently playing\r\n */\r\n pause(): void;\r\n /**\r\n * Reset this animation\r\n */\r\n reset(): void;\r\n /**\r\n * Restart the animation\r\n */\r\n restart(): void;\r\n /**\r\n * Go to a specific\r\n * @param frameNumber the frame number to go to\r\n */\r\n goToFrame(frameNumber: number): void;\r\n /**\r\n * Dispose this animation\r\n */\r\n dispose(): void;\r\n}\r\n\r\n/**\r\n * The GroupModelAnimation is an implementation of the IModelAnimation interface using BABYLON's\r\n * native GroupAnimation class.\r\n */\r\nexport class GroupModelAnimation implements IModelAnimation {\r\n private _playMode: AnimationPlayMode;\r\n private _state: AnimationState;\r\n\r\n /**\r\n * Create a new GroupModelAnimation object using an AnimationGroup object\r\n * @param _animationGroup The animation group to base the class on\r\n */\r\n constructor(private _animationGroup: AnimationGroup) {\r\n this._state = AnimationState.INIT;\r\n this._playMode = AnimationPlayMode.LOOP;\r\n\r\n this._animationGroup.onAnimationEndObservable.add(() => {\r\n this._state = AnimationState.ENDED;\r\n this.stop();\r\n });\r\n }\r\n\r\n /**\r\n * Get the animation's name\r\n */\r\n public get name() {\r\n return this._animationGroup.name;\r\n }\r\n\r\n /**\r\n * Get the current animation's state\r\n */\r\n public get state() {\r\n return this._state;\r\n }\r\n\r\n /**\r\n * Gets the speed ratio to use for all animations\r\n */\r\n public get speedRatio(): number {\r\n return this._animationGroup.speedRatio;\r\n }\r\n\r\n /**\r\n * Sets the speed ratio to use for all animations\r\n */\r\n public set speedRatio(value: number) {\r\n this._animationGroup.speedRatio = value;\r\n }\r\n\r\n /**\r\n * Get the max numbers of frame available in the animation group\r\n *\r\n * In correlation to an array, this would be \".length\"\r\n */\r\n public get frames(): number {\r\n return this._animationGroup.to - this._animationGroup.from;\r\n }\r\n\r\n /**\r\n * Get the current frame playing right now.\r\n * This can be used to poll the frame currently playing (and, for example, display a progress bar with the data)\r\n *\r\n * In correlation to an array, this would be the current index\r\n */\r\n public get currentFrame(): number {\r\n if (this._animationGroup.targetedAnimations[0] && this._animationGroup.targetedAnimations[0].animation.runtimeAnimations[0]) {\r\n return this._animationGroup.targetedAnimations[0].animation.runtimeAnimations[0].currentFrame - this._animationGroup.from;\r\n } else {\r\n return 0;\r\n }\r\n }\r\n\r\n /**\r\n * Get the FPS value of this animation\r\n */\r\n public get fps(): number {\r\n // get the first currentFrame found\r\n for (let i = 0; i < this._animationGroup.animatables.length; ++i) {\r\n const animatable: Animatable = this._animationGroup.animatables[i];\r\n const animations = animatable.getAnimations();\r\n if (!animations || !animations.length) {\r\n continue;\r\n }\r\n for (let idx = 0; idx < animations.length; ++idx) {\r\n if (animations[idx].animation && animations[idx].animation.framePerSecond) {\r\n return animations[idx].animation.framePerSecond;\r\n }\r\n }\r\n }\r\n return 0;\r\n }\r\n\r\n /**\r\n * What is the animation'S play mode (looping or played once)\r\n */\r\n public get playMode(): AnimationPlayMode {\r\n return this._playMode;\r\n }\r\n\r\n /**\r\n * Set the play mode.\r\n * If the animation is played, it will continue playing at least once more, depending on the new play mode set.\r\n * If the animation is not set, the will be initialized and will wait for the user to start playing it.\r\n */\r\n public set playMode(value: AnimationPlayMode) {\r\n if (value === this._playMode) {\r\n return;\r\n }\r\n\r\n this._playMode = value;\r\n\r\n if (this.state === AnimationState.PLAYING) {\r\n this._animationGroup.play(this._playMode === AnimationPlayMode.LOOP);\r\n } else {\r\n this._animationGroup.reset();\r\n this._state = AnimationState.INIT;\r\n }\r\n }\r\n\r\n /**\r\n * Reset the animation group\r\n */\r\n reset() {\r\n this._animationGroup.reset();\r\n }\r\n\r\n /**\r\n * Restart the animation group\r\n */\r\n restart() {\r\n if (this.state === AnimationState.PAUSED) {\r\n this._animationGroup.restart();\r\n } else {\r\n this.start();\r\n }\r\n }\r\n\r\n /**\r\n *\r\n * @param frameNumber Go to a specific frame in the animation\r\n */\r\n goToFrame(frameNumber: number) {\r\n this._animationGroup.goToFrame(frameNumber + this._animationGroup.from);\r\n }\r\n\r\n /**\r\n * Start playing the animation.\r\n */\r\n public start() {\r\n this._animationGroup.start(this.playMode === AnimationPlayMode.LOOP, this.speedRatio);\r\n if (this._animationGroup.isStarted) {\r\n this._state = AnimationState.PLAYING;\r\n }\r\n }\r\n\r\n /**\r\n * Pause the animation\r\n */\r\n pause() {\r\n this._animationGroup.pause();\r\n this._state = AnimationState.PAUSED;\r\n }\r\n\r\n /**\r\n * Stop the animation.\r\n * This will fail silently if the animation group is already stopped.\r\n */\r\n public stop() {\r\n // do not trigger stop if animation state is ended.\r\n if (this._state === AnimationState.ENDED) {\r\n return;\r\n }\r\n this._animationGroup.stop();\r\n if (!this._animationGroup.isStarted) {\r\n this._state = AnimationState.STOPPED;\r\n }\r\n }\r\n\r\n /**\r\n * Dispose this animation object.\r\n */\r\n public dispose() {\r\n this._animationGroup.dispose();\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"modelAnimation.js","sourceRoot":"","sources":["../../../../tools/viewer/src/model/modelAnimation.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Vector3 } from \"core/Maths/math.vector\";\r\n// eslint-disable-next-line import/no-internal-modules\r\nimport type { AnimationGroup, Animatable } from \"core/Animations/index\";\r\n\r\n/**\r\n * Animation play mode enum - is the animation looping or playing once\r\n */\r\nexport enum AnimationPlayMode {\r\n ONCE,\r\n LOOP,\r\n}\r\n\r\n/**\r\n * An enum representing the current state of an animation object\r\n */\r\nexport enum AnimationState {\r\n INIT,\r\n PLAYING,\r\n PAUSED,\r\n STOPPED,\r\n ENDED,\r\n}\r\n\r\n/**\r\n * The different type of easing functions available\r\n */\r\nexport enum EasingFunction {\r\n Linear = 0,\r\n CircleEase = 1,\r\n BackEase = 2,\r\n BounceEase = 3,\r\n CubicEase = 4,\r\n ElasticEase = 5,\r\n ExponentialEase = 6,\r\n PowerEase = 7,\r\n QuadraticEase = 8,\r\n QuarticEase = 9,\r\n QuinticEase = 10,\r\n SineEase = 11,\r\n}\r\n\r\n/**\r\n * Defines a simple animation to be applied to a model (scale).\r\n */\r\nexport interface ModelAnimationConfiguration {\r\n /**\r\n * Time of animation, in seconds\r\n */\r\n time: number;\r\n\r\n /**\r\n * Scale to apply\r\n */\r\n scaling?: Vector3;\r\n\r\n /**\r\n * Easing function to apply\r\n * See SPECTRE.EasingFunction\r\n */\r\n easingFunction?: number;\r\n\r\n /**\r\n * An Easing mode to apply to the easing function\r\n * See BABYLON.EasingFunction\r\n */\r\n easingMode?: number;\r\n}\r\n\r\n/**\r\n * This interface can be implemented to define new types of ModelAnimation objects.\r\n */\r\nexport interface IModelAnimation {\r\n /**\r\n * Current animation state (playing, stopped etc')\r\n */\r\n readonly state: AnimationState;\r\n /**\r\n * the name of the animation\r\n */\r\n readonly name: string;\r\n /**\r\n * Get the max numbers of frame available in the animation group\r\n *\r\n * In correlation to an array, this would be \".length\"\r\n */\r\n readonly frames: number;\r\n /**\r\n * Get the current frame playing right now.\r\n * This can be used to poll the frame currently playing (and, for example, display a progress bar with the data)\r\n *\r\n * In correlation to an array, this would be the current index\r\n */\r\n readonly currentFrame: number;\r\n /**\r\n * Animation's FPS value\r\n */\r\n readonly fps: number;\r\n /**\r\n * Get or set the animation's speed ration (Frame-to-fps)\r\n */\r\n speedRatio: number;\r\n /**\r\n * Gets or sets the aimation's play mode.\r\n */\r\n playMode: AnimationPlayMode;\r\n /**\r\n * Start the animation\r\n */\r\n start(): void;\r\n /**\r\n * Stop the animation.\r\n * This will fail silently if the animation group is already stopped.\r\n */\r\n stop(): void;\r\n /**\r\n * Pause the animation\r\n * This will fail silently if the animation is not currently playing\r\n */\r\n pause(): void;\r\n /**\r\n * Reset this animation\r\n */\r\n reset(): void;\r\n /**\r\n * Restart the animation\r\n */\r\n restart(): void;\r\n /**\r\n * Go to a specific\r\n * @param frameNumber the frame number to go to\r\n */\r\n goToFrame(frameNumber: number): void;\r\n /**\r\n * Dispose this animation\r\n */\r\n dispose(): void;\r\n}\r\n\r\n/**\r\n * The GroupModelAnimation is an implementation of the IModelAnimation interface using BABYLON's\r\n * native GroupAnimation class.\r\n */\r\nexport class GroupModelAnimation implements IModelAnimation {\r\n private _playMode: AnimationPlayMode;\r\n private _state: AnimationState;\r\n\r\n /**\r\n * Create a new GroupModelAnimation object using an AnimationGroup object\r\n * @param _animationGroup The animation group to base the class on\r\n */\r\n constructor(private _animationGroup: AnimationGroup) {\r\n this._state = AnimationState.INIT;\r\n this._playMode = AnimationPlayMode.LOOP;\r\n\r\n this._animationGroup.onAnimationEndObservable.add(() => {\r\n this._state = AnimationState.ENDED;\r\n this.stop();\r\n });\r\n }\r\n\r\n /**\r\n * Get the animation's name\r\n */\r\n public get name() {\r\n return this._animationGroup.name;\r\n }\r\n\r\n /**\r\n * Get the current animation's state\r\n */\r\n public get state() {\r\n return this._state;\r\n }\r\n\r\n /**\r\n * Gets the speed ratio to use for all animations\r\n */\r\n public get speedRatio(): number {\r\n return this._animationGroup.speedRatio;\r\n }\r\n\r\n /**\r\n * Sets the speed ratio to use for all animations\r\n */\r\n public set speedRatio(value: number) {\r\n this._animationGroup.speedRatio = value;\r\n }\r\n\r\n /**\r\n * Get the max numbers of frame available in the animation group\r\n *\r\n * In correlation to an array, this would be \".length\"\r\n */\r\n public get frames(): number {\r\n return this._animationGroup.to - this._animationGroup.from;\r\n }\r\n\r\n /**\r\n * Get the current frame playing right now.\r\n * This can be used to poll the frame currently playing (and, for example, display a progress bar with the data)\r\n *\r\n * In correlation to an array, this would be the current index\r\n */\r\n public get currentFrame(): number {\r\n if (this._animationGroup.targetedAnimations[0] && this._animationGroup.targetedAnimations[0].animation.runtimeAnimations[0]) {\r\n return this._animationGroup.targetedAnimations[0].animation.runtimeAnimations[0].currentFrame - this._animationGroup.from;\r\n } else {\r\n return 0;\r\n }\r\n }\r\n\r\n /**\r\n * Get the FPS value of this animation\r\n */\r\n public get fps(): number {\r\n // get the first currentFrame found\r\n for (let i = 0; i < this._animationGroup.animatables.length; ++i) {\r\n const animatable: Animatable = this._animationGroup.animatables[i];\r\n const animations = animatable.getAnimations();\r\n if (!animations || !animations.length) {\r\n continue;\r\n }\r\n for (let idx = 0; idx < animations.length; ++idx) {\r\n if (animations[idx].animation && animations[idx].animation.framePerSecond) {\r\n return animations[idx].animation.framePerSecond;\r\n }\r\n }\r\n }\r\n return 0;\r\n }\r\n\r\n /**\r\n * What is the animation'S play mode (looping or played once)\r\n */\r\n public get playMode(): AnimationPlayMode {\r\n return this._playMode;\r\n }\r\n\r\n /**\r\n * Set the play mode.\r\n * If the animation is played, it will continue playing at least once more, depending on the new play mode set.\r\n * If the animation is not set, the will be initialized and will wait for the user to start playing it.\r\n */\r\n public set playMode(value: AnimationPlayMode) {\r\n if (value === this._playMode) {\r\n return;\r\n }\r\n\r\n this._playMode = value;\r\n\r\n if (this.state === AnimationState.PLAYING) {\r\n this._animationGroup.play(this._playMode === AnimationPlayMode.LOOP);\r\n } else {\r\n this._animationGroup.reset();\r\n this._state = AnimationState.INIT;\r\n }\r\n }\r\n\r\n /**\r\n * Reset the animation group\r\n */\r\n reset() {\r\n this._animationGroup.reset();\r\n }\r\n\r\n /**\r\n * Restart the animation group\r\n */\r\n restart() {\r\n if (this.state === AnimationState.PAUSED) {\r\n this._animationGroup.restart();\r\n } else {\r\n this.start();\r\n }\r\n }\r\n\r\n /**\r\n *\r\n * @param frameNumber Go to a specific frame in the animation\r\n */\r\n goToFrame(frameNumber: number) {\r\n this._animationGroup.goToFrame(frameNumber + this._animationGroup.from);\r\n }\r\n\r\n /**\r\n * Start playing the animation.\r\n */\r\n public start() {\r\n this._animationGroup.start(this.playMode === AnimationPlayMode.LOOP, this.speedRatio);\r\n if (this._animationGroup.isStarted) {\r\n this._state = AnimationState.PLAYING;\r\n }\r\n }\r\n\r\n /**\r\n * Pause the animation\r\n */\r\n pause() {\r\n this._animationGroup.pause();\r\n this._state = AnimationState.PAUSED;\r\n }\r\n\r\n /**\r\n * Stop the animation.\r\n * This will fail silently if the animation group is already stopped.\r\n */\r\n public stop() {\r\n // do not trigger stop if animation state is ended.\r\n if (this._state === AnimationState.ENDED) {\r\n return;\r\n }\r\n this._animationGroup.stop();\r\n if (!this._animationGroup.isStarted) {\r\n this._state = AnimationState.STOPPED;\r\n }\r\n }\r\n\r\n /**\r\n * Dispose this animation object.\r\n */\r\n public dispose() {\r\n this._animationGroup.dispose();\r\n }\r\n}\r\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"viewerModel.js","sourceRoot":"","sources":["../../../../tools/viewer/src/model/viewerModel.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable import/no-internal-modules */\r\nimport type { IDisposable } from \"core/scene\";\r\nimport type { ISceneLoaderPlugin, ISceneLoaderPluginAsync, ISceneLoaderProgressEvent } from \"core/Loading/sceneLoader\";\r\nimport type { AbstractMesh } from \"core/Meshes/abstractMesh\";\r\nimport type { IParticleSystem } from \"core/Particles/IParticleSystem\";\r\nimport type { Skeleton } from \"core/Bones/skeleton\";\r\nimport { Observable } from \"core/Misc/observable\";\r\nimport \"core/Misc/observable.extensions\";\r\nimport { AnimationGroup } from \"core/Animations/animationGroup\";\r\nimport type { Animatable } from \"core/Animations/index\";\r\nimport {\r\n Animation,\r\n CircleEase,\r\n BackEase,\r\n BounceEase,\r\n CubicEase,\r\n ElasticEase,\r\n ExponentialEase,\r\n PowerEase,\r\n QuadraticEase,\r\n QuarticEase,\r\n QuinticEase,\r\n SineEase,\r\n} from \"core/Animations/index\";\r\nimport type { Nullable } from \"core/types\";\r\nimport { Quaternion, Vector3 } from \"core/Maths/math.vector\";\r\nimport { Tags } from \"core/Misc/tags\";\r\nimport type { Material } from \"core/Materials/material\";\r\nimport { PBRMaterial } from \"core/Materials/PBR/pbrMaterial\";\r\nimport { MultiMaterial } from \"core/Materials/multiMaterial\";\r\nimport { Tools } from \"core/Misc/tools\";\r\nimport type { GLTFFileLoader } from \"loaders/glTF/index\";\r\nimport type { IAsset } from \"babylonjs-gltf2interface\";\r\nimport type { IModelConfiguration } from \"../configuration/interfaces/modelConfiguration\";\r\nimport type { IModelAnimationConfiguration } from \"../configuration/interfaces/modelAnimationConfiguration\";\r\nimport type { IModelAnimation, ModelAnimationConfiguration } from \"./modelAnimation\";\r\nimport { GroupModelAnimation, AnimationPlayMode, EasingFunction, AnimationState } from \"./modelAnimation\";\r\nimport { deepmerge, extendClassWithConfig } from \"../helper/index\";\r\nimport type { ObservablesManager } from \"../managers/observablesManager\";\r\nimport type { ConfigurationContainer } from \"../configuration/configurationContainer\";\r\nimport { TransformNode } from \"core/Meshes/transformNode\";\r\nimport { Mesh } from \"core/Meshes/mesh\";\r\n\r\n/**\r\n * The current state of the model\r\n */\r\nexport enum ModelState {\r\n INIT,\r\n LOADING,\r\n LOADED,\r\n ENTRY,\r\n ENTRYDONE,\r\n COMPLETE,\r\n CANCELED,\r\n ERROR,\r\n}\r\n\r\n/**\r\n * The viewer model is a container for all assets representing a sngle loaded model.\r\n */\r\nexport class ViewerModel implements IDisposable {\r\n /**\r\n * The loader used to load this model.\r\n */\r\n public loader: ISceneLoaderPlugin | ISceneLoaderPluginAsync;\r\n\r\n private _animations: Array<IModelAnimation>;\r\n\r\n /**\r\n * the list of meshes that are a part of this model\r\n */\r\n private _meshes: Array<AbstractMesh> = [];\r\n /**\r\n * This model's root mesh (the parent of all other meshes).\r\n * This mesh does not(!) exist in the meshes array.\r\n */\r\n public rootMesh: AbstractMesh;\r\n\r\n private _pivotMesh: TransformNode;\r\n /**\r\n * ParticleSystems connected to this model\r\n */\r\n public particleSystems: Array<IParticleSystem> = [];\r\n /**\r\n * Skeletons defined in this model\r\n */\r\n public skeletons: Array<Skeleton> = [];\r\n /**\r\n * The current model animation.\r\n * On init, this will be undefined.\r\n */\r\n public currentAnimation: IModelAnimation;\r\n\r\n /**\r\n * Observers registered here will be executed when the model is done loading\r\n */\r\n public onLoadedObservable: Observable<ViewerModel>;\r\n /**\r\n * Observers registered here will be executed when the loader notified of a progress event\r\n */\r\n public onLoadProgressObservable: Observable<ISceneLoaderProgressEvent>;\r\n /**\r\n * Observers registered here will be executed when the loader notified of an error.\r\n */\r\n public onLoadErrorObservable: Observable<{ message: string; exception: any }>;\r\n\r\n /**\r\n * Will be executed after the model finished loading and complete, including entry animation and lod\r\n */\r\n public onCompleteObservable: Observable<ViewerModel>;\r\n /**\r\n * Observers registered here will be executed every time the model is being configured.\r\n * This can be used to extend the model's configuration without extending the class itself\r\n */\r\n public onAfterConfigure: Observable<ViewerModel>;\r\n\r\n /**\r\n * The current model state (loaded, error, etc)\r\n */\r\n public state: ModelState;\r\n /**\r\n * A loadID provided by the modelLoader, unique to ths (Abstract)Viewer instance.\r\n */\r\n public loadId: number;\r\n\r\n public loadInfo: IAsset;\r\n private _modelConfiguration: IModelConfiguration;\r\n\r\n private _loaderDone: boolean = false;\r\n\r\n private _entryAnimation: ModelAnimationConfiguration;\r\n private _scaleTransition: Animation;\r\n private _animatables: Array<Animatable> = [];\r\n private _frameRate: number = 60;\r\n\r\n private _shadowsRenderedAfterLoad: boolean = false;\r\n\r\n constructor(\r\n private _observablesManager: ObservablesManager,\r\n modelConfiguration: IModelConfiguration,\r\n private _configurationContainer?: ConfigurationContainer\r\n ) {\r\n this.onLoadedObservable = new Observable();\r\n this.onLoadErrorObservable = new Observable();\r\n this.onLoadProgressObservable = new Observable();\r\n this.onCompleteObservable = new Observable();\r\n this.onAfterConfigure = new Observable();\r\n\r\n this.state = ModelState.INIT;\r\n\r\n const scene = this._configurationContainer && this._configurationContainer.scene;\r\n\r\n this.rootMesh = new Mesh(\"modelRootMesh\", scene);\r\n this._pivotMesh = new TransformNode(\"pivotMesh\", scene);\r\n this._pivotMesh.parent = this.rootMesh;\r\n // rotate 180, gltf fun\r\n this._pivotMesh.rotation.y += Math.PI;\r\n\r\n this._scaleTransition = new Animation(\"scaleAnimation\", \"scaling\", this._frameRate, Animation.ANIMATIONTYPE_VECTOR3, Animation.ANIMATIONLOOPMODE_CONSTANT);\r\n\r\n this._animations = [];\r\n //create a copy of the configuration to make sure it doesn't change even after it is changed in the viewer\r\n this._modelConfiguration = deepmerge((this._configurationContainer && this._configurationContainer.configuration.model) || {}, modelConfiguration);\r\n\r\n if (this._observablesManager) {\r\n this._observablesManager.onModelAddedObservable.notifyObservers(this);\r\n }\r\n\r\n if (this._modelConfiguration.entryAnimation) {\r\n this.rootMesh.setEnabled(false);\r\n }\r\n\r\n this.onLoadedObservable.add(() => {\r\n this.updateConfiguration(this._modelConfiguration);\r\n if (this._observablesManager) {\r\n this._observablesManager.onModelLoadedObservable.notifyObservers(this);\r\n }\r\n this._initAnimations();\r\n });\r\n\r\n this.onCompleteObservable.add(() => {\r\n this.state = ModelState.COMPLETE;\r\n });\r\n }\r\n\r\n public get shadowsRenderedAfterLoad() {\r\n return this._shadowsRenderedAfterLoad;\r\n }\r\n\r\n public set shadowsRenderedAfterLoad(rendered: boolean) {\r\n if (!rendered) {\r\n throw new Error(\"can only be enabled\");\r\n } else {\r\n this._shadowsRenderedAfterLoad = rendered;\r\n }\r\n }\r\n\r\n public getViewerId() {\r\n return this._configurationContainer && this._configurationContainer.viewerId;\r\n }\r\n\r\n /**\r\n * Is this model enabled?\r\n */\r\n public get enabled() {\r\n return this.rootMesh.isEnabled();\r\n }\r\n\r\n /**\r\n * Set whether this model is enabled or not.\r\n */\r\n public set enabled(enable: boolean) {\r\n this.rootMesh.setEnabled(enable);\r\n }\r\n\r\n public set loaderDone(done: boolean) {\r\n this._loaderDone = done;\r\n this._checkCompleteState();\r\n }\r\n\r\n private _checkCompleteState() {\r\n if (this._loaderDone && this.state === ModelState.ENTRYDONE) {\r\n this._modelComplete();\r\n }\r\n }\r\n\r\n /**\r\n * Add a mesh to this model.\r\n * Any mesh that has no parent will be provided with the root mesh as its new parent.\r\n *\r\n * @param mesh the new mesh to add\r\n * @param triggerLoaded should this mesh trigger the onLoaded observable. Used when adding meshes manually.\r\n * @returns a promise that will resolve when the model is done loading\r\n */\r\n public addMesh(mesh: AbstractMesh, triggerLoaded?: boolean) {\r\n if (!mesh.parent) {\r\n mesh.parent = this._pivotMesh;\r\n }\r\n\r\n if (mesh.getClassName() !== \"InstancedMesh\") {\r\n mesh.receiveShadows = !!this.configuration.receiveShadows;\r\n }\r\n\r\n this._meshes.push(mesh);\r\n if (triggerLoaded) {\r\n return this.onLoadedObservable.notifyObserversWithPromise(this);\r\n }\r\n return Promise.resolve(this);\r\n }\r\n\r\n /**\r\n * get the list of meshes (excluding the root mesh)\r\n */\r\n public get meshes() {\r\n return this._meshes;\r\n }\r\n\r\n /**\r\n * Get the model's configuration\r\n */\r\n public get configuration(): IModelConfiguration {\r\n return this._modelConfiguration;\r\n }\r\n\r\n /**\r\n * (Re-)set the model's entire configuration\r\n * @param newConfiguration the new configuration to replace the new one\r\n */\r\n public set configuration(newConfiguration: IModelConfiguration) {\r\n this._modelConfiguration = newConfiguration;\r\n this._configureModel();\r\n }\r\n\r\n /**\r\n * Update the current configuration with new values.\r\n * Configuration will not be overwritten, but merged with the new configuration.\r\n * Priority is to the new configuration\r\n * @param newConfiguration the configuration to be merged into the current configuration;\r\n */\r\n public updateConfiguration(newConfiguration: Partial<IModelConfiguration>) {\r\n this._modelConfiguration = deepmerge(this._modelConfiguration, newConfiguration);\r\n this._configureModel();\r\n }\r\n\r\n private _initAnimations() {\r\n // check if this is not a gltf loader and init the animations\r\n if (this.skeletons.length) {\r\n this.skeletons.forEach((skeleton, idx) => {\r\n const ag = new AnimationGroup(\"animation-\" + idx, this._configurationContainer && this._configurationContainer.scene);\r\n let add = false;\r\n skeleton.getAnimatables().forEach((a) => {\r\n if (a.animations && a.animations[0]) {\r\n ag.addTargetedAnimation(a.animations[0], a);\r\n add = true;\r\n }\r\n });\r\n if (add) {\r\n this.addAnimationGroup(ag);\r\n }\r\n });\r\n }\r\n\r\n let completeCallback = () => {};\r\n\r\n if (this._modelConfiguration.animation) {\r\n if (this._modelConfiguration.animation.playOnce) {\r\n this._animations.forEach((a) => {\r\n a.playMode = AnimationPlayMode.ONCE;\r\n });\r\n }\r\n if (this._modelConfiguration.animation.autoStart && this._animations.length) {\r\n const animationName = this._modelConfiguration.animation.autoStart === true ? this._animations[0].name : this._modelConfiguration.animation.autoStart;\r\n\r\n completeCallback = () => {\r\n this.playAnimation(animationName);\r\n };\r\n }\r\n }\r\n\r\n this._enterScene(completeCallback);\r\n }\r\n\r\n /**\r\n * Animates the model from the current position to the default position\r\n * @param completeCallback A function to call when the animation has completed\r\n */\r\n private _enterScene(completeCallback?: () => void): void {\r\n const scene = this.rootMesh.getScene();\r\n const previousValue = scene.animationPropertiesOverride!.enableBlending;\r\n const callback = () => {\r\n this.state = ModelState.ENTRYDONE;\r\n scene.animationPropertiesOverride!.enableBlending = previousValue;\r\n this._checkCompleteState();\r\n if (completeCallback) {\r\n completeCallback();\r\n }\r\n };\r\n if (!this._entryAnimation) {\r\n callback();\r\n return;\r\n }\r\n this.rootMesh.setEnabled(true);\r\n // disable blending for the sake of the entry animation;\r\n scene.animationPropertiesOverride!.enableBlending = false;\r\n this._applyAnimation(this._entryAnimation, true, callback);\r\n }\r\n\r\n // /**\r\n // * Animates the model from the current position to the exit-screen position\r\n // * @param completeCallback A function to call when the animation has completed\r\n // */\r\n // private _exitScene(completeCallback: () => void): void {\r\n // if (!this._exitAnimation) {\r\n // completeCallback();\r\n // return;\r\n // }\r\n\r\n // this._applyAnimation(this._exitAnimation, false, completeCallback);\r\n // }\r\n\r\n private _modelComplete() {\r\n //reapply material defines to be sure:\r\n const meshes = this._pivotMesh.getChildMeshes(false);\r\n meshes\r\n .filter((m) => m.material)\r\n .forEach((mesh) => {\r\n this._applyModelMaterialConfiguration(mesh.material!);\r\n });\r\n this.state = ModelState.COMPLETE;\r\n this.onCompleteObservable.notifyObservers(this);\r\n }\r\n\r\n /**\r\n * Add a new animation group to this model.\r\n * @param animationGroup the new animation group to be added\r\n */\r\n public addAnimationGroup(animationGroup: AnimationGroup) {\r\n this._animations.push(new GroupModelAnimation(animationGroup));\r\n }\r\n\r\n /**\r\n * Get the ModelAnimation array\r\n * @returns the array of ModelAnimations\r\n */\r\n public getAnimations(): Array<IModelAnimation> {\r\n return this._animations;\r\n }\r\n\r\n /**\r\n * Get the animations' names. Using the names you can play a specific animation.\r\n * @returns the array of ModelAnimations\r\n */\r\n public getAnimationNames(): Array<string> {\r\n return this._animations.map((a) => a.name);\r\n }\r\n\r\n /**\r\n * Get an animation by the provided name. Used mainly when playing n animation.\r\n * @param name the name of the animation to find\r\n * @returns the ModelAnimation object\r\n */\r\n protected _getAnimationByName(name: string): Nullable<IModelAnimation> {\r\n // can't use .find, noe available on IE\r\n const filtered = this._animations.filter((a) => a.name === name.trim());\r\n if (filtered.length >= 1) {\r\n return filtered[0];\r\n } else {\r\n return null;\r\n }\r\n }\r\n\r\n /**\r\n * Choose an initialized animation using its name and start playing it\r\n * @param name the name of the animation to play\r\n * @returns The model aniamtion to be played.\r\n */\r\n public playAnimation(name: string): IModelAnimation {\r\n const animation = this.setCurrentAnimationByName(name);\r\n if (animation) {\r\n animation.start();\r\n }\r\n return animation;\r\n }\r\n\r\n public setCurrentAnimationByName(name: string) {\r\n const animation = this._getAnimationByName(name.trim());\r\n if (animation) {\r\n if (this.currentAnimation && this.currentAnimation.state !== AnimationState.STOPPED) {\r\n this.currentAnimation.stop();\r\n }\r\n this.currentAnimation = animation;\r\n return animation;\r\n } else {\r\n throw new Error(\"animation not found - \" + name);\r\n }\r\n }\r\n\r\n private _configureModel() {\r\n // this can be changed to the meshes that have rootMesh a parent without breaking anything.\r\n const meshesWithNoParent: Array<TransformNode> = [this.rootMesh]; //this._meshes.filter(m => m.parent === this.rootMesh);\r\n const updateMeshesWithNoParent = (variable: string, value: any, param?: string) => {\r\n meshesWithNoParent.forEach((mesh) => {\r\n if (param) {\r\n mesh[variable as keyof TransformNode][param] = value;\r\n } else {\r\n (mesh as any)[variable] = value;\r\n }\r\n });\r\n };\r\n const updateXYZ = (variable: string, configValues: { x: number; y: number; z: number; w?: number }) => {\r\n if (configValues.x !== undefined) {\r\n updateMeshesWithNoParent(variable, configValues.x, \"x\");\r\n }\r\n if (configValues.y !== undefined) {\r\n updateMeshesWithNoParent(variable, configValues.y, \"y\");\r\n }\r\n if (configValues.z !== undefined) {\r\n updateMeshesWithNoParent(variable, configValues.z, \"z\");\r\n }\r\n if (configValues.w !== undefined) {\r\n updateMeshesWithNoParent(variable, configValues.w, \"w\");\r\n }\r\n };\r\n\r\n if (this._modelConfiguration.normalize) {\r\n let center = false;\r\n let unitSize = false;\r\n let parentIndex;\r\n if (this._modelConfiguration.normalize === true) {\r\n center = true;\r\n unitSize = true;\r\n } else {\r\n center = !!this._modelConfiguration.normalize.center;\r\n unitSize = !!this._modelConfiguration.normalize.unitSize;\r\n parentIndex = this._modelConfiguration.normalize.parentIndex;\r\n }\r\n\r\n let meshesToNormalize: Array<TransformNode> = [];\r\n if (parentIndex !== undefined) {\r\n meshesToNormalize.push(this._meshes[parentIndex]);\r\n } else {\r\n meshesToNormalize = this._pivotMesh.getChildMeshes(true).length === 1 ? [this._pivotMesh] : meshesWithNoParent;\r\n }\r\n\r\n if (unitSize) {\r\n meshesToNormalize.forEach((mesh) => {\r\n mesh.normalizeToUnitCube(true);\r\n mesh.computeWorldMatrix(true);\r\n });\r\n }\r\n if (center) {\r\n meshesToNormalize.forEach((mesh) => {\r\n const boundingInfo = mesh.getHierarchyBoundingVectors(true);\r\n const sizeVec = boundingInfo.max.subtract(boundingInfo.min);\r\n const halfSizeVec = sizeVec.scale(0.5);\r\n const center = boundingInfo.min.add(halfSizeVec);\r\n mesh.position = center.scale(-1);\r\n\r\n mesh.position.y += halfSizeVec.y;\r\n\r\n // Recompute Info.\r\n mesh.computeWorldMatrix(true);\r\n });\r\n }\r\n } else {\r\n // if centered, should be done here\r\n }\r\n\r\n // position?\r\n if (this._modelConfiguration.position) {\r\n updateXYZ(\"position\", this._modelConfiguration.position);\r\n }\r\n if (this._modelConfiguration.rotation) {\r\n //quaternion?\r\n if (this._modelConfiguration.rotation.w) {\r\n meshesWithNoParent.forEach((mesh) => {\r\n if (!mesh.rotationQuaternion) {\r\n mesh.rotationQuaternion = new Quaternion();\r\n }\r\n });\r\n updateXYZ(\"rotationQuaternion\", this._modelConfiguration.rotation);\r\n } else {\r\n updateXYZ(\"rotation\", this._modelConfiguration.rotation);\r\n }\r\n }\r\n\r\n if (this._modelConfiguration.rotationOffsetAxis) {\r\n const rotationAxis = new Vector3(\r\n this._modelConfiguration.rotationOffsetAxis.x,\r\n this._modelConfiguration.rotationOffsetAxis.y,\r\n this._modelConfiguration.rotationOffsetAxis.z\r\n );\r\n\r\n meshesWithNoParent.forEach((m) => {\r\n if (this._modelConfiguration.rotationOffsetAngle) {\r\n m.rotate(rotationAxis, this._modelConfiguration.rotationOffsetAngle);\r\n }\r\n });\r\n }\r\n\r\n if (this._modelConfiguration.scaling) {\r\n updateXYZ(\"scaling\", this._modelConfiguration.scaling);\r\n }\r\n\r\n if (this._modelConfiguration.castShadow) {\r\n this._meshes.forEach((mesh) => {\r\n Tags.AddTagsTo(mesh, \"castShadow\");\r\n });\r\n }\r\n\r\n const meshes = this._pivotMesh.getChildMeshes(false);\r\n meshes\r\n .filter((m) => m.material)\r\n .forEach((mesh) => {\r\n this._applyModelMaterialConfiguration(mesh.material!);\r\n });\r\n\r\n if (this._modelConfiguration.entryAnimation) {\r\n this._entryAnimation = this._modelAnimationConfigurationToObject(this._modelConfiguration.entryAnimation);\r\n }\r\n\r\n // if (this._modelConfiguration.exitAnimation) {\r\n // this._exitAnimation = this._modelAnimationConfigurationToObject(this._modelConfiguration.exitAnimation);\r\n // }\r\n\r\n this.onAfterConfigure.notifyObservers(this);\r\n }\r\n\r\n private _modelAnimationConfigurationToObject(animConfig: IModelAnimationConfiguration): ModelAnimationConfiguration {\r\n const anim: ModelAnimationConfiguration = {\r\n time: 0.5,\r\n };\r\n if (animConfig.scaling) {\r\n anim.scaling = Vector3.Zero();\r\n }\r\n if (animConfig.easingFunction !== undefined) {\r\n anim.easingFunction = animConfig.easingFunction;\r\n }\r\n if (animConfig.easingMode !== undefined) {\r\n anim.easingMode = animConfig.easingMode;\r\n }\r\n extendClassWithConfig(anim, animConfig);\r\n return anim;\r\n }\r\n\r\n /**\r\n * Apply a material configuration to a material\r\n * @param material Material to apply configuration to\r\n * @internal\r\n */\r\n public _applyModelMaterialConfiguration(material: Material) {\r\n if (!this._modelConfiguration.material) {\r\n return;\r\n }\r\n\r\n extendClassWithConfig(material, this._modelConfiguration.material);\r\n\r\n if (material instanceof PBRMaterial) {\r\n if (this._modelConfiguration.material.directIntensity !== undefined) {\r\n material.directIntensity = this._modelConfiguration.material.directIntensity;\r\n }\r\n\r\n if (this._modelConfiguration.material.emissiveIntensity !== undefined) {\r\n material.emissiveIntensity = this._modelConfiguration.material.emissiveIntensity;\r\n }\r\n\r\n if (this._modelConfiguration.material.environmentIntensity !== undefined) {\r\n material.environmentIntensity = this._modelConfiguration.material.environmentIntensity;\r\n }\r\n\r\n if (this._modelConfiguration.material.directEnabled !== undefined) {\r\n material.disableLighting = !this._modelConfiguration.material.directEnabled;\r\n }\r\n if (this._configurationContainer && this._configurationContainer.reflectionColor) {\r\n material.reflectionColor = this._configurationContainer.reflectionColor.clone();\r\n }\r\n } else if (material instanceof MultiMaterial) {\r\n for (let i = 0; i < material.subMaterials.length; i++) {\r\n const subMaterial = material.subMaterials[i];\r\n if (subMaterial) {\r\n this._applyModelMaterialConfiguration(subMaterial);\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Start entry/exit animation given an animation configuration\r\n * @param animationConfiguration Entry/Exit animation configuration\r\n * @param isEntry Pass true if the animation is an entry animation\r\n * @param completeCallback Callback to execute when the animation completes\r\n */\r\n private _applyAnimation(animationConfiguration: ModelAnimationConfiguration, isEntry: boolean, completeCallback?: () => void) {\r\n const animations: Animation[] = [];\r\n\r\n //scale\r\n if (animationConfiguration.scaling) {\r\n const scaleStart: Vector3 = isEntry ? animationConfiguration.scaling : new Vector3(1, 1, 1);\r\n const scaleEnd: Vector3 = isEntry ? new Vector3(1, 1, 1) : animationConfiguration.scaling;\r\n\r\n if (!scaleStart.equals(scaleEnd)) {\r\n this.rootMesh.scaling = scaleStart;\r\n this._setLinearKeys(this._scaleTransition, this.rootMesh.scaling, scaleEnd, animationConfiguration.time);\r\n animations.push(this._scaleTransition);\r\n }\r\n }\r\n\r\n //Start the animation(s)\r\n this.transitionTo(animations, animationConfiguration.time, this._createEasingFunction(animationConfiguration.easingFunction), animationConfiguration.easingMode, () => {\r\n if (completeCallback) {\r\n completeCallback();\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Begin @animations with the specified @easingFunction\r\n * @param animations The BABYLON Animations to begin\r\n * @param duration of transition, in seconds\r\n * @param easingFunction An easing function to apply\r\n * @param easingMode A easing mode to apply to the easingFunction\r\n * @param onAnimationEnd Call back trigger at the end of the animation.\r\n */\r\n public transitionTo(\r\n animations: Animation[],\r\n duration: number,\r\n easingFunction: any,\r\n easingMode: number = 2, // BABYLON.EasingFunction.EASINGMODE_EASEINOUT,\r\n onAnimationEnd: () => void\r\n ): void {\r\n if (easingFunction) {\r\n for (const animation of animations) {\r\n easingFunction.setEasingMode(easingMode);\r\n animation.setEasingFunction(easingFunction);\r\n }\r\n }\r\n\r\n //Stop any current animations before starting the new one - merging not yet supported.\r\n this.stopAllAnimations();\r\n\r\n this.rootMesh.animations = animations;\r\n\r\n if (this.rootMesh.getScene().beginAnimation !== undefined) {\r\n const animatable: Animatable = this.rootMesh.getScene().beginAnimation(this.rootMesh, 0, this._frameRate * duration, false, 1, () => {\r\n if (onAnimationEnd) {\r\n onAnimationEnd();\r\n }\r\n });\r\n this._animatables.push(animatable);\r\n }\r\n }\r\n\r\n /**\r\n * Sets key values on an Animation from first to last frame.\r\n * @param animation The Babylon animation object to set keys on\r\n * @param startValue The value of the first key\r\n * @param endValue The value of the last key\r\n * @param duration The duration of the animation, used to determine the end frame\r\n */\r\n private _setLinearKeys(animation: Animation, startValue: any, endValue: any, duration: number) {\r\n animation.setKeys([\r\n {\r\n frame: 0,\r\n value: startValue,\r\n },\r\n {\r\n frame: this._frameRate * duration,\r\n value: endValue,\r\n },\r\n ]);\r\n }\r\n\r\n /**\r\n * Creates and returns a Babylon easing funtion object based on a string representing the Easing function\r\n * @param easingFunctionID The enum of the easing funtion to create\r\n * @returns The newly created Babylon easing function object\r\n */\r\n private _createEasingFunction(easingFunctionID?: number): any {\r\n let easingFunction;\r\n\r\n switch (easingFunctionID) {\r\n case EasingFunction.CircleEase:\r\n easingFunction = new CircleEase();\r\n break;\r\n case EasingFunction.BackEase:\r\n easingFunction = new BackEase(0.3);\r\n break;\r\n case EasingFunction.BounceEase:\r\n easingFunction = new BounceEase();\r\n break;\r\n case EasingFunction.CubicEase:\r\n easingFunction = new CubicEase();\r\n break;\r\n case EasingFunction.ElasticEase:\r\n easingFunction = new ElasticEase();\r\n break;\r\n case EasingFunction.ExponentialEase:\r\n easingFunction = new ExponentialEase();\r\n break;\r\n case EasingFunction.PowerEase:\r\n easingFunction = new PowerEase();\r\n break;\r\n case EasingFunction.QuadraticEase:\r\n easingFunction = new QuadraticEase();\r\n break;\r\n case EasingFunction.QuarticEase:\r\n easingFunction = new QuarticEase();\r\n break;\r\n case EasingFunction.QuinticEase:\r\n easingFunction = new QuinticEase();\r\n break;\r\n case EasingFunction.SineEase:\r\n easingFunction = new SineEase();\r\n break;\r\n default:\r\n Tools.Log(\"No ease function found\");\r\n break;\r\n }\r\n\r\n return easingFunction;\r\n }\r\n\r\n /**\r\n * Stops and removes all animations that have been applied to the model\r\n */\r\n public stopAllAnimations(): void {\r\n if (this.rootMesh) {\r\n this.rootMesh.animations = [];\r\n }\r\n if (this.currentAnimation) {\r\n this.currentAnimation.stop();\r\n }\r\n while (this._animatables.length) {\r\n this._animatables[0].onAnimationEnd = null;\r\n this._animatables[0].stop();\r\n this._animatables.shift();\r\n }\r\n }\r\n\r\n /**\r\n * Will remove this model from the viewer (but NOT dispose it).\r\n */\r\n public remove() {\r\n this.stopAllAnimations();\r\n\r\n if (this._observablesManager) {\r\n this._observablesManager.onModelRemovedObservable.notifyObservers(this);\r\n }\r\n }\r\n\r\n /**\r\n * Dispose this model, including all of its associated assets.\r\n */\r\n public dispose() {\r\n this.remove();\r\n this.onAfterConfigure.clear();\r\n this.onLoadedObservable.clear();\r\n this.onLoadErrorObservable.clear();\r\n this.onLoadProgressObservable.clear();\r\n if (this.loader && this.loader.name === \"gltf\") {\r\n (<GLTFFileLoader>this.loader).dispose();\r\n }\r\n this.particleSystems.forEach((ps) => ps.dispose());\r\n this.particleSystems.length = 0;\r\n this.skeletons.forEach((s) => s.dispose());\r\n this.skeletons.length = 0;\r\n this._animations.forEach((ag) => ag.dispose());\r\n this._animations.length = 0;\r\n this.rootMesh.dispose(false, true);\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"viewerModel.js","sourceRoot":"","sources":["../../../../tools/viewer/src/model/viewerModel.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable import/no-internal-modules */\r\nimport type { IDisposable } from \"core/scene\";\r\nimport type { ISceneLoaderPlugin, ISceneLoaderPluginAsync, ISceneLoaderProgressEvent } from \"core/Loading/sceneLoader\";\r\nimport type { AbstractMesh } from \"core/Meshes/abstractMesh\";\r\nimport type { IParticleSystem } from \"core/Particles/IParticleSystem\";\r\nimport type { Skeleton } from \"core/Bones/skeleton\";\r\nimport { Observable } from \"core/Misc/observable\";\r\nimport \"core/Misc/observable.extensions\";\r\nimport { AnimationGroup } from \"core/Animations/animationGroup\";\r\nimport type { Animatable } from \"core/Animations/index\";\r\nimport {\r\n Animation,\r\n CircleEase,\r\n BackEase,\r\n BounceEase,\r\n CubicEase,\r\n ElasticEase,\r\n ExponentialEase,\r\n PowerEase,\r\n QuadraticEase,\r\n QuarticEase,\r\n QuinticEase,\r\n SineEase,\r\n} from \"core/Animations/index\";\r\nimport type { Nullable } from \"core/types\";\r\nimport { Quaternion, Vector3 } from \"core/Maths/math.vector\";\r\nimport { Tags } from \"core/Misc/tags\";\r\nimport type { Material } from \"core/Materials/material\";\r\nimport { PBRMaterial } from \"core/Materials/PBR/pbrMaterial\";\r\nimport { MultiMaterial } from \"core/Materials/multiMaterial\";\r\nimport { Tools } from \"core/Misc/tools\";\r\nimport type { GLTFFileLoader } from \"loaders/glTF/index\";\r\nimport type { IAsset } from \"babylonjs-gltf2interface\";\r\nimport type { IModelConfiguration } from \"../configuration/interfaces/modelConfiguration\";\r\nimport type { IModelAnimationConfiguration } from \"../configuration/interfaces/modelAnimationConfiguration\";\r\nimport type { IModelAnimation, ModelAnimationConfiguration } from \"./modelAnimation\";\r\nimport { GroupModelAnimation, AnimationPlayMode, EasingFunction, AnimationState } from \"./modelAnimation\";\r\nimport { deepmerge, extendClassWithConfig } from \"../helper/index\";\r\nimport type { ObservablesManager } from \"../managers/observablesManager\";\r\nimport type { ConfigurationContainer } from \"../configuration/configurationContainer\";\r\nimport { TransformNode } from \"core/Meshes/transformNode\";\r\nimport { Mesh } from \"core/Meshes/mesh\";\r\n\r\n/**\r\n * The current state of the model\r\n */\r\nexport enum ModelState {\r\n INIT,\r\n LOADING,\r\n LOADED,\r\n ENTRY,\r\n ENTRYDONE,\r\n COMPLETE,\r\n CANCELED,\r\n ERROR,\r\n}\r\n\r\n/**\r\n * The viewer model is a container for all assets representing a sngle loaded model.\r\n */\r\nexport class ViewerModel implements IDisposable {\r\n /**\r\n * The loader used to load this model.\r\n */\r\n public loader: ISceneLoaderPlugin | ISceneLoaderPluginAsync;\r\n\r\n private _animations: Array<IModelAnimation>;\r\n\r\n /**\r\n * the list of meshes that are a part of this model\r\n */\r\n private _meshes: Array<AbstractMesh> = [];\r\n /**\r\n * This model's root mesh (the parent of all other meshes).\r\n * This mesh does not(!) exist in the meshes array.\r\n */\r\n public rootMesh: AbstractMesh;\r\n\r\n private _pivotMesh: TransformNode;\r\n /**\r\n * ParticleSystems connected to this model\r\n */\r\n public particleSystems: Array<IParticleSystem> = [];\r\n /**\r\n * Skeletons defined in this model\r\n */\r\n public skeletons: Array<Skeleton> = [];\r\n /**\r\n * The current model animation.\r\n * On init, this will be undefined.\r\n */\r\n public currentAnimation: IModelAnimation;\r\n\r\n /**\r\n * Observers registered here will be executed when the model is done loading\r\n */\r\n public onLoadedObservable: Observable<ViewerModel>;\r\n /**\r\n * Observers registered here will be executed when the loader notified of a progress event\r\n */\r\n public onLoadProgressObservable: Observable<ISceneLoaderProgressEvent>;\r\n /**\r\n * Observers registered here will be executed when the loader notified of an error.\r\n */\r\n public onLoadErrorObservable: Observable<{ message: string; exception: any }>;\r\n\r\n /**\r\n * Will be executed after the model finished loading and complete, including entry animation and lod\r\n */\r\n public onCompleteObservable: Observable<ViewerModel>;\r\n /**\r\n * Observers registered here will be executed every time the model is being configured.\r\n * This can be used to extend the model's configuration without extending the class itself\r\n */\r\n public onAfterConfigure: Observable<ViewerModel>;\r\n\r\n /**\r\n * The current model state (loaded, error, etc)\r\n */\r\n public state: ModelState;\r\n /**\r\n * A loadID provided by the modelLoader, unique to ths (Abstract)Viewer instance.\r\n */\r\n public loadId: number;\r\n\r\n public loadInfo: IAsset;\r\n private _modelConfiguration: IModelConfiguration;\r\n\r\n private _loaderDone: boolean = false;\r\n\r\n private _entryAnimation: ModelAnimationConfiguration;\r\n private _scaleTransition: Animation;\r\n private _animatables: Array<Animatable> = [];\r\n private _frameRate: number = 60;\r\n\r\n private _shadowsRenderedAfterLoad: boolean = false;\r\n\r\n constructor(\r\n private _observablesManager: ObservablesManager,\r\n modelConfiguration: IModelConfiguration,\r\n private _configurationContainer?: ConfigurationContainer\r\n ) {\r\n this.onLoadedObservable = new Observable();\r\n this.onLoadErrorObservable = new Observable();\r\n this.onLoadProgressObservable = new Observable();\r\n this.onCompleteObservable = new Observable();\r\n this.onAfterConfigure = new Observable();\r\n\r\n this.state = ModelState.INIT;\r\n\r\n const scene = this._configurationContainer && this._configurationContainer.scene;\r\n\r\n this.rootMesh = new Mesh(\"modelRootMesh\", scene);\r\n this._pivotMesh = new TransformNode(\"pivotMesh\", scene);\r\n this._pivotMesh.parent = this.rootMesh;\r\n // rotate 180, gltf fun\r\n this._pivotMesh.rotation.y += Math.PI;\r\n\r\n this._scaleTransition = new Animation(\"scaleAnimation\", \"scaling\", this._frameRate, Animation.ANIMATIONTYPE_VECTOR3, Animation.ANIMATIONLOOPMODE_CONSTANT);\r\n\r\n this._animations = [];\r\n //create a copy of the configuration to make sure it doesn't change even after it is changed in the viewer\r\n this._modelConfiguration = deepmerge((this._configurationContainer && this._configurationContainer.configuration.model) || {}, modelConfiguration);\r\n\r\n if (this._observablesManager) {\r\n this._observablesManager.onModelAddedObservable.notifyObservers(this);\r\n }\r\n\r\n if (this._modelConfiguration.entryAnimation) {\r\n this.rootMesh.setEnabled(false);\r\n }\r\n\r\n this.onLoadedObservable.add(() => {\r\n this.updateConfiguration(this._modelConfiguration);\r\n if (this._observablesManager) {\r\n this._observablesManager.onModelLoadedObservable.notifyObservers(this);\r\n }\r\n this._initAnimations();\r\n });\r\n\r\n this.onCompleteObservable.add(() => {\r\n this.state = ModelState.COMPLETE;\r\n });\r\n }\r\n\r\n public get shadowsRenderedAfterLoad() {\r\n return this._shadowsRenderedAfterLoad;\r\n }\r\n\r\n public set shadowsRenderedAfterLoad(rendered: boolean) {\r\n if (!rendered) {\r\n throw new Error(\"can only be enabled\");\r\n } else {\r\n this._shadowsRenderedAfterLoad = rendered;\r\n }\r\n }\r\n\r\n public getViewerId() {\r\n return this._configurationContainer && this._configurationContainer.viewerId;\r\n }\r\n\r\n /**\r\n * Is this model enabled?\r\n */\r\n public get enabled() {\r\n return this.rootMesh.isEnabled();\r\n }\r\n\r\n /**\r\n * Set whether this model is enabled or not.\r\n */\r\n public set enabled(enable: boolean) {\r\n this.rootMesh.setEnabled(enable);\r\n }\r\n\r\n public set loaderDone(done: boolean) {\r\n this._loaderDone = done;\r\n this._checkCompleteState();\r\n }\r\n\r\n private _checkCompleteState() {\r\n if (this._loaderDone && this.state === ModelState.ENTRYDONE) {\r\n this._modelComplete();\r\n }\r\n }\r\n\r\n /**\r\n * Add a mesh to this model.\r\n * Any mesh that has no parent will be provided with the root mesh as its new parent.\r\n *\r\n * @param mesh the new mesh to add\r\n * @param triggerLoaded should this mesh trigger the onLoaded observable. Used when adding meshes manually.\r\n * @returns a promise that will resolve when the model is done loading\r\n */\r\n public addMesh(mesh: AbstractMesh, triggerLoaded?: boolean) {\r\n if (!mesh.parent) {\r\n mesh.parent = this._pivotMesh;\r\n }\r\n\r\n if (mesh.getClassName() !== \"InstancedMesh\") {\r\n mesh.receiveShadows = !!this.configuration.receiveShadows;\r\n }\r\n\r\n this._meshes.push(mesh);\r\n if (triggerLoaded) {\r\n return this.onLoadedObservable.notifyObserversWithPromise(this);\r\n }\r\n return Promise.resolve(this);\r\n }\r\n\r\n /**\r\n * get the list of meshes (excluding the root mesh)\r\n */\r\n public get meshes() {\r\n return this._meshes;\r\n }\r\n\r\n /**\r\n * Get the model's configuration\r\n */\r\n public get configuration(): IModelConfiguration {\r\n return this._modelConfiguration;\r\n }\r\n\r\n /**\r\n * (Re-)set the model's entire configuration\r\n * @param newConfiguration the new configuration to replace the new one\r\n */\r\n public set configuration(newConfiguration: IModelConfiguration) {\r\n this._modelConfiguration = newConfiguration;\r\n this._configureModel();\r\n }\r\n\r\n /**\r\n * Update the current configuration with new values.\r\n * Configuration will not be overwritten, but merged with the new configuration.\r\n * Priority is to the new configuration\r\n * @param newConfiguration the configuration to be merged into the current configuration;\r\n */\r\n public updateConfiguration(newConfiguration: Partial<IModelConfiguration>) {\r\n this._modelConfiguration = deepmerge(this._modelConfiguration, newConfiguration);\r\n this._configureModel();\r\n }\r\n\r\n private _initAnimations() {\r\n // check if this is not a gltf loader and init the animations\r\n if (this.skeletons.length) {\r\n this.skeletons.forEach((skeleton, idx) => {\r\n const ag = new AnimationGroup(\"animation-\" + idx, this._configurationContainer && this._configurationContainer.scene);\r\n let add = false;\r\n skeleton.getAnimatables().forEach((a) => {\r\n if (a.animations && a.animations[0]) {\r\n ag.addTargetedAnimation(a.animations[0], a);\r\n add = true;\r\n }\r\n });\r\n if (add) {\r\n this.addAnimationGroup(ag);\r\n }\r\n });\r\n }\r\n\r\n let completeCallback = () => {};\r\n\r\n if (this._modelConfiguration.animation) {\r\n if (this._modelConfiguration.animation.playOnce) {\r\n this._animations.forEach((a) => {\r\n a.playMode = AnimationPlayMode.ONCE;\r\n });\r\n }\r\n if (this._modelConfiguration.animation.autoStart && this._animations.length) {\r\n const animationName = this._modelConfiguration.animation.autoStart === true ? this._animations[0].name : this._modelConfiguration.animation.autoStart;\r\n\r\n completeCallback = () => {\r\n this.playAnimation(animationName);\r\n };\r\n }\r\n }\r\n\r\n this._enterScene(completeCallback);\r\n }\r\n\r\n /**\r\n * Animates the model from the current position to the default position\r\n * @param completeCallback A function to call when the animation has completed\r\n */\r\n private _enterScene(completeCallback?: () => void): void {\r\n const scene = this.rootMesh.getScene();\r\n const previousValue = scene.animationPropertiesOverride!.enableBlending;\r\n const callback = () => {\r\n this.state = ModelState.ENTRYDONE;\r\n scene.animationPropertiesOverride!.enableBlending = previousValue;\r\n this._checkCompleteState();\r\n if (completeCallback) {\r\n completeCallback();\r\n }\r\n };\r\n if (!this._entryAnimation) {\r\n callback();\r\n return;\r\n }\r\n this.rootMesh.setEnabled(true);\r\n // disable blending for the sake of the entry animation;\r\n scene.animationPropertiesOverride!.enableBlending = false;\r\n this._applyAnimation(this._entryAnimation, true, callback);\r\n }\r\n\r\n // /**\r\n // * Animates the model from the current position to the exit-screen position\r\n // * @param completeCallback A function to call when the animation has completed\r\n // */\r\n // private _exitScene(completeCallback: () => void): void {\r\n // if (!this._exitAnimation) {\r\n // completeCallback();\r\n // return;\r\n // }\r\n\r\n // this._applyAnimation(this._exitAnimation, false, completeCallback);\r\n // }\r\n\r\n private _modelComplete() {\r\n //reapply material defines to be sure:\r\n const meshes = this._pivotMesh.getChildMeshes(false);\r\n meshes\r\n .filter((m) => m.material)\r\n .forEach((mesh) => {\r\n this._applyModelMaterialConfiguration(mesh.material!);\r\n });\r\n this.state = ModelState.COMPLETE;\r\n this.onCompleteObservable.notifyObservers(this);\r\n }\r\n\r\n /**\r\n * Add a new animation group to this model.\r\n * @param animationGroup the new animation group to be added\r\n */\r\n public addAnimationGroup(animationGroup: AnimationGroup) {\r\n this._animations.push(new GroupModelAnimation(animationGroup));\r\n }\r\n\r\n /**\r\n * Get the ModelAnimation array\r\n * @returns the array of ModelAnimations\r\n */\r\n public getAnimations(): Array<IModelAnimation> {\r\n return this._animations;\r\n }\r\n\r\n /**\r\n * Get the animations' names. Using the names you can play a specific animation.\r\n * @returns the array of ModelAnimations\r\n */\r\n public getAnimationNames(): Array<string> {\r\n return this._animations.map((a) => a.name);\r\n }\r\n\r\n /**\r\n * Get an animation by the provided name. Used mainly when playing n animation.\r\n * @param name the name of the animation to find\r\n * @returns the ModelAnimation object\r\n */\r\n protected _getAnimationByName(name: string): Nullable<IModelAnimation> {\r\n // can't use .find, noe available on IE\r\n const filtered = this._animations.filter((a) => a.name === name.trim());\r\n if (filtered.length >= 1) {\r\n return filtered[0];\r\n } else {\r\n return null;\r\n }\r\n }\r\n\r\n /**\r\n * Choose an initialized animation using its name and start playing it\r\n * @param name the name of the animation to play\r\n * @returns The model aniamtion to be played.\r\n */\r\n public playAnimation(name: string): IModelAnimation {\r\n const animation = this.setCurrentAnimationByName(name);\r\n if (animation) {\r\n animation.start();\r\n }\r\n return animation;\r\n }\r\n\r\n public setCurrentAnimationByName(name: string) {\r\n const animation = this._getAnimationByName(name.trim());\r\n if (animation) {\r\n if (this.currentAnimation && this.currentAnimation.state !== AnimationState.STOPPED) {\r\n this.currentAnimation.stop();\r\n }\r\n this.currentAnimation = animation;\r\n return animation;\r\n } else {\r\n throw new Error(\"animation not found - \" + name);\r\n }\r\n }\r\n\r\n private _configureModel() {\r\n // this can be changed to the meshes that have rootMesh a parent without breaking anything.\r\n const meshesWithNoParent: Array<TransformNode> = [this.rootMesh]; //this._meshes.filter(m => m.parent === this.rootMesh);\r\n const updateMeshesWithNoParent = (variable: string, value: any, param?: string) => {\r\n meshesWithNoParent.forEach((mesh) => {\r\n if (param) {\r\n mesh[variable as keyof TransformNode][param] = value;\r\n } else {\r\n (mesh as any)[variable] = value;\r\n }\r\n });\r\n };\r\n const updateXYZ = (variable: string, configValues: { x: number; y: number; z: number; w?: number }) => {\r\n if (configValues.x !== undefined) {\r\n updateMeshesWithNoParent(variable, configValues.x, \"x\");\r\n }\r\n if (configValues.y !== undefined) {\r\n updateMeshesWithNoParent(variable, configValues.y, \"y\");\r\n }\r\n if (configValues.z !== undefined) {\r\n updateMeshesWithNoParent(variable, configValues.z, \"z\");\r\n }\r\n if (configValues.w !== undefined) {\r\n updateMeshesWithNoParent(variable, configValues.w, \"w\");\r\n }\r\n };\r\n\r\n if (this._modelConfiguration.normalize) {\r\n let center = false;\r\n let unitSize = false;\r\n let parentIndex;\r\n if (this._modelConfiguration.normalize === true) {\r\n center = true;\r\n unitSize = true;\r\n } else {\r\n center = !!this._modelConfiguration.normalize.center;\r\n unitSize = !!this._modelConfiguration.normalize.unitSize;\r\n parentIndex = this._modelConfiguration.normalize.parentIndex;\r\n }\r\n\r\n let meshesToNormalize: Array<TransformNode> = [];\r\n if (parentIndex !== undefined) {\r\n meshesToNormalize.push(this._meshes[parentIndex]);\r\n } else {\r\n meshesToNormalize = this._pivotMesh.getChildMeshes(true).length === 1 ? [this._pivotMesh] : meshesWithNoParent;\r\n }\r\n\r\n if (unitSize) {\r\n meshesToNormalize.forEach((mesh) => {\r\n mesh.normalizeToUnitCube(true);\r\n mesh.computeWorldMatrix(true);\r\n });\r\n }\r\n if (center) {\r\n meshesToNormalize.forEach((mesh) => {\r\n const boundingInfo = mesh.getHierarchyBoundingVectors(true);\r\n const sizeVec = boundingInfo.max.subtract(boundingInfo.min);\r\n const halfSizeVec = sizeVec.scale(0.5);\r\n const center = boundingInfo.min.add(halfSizeVec);\r\n mesh.position = center.scale(-1);\r\n\r\n mesh.position.y += halfSizeVec.y;\r\n\r\n // Recompute Info.\r\n mesh.computeWorldMatrix(true);\r\n });\r\n }\r\n } else {\r\n // if centered, should be done here\r\n }\r\n\r\n // position?\r\n if (this._modelConfiguration.position) {\r\n updateXYZ(\"position\", this._modelConfiguration.position);\r\n }\r\n if (this._modelConfiguration.rotation) {\r\n //quaternion?\r\n if (this._modelConfiguration.rotation.w) {\r\n meshesWithNoParent.forEach((mesh) => {\r\n if (!mesh.rotationQuaternion) {\r\n mesh.rotationQuaternion = new Quaternion();\r\n }\r\n });\r\n updateXYZ(\"rotationQuaternion\", this._modelConfiguration.rotation);\r\n } else {\r\n updateXYZ(\"rotation\", this._modelConfiguration.rotation);\r\n }\r\n }\r\n\r\n if (this._modelConfiguration.rotationOffsetAxis) {\r\n const rotationAxis = new Vector3(\r\n this._modelConfiguration.rotationOffsetAxis.x,\r\n this._modelConfiguration.rotationOffsetAxis.y,\r\n this._modelConfiguration.rotationOffsetAxis.z\r\n );\r\n\r\n meshesWithNoParent.forEach((m) => {\r\n if (this._modelConfiguration.rotationOffsetAngle) {\r\n m.rotate(rotationAxis, this._modelConfiguration.rotationOffsetAngle);\r\n }\r\n });\r\n }\r\n\r\n if (this._modelConfiguration.scaling) {\r\n updateXYZ(\"scaling\", this._modelConfiguration.scaling);\r\n }\r\n\r\n if (this._modelConfiguration.castShadow) {\r\n this._meshes.forEach((mesh) => {\r\n Tags.AddTagsTo(mesh, \"castShadow\");\r\n });\r\n }\r\n\r\n const meshes = this._pivotMesh.getChildMeshes(false);\r\n meshes\r\n .filter((m) => m.material)\r\n .forEach((mesh) => {\r\n this._applyModelMaterialConfiguration(mesh.material!);\r\n });\r\n\r\n if (this._modelConfiguration.entryAnimation) {\r\n this._entryAnimation = this._modelAnimationConfigurationToObject(this._modelConfiguration.entryAnimation);\r\n }\r\n\r\n // if (this._modelConfiguration.exitAnimation) {\r\n // this._exitAnimation = this._modelAnimationConfigurationToObject(this._modelConfiguration.exitAnimation);\r\n // }\r\n\r\n this.onAfterConfigure.notifyObservers(this);\r\n }\r\n\r\n private _modelAnimationConfigurationToObject(animConfig: IModelAnimationConfiguration): ModelAnimationConfiguration {\r\n const anim: ModelAnimationConfiguration = {\r\n time: 0.5,\r\n };\r\n if (animConfig.scaling) {\r\n anim.scaling = Vector3.Zero();\r\n }\r\n if (animConfig.easingFunction !== undefined) {\r\n anim.easingFunction = animConfig.easingFunction;\r\n }\r\n if (animConfig.easingMode !== undefined) {\r\n anim.easingMode = animConfig.easingMode;\r\n }\r\n extendClassWithConfig(anim, animConfig);\r\n return anim;\r\n }\r\n\r\n /**\r\n * Apply a material configuration to a material\r\n * @param material Material to apply configuration to\r\n * @internal\r\n */\r\n public _applyModelMaterialConfiguration(material: Material) {\r\n if (!this._modelConfiguration.material) {\r\n return;\r\n }\r\n\r\n extendClassWithConfig(material, this._modelConfiguration.material);\r\n\r\n if (material instanceof PBRMaterial) {\r\n if (this._modelConfiguration.material.directIntensity !== undefined) {\r\n material.directIntensity = this._modelConfiguration.material.directIntensity;\r\n }\r\n\r\n if (this._modelConfiguration.material.emissiveIntensity !== undefined) {\r\n material.emissiveIntensity = this._modelConfiguration.material.emissiveIntensity;\r\n }\r\n\r\n if (this._modelConfiguration.material.environmentIntensity !== undefined) {\r\n material.environmentIntensity = this._modelConfiguration.material.environmentIntensity;\r\n }\r\n\r\n if (this._modelConfiguration.material.directEnabled !== undefined) {\r\n material.disableLighting = !this._modelConfiguration.material.directEnabled;\r\n }\r\n if (this._configurationContainer && this._configurationContainer.reflectionColor) {\r\n material.reflectionColor = this._configurationContainer.reflectionColor.clone();\r\n }\r\n } else if (material instanceof MultiMaterial) {\r\n for (let i = 0; i < material.subMaterials.length; i++) {\r\n const subMaterial = material.subMaterials[i];\r\n if (subMaterial) {\r\n this._applyModelMaterialConfiguration(subMaterial);\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Start entry/exit animation given an animation configuration\r\n * @param animationConfiguration Entry/Exit animation configuration\r\n * @param isEntry Pass true if the animation is an entry animation\r\n * @param completeCallback Callback to execute when the animation completes\r\n */\r\n private _applyAnimation(animationConfiguration: ModelAnimationConfiguration, isEntry: boolean, completeCallback?: () => void) {\r\n const animations: Animation[] = [];\r\n\r\n //scale\r\n if (animationConfiguration.scaling) {\r\n const scaleStart: Vector3 = isEntry ? animationConfiguration.scaling : new Vector3(1, 1, 1);\r\n const scaleEnd: Vector3 = isEntry ? new Vector3(1, 1, 1) : animationConfiguration.scaling;\r\n\r\n if (!scaleStart.equals(scaleEnd)) {\r\n this.rootMesh.scaling = scaleStart;\r\n this._setLinearKeys(this._scaleTransition, this.rootMesh.scaling, scaleEnd, animationConfiguration.time);\r\n animations.push(this._scaleTransition);\r\n }\r\n }\r\n\r\n //Start the animation(s)\r\n this.transitionTo(animations, animationConfiguration.time, this._createEasingFunction(animationConfiguration.easingFunction), animationConfiguration.easingMode, () => {\r\n if (completeCallback) {\r\n completeCallback();\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Begin @animations with the specified @easingFunction\r\n * @param animations The BABYLON Animations to begin\r\n * @param duration of transition, in seconds\r\n * @param easingFunction An easing function to apply\r\n * @param easingMode A easing mode to apply to the easingFunction\r\n * @param onAnimationEnd Call back trigger at the end of the animation.\r\n */\r\n public transitionTo(\r\n animations: Animation[],\r\n duration: number,\r\n easingFunction: any,\r\n easingMode: number = 2, // BABYLON.EasingFunction.EASINGMODE_EASEINOUT,\r\n onAnimationEnd: () => void\r\n ): void {\r\n if (easingFunction) {\r\n for (const animation of animations) {\r\n easingFunction.setEasingMode(easingMode);\r\n animation.setEasingFunction(easingFunction);\r\n }\r\n }\r\n\r\n //Stop any current animations before starting the new one - merging not yet supported.\r\n this.stopAllAnimations();\r\n\r\n this.rootMesh.animations = animations;\r\n\r\n if (this.rootMesh.getScene().beginAnimation !== undefined) {\r\n const animatable: Animatable = this.rootMesh.getScene().beginAnimation(this.rootMesh, 0, this._frameRate * duration, false, 1, () => {\r\n if (onAnimationEnd) {\r\n onAnimationEnd();\r\n }\r\n });\r\n this._animatables.push(animatable);\r\n }\r\n }\r\n\r\n /**\r\n * Sets key values on an Animation from first to last frame.\r\n * @param animation The Babylon animation object to set keys on\r\n * @param startValue The value of the first key\r\n * @param endValue The value of the last key\r\n * @param duration The duration of the animation, used to determine the end frame\r\n */\r\n private _setLinearKeys(animation: Animation, startValue: any, endValue: any, duration: number) {\r\n animation.setKeys([\r\n {\r\n frame: 0,\r\n value: startValue,\r\n },\r\n {\r\n frame: this._frameRate * duration,\r\n value: endValue,\r\n },\r\n ]);\r\n }\r\n\r\n /**\r\n * Creates and returns a Babylon easing funtion object based on a string representing the Easing function\r\n * @param easingFunctionID The enum of the easing funtion to create\r\n * @returns The newly created Babylon easing function object\r\n */\r\n private _createEasingFunction(easingFunctionID?: number): any {\r\n let easingFunction;\r\n\r\n switch (easingFunctionID) {\r\n case EasingFunction.CircleEase:\r\n easingFunction = new CircleEase();\r\n break;\r\n case EasingFunction.BackEase:\r\n easingFunction = new BackEase(0.3);\r\n break;\r\n case EasingFunction.BounceEase:\r\n easingFunction = new BounceEase();\r\n break;\r\n case EasingFunction.CubicEase:\r\n easingFunction = new CubicEase();\r\n break;\r\n case EasingFunction.ElasticEase:\r\n easingFunction = new ElasticEase();\r\n break;\r\n case EasingFunction.ExponentialEase:\r\n easingFunction = new ExponentialEase();\r\n break;\r\n case EasingFunction.PowerEase:\r\n easingFunction = new PowerEase();\r\n break;\r\n case EasingFunction.QuadraticEase:\r\n easingFunction = new QuadraticEase();\r\n break;\r\n case EasingFunction.QuarticEase:\r\n easingFunction = new QuarticEase();\r\n break;\r\n case EasingFunction.QuinticEase:\r\n easingFunction = new QuinticEase();\r\n break;\r\n case EasingFunction.SineEase:\r\n easingFunction = new SineEase();\r\n break;\r\n default:\r\n Tools.Log(\"No ease function found\");\r\n break;\r\n }\r\n\r\n return easingFunction;\r\n }\r\n\r\n /**\r\n * Stops and removes all animations that have been applied to the model\r\n */\r\n public stopAllAnimations(): void {\r\n if (this.rootMesh) {\r\n this.rootMesh.animations = [];\r\n }\r\n if (this.currentAnimation) {\r\n this.currentAnimation.stop();\r\n }\r\n while (this._animatables.length) {\r\n this._animatables[0].onAnimationEnd = null;\r\n this._animatables[0].stop();\r\n this._animatables.shift();\r\n }\r\n }\r\n\r\n /**\r\n * Will remove this model from the viewer (but NOT dispose it).\r\n */\r\n public remove() {\r\n this.stopAllAnimations();\r\n\r\n if (this._observablesManager) {\r\n this._observablesManager.onModelRemovedObservable.notifyObservers(this);\r\n }\r\n }\r\n\r\n /**\r\n * Dispose this model, including all of its associated assets.\r\n */\r\n public dispose() {\r\n this.remove();\r\n this.onAfterConfigure.clear();\r\n this.onLoadedObservable.clear();\r\n this.onLoadErrorObservable.clear();\r\n this.onLoadProgressObservable.clear();\r\n if (this.loader && this.loader.name === \"gltf\") {\r\n (<GLTFFileLoader>this.loader).dispose();\r\n }\r\n this.particleSystems.forEach((ps) => ps.dispose());\r\n this.particleSystems.length = 0;\r\n this.skeletons.forEach((s) => s.dispose());\r\n this.skeletons.length = 0;\r\n this._animations.forEach((ag) => ag.dispose());\r\n this._animations.length = 0;\r\n this.rootMesh.dispose(false, true);\r\n }\r\n}\r\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"extended.js","sourceRoot":"","sources":["../../../../../tools/viewer/src/optimizer/custom/extended.ts"],"names":[],"mappings":"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","sourcesContent":["import type { DefaultRenderingPipeline } from \"core/PostProcesses/RenderPipeline/Pipelines/defaultRenderingPipeline\";\r\nimport { Scalar } from \"core/Maths/math.scalar\";\r\nimport type { SceneManager } from \"../../managers/sceneManager\";\r\n\r\n/**\r\n * A custom upgrade-oriented function configuration for the scene optimizer.\r\n * @param sceneManager\r\n * @returns true if the scene is fully upgraded\r\n */\r\nexport function extendedUpgrade(sceneManager: SceneManager): boolean {\r\n const defaultPipeline = <DefaultRenderingPipeline>sceneManager.defaultRenderingPipeline;\r\n // if (!this.Scene.BackgroundHelper) {\r\n // \tthis.Scene.EngineScene.autoClear = false;\r\n // this.Scene.BackgroundHelper = true;\r\n // Would require a dedicated clear color;\r\n // return false;\r\n // }\r\n if (sceneManager.scene.getEngine().getHardwareScalingLevel() > 1) {\r\n const scaling = Scalar.Clamp(sceneManager.scene.getEngine().getHardwareScalingLevel() - 0.25, 0, 1);\r\n sceneManager.scene.getEngine().setHardwareScalingLevel(scaling);\r\n return false;\r\n }\r\n if (!sceneManager.scene.postProcessesEnabled) {\r\n sceneManager.scene.postProcessesEnabled = true;\r\n return false;\r\n }\r\n if (!sceneManager.groundEnabled) {\r\n sceneManager.groundEnabled = true;\r\n return false;\r\n }\r\n if (defaultPipeline && !sceneManager.fxaaEnabled) {\r\n sceneManager.fxaaEnabled = true;\r\n return false;\r\n }\r\n const hardwareScalingLevel = Math.max(1 / 2, 1 / (window.devicePixelRatio || 2));\r\n if (sceneManager.scene.getEngine().getHardwareScalingLevel() > hardwareScalingLevel) {\r\n const scaling = Scalar.Clamp(sceneManager.scene.getEngine().getHardwareScalingLevel() - 0.25, 0, hardwareScalingLevel);\r\n sceneManager.scene.getEngine().setHardwareScalingLevel(scaling);\r\n return false;\r\n }\r\n if (!sceneManager.processShadows) {\r\n sceneManager.processShadows = true;\r\n return false;\r\n }\r\n if (defaultPipeline && !sceneManager.bloomEnabled) {\r\n sceneManager.bloomEnabled = true;\r\n return false;\r\n }\r\n if (!sceneManager.groundMirrorEnabled) {\r\n sceneManager.groundMirrorEnabled = true;\r\n return false;\r\n }\r\n return true;\r\n}\r\n\r\n/**\r\n * A custom degrade-oriented function configuration for the scene optimizer.\r\n * @param sceneManager\r\n * @returns true if the scene is fully degraded\r\n */\r\nexport function extendedDegrade(sceneManager: SceneManager): boolean {\r\n const defaultPipeline = <DefaultRenderingPipeline>sceneManager.defaultRenderingPipeline;\r\n\r\n if (sceneManager.groundMirrorEnabled) {\r\n sceneManager.groundMirrorEnabled = false;\r\n return false;\r\n }\r\n if (defaultPipeline && sceneManager.bloomEnabled) {\r\n sceneManager.bloomEnabled = false;\r\n return false;\r\n }\r\n if (sceneManager.processShadows) {\r\n sceneManager.processShadows = false;\r\n return false;\r\n }\r\n if (sceneManager.scene.getEngine().getHardwareScalingLevel() < 1) {\r\n const scaling = Scalar.Clamp(sceneManager.scene.getEngine().getHardwareScalingLevel() + 0.25, 0, 1);\r\n sceneManager.scene.getEngine().setHardwareScalingLevel(scaling);\r\n return false;\r\n }\r\n if (defaultPipeline && sceneManager.fxaaEnabled) {\r\n sceneManager.fxaaEnabled = false;\r\n return false;\r\n }\r\n if (sceneManager.groundEnabled) {\r\n sceneManager.groundEnabled = false;\r\n return false;\r\n }\r\n if (sceneManager.scene.postProcessesEnabled) {\r\n sceneManager.scene.postProcessesEnabled = false;\r\n return false;\r\n }\r\n if (sceneManager.scene.getEngine().getHardwareScalingLevel() < 1.25) {\r\n const scaling = Scalar.Clamp(sceneManager.scene.getEngine().getHardwareScalingLevel() + 0.25, 0, 1.25);\r\n sceneManager.scene.getEngine().setHardwareScalingLevel(scaling);\r\n return false;\r\n }\r\n // if (this.Scene.BackgroundHelper) {\r\n // \tthis.Scene.EngineScene.autoClear = true;\r\n // this.Scene.BackgroundHelper = false;\r\n // Would require a dedicated clear color;\r\n // return false;\r\n // }\r\n return true;\r\n}\r\n"]}
1
+ {"version":3,"file":"extended.js","sourceRoot":"","sources":["../../../../../tools/viewer/src/optimizer/custom/extended.ts"],"names":[],"mappings":"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","sourcesContent":["import type { DefaultRenderingPipeline } from \"core/PostProcesses/RenderPipeline/Pipelines/defaultRenderingPipeline\";\r\nimport { Scalar } from \"core/Maths/math.scalar\";\r\nimport type { SceneManager } from \"../../managers/sceneManager\";\r\n\r\n/**\r\n * A custom upgrade-oriented function configuration for the scene optimizer.\r\n * @param sceneManager\r\n * @returns true if the scene is fully upgraded\r\n */\r\nexport function extendedUpgrade(sceneManager: SceneManager): boolean {\r\n const defaultPipeline = <DefaultRenderingPipeline>sceneManager.defaultRenderingPipeline;\r\n // if (!this.Scene.BackgroundHelper) {\r\n // \tthis.Scene.EngineScene.autoClear = false;\r\n // this.Scene.BackgroundHelper = true;\r\n // Would require a dedicated clear color;\r\n // return false;\r\n // }\r\n if (sceneManager.scene.getEngine().getHardwareScalingLevel() > 1) {\r\n const scaling = Scalar.Clamp(sceneManager.scene.getEngine().getHardwareScalingLevel() - 0.25, 0, 1);\r\n sceneManager.scene.getEngine().setHardwareScalingLevel(scaling);\r\n return false;\r\n }\r\n if (!sceneManager.scene.postProcessesEnabled) {\r\n sceneManager.scene.postProcessesEnabled = true;\r\n return false;\r\n }\r\n if (!sceneManager.groundEnabled) {\r\n sceneManager.groundEnabled = true;\r\n return false;\r\n }\r\n if (defaultPipeline && !sceneManager.fxaaEnabled) {\r\n sceneManager.fxaaEnabled = true;\r\n return false;\r\n }\r\n const hardwareScalingLevel = Math.max(1 / 2, 1 / (window.devicePixelRatio || 2));\r\n if (sceneManager.scene.getEngine().getHardwareScalingLevel() > hardwareScalingLevel) {\r\n const scaling = Scalar.Clamp(sceneManager.scene.getEngine().getHardwareScalingLevel() - 0.25, 0, hardwareScalingLevel);\r\n sceneManager.scene.getEngine().setHardwareScalingLevel(scaling);\r\n return false;\r\n }\r\n if (!sceneManager.processShadows) {\r\n sceneManager.processShadows = true;\r\n return false;\r\n }\r\n if (defaultPipeline && !sceneManager.bloomEnabled) {\r\n sceneManager.bloomEnabled = true;\r\n return false;\r\n }\r\n if (!sceneManager.groundMirrorEnabled) {\r\n sceneManager.groundMirrorEnabled = true;\r\n return false;\r\n }\r\n return true;\r\n}\r\n\r\n/**\r\n * A custom degrade-oriented function configuration for the scene optimizer.\r\n * @param sceneManager\r\n * @returns true if the scene is fully degraded\r\n */\r\nexport function extendedDegrade(sceneManager: SceneManager): boolean {\r\n const defaultPipeline = <DefaultRenderingPipeline>sceneManager.defaultRenderingPipeline;\r\n\r\n if (sceneManager.groundMirrorEnabled) {\r\n sceneManager.groundMirrorEnabled = false;\r\n return false;\r\n }\r\n if (defaultPipeline && sceneManager.bloomEnabled) {\r\n sceneManager.bloomEnabled = false;\r\n return false;\r\n }\r\n if (sceneManager.processShadows) {\r\n sceneManager.processShadows = false;\r\n return false;\r\n }\r\n if (sceneManager.scene.getEngine().getHardwareScalingLevel() < 1) {\r\n const scaling = Scalar.Clamp(sceneManager.scene.getEngine().getHardwareScalingLevel() + 0.25, 0, 1);\r\n sceneManager.scene.getEngine().setHardwareScalingLevel(scaling);\r\n return false;\r\n }\r\n if (defaultPipeline && sceneManager.fxaaEnabled) {\r\n sceneManager.fxaaEnabled = false;\r\n return false;\r\n }\r\n if (sceneManager.groundEnabled) {\r\n sceneManager.groundEnabled = false;\r\n return false;\r\n }\r\n if (sceneManager.scene.postProcessesEnabled) {\r\n sceneManager.scene.postProcessesEnabled = false;\r\n return false;\r\n }\r\n if (sceneManager.scene.getEngine().getHardwareScalingLevel() < 1.25) {\r\n const scaling = Scalar.Clamp(sceneManager.scene.getEngine().getHardwareScalingLevel() + 0.25, 0, 1.25);\r\n sceneManager.scene.getEngine().setHardwareScalingLevel(scaling);\r\n return false;\r\n }\r\n // if (this.Scene.BackgroundHelper) {\r\n // \tthis.Scene.EngineScene.autoClear = true;\r\n // this.Scene.BackgroundHelper = false;\r\n // Would require a dedicated clear color;\r\n // return false;\r\n // }\r\n return true;\r\n}\r\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../tools/viewer/src/optimizer/custom/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAG9D,IAAM,KAAK,GAA+D,EAAE,CAAC;AAE7E;;;;;GAKG;AACH,MAAM,UAAU,wBAAwB,CAAC,IAAY,EAAE,OAAiB;IACpE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE;QACd,QAAQ,IAAI,EAAE;YACV,KAAK,UAAU;gBACX,IAAI,OAAO,EAAE;oBACT,OAAO,eAAe,CAAC;iBAC1B;qBAAM;oBACH,OAAO,eAAe,CAAC;iBAC1B;SACR;KACJ;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,CAAC;AACvB,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,IAAY,EAAE,SAAkD;IACpG,KAAK,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC;AAC5B,CAAC","sourcesContent":["import { extendedUpgrade, extendedDegrade } from \"./extended\";\r\nimport type { SceneManager } from \"../../managers/sceneManager\";\r\n\r\nconst cache: { [key: string]: (sceneManager: SceneManager) => boolean } = {};\r\n\r\n/**\r\n *\r\n * @param name the name of the custom optimizer configuration\r\n * @param upgrade set to true if you want to upgrade optimizer and false if you want to degrade\r\n * @returns the optimizer function\r\n */\r\nexport function getCustomOptimizerByName(name: string, upgrade?: boolean) {\r\n if (!cache[name]) {\r\n switch (name) {\r\n case \"extended\":\r\n if (upgrade) {\r\n return extendedUpgrade;\r\n } else {\r\n return extendedDegrade;\r\n }\r\n }\r\n }\r\n\r\n return cache[name];\r\n}\r\n\r\nexport function registerCustomOptimizer(name: string, optimizer: (sceneManager: SceneManager) => boolean) {\r\n cache[name] = optimizer;\r\n}\r\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../tools/viewer/src/optimizer/custom/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAG9D,IAAM,KAAK,GAA+D,EAAE,CAAC;AAE7E;;;;;GAKG;AACH,MAAM,UAAU,wBAAwB,CAAC,IAAY,EAAE,OAAiB;IACpE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QACf,QAAQ,IAAI,EAAE,CAAC;YACX,KAAK,UAAU;gBACX,IAAI,OAAO,EAAE,CAAC;oBACV,OAAO,eAAe,CAAC;gBAC3B,CAAC;qBAAM,CAAC;oBACJ,OAAO,eAAe,CAAC;gBAC3B,CAAC;QACT,CAAC;IACL,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,CAAC;AACvB,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,IAAY,EAAE,SAAkD;IACpG,KAAK,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC;AAC5B,CAAC","sourcesContent":["import { extendedUpgrade, extendedDegrade } from \"./extended\";\r\nimport type { SceneManager } from \"../../managers/sceneManager\";\r\n\r\nconst cache: { [key: string]: (sceneManager: SceneManager) => boolean } = {};\r\n\r\n/**\r\n *\r\n * @param name the name of the custom optimizer configuration\r\n * @param upgrade set to true if you want to upgrade optimizer and false if you want to degrade\r\n * @returns the optimizer function\r\n */\r\nexport function getCustomOptimizerByName(name: string, upgrade?: boolean) {\r\n if (!cache[name]) {\r\n switch (name) {\r\n case \"extended\":\r\n if (upgrade) {\r\n return extendedUpgrade;\r\n } else {\r\n return extendedDegrade;\r\n }\r\n }\r\n }\r\n\r\n return cache[name];\r\n}\r\n\r\nexport function registerCustomOptimizer(name: string, optimizer: (sceneManager: SceneManager) => boolean) {\r\n cache[name] = optimizer;\r\n}\r\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@babylonjs/viewer",
3
- "version": "7.34.4",
3
+ "version": "7.35.0",
4
4
  "main": "index.js",
5
5
  "module": "index.js",
6
6
  "types": "index.d.ts",
@@ -18,10 +18,10 @@
18
18
  "postcompile": "build-tools -c add-js-to-es6"
19
19
  },
20
20
  "dependencies": {
21
- "@babylonjs/core": "^7.34.4",
22
- "@babylonjs/loaders": "^7.34.4",
23
- "babylonjs-gltf2interface": "^7.34.4",
24
- "babylonjs-viewer-assets": "^7.34.4",
21
+ "@babylonjs/core": "^7.35.0",
22
+ "@babylonjs/loaders": "^7.35.0",
23
+ "babylonjs-gltf2interface": "^7.35.0",
24
+ "babylonjs-viewer-assets": "^7.35.0",
25
25
  "deepmerge": "~4.2.2",
26
26
  "handlebars": "~4.7.7",
27
27
  "pepjs": "~0.5.3",
@@ -1 +1 @@
1
- {"version":3,"file":"eventManager.js","sourceRoot":"","sources":["../../../../tools/viewer/src/templating/eventManager.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH;IAGI,sBAAoB,gBAAiC;QAArD,iBAKC;QALmB,qBAAgB,GAAhB,gBAAgB,CAAiB;QACjD,IAAI,CAAC,mBAAmB,GAAG,EAAE,CAAC;QAC9B,IAAI,CAAC,gBAAgB,CAAC,gBAAgB,CAAC,GAAG,CAAC,UAAC,SAAS;YACjD,KAAI,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC;QACpC,CAAC,CAAC,CAAC;IACP,CAAC;IAED;;;;;;;;OAQG;IACI,uCAAgB,GAAvB,UAAwB,YAAoB,EAAE,QAA4C,EAAE,SAAkB,EAAE,QAAiB;QAC7H,IAAI,CAAC,IAAI,CAAC,mBAAmB,CAAC,YAAY,CAAC,EAAE;YACzC,IAAI,CAAC,mBAAmB,CAAC,YAAY,CAAC,GAAG,EAAE,CAAC;SAC/C;QACD,IAAI,CAAC,mBAAmB,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC;YACxC,SAAS,WAAA;YACT,QAAQ,UAAA;YACR,QAAQ,UAAA;SACX,CAAC,CAAC;IACP,CAAC;IAED;;;;;;;;OAQG;IACI,yCAAkB,GAAzB,UAA0B,YAAoB,EAAE,QAA4C,EAAE,SAAkB,EAAE,QAAiB;QAC/H,IAAM,YAAY,GAAG,IAAI,CAAC,mBAAmB,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC;QAClE,IAAI,CAAC,mBAAmB,CAAC,YAAY,CAAC,GAAG,YAAY,CAAC,MAAM,CACxD,UAAC,WAAW,IAAK,OAAA,CAAC,CAAC,WAAW,CAAC,SAAS,IAAI,WAAW,CAAC,SAAS,KAAK,SAAS,CAAC,IAAI,CAAC,CAAC,WAAW,CAAC,QAAQ,IAAI,WAAW,CAAC,QAAQ,KAAK,QAAQ,CAAC,EAA/H,CAA+H,CACnJ,CAAC;IACN,CAAC;IAEO,sCAAe,GAAvB,UAAwB,IAAmB;QACvC,IAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;QACxC,IAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;QAClC,IAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;QAE/B,IAAM,YAAY,GAAG,IAAI,CAAC,mBAAmB,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC;QAClE,YAAY;aACP,MAAM,CAAC,UAAC,WAAW,IAAK,OAAA,CAAC,CAAC,WAAW,CAAC,SAAS,IAAI,WAAW,CAAC,SAAS,KAAK,SAAS,CAAC,IAAI,CAAC,CAAC,WAAW,CAAC,QAAQ,IAAI,WAAW,CAAC,QAAQ,KAAK,QAAQ,CAAC,EAA/H,CAA+H,CAAC;aACxJ,OAAO,CAAC,UAAC,WAAW;YACjB,WAAW,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QAC/B,CAAC,CAAC,CAAC;IACX,CAAC;IAED;;OAEG;IACI,8BAAO,GAAd;QACI,IAAI,CAAC,mBAAmB,GAAG,EAAE,CAAC;IAClC,CAAC;IACL,mBAAC;AAAD,CAAC,AAjED,IAiEC","sourcesContent":["import type { EventCallback, TemplateManager } from \"./templateManager\";\r\n\r\n/**\r\n * The EventManager is in charge of registering user interctions with the viewer.\r\n * It is used in the TemplateManager\r\n */\r\nexport class EventManager {\r\n private _callbacksContainer: { [key: string]: Array<{ eventType?: string; selector?: string; callback: (eventData: EventCallback) => void }> };\r\n\r\n constructor(private _templateManager: TemplateManager) {\r\n this._callbacksContainer = {};\r\n this._templateManager.onEventTriggered.add((eventData) => {\r\n this._eventTriggered(eventData);\r\n });\r\n }\r\n\r\n /**\r\n * Register a new callback to a specific template.\r\n * The best example for the usage can be found in the DefaultViewer\r\n *\r\n * @param templateName the templateName to register the event to\r\n * @param callback The callback to be executed\r\n * @param eventType the type of event to register\r\n * @param selector an optional selector. if not defined the parent object in the template will be selected\r\n */\r\n public registerCallback(templateName: string, callback: (eventData: EventCallback) => void, eventType?: string, selector?: string) {\r\n if (!this._callbacksContainer[templateName]) {\r\n this._callbacksContainer[templateName] = [];\r\n }\r\n this._callbacksContainer[templateName].push({\r\n eventType,\r\n callback,\r\n selector,\r\n });\r\n }\r\n\r\n /**\r\n * This will remove a registered event from the defined template.\r\n * Each one of the variables apart from the template name are optional, but one must be provided.\r\n *\r\n * @param templateName the templateName\r\n * @param callback the callback to remove (optional)\r\n * @param eventType the event type to remove (optional)\r\n * @param selector the selector from which to remove the event (optional)\r\n */\r\n public unregisterCallback(templateName: string, callback: (eventData: EventCallback) => void, eventType?: string, selector?: string) {\r\n const callbackDefs = this._callbacksContainer[templateName] || [];\r\n this._callbacksContainer[templateName] = callbackDefs.filter(\r\n (callbackDef) => (!callbackDef.eventType || callbackDef.eventType === eventType) && (!callbackDef.selector || callbackDef.selector === selector)\r\n );\r\n }\r\n\r\n private _eventTriggered(data: EventCallback) {\r\n const templateName = data.template.name;\r\n const eventType = data.event.type;\r\n const selector = data.selector;\r\n\r\n const callbackDefs = this._callbacksContainer[templateName] || [];\r\n callbackDefs\r\n .filter((callbackDef) => (!callbackDef.eventType || callbackDef.eventType === eventType) && (!callbackDef.selector || callbackDef.selector === selector))\r\n .forEach((callbackDef) => {\r\n callbackDef.callback(data);\r\n });\r\n }\r\n\r\n /**\r\n * Dispose the event manager\r\n */\r\n public dispose() {\r\n this._callbacksContainer = {};\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"eventManager.js","sourceRoot":"","sources":["../../../../tools/viewer/src/templating/eventManager.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH;IAGI,sBAAoB,gBAAiC;QAArD,iBAKC;QALmB,qBAAgB,GAAhB,gBAAgB,CAAiB;QACjD,IAAI,CAAC,mBAAmB,GAAG,EAAE,CAAC;QAC9B,IAAI,CAAC,gBAAgB,CAAC,gBAAgB,CAAC,GAAG,CAAC,UAAC,SAAS;YACjD,KAAI,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC;QACpC,CAAC,CAAC,CAAC;IACP,CAAC;IAED;;;;;;;;OAQG;IACI,uCAAgB,GAAvB,UAAwB,YAAoB,EAAE,QAA4C,EAAE,SAAkB,EAAE,QAAiB;QAC7H,IAAI,CAAC,IAAI,CAAC,mBAAmB,CAAC,YAAY,CAAC,EAAE,CAAC;YAC1C,IAAI,CAAC,mBAAmB,CAAC,YAAY,CAAC,GAAG,EAAE,CAAC;QAChD,CAAC;QACD,IAAI,CAAC,mBAAmB,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC;YACxC,SAAS,WAAA;YACT,QAAQ,UAAA;YACR,QAAQ,UAAA;SACX,CAAC,CAAC;IACP,CAAC;IAED;;;;;;;;OAQG;IACI,yCAAkB,GAAzB,UAA0B,YAAoB,EAAE,QAA4C,EAAE,SAAkB,EAAE,QAAiB;QAC/H,IAAM,YAAY,GAAG,IAAI,CAAC,mBAAmB,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC;QAClE,IAAI,CAAC,mBAAmB,CAAC,YAAY,CAAC,GAAG,YAAY,CAAC,MAAM,CACxD,UAAC,WAAW,IAAK,OAAA,CAAC,CAAC,WAAW,CAAC,SAAS,IAAI,WAAW,CAAC,SAAS,KAAK,SAAS,CAAC,IAAI,CAAC,CAAC,WAAW,CAAC,QAAQ,IAAI,WAAW,CAAC,QAAQ,KAAK,QAAQ,CAAC,EAA/H,CAA+H,CACnJ,CAAC;IACN,CAAC;IAEO,sCAAe,GAAvB,UAAwB,IAAmB;QACvC,IAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;QACxC,IAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;QAClC,IAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;QAE/B,IAAM,YAAY,GAAG,IAAI,CAAC,mBAAmB,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC;QAClE,YAAY;aACP,MAAM,CAAC,UAAC,WAAW,IAAK,OAAA,CAAC,CAAC,WAAW,CAAC,SAAS,IAAI,WAAW,CAAC,SAAS,KAAK,SAAS,CAAC,IAAI,CAAC,CAAC,WAAW,CAAC,QAAQ,IAAI,WAAW,CAAC,QAAQ,KAAK,QAAQ,CAAC,EAA/H,CAA+H,CAAC;aACxJ,OAAO,CAAC,UAAC,WAAW;YACjB,WAAW,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QAC/B,CAAC,CAAC,CAAC;IACX,CAAC;IAED;;OAEG;IACI,8BAAO,GAAd;QACI,IAAI,CAAC,mBAAmB,GAAG,EAAE,CAAC;IAClC,CAAC;IACL,mBAAC;AAAD,CAAC,AAjED,IAiEC","sourcesContent":["import type { EventCallback, TemplateManager } from \"./templateManager\";\r\n\r\n/**\r\n * The EventManager is in charge of registering user interctions with the viewer.\r\n * It is used in the TemplateManager\r\n */\r\nexport class EventManager {\r\n private _callbacksContainer: { [key: string]: Array<{ eventType?: string; selector?: string; callback: (eventData: EventCallback) => void }> };\r\n\r\n constructor(private _templateManager: TemplateManager) {\r\n this._callbacksContainer = {};\r\n this._templateManager.onEventTriggered.add((eventData) => {\r\n this._eventTriggered(eventData);\r\n });\r\n }\r\n\r\n /**\r\n * Register a new callback to a specific template.\r\n * The best example for the usage can be found in the DefaultViewer\r\n *\r\n * @param templateName the templateName to register the event to\r\n * @param callback The callback to be executed\r\n * @param eventType the type of event to register\r\n * @param selector an optional selector. if not defined the parent object in the template will be selected\r\n */\r\n public registerCallback(templateName: string, callback: (eventData: EventCallback) => void, eventType?: string, selector?: string) {\r\n if (!this._callbacksContainer[templateName]) {\r\n this._callbacksContainer[templateName] = [];\r\n }\r\n this._callbacksContainer[templateName].push({\r\n eventType,\r\n callback,\r\n selector,\r\n });\r\n }\r\n\r\n /**\r\n * This will remove a registered event from the defined template.\r\n * Each one of the variables apart from the template name are optional, but one must be provided.\r\n *\r\n * @param templateName the templateName\r\n * @param callback the callback to remove (optional)\r\n * @param eventType the event type to remove (optional)\r\n * @param selector the selector from which to remove the event (optional)\r\n */\r\n public unregisterCallback(templateName: string, callback: (eventData: EventCallback) => void, eventType?: string, selector?: string) {\r\n const callbackDefs = this._callbacksContainer[templateName] || [];\r\n this._callbacksContainer[templateName] = callbackDefs.filter(\r\n (callbackDef) => (!callbackDef.eventType || callbackDef.eventType === eventType) && (!callbackDef.selector || callbackDef.selector === selector)\r\n );\r\n }\r\n\r\n private _eventTriggered(data: EventCallback) {\r\n const templateName = data.template.name;\r\n const eventType = data.event.type;\r\n const selector = data.selector;\r\n\r\n const callbackDefs = this._callbacksContainer[templateName] || [];\r\n callbackDefs\r\n .filter((callbackDef) => (!callbackDef.eventType || callbackDef.eventType === eventType) && (!callbackDef.selector || callbackDef.selector === selector))\r\n .forEach((callbackDef) => {\r\n callbackDef.callback(data);\r\n });\r\n }\r\n\r\n /**\r\n * Dispose the event manager\r\n */\r\n public dispose() {\r\n this._callbacksContainer = {};\r\n }\r\n}\r\n"]}
@@ -1,6 +1,6 @@
1
1
  import { __extends } from "@babylonjs/core/tslib.es6.js";
2
2
  import { AbstractViewerNavbarButton } from "../viewerTemplatePlugin.js";
3
- export var HDButtonPlugin = /** @class */ (function (_super) {
3
+ var HDButtonPlugin = /** @class */ (function (_super) {
4
4
  __extends(HDButtonPlugin, _super);
5
5
  function HDButtonPlugin(_viewer) {
6
6
  var _this = _super.call(this, "hd", "hd-button", HDButtonPlugin.HtmlTemplate) || this;
@@ -18,4 +18,5 @@ export var HDButtonPlugin = /** @class */ (function (_super) {
18
18
  HDButtonPlugin.HtmlTemplate = "\n{{#unless hideHd}}\n<style>\n.hd-icon:after {\n font-size: 16px;\n content: \"\\F765\";\n}\n\n.hd-toggled span.hd-icon:after {\n content: \"\\F766\";\n}\n</style>\n<button class=\"hd-button\" title=\"{{text.hdButton}}\">\n <span class=\"icon hd-icon\"></span>\n </button>\n {{/unless}}\n";
19
19
  return HDButtonPlugin;
20
20
  }(AbstractViewerNavbarButton));
21
+ export { HDButtonPlugin };
21
22
  //# sourceMappingURL=hdButtonPlugin.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"hdButtonPlugin.js","sourceRoot":"","sources":["../../../../../tools/viewer/src/templating/plugins/hdButtonPlugin.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,0BAA0B,EAAE,MAAM,yBAAyB,CAAC;AAIrE;IAAoC,kCAA0B;IAC1D,wBAAoB,OAAsB;QAA1C,YACI,kBAAM,IAAI,EAAE,WAAW,EAAE,cAAc,CAAC,YAAY,CAAC,SACxD;QAFmB,aAAO,GAAP,OAAO,CAAe;;IAE1C,CAAC;IAED,gCAAO,GAAP,UAAQ,KAAoB;QACxB,IAAM,MAAM,GAAG,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,aAAa,CAAC,YAAY,CAAC,CAAC;QACjE,IAAI,MAAM,EAAE;YACR,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;SACxH;QACD,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC;IAC5B,CAAC;IAED,gEAAgE;IAC/C,2BAAY,GAAW,gTAgB3C,CAAC;IACF,qBAAC;CAAA,AA/BD,CAAoC,0BAA0B,GA+B7D","sourcesContent":["import { AbstractViewerNavbarButton } from \"../viewerTemplatePlugin\";\r\nimport type { DefaultViewer } from \"../../viewer/defaultViewer\";\r\nimport type { EventCallback } from \"../templateManager\";\r\n\r\nexport class HDButtonPlugin extends AbstractViewerNavbarButton {\r\n constructor(private _viewer: DefaultViewer) {\r\n super(\"hd\", \"hd-button\", HDButtonPlugin.HtmlTemplate);\r\n }\r\n\r\n onEvent(event: EventCallback): void {\r\n const button = event.template.parent.querySelector(\".hd-button\");\r\n if (button) {\r\n button.classList.contains(\"hd-toggled\") ? button.classList.remove(\"hd-toggled\") : button.classList.add(\"hd-toggled\");\r\n }\r\n this._viewer.toggleHD();\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n protected static HtmlTemplate: string = `\r\n{{#unless hideHd}}\r\n<style>\r\n.hd-icon:after {\r\n font-size: 16px;\r\n content: \"\\\\F765\";\r\n}\r\n\r\n.hd-toggled span.hd-icon:after {\r\n content: \"\\\\F766\";\r\n}\r\n</style>\r\n<button class=\"hd-button\" title=\"{{text.hdButton}}\">\r\n <span class=\"icon hd-icon\"></span>\r\n </button>\r\n {{/unless}}\r\n`;\r\n}\r\n"]}
1
+ {"version":3,"file":"hdButtonPlugin.js","sourceRoot":"","sources":["../../../../../tools/viewer/src/templating/plugins/hdButtonPlugin.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,0BAA0B,EAAE,MAAM,yBAAyB,CAAC;AAIrE;IAAoC,kCAA0B;IAC1D,wBAAoB,OAAsB;QACtC,YAAA,MAAK,YAAC,IAAI,EAAE,WAAW,EAAE,cAAc,CAAC,YAAY,CAAC,SAAC;QADtC,aAAO,GAAP,OAAO,CAAe;;IAE1C,CAAC;IAED,gCAAO,GAAP,UAAQ,KAAoB;QACxB,IAAM,MAAM,GAAG,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,aAAa,CAAC,YAAY,CAAC,CAAC;QACjE,IAAI,MAAM,EAAE,CAAC;YACT,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;QACzH,CAAC;QACD,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC;IAC5B,CAAC;IAED,gEAAgE;IAC/C,2BAAY,GAAW,gTAgB3C,CAAC;IACF,qBAAC;CAAA,AA/BD,CAAoC,0BAA0B,GA+B7D;SA/BY,cAAc","sourcesContent":["import { AbstractViewerNavbarButton } from \"../viewerTemplatePlugin\";\r\nimport type { DefaultViewer } from \"../../viewer/defaultViewer\";\r\nimport type { EventCallback } from \"../templateManager\";\r\n\r\nexport class HDButtonPlugin extends AbstractViewerNavbarButton {\r\n constructor(private _viewer: DefaultViewer) {\r\n super(\"hd\", \"hd-button\", HDButtonPlugin.HtmlTemplate);\r\n }\r\n\r\n onEvent(event: EventCallback): void {\r\n const button = event.template.parent.querySelector(\".hd-button\");\r\n if (button) {\r\n button.classList.contains(\"hd-toggled\") ? button.classList.remove(\"hd-toggled\") : button.classList.add(\"hd-toggled\");\r\n }\r\n this._viewer.toggleHD();\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n protected static HtmlTemplate: string = `\r\n{{#unless hideHd}}\r\n<style>\r\n.hd-icon:after {\r\n font-size: 16px;\r\n content: \"\\\\F765\";\r\n}\r\n\r\n.hd-toggled span.hd-icon:after {\r\n content: \"\\\\F766\";\r\n}\r\n</style>\r\n<button class=\"hd-button\" title=\"{{text.hdButton}}\">\r\n <span class=\"icon hd-icon\"></span>\r\n </button>\r\n {{/unless}}\r\n`;\r\n}\r\n"]}
@@ -1,7 +1,7 @@
1
1
  import { __extends } from "@babylonjs/core/tslib.es6.js";
2
2
  import { AbstractViewerNavbarButton } from "../viewerTemplatePlugin.js";
3
3
  import { Tools } from "@babylonjs/core/Misc/tools.js";
4
- export var PrintButtonPlugin = /** @class */ (function (_super) {
4
+ var PrintButtonPlugin = /** @class */ (function (_super) {
5
5
  __extends(PrintButtonPlugin, _super);
6
6
  function PrintButtonPlugin(_viewer) {
7
7
  var _this = _super.call(this, "print", "print-button", PrintButtonPlugin.HtmlTemplate) || this;
@@ -37,4 +37,5 @@ export var PrintButtonPlugin = /** @class */ (function (_super) {
37
37
  PrintButtonPlugin.HtmlTemplate = "\n{{#unless hidePrint}}\n<style>\n\n/* Show only if it's a windows 10 printer */\n.print-icon.not-win-10 {\n display: none;\n}\n\n.print-icon:after {\n font-size: 16px;\n content: \"\\E914\";\n}\n\n</style>\n<button class=\"print-button ".concat(window.navigator.userAgent.indexOf("Windows NT 10.0") === -1 ? "no-win-10" : "", "\" title=\"{{text.printButton}}\">\n <span class=\"icon print-icon\"></span>\n </button>\n {{/unless}}\n");
38
38
  return PrintButtonPlugin;
39
39
  }(AbstractViewerNavbarButton));
40
+ export { PrintButtonPlugin };
40
41
  //# sourceMappingURL=printButton.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"printButton.js","sourceRoot":"","sources":["../../../../../tools/viewer/src/templating/plugins/printButton.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,0BAA0B,EAAE,MAAM,yBAAyB,CAAC;AAErE,OAAO,EAAE,KAAK,EAAE,sCAAwB;AAExC;IAAuC,qCAA0B;IAG7D,2BAAoB,OAAsB;QAA1C,YACI,kBAAM,OAAO,EAAE,cAAc,EAAE,iBAAiB,CAAC,YAAY,CAAC,SAsBjE;QAvBmB,aAAO,GAAP,OAAO,CAAe;QAGtC,KAAI,CAAC,OAAO,CAAC,uBAAuB,CAAC,GAAG,CAAC,UAAC,KAAK;YAC3C,KAAI,CAAC,gBAAgB,GAAG,EAAE,CAAC;YAC3B,IAAI,KAAK,CAAC,aAAa,CAAC,GAAG,EAAE;gBACzB,IAAM,QAAQ,GAAG,KAAK,CAAC,WAAW,CAAC,KAAK,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,aAAa,CAAC,GAAG,CAAC;gBACvF,IAAM,OAAO,GAAG,KAAK,CAAC,aAAa,CAAC,IAAI,IAAI,KAAK,CAAC,aAAa,CAAC,KAAK,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;gBAEzF,gBAAgB;gBAChB,IAAM,WAAS,GAAG,KAAK,CAAC,aAAa,CAAC,MAAM,IAAI,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC;gBAChF,IAAI,WAAS,GAAG,KAAK,CAAC;gBACtB,8BAA8B;gBAC9B,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,OAAO,CAAC,UAAC,GAAG;oBACtC,IAAI,WAAS,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE;wBAC/B,WAAS,GAAG,IAAI,CAAC;qBACpB;gBACL,CAAC,CAAC,CAAC;gBACH,IAAI,WAAS,EAAE;oBACX,KAAI,CAAC,gBAAgB,GAAG,OAAO,GAAG,QAAQ,CAAC;iBAC9C;aACJ;QACL,CAAC,CAAC,CAAC;;IACP,CAAC;IAED,mCAAO,GAAP;QACI,IAAI,IAAI,CAAC,gBAAgB,EAAE;YACvB,IAAM,QAAQ,GAAG,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,aAAa,EAAE,4BAA4B,CAAC,CAAC;YAC5F,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;SAClC;IACL,CAAC;IAED,gEAAgE;IAC/C,8BAAY,GAAW,iQAed,MAAM,CAAC,SAAS,CAAC,SAAS,CAAC,OAAO,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,iHAI5G,CAAC;IACF,wBAAC;CAAA,AAxDD,CAAuC,0BAA0B,GAwDhE","sourcesContent":["import { AbstractViewerNavbarButton } from \"../viewerTemplatePlugin\";\r\nimport type { DefaultViewer } from \"../../viewer/defaultViewer\";\r\nimport { Tools } from \"core/Misc/tools\";\r\n\r\nexport class PrintButtonPlugin extends AbstractViewerNavbarButton {\r\n private _currentModelUrl: string;\r\n\r\n constructor(private _viewer: DefaultViewer) {\r\n super(\"print\", \"print-button\", PrintButtonPlugin.HtmlTemplate);\r\n\r\n this._viewer.onModelLoadedObservable.add((model) => {\r\n this._currentModelUrl = \"\";\r\n if (model.configuration.url) {\r\n const filename = Tools.GetFilename(model.configuration.url) || model.configuration.url;\r\n const baseUrl = model.configuration.root || Tools.GetFolderPath(model.configuration.url);\r\n\r\n //gltf, obj, stl\r\n const extension = model.configuration.loader || filename.split(\".\").pop() || \"\";\r\n let printable = false;\r\n // not using .some sue to IE11\r\n [\"gltf\", \"glb\", \"obj\", \"stl\"].forEach((ext) => {\r\n if (extension.indexOf(ext) !== -1) {\r\n printable = true;\r\n }\r\n });\r\n if (printable) {\r\n this._currentModelUrl = baseUrl + filename;\r\n }\r\n }\r\n });\r\n }\r\n\r\n onEvent(): void {\r\n if (this._currentModelUrl) {\r\n const printUrl = this._currentModelUrl.replace(/https?:\\/\\//, \"com.microsoft.builder3d://\");\r\n window.open(printUrl, \"_self\");\r\n }\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n protected static HtmlTemplate: string = `\r\n{{#unless hidePrint}}\r\n<style>\r\n\r\n/* Show only if it's a windows 10 printer */\r\n.print-icon.not-win-10 {\r\n display: none;\r\n}\r\n\r\n.print-icon:after {\r\n font-size: 16px;\r\n content: \"\\\\E914\";\r\n}\r\n\r\n</style>\r\n<button class=\"print-button ${window.navigator.userAgent.indexOf(\"Windows NT 10.0\") === -1 ? \"no-win-10\" : \"\"}\" title=\"{{text.printButton}}\">\r\n <span class=\"icon print-icon\"></span>\r\n </button>\r\n {{/unless}}\r\n`;\r\n}\r\n"]}
1
+ {"version":3,"file":"printButton.js","sourceRoot":"","sources":["../../../../../tools/viewer/src/templating/plugins/printButton.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,0BAA0B,EAAE,MAAM,yBAAyB,CAAC;AAErE,OAAO,EAAE,KAAK,EAAE,sCAAwB;AAExC;IAAuC,qCAA0B;IAG7D,2BAAoB,OAAsB;QACtC,YAAA,MAAK,YAAC,OAAO,EAAE,cAAc,EAAE,iBAAiB,CAAC,YAAY,CAAC,SAAC;QAD/C,aAAO,GAAP,OAAO,CAAe;QAGtC,KAAI,CAAC,OAAO,CAAC,uBAAuB,CAAC,GAAG,CAAC,UAAC,KAAK;YAC3C,KAAI,CAAC,gBAAgB,GAAG,EAAE,CAAC;YAC3B,IAAI,KAAK,CAAC,aAAa,CAAC,GAAG,EAAE,CAAC;gBAC1B,IAAM,QAAQ,GAAG,KAAK,CAAC,WAAW,CAAC,KAAK,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,aAAa,CAAC,GAAG,CAAC;gBACvF,IAAM,OAAO,GAAG,KAAK,CAAC,aAAa,CAAC,IAAI,IAAI,KAAK,CAAC,aAAa,CAAC,KAAK,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;gBAEzF,gBAAgB;gBAChB,IAAM,WAAS,GAAG,KAAK,CAAC,aAAa,CAAC,MAAM,IAAI,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC;gBAChF,IAAI,WAAS,GAAG,KAAK,CAAC;gBACtB,8BAA8B;gBAC9B,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,OAAO,CAAC,UAAC,GAAG;oBACtC,IAAI,WAAS,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;wBAChC,WAAS,GAAG,IAAI,CAAC;oBACrB,CAAC;gBACL,CAAC,CAAC,CAAC;gBACH,IAAI,WAAS,EAAE,CAAC;oBACZ,KAAI,CAAC,gBAAgB,GAAG,OAAO,GAAG,QAAQ,CAAC;gBAC/C,CAAC;YACL,CAAC;QACL,CAAC,CAAC,CAAC;;IACP,CAAC;IAED,mCAAO,GAAP;QACI,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;YACxB,IAAM,QAAQ,GAAG,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,aAAa,EAAE,4BAA4B,CAAC,CAAC;YAC5F,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QACnC,CAAC;IACL,CAAC;IAED,gEAAgE;IAC/C,8BAAY,GAAW,iQAed,MAAM,CAAC,SAAS,CAAC,SAAS,CAAC,OAAO,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,iHAI5G,CAAC;IACF,wBAAC;CAAA,AAxDD,CAAuC,0BAA0B,GAwDhE;SAxDY,iBAAiB","sourcesContent":["import { AbstractViewerNavbarButton } from \"../viewerTemplatePlugin\";\r\nimport type { DefaultViewer } from \"../../viewer/defaultViewer\";\r\nimport { Tools } from \"core/Misc/tools\";\r\n\r\nexport class PrintButtonPlugin extends AbstractViewerNavbarButton {\r\n private _currentModelUrl: string;\r\n\r\n constructor(private _viewer: DefaultViewer) {\r\n super(\"print\", \"print-button\", PrintButtonPlugin.HtmlTemplate);\r\n\r\n this._viewer.onModelLoadedObservable.add((model) => {\r\n this._currentModelUrl = \"\";\r\n if (model.configuration.url) {\r\n const filename = Tools.GetFilename(model.configuration.url) || model.configuration.url;\r\n const baseUrl = model.configuration.root || Tools.GetFolderPath(model.configuration.url);\r\n\r\n //gltf, obj, stl\r\n const extension = model.configuration.loader || filename.split(\".\").pop() || \"\";\r\n let printable = false;\r\n // not using .some sue to IE11\r\n [\"gltf\", \"glb\", \"obj\", \"stl\"].forEach((ext) => {\r\n if (extension.indexOf(ext) !== -1) {\r\n printable = true;\r\n }\r\n });\r\n if (printable) {\r\n this._currentModelUrl = baseUrl + filename;\r\n }\r\n }\r\n });\r\n }\r\n\r\n onEvent(): void {\r\n if (this._currentModelUrl) {\r\n const printUrl = this._currentModelUrl.replace(/https?:\\/\\//, \"com.microsoft.builder3d://\");\r\n window.open(printUrl, \"_self\");\r\n }\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n protected static HtmlTemplate: string = `\r\n{{#unless hidePrint}}\r\n<style>\r\n\r\n/* Show only if it's a windows 10 printer */\r\n.print-icon.not-win-10 {\r\n display: none;\r\n}\r\n\r\n.print-icon:after {\r\n font-size: 16px;\r\n content: \"\\\\E914\";\r\n}\r\n\r\n</style>\r\n<button class=\"print-button ${window.navigator.userAgent.indexOf(\"Windows NT 10.0\") === -1 ? \"no-win-10\" : \"\"}\" title=\"{{text.printButton}}\">\r\n <span class=\"icon print-icon\"></span>\r\n </button>\r\n {{/unless}}\r\n`;\r\n}\r\n"]}