@spiffcommerce/preview 3.5.2 → 3.6.0-alpha.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.
- package/dist/main.js +1 -1
- package/dist/module.js +1 -1
- package/dist/types.d.ts +6 -0
- package/package.json +1 -1
package/dist/main.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
var e=require("@babylonjs/core/Cameras/arcRotateCamera"),t=require("@babylonjs/core/Engines/engine"),i=require("@babylonjs/core/Engines/nullEngine"),a=require("@babylonjs/core/Layers/highlightLayer"),n=require("@babylonjs/core/Loading/sceneLoader"),r=require("@babylonjs/core/Materials/Textures/cubeTexture"),s=require("@babylonjs/core/Maths/math.color"),o=require("@babylonjs/core/Maths/math.vector"),l=require("@babylonjs/core/Meshes/Compression/dracoCompression"),h=require("@babylonjs/core/Misc/observable"),c=require("@babylonjs/core/Misc/tools"),d=require("@babylonjs/core/scene"),u=require("@babylonjs/loaders/glTF");require("@babylonjs/core/Engines/Extensions/engine.views"),require("@babylonjs/core/Meshes/instancedMesh"),require("@babylonjs/core/Materials/Textures/Loaders/ddsTextureLoader"),require("@babylonjs/core/Materials/Textures/Loaders/envTextureLoader"),require("@babylonjs/core/Materials/Textures/Loaders/ktxTextureLoader"),require("@babylonjs/core/Animations/animatable"),require("@babylonjs/core/Misc/screenshotTools"),require("@babylonjs/core/Rendering/boundingBoxRenderer"),require("@babylonjs/loaders/glTF/2.0/Extensions");var g=require("@babylonjs/core/Materials/PBR/pbrMaterial"),m=require("@babylonjs/core/Materials/Textures/mirrorTexture"),p=require("@babylonjs/core/Maths/math"),b=require("@babylonjs/core/Probes/reflectionProbe"),f=require("@babylonjs/core/Actions/actionManager"),v=require("@babylonjs/core/Actions/directActions"),y=require("@babylonjs/core/Layers/glowLayer"),C=require("@babylonjs/core/Meshes/transformNode"),M=require("@babylonjs/core/Materials/Textures/dynamicTexture"),P=require("@babylonjs/core/Materials/Textures/texture"),w=require("@babylonjs/core/Animations/animation"),x=require("@babylonjs/core/Animations/easing"),A=require("@babylonjs/core/Misc/assetsManager"),O=require("@babylonjs/core/Materials/colorCurves"),E=require("@babylonjs/core/Materials/imageProcessingConfiguration"),L=require("@babylonjs/core/PostProcesses/RenderPipeline"),R=require("@babylonjs/core/PostProcesses/depthOfFieldEffect");function T(e,t){return Object.keys(t).forEach((function(i){"default"===i||"__esModule"===i||e.hasOwnProperty(i)||Object.defineProperty(e,i,{enumerable:!0,get:function(){return t[i]}})})),e}function I(e,t,i,a){Object.defineProperty(e,t,{get:i,set:a,enumerable:!0,configurable:!0})}require("@babylonjs/core/Rendering/depthRendererSceneComponent");var S={};let F;var k;let D;var B;I(S,"ProductCameraRig",(()=>F)),I(S,"MaterialEffectMode",(()=>D)),(k=F||(F={}))[k.Orbit=0]="Orbit",k[k.Pan=1]="Pan",(B=D||(D={})).None="None",B.RemoveWhenSelected="RemoveWhenSelected",B.ApplyWhenSelected="ApplyWhenSelected";var q={};function V(e,t,i){return t in e?Object.defineProperty(e,t,{value:i,enumerable:!0,configurable:!0,writable:!0}):e[t]=i,e}I(q,"SpiffCommerce3DPreviewService",(()=>ve));class z{constructor(e){V(this,"customOptions",void 0),V(this,"getSceneClearColor",(()=>{const e=this.customOptions?.transparentBackground||this.customOptions?.backgroundImage?0:1;if(this.customOptions&&this.customOptions?.transparentBackground||this.customOptions?.backgroundImage)return new(0,s.Color4)(0,0,0,e).toLinearSpace();if(this.customOptions&&this.customOptions.backgroundColor){const t=s.Color3.FromHexString(this.customOptions.backgroundColor);return new(0,s.Color4)(t.r,t.g,t.b,e).toLinearSpace()}return new(0,s.Color4)(.98,.98,.98,e).toLinearSpace()})),V(this,"highlightColorFromConfig",(()=>this.customOptions&&this.customOptions.highlightColor?this.hexToColor4(this.customOptions.highlightColor):new(0,s.Color4)(.98,.98,.98,1).toLinearSpace())),V(this,"hexToColor4",((e,t=1)=>{const i=s.Color3.FromHexString(e);return new(0,s.Color4)(i.r,i.g,i.b,t).toLinearSpace()})),this.customOptions=e}get options(){return this.customOptions}get scene(){return{clearColor:this.getSceneClearColor(),transparentBackground:this.customOptions?.transparentBackground||this.customOptions?.backgroundImage,environmentFile:this.customOptions?.environmentFile??"assets/model-viewer/default.env"}}get camera(){return{autoOrientation:this.customOptions?.disableAutomaticOrientation??!0,autoRotation:{enabled:this.customOptions?.autoRotation??!1,idleTimeMs:this.customOptions?.idleTimeBeforeRotation??5e3},limits:{min:{alpha:this.customOptions?.lowerAlphaLimitDeg?this.customOptions?.lowerAlphaLimitDeg*Math.PI/180:void 0,beta:this.customOptions?.lowerBetaLimitDeg?this.customOptions?.lowerBetaLimitDeg*Math.PI/180:void 0,radius:this.customOptions?.minZoomOverride},max:{alpha:this.customOptions?.upperAlphaLimitDeg?this.customOptions?.upperAlphaLimitDeg*Math.PI/180:void 0,beta:this.customOptions?.upperBetaLimitDeg?this.customOptions?.upperBetaLimitDeg*Math.PI/180:void 0,radius:this.customOptions?.maxZoomOverride}}}}get highlights(){return{enabled:this.customOptions?.highlightOnMaterialHover??!1,color:this.highlightColorFromConfig()}}get lighting(){return{exposure:this.customOptions?.lighting?.exposure??.9,contrast:this.customOptions?.lighting?.contrast??1.6}}}var N={};I(N,"RenderingConfiguration",(()=>j)),I(N,"REFLECTION_PROBE_RESOLUTION",(()=>H)),I(N,"renderingPipelineDefaults",(()=>_));class j{static getDynamicTextureResolution(){return this.getIsMobile()||!j.offscreenRenderingSupported()?{width:1024,height:1024}:{width:2048,height:2048}}static shouldMipMap(){return!0}static offscreenRenderingSupported(){return!navigator.userAgent.includes("SamsungBrowser")&&(!!window.Worker&&!!window.OffscreenCanvas)}static getMirrorTextureResolution(){return this.getIsMobile()?512:1024}static getIsMobile(){try{return!("undefined"==typeof window||!window.navigator)&&(/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(window.navigator.userAgent)||window.innerWidth<=480)}catch(e){return!1}}}const H=128,_={antiAliasing:{samples:4,fxaaEnabled:!1},bloom:{enabled:!1,kernel:64,scale:.5,threshold:.9,weight:.15},chromaticAberration:{enabled:!1,aberrationAmount:30,direction:{x:0,y:0},radialIntensity:0},colorCurves:{enabled:!1},depthOfField:{enabled:!1,blurLevel:"Low",focalLength:50,focusDistance:2e3,fStop:1.4,lensSize:50},grain:{enabled:!1,animated:!1,intensity:30},misc:{contrast:1,exposure:1,toneMappingEnabled:!1,toneMappingType:"Standard"},sharpen:{enabled:!1,colorAmount:1,edgeAmount:.3},vignette:{enabled:!1,blendMode:"Multiply",cameraFov:.5,center:{x:0,y:0},colorHex:"#000000ff",colorRgba:{r:0,g:0,b:0,a:1},stretch:0,weight:1}};function G(e,t,i){return t in e?Object.defineProperty(e,t,{value:i,enumerable:!0,configurable:!0,writable:!0}):e[t]=i,e}class K{constructor(e){G(this,"name",void 0),G(this,"enabled",void 0),G(this,"loader",void 0),this.name="glbPostProcessor",this.enabled=!0,this.loader=e}onReady(){this.applyReflections(this.loader.babylonScene)}loadNodeAsync(e,t,i){return this.loader.loadNodeAsync(e,t,(function(e){t.extras&&Object.keys(t.extras).forEach((i=>{const a=t.extras[i];e.metadata[i]=a})),i(e)}))}async loadMaterialPropertiesAsync(e,t,i){await this.loader.loadMaterialPropertiesAsync(e,t,i),this.enableMaterialExtrasIfRequired(t,i),i.needDepthPrePass=!0}dispose(){}enableMaterialExtrasIfRequired(e,t){if(e.extras&&t instanceof g.PBRMaterial){if(e.extras.sheen){const i=t;i.sheen.isEnabled=!0,i.sheen.intensity=e.extras.sheen}if(e.extras.translucency){const i=t;i.subSurface.isTranslucencyEnabled=!0,i.subSurface.translucencyIntensity=e.extras.translucency,e.extras.translucencyR&&e.extras.translucencyG&&e.extras.translucencyB&&(i.subSurface.tintColor=new(0,p.Color3)(e.extras.translucencyR,e.extras.translucencyG,e.extras.translucencyB))}if(e.extras.refractionIOR){const i=t;i.subSurface.isRefractionEnabled=!0,i.subSurface.volumeIndexOfRefraction=e.extras.refractionIOR}if(e.extras.useDepthPrePass){const e=t;e.needDepthPrePass=!0,e.forceIrradianceInFragment=!0}if(e.extras.useParallax){const i=t;i.useParallax=!0,i.useParallaxOcclusion=!0,i.parallaxScaleBias=e.extras.useParallax}}}applyReflections(e){function t(e){const t=[];return e.transformNodes.forEach((e=>{e.metadata&&e.metadata.reflective&&t.push(...e.getChildMeshes())})),e.meshes.forEach((e=>{e.metadata&&e.metadata.reflective&&!t.includes(e)&&t.push(e)})),t}e.meshes.forEach((i=>{const a=i.metadata;a&&(a.mirrorTexture&&function(i,a=1){const n=i.material;if(!n)return;const r=new(0,m.MirrorTexture)("mirror",j.getMirrorTextureResolution(),e,!0);r.renderList=t(e);const s=i.getVerticesData("normal");if(!s)throw new Error("Mirror attribute specified on: "+i.name+"But no normals exist to generate a mirror from!");i.computeWorldMatrix(!0);const o=i.getWorldMatrix(),l=p.Vector3.TransformNormal(new(0,p.Vector3)(s[0],s[1],s[2]),o).normalize(),h=p.Plane.FromPositionAndNormal(i.position,l.scale(-1));r.mirrorPlane=h,r.level=a,n.reflectionTexture=r}(i,a.mirrorTexture),a.reflectionProbe&&function(i){const a=i.material,n=new(0,b.ReflectionProbe)("probe-"+a.name,H,e);n.attachToMesh(i),n.renderList&&n.renderList.push(...t(e)),a.reflectionTexture=n.cubeTexture}(i))}))}}const U=new Map;async function W(e,t,i){return new Promise(((a,r)=>{const s=U.get(e);if(s&&s.scene.uid===t.uid)return a(s);n.SceneLoader.LoadAssetContainerAsync(e,void 0,t,i).then((t=>{U.set(e,t),a(t)})).catch(r)}))}function Z(e,i,a,n,r=""){a.forEach((a=>{const s=a.getID(),o=a.getName(),l=j.getDynamicTextureResolution();e.filter((e=>e.name===r+o)).forEach((e=>{const r=n.get(s);if(r)Q(e,r),r.update(false);else{const r=function(e,i,a,n){const r=new(0,M.DynamicTexture)(e,{width:a,height:n},i,j.shouldMipMap(),P.Texture.TRILINEAR_SAMPLINGMODE,t.Engine.TEXTUREFORMAT_RGBA),s=r.getContext();s&&(s.fillStyle="#f5f5f5",s.fillRect(0,0,a,n),r.update());return r}(o,i,l.width,l.height);n.set(s,r),a.setStaticContext(r.getContext()),Q(e,r),r.onLoadObservable.addOnce((()=>{r.update(false)}))}}))}))}function Q(e,t){if(e instanceof g.PBRMaterial){const i=e,a=i.albedoTexture;a?(t.wrapU=a.wrapU,t.wrapV=a.wrapV):(t.wrapU=1,t.wrapV=1),i.albedoTexture=t}else{const i=e,a=i.diffuseTexture;a&&(t.wrapU=a.wrapU,t.wrapV=a.wrapV),i.diffuseTexture=t}}function Y(){const e=()=>Math.floor(65536*(1+Math.random())).toString(16).substring(1);return e()+e()+"-"+e()+"-"+e()+"-"+e()+"-"+e()+e()+e()}function $(e){return e.targetedAnimations.map((e=>e.animation.framePerSecond)).reduce(((e,t)=>e+t),0)/e.targetedAnimations.length||0}function X(e,t,i,a,n){const r=n?e.filter((e=>e.name===n)):e;0!==r.length?void 0===a||void 0===i||a!==i?r.forEach((e=>{e.stop();const n=$(e),r=void 0!==a?a*n:void 0,s=void 0!==i?i*n:void 0;e.start(t,1,r,s)})):r.forEach((e=>{e.stop();const i=$(e),n=a*i;e.start(t,1,n,n)})):console.warn(`No animations found for name: ${n}`)}function J(e){e.forEach((e=>{e.stop()}))}function ee(e,t,i){var a,n,r;e.stopAnimation(t),t.animations=[],Math.abs(t.alpha)>2*Math.PI&&(t.alpha=(a=t.alpha,n=0,r=2*Math.PI,a<n?r-(n-a)%(r-n):n+(a-n)%(r-n)));const s=[],l=i.target,h=l?1:0;if(i.target&&Object.keys(i.target).length>0&&s.push(ie("cameraTargetLerp","target",(new(0,o.Vector3)).copyFrom(t.target),new(0,o.Vector3)(i.target.x,i.target.y,i.target.z),w.Animation.ANIMATIONTYPE_VECTOR3,0)),s.push(ie("cameraAlphaLerp","alpha",t.alpha,te(i.lonDeg),w.Animation.ANIMATIONTYPE_FLOAT,h)),s.push(ie("cameraBetaLerp","beta",t.beta,te(i.latDeg),w.Animation.ANIMATIONTYPE_FLOAT,h)),void 0!==i.radius){const e=Math.max(.01,i.radius);s.push(ie("cameraRadiusLerp","radius",t.radius,e,w.Animation.ANIMATIONTYPE_FLOAT,h))}t.animations.push(...s);const c=t.useAutoRotationBehavior;t.disableAutoRotationBehavior(),e.beginAnimation(t,0,l?120:60,!1,1,(()=>{t.animations=[],c&&t.enableAutoRotationBehavior()}))}function te(e){return e*Math.PI/180}function ie(e,t,i,a,n,r=0,s=w.Animation.ANIMATIONLOOPMODE_CONSTANT){const o=new(0,x.QuadraticEase);o.setEasingMode(x.EasingFunction.EASINGMODE_EASEINOUT);const l=new(0,w.Animation)(e,t,60,n,s),h=[];return r>0&&h.push({frame:0,value:i}),h.push({frame:60*r,value:i}),h.push({frame:60*(r+1),value:a}),l.setKeys(h),l.setEasingFunction(o),l}const ae={albedoTexture:"albedoMap",bumpTexture:"normalMap",ambientTexture:"ambientMap",emissiveTexture:"emissionMap",opacityTexture:"alphaMap",metallicTexture:"metallicMap",refractionTexture:"refractionMap"};function ne(e,t,i,a){["albedoTexture","bumpTexture","ambientTexture","emissiveTexture","opacityTexture","metallicTexture","refractionTexture"].forEach((n=>{!function(e,t,i,a,n){const r=ae[e];if(!r)throw new Error("Unexpected texture name encountered.");const s=t[r]?.fileLink;s?a.addTextureTask(e,s,!1,!1):n&&i[e]&&(i[e]&&i[e].dispose(),i[e]=null,function(e,t){"opacityTexture"===e&&(t.useAlphaFromAlbedoTexture=!0);"metallicTexture"===e&&(t.useRoughnessFromMetallicTextureAlpha=!1,t.useRoughnessFromMetallicTextureGreen=!1,t.useMetallnessFromMetallicTextureBlue=!1);"refractionTexture"===e&&(t.subSurface.isRefractionEnabled=!1,t.subSurface.refractionIntensity=1)}(e,i))}(n,e,t,i,a)})),function(e,t){if(!e.clearCoat)return;e.clearCoat===D.RemoveWhenSelected?(t.clearCoat.isEnabled=!1,t.clearCoat.indexOfRefraction=1.5):e.clearCoat===D.ApplyWhenSelected&&(t.clearCoat.isEnabled=!0,t.clearCoat.indexOfRefraction=e.clearCoatIOR||t.clearCoat.indexOfRefraction)}(e,t)}function re(e,t,i,a){"opacityTexture"===e&&(t.useAlphaFromAlbedoTexture=!1),"metallicTexture"===e&&(t.useRoughnessFromMetallicTextureAlpha=!1,t.useRoughnessFromMetallicTextureGreen=!0,t.useMetallnessFromMetallicTextureBlue=!0),"refractionTexture"===e&&(t.subSurface.isRefractionEnabled=!0,t.subSurface.refractionIntensity=i.refractionIntensity||1),t[e]=a}function se(e,t,i){return t in e?Object.defineProperty(e,t,{value:i,enumerable:!0,configurable:!0,writable:!0}):e[t]=i,e}class oe{constructor(e,t,i){se(this,"materialVariantMap",new Map),se(this,"keysThatRemovedBaseModel",[]),se(this,"loadedContainerForKey",new Map),se(this,"loadedMaterialsForKey",new Map),se(this,"scene",void 0),se(this,"renameClonedAsset",void 0),se(this,"setBaseModelEnabled",void 0),this.scene=e,this.renameClonedAsset=t,this.setBaseModelEnabled=i}async applyMaterial(e,t,i,a){return new Promise((n=>{const r=this.materialVariantMap.get(e);this.materialVariantMap.set(e,{...r,...t});const s=this.renameClonedAsset(e),o=this.scene.materials.filter((e=>e.name===s));if(0===o.length)return void n();const l=new(0,A.AssetsManager)(this.scene);l.useDefaultLoadingScreen=!1,o.forEach((e=>ne(t,e,l,a))),l.onProgress=(e,t,a)=>{i&&i(e/t*100,100,a.name)},l.onFinish=e=>{e.forEach((e=>{const a=e;i&&i(100,100,e.name),o.forEach((i=>re(e.name,i,t,a.texture)))})),n()},l.loadAsync()}))}async applyModel(e,t,i,a){if(i&&t&&!this.keysThatRemovedBaseModel.includes(e)&&this.keysThatRemovedBaseModel.push(e),!i)return this.keysThatRemovedBaseModel.includes(e)&&this.setBaseModelEnabled(!0),this.loadedContainerForKey.get(e)?.dispose(),this.loadedContainerForKey.delete(e),this.loadedMaterialsForKey.delete(e),Promise.resolve(void 0);this.loadedContainerForKey.has(e)&&(this.loadedContainerForKey.get(e)?.dispose(),this.loadedContainerForKey.delete(e),this.loadedMaterialsForKey.delete(e)),t&&this.setBaseModelEnabled(!1);const n=(await W(i,this.scene,a)).instantiateModelsToScene(this.renameClonedAsset,!0);this.loadedContainerForKey.set(e,n),this.loadedMaterialsForKey.set(e,le(n));const r=[];return this.materialVariantMap.forEach((async(e,t)=>{r.push(this.applyMaterial(t,e))})),await Promise.all(r),n}dispose(){this.loadedContainerForKey.forEach((e=>e?.dispose())),this.loadedContainerForKey.clear(),this.loadedMaterialsForKey.forEach((e=>e.forEach((e=>e?.dispose())))),this.loadedMaterialsForKey.clear(),this.materialVariantMap.clear(),this.keysThatRemovedBaseModel=[]}getAllMaterials(){const e=[];return this.loadedMaterialsForKey.forEach((t=>{t.forEach((t=>{e.includes(t)||e.push(t)}))})),e}getAnimationGroups(){const e=[];return this.loadedContainerForKey.forEach((t=>{e.push(...t.animationGroups)})),e}}function le(e){const t=[];return e.rootNodes.forEach((e=>{e.getChildMeshes().forEach((e=>{e.material&&!t.includes(e.material)&&t.push(e.material),e.subMeshes&&e.subMeshes.forEach((e=>{const i=e.getMaterial(!1);i&&!t.includes(i)&&t.push(i)}))}))})),t}function he(e,t,i){return t in e?Object.defineProperty(e,t,{value:i,enumerable:!0,configurable:!0,writable:!0}):e[t]=i,e}function ce(e,t=""){return e.map((e=>({name:e.name.substring(t.length),loop:e.loopAnimation,to:e.to,from:e.from})))}class de{constructor(e){he(this,"metadata",new Map),he(this,"id",void 0),he(this,"previewService",void 0),he(this,"scene",void 0),he(this,"variantManager",void 0),he(this,"materialSelectedObservable",new(0,h.Observable)),he(this,"materialDeselectedObservable",new(0,h.Observable)),he(this,"materialVariantObservable",new(0,h.Observable)),he(this,"modelVariantObservable",new(0,h.Observable)),he(this,"queuedModelAnimation",void 0),he(this,"materialReadyToLoadCallbacks",new Map),he(this,"modelReadyToLoadCallbacks",new Map),he(this,"dynamicTextures",new Map),he(this,"queuedMaterialChanges",new Map),he(this,"materialChangesInProgress",[]),he(this,"queuedModelChanges",new Map),he(this,"modelChangesInProgress",[]),he(this,"animations",[]),he(this,"assetContainer",void 0),he(this,"canvasPanels",void 0),he(this,"contextService",void 0),he(this,"enablePicking",void 0),he(this,"importPromise",void 0),he(this,"initialized",!1),he(this,"materials",[]),he(this,"modelInstance",void 0),he(this,"transformRoot",void 0);const{enablePicking:t,modelDetails:i,previewService:a,progressHandler:n,scene:r}=e;this.enablePicking=t,this.contextService=i.contextService,this.id=Y(),this.previewService=a,this.scene=r,this.variantManager=new oe(r,this.renameClonedAsset.bind(this),this.setEnabled.bind(this)),this.previewService.registerInitializedListener((async()=>await this.processQueuedEvents())),this.transformRoot=new(0,C.TransformNode)("root",this.scene);this.importPromise=(async()=>(this.assetContainer=await W(i.model,r,n),this.initialized=!0,this.instantiate(),this))()}async applyMaterialVariant(e,t,i,a){if(100!==this.previewService.getSceneInitializationProgress()||!this.initialized){if(this.materialReadyToLoadCallbacks.has(e)){this.materialReadyToLoadCallbacks.get(e)?.set(t,this.applyMaterialVariant.bind(this,e,t,i,a))}else{this.materialReadyToLoadCallbacks.set(e,new Map);this.materialReadyToLoadCallbacks.get(e)?.set(t,this.applyMaterialVariant.bind(this,e,t,i,a))}return}const n=async()=>{await this.variantManager.applyMaterial(e,i,((e,t,i)=>{this.materialVariantObservable.notifyObservers({remainingCount:e,totalCount:t,taskName:i})}),a)};if(this.materialChangesInProgress.includes(e))if(this.queuedMaterialChanges.has(e)){this.queuedMaterialChanges.get(e)?.set(t,n)}else{this.queuedMaterialChanges.set(e,new Map);this.queuedMaterialChanges.get(e)?.set(t,n)}else{if(this.materialChangesInProgress.push(e),await n(),this.queuedMaterialChanges.has(e)){this.queuedMaterialChanges.get(e).forEach((async e=>{await e()})),this.queuedMaterialChanges.delete(e)}this.materialChangesInProgress.splice(this.materialChangesInProgress.indexOf(e),1)}}async applyModelVariant(e,t,i){if(!this.previewService.getIsInitialized()||!this.initialized)return void this.modelReadyToLoadCallbacks.set(e,this.applyModelVariant.bind(this,e,t,i));const a=()=>this.variantManager.applyModel(e,i,t?.model,(t=>{this.modelVariantObservable.notifyObservers({...t,key:e})}));if(this.modelChangesInProgress.includes(e))return void this.queuedModelChanges.set(e,a);const n=await(async()=>{this.modelChangesInProgress.push(e);let t=await a();if(this.queuedModelChanges.has(e)){const i=this.queuedModelChanges.get(e);t=await i(),this.queuedModelChanges.delete(e)}return this.modelChangesInProgress.splice(this.modelChangesInProgress.indexOf(e),1),t})();this.modelInstance&&J(this.modelInstance.animationGroups),this.contextService||(this.contextService=t?.contextService),n&&this.configureModelInstance(n)}dispose(){this.destroyInstance(),this.variantManager.dispose(),this.dynamicTextures.forEach((e=>e?.dispose())),this.dynamicTextures.clear(),this.materials.forEach((e=>e&&e?.dispose())),this.materials=[],this.transformRoot?.dispose(),this.transformRoot=void 0,this.previewService.modelUnloaded(this)}executeAnimation(e){this.previewService.getIsInitialized()?this.modelInstance&&X([...this.modelInstance.animationGroups,...this.variantManager.getAnimationGroups()],e.loop,e.to,e.from,e.name?this.renameClonedAsset(e.name):void 0):this.queuedModelAnimation=e}getAnimations(e){return[...this.animations,...e?ce(this.variantManager.getAnimationGroups(),this.renameClonedAsset("")):[]]}getId(){return this.id}listMaterials(){const e=this.scene?.materials.filter((e=>e.name.startsWith(this.id)));return e?e.map((e=>({id:e.id,name:this.stripIdFromName(e.name)}))):[]}registerMaterialSelectedCallback(e){this.materialSelectedObservable.add(e)}unregisterMaterialSelectedCallback(e){this.materialSelectedObservable.removeCallback(e)}registerMaterialDeselectedCallback(e){this.materialDeselectedObservable.add(e)}unregisterMaterialDeselectedCallback(e){this.materialDeselectedObservable.removeCallback(e)}get position(){return this.transformRoot.position}set position(e){this.transformRoot.position=new(0,o.Vector3)(e.x,e.y,e.z)}get rotation(){return this.transformRoot.rotation}set rotation(e){this.transformRoot.rotation=new(0,o.Vector3)(e.x,e.y,e.z)}get scale(){return this.transformRoot.scaling}set scale(e){this.transformRoot.scaling=new(0,o.Vector3)(e.x,e.y,e.z)}attachPickingHandler(e){e.rootNodes.forEach((e=>{e.getChildMeshes(!1).forEach((e=>{"targetcube_t"!==e.name&&"backgroundShell"!==e.name&&(e.actionManager||(e.actionManager=new(0,f.ActionManager)(this.scene)),e.actionManager.registerAction(new(0,v.ExecuteCodeAction)(f.ActionManager.OnPointerOverTrigger,(t=>{t.meshUnderPointer&&e.material&&this.materialSelectedObservable.notifyObservers({id:e.material.id,name:this.stripIdFromName(e.material.name)})}))),e.actionManager.registerAction(new(0,v.ExecuteCodeAction)(f.ActionManager.OnPointerOutTrigger,(()=>{e.material&&this.materialDeselectedObservable.notifyObservers({id:e.material.id,name:this.stripIdFromName(e.material.name)})}))))}))}))}getInitializationPromise(){return this.importPromise}getIsInitialized(){return this.initialized}getQueuedMaterialVariantCount(){return this.materialReadyToLoadCallbacks.size}getQueuedModelVariantCount(){return this.modelReadyToLoadCallbacks.size}configureModelInstance(e){const t=this.transformRoot.position,i=this.transformRoot.rotation,a=this.transformRoot.scaling;this.transformRoot.position=o.Vector3.Zero(),this.transformRoot.rotation=o.Vector3.Zero(),this.transformRoot.scaling=o.Vector3.One(),e.rootNodes.forEach((e=>{e.parent=this.transformRoot})),this.transformRoot.position=t,this.transformRoot.rotation=i,this.transformRoot.scaling=a,this.canvasPanels=this.contextService?.getAll()||new Map,Z(this.materials.concat(this.variantManager.getAllMaterials()),this.scene,this.canvasPanels,this.dynamicTextures,`${this.id}_`),this.enablePicking&&this.attachPickingHandler(e)}destroyInstance(){this.modelInstance?.dispose(),this.modelInstance=void 0}instantiate(){this.modelInstance=this.assetContainer.instantiateModelsToScene(this.renameClonedAsset.bind(this),!0),this.materials=le(this.modelInstance),this.configureModelInstance(this.modelInstance);if(this.materials.some((e=>"emissiveTexture"in e&&null!==e.emissiveTexture))){new(0,y.GlowLayer)("GlowLayer",this.scene).intensity=.5}this.animations=ce(this.modelInstance.animationGroups,this.renameClonedAsset("")),this.processQueuedEvents()}renameClonedAsset(e){return`${this.id}_${e}`}setEnabled(e){e&&!this.modelInstance?this.instantiate():!e&&this.modelInstance&&this.destroyInstance()}updateDynamicTextures(){this.canvasPanels?.forEach(((e,t)=>{const i=this.dynamicTextures.get(t);i&&e.getStaticContextDirty()&&i.isReady()&&(i.update(!1),e.setStaticContextDirty(!1))}))}registerMaterialVariantListener(e){this.materialVariantObservable.add(e)}unregisterMaterialVariantListener(e){this.materialVariantObservable.removeCallback(e)}registerModelVariantListener(e){this.modelVariantObservable.add(e)}unregisterModelVariantListener(e){this.modelVariantObservable.removeCallback(e)}stripIdFromName(e){return e.substring(this.id.length+1)}async processQueuedEvents(){this.previewService.getIsInitialized()&&(await Promise.all(Array.from(this.materialReadyToLoadCallbacks.values()).map((e=>Array.from(e.values()).map((e=>e()))))),this.materialReadyToLoadCallbacks.clear(),await Promise.all(Array.from(this.modelReadyToLoadCallbacks.values()).map((e=>e()))),this.modelReadyToLoadCallbacks.clear(),this.queuedModelAnimation&&(this.executeAnimation(this.queuedModelAnimation),this.queuedModelAnimation=void 0))}}function ue(e,t,i){return t in e?Object.defineProperty(e,t,{value:i,enumerable:!0,configurable:!0,writable:!0}):e[t]=i,e}class ge extends e.ArcRotateCamera{constructor(e,t,i,a,n,r,s,l){super(e,t,i,a,n,r,l),ue(this,"lastFocus",new(0,o.Vector3)(0,0,0)),ue(this,"panDenominator",1),this.minZ=.01,this.setRadius(this.radius),this.enableFramingBehavior(),this.wheelDeltaPercentage=.01,this.pinchDeltaPercentage=.005,this.useNaturalPinchZoom=!0,s.camera.autoOrientation&&(this.alpha+=Math.PI),s&&(s.camera.limits.min.beta&&(this.lowerBetaLimit=s.camera.limits.min.beta),s.camera.limits.max.beta&&(this.upperBetaLimit=s.camera.limits.max.beta),s.camera.limits.min.alpha&&(this.lowerAlphaLimit=s.camera.limits.min.alpha),s.camera.limits.max.alpha&&(this.upperAlphaLimit=s.camera.limits.max.alpha),s.camera.limits.min.radius&&(this.lowerRadiusLimit=s.camera.limits.min.radius),s.camera.limits.max.radius&&(this.upperRadiusLimit=s.camera.limits.max.radius),s.camera.autoRotation.enabled&&this.enableAutoRotationBehavior(s.camera.autoRotation.idleTimeMs))}getFramingBehavior(){return this.getBehaviorByName("Framing")}getAutoRotationBehavior(){const e=this.getBehaviorByName("AutoRotation");return e||void 0}enableFramingBehavior(){this.useFramingBehavior=!0;const e=this.getFramingBehavior();e.attach(this),e.framingTime=0,e.elevationReturnTime=-1,e.zoomStopsAnimation=!1,this.lowerRadiusLimit=null;const t=me(this._scene);return e.zoomOnBoundingInfo(t.min,t.max),this.wheelPrecision=100/this.radius,null===this.lowerRadiusLimit&&(this.lowerRadiusLimit=.1),this.lastFocus.copyFrom(this.target),e}rerunFramingBehavior(e,t){const i=this.getFramingBehavior();i.framingTime=t||800;const a=me(this._scene),n=a.max.subtract(a.min),r=a.min.add(n.scale(.5));this.setRadius(1.5*n.length()),this.wheelPrecision=100/this.radius,this.panningInertia=0,this.panningOriginTarget.copyFrom(r),this.panDenominator=n.length(),i.zoomOnBoundingInfo(a.min,a.max,void 0,(()=>{e&&e()})),i.framingTime=0}enableAutoRotationBehavior(e=5e3){this.useAutoRotationBehavior=!0;const t=this.getAutoRotationBehavior();t&&(t.idleRotationWaitTime=e)}disableAutoRotationBehavior(){this.useAutoRotationBehavior=!1}setRadius(e){this.radius=e,this.maxZ=1e3*this.radius,this.lowerRadiusLimit=.01*this.radius,this.upperRadiusLimit=1.5*this.radius,this.wheelPrecision=100/this.radius,this.pinchPrecision=300/this.radius}static create(e,t,i){const a=me(e),n=a.max.subtract(a.min),r=a.min.add(n.scale(.5)),s=new ge("ProductCamera",-Math.PI/2,Math.PI/2,1.5*n.length(),r,e,t);return s.panningInertia=0,s.panningOriginTarget.copyFrom(r),s.panDenominator=n.length(),s.onAfterCheckInputsObservable.add((()=>{s.panningSensibility=1e3/s.panDenominator})),i&&(e.activeCamera=s),s}}function me(e){if(0===e.meshes.length)return{min:new(0,o.Vector3)(-1,-1,-1),max:new(0,o.Vector3)(1,1,1)};const t=e.meshes.filter((e=>e.name.toLowerCase().endsWith("_t")||e.name.toLowerCase().includes("_t_")));return e.getWorldExtends((e=>e.isVisible&&e.isEnabled()&&(0===t.length||t.includes(e))))}function pe(e,t,i){return t in e?Object.defineProperty(e,t,{value:i,enumerable:!0,configurable:!0,writable:!0}):e[t]=i,e}class be{constructor(e,t=!1,i){pe(this,"renderingPipeline",void 0),pe(this,"currentConfiguration",void 0),this.renderingPipeline=new(0,L.DefaultRenderingPipeline)("default",t,e,i?[i]:void 0,!1),this.renderingPipeline.isSupported&&(this.renderingPipeline.prepare(),this.setConfiguration(_))}dispose(){this.renderingPipeline.dispose()}getConfiguration(){return this.currentConfiguration}setConfiguration(e){if(this.renderingPipeline.isSupported){if(this.renderingPipeline.samples=e.antiAliasing?.samples??_.antiAliasing.samples,this.renderingPipeline.fxaaEnabled=e.antiAliasing?.fxaaEnabled??_.antiAliasing.fxaaEnabled,this.renderingPipeline.bloomEnabled=e.bloom?.enabled??_.bloom.enabled,this.renderingPipeline.bloomKernel=e.bloom?.kernel??_.bloom.kernel,this.renderingPipeline.bloomScale=e.bloom?.scale??_.bloom.scale,this.renderingPipeline.bloomThreshold=e.bloom?.threshold??_.bloom.threshold,this.renderingPipeline.bloomWeight=e.bloom?.weight??_.bloom.weight,this.renderingPipeline.chromaticAberrationEnabled=e.chromaticAberration?.enabled??_.chromaticAberration.enabled,this.renderingPipeline.chromaticAberration.aberrationAmount=e.chromaticAberration?.aberrationAmount??_.chromaticAberration.aberrationAmount,this.renderingPipeline.chromaticAberration.radialIntensity=e.chromaticAberration?.radialIntensity??_.chromaticAberration.radialIntensity,this.renderingPipeline.chromaticAberration.direction=e.chromaticAberration?.direction?new(0,o.Vector2)(e.chromaticAberration.direction.x,e.chromaticAberration.direction.y):new(0,o.Vector2)(_.chromaticAberration.direction.x,_.chromaticAberration.direction.y),this.renderingPipeline.imageProcessing.colorCurvesEnabled=e.colorCurves?.enabled??_.colorCurves.enabled,this.renderingPipeline.imageProcessing.colorCurves=e.colorCurves?this.updateColorCurve(e.colorCurves):new(0,O.ColorCurves),this.renderingPipeline.depthOfFieldEnabled=e.depthOfField?.enabled??_.depthOfField.enabled,e.depthOfField)switch(e.depthOfField.blurLevel??_.depthOfField.blurLevel){case"Low":this.renderingPipeline.depthOfFieldBlurLevel=R.DepthOfFieldEffectBlurLevel.Low;break;case"Medium":this.renderingPipeline.depthOfFieldBlurLevel=R.DepthOfFieldEffectBlurLevel.Medium;break;case"High":this.renderingPipeline.depthOfFieldBlurLevel=R.DepthOfFieldEffectBlurLevel.High}if(this.renderingPipeline.depthOfField.focalLength=e.depthOfField?.focalLength??_.depthOfField.focalLength,this.renderingPipeline.depthOfField.fStop=e.depthOfField?.fStop??_.depthOfField.fStop,this.renderingPipeline.depthOfField.focusDistance=e.depthOfField?.focusDistance??_.depthOfField.focusDistance,this.renderingPipeline.depthOfField.lensSize=e.depthOfField?.lensSize??_.depthOfField.lensSize,this.renderingPipeline.grainEnabled=e.grain?.enabled??_.grain.enabled,this.renderingPipeline.grain.animated=e.grain?.animated??_.grain.animated,this.renderingPipeline.grain.intensity=e.grain?.intensity??_.grain.intensity,this.renderingPipeline.imageProcessing.contrast=e.misc?.contrast??_.misc.contrast,this.renderingPipeline.imageProcessing.exposure=e.misc?.exposure??_.misc.exposure,this.renderingPipeline.imageProcessing.toneMappingEnabled=e.misc?.toneMappingEnabled??_.misc.toneMappingEnabled,this.renderingPipeline.imageProcessing.toneMappingEnabled)switch(e.misc.toneMappingType??_.misc.toneMappingType){case"Standard":this.renderingPipeline.imageProcessing.toneMappingType=E.ImageProcessingConfiguration.TONEMAPPING_STANDARD;break;case"ACES":this.renderingPipeline.imageProcessing.toneMappingType=E.ImageProcessingConfiguration.TONEMAPPING_ACES}if(this.renderingPipeline.sharpenEnabled=e.sharpen?.enabled??_.sharpen.enabled,this.renderingPipeline.sharpen.colorAmount=e.sharpen?.colorAmount??_.sharpen.colorAmount,this.renderingPipeline.sharpen.edgeAmount=e.sharpen?.edgeAmount??_.sharpen.edgeAmount,this.renderingPipeline.imageProcessing.vignetteEnabled=e.vignette?.enabled??_.vignette.enabled,e.vignette?.center?(this.renderingPipeline.imageProcessing.vignetteCenterX=e.vignette.center.x,this.renderingPipeline.imageProcessing.vignetteCenterY=e.vignette.center.y):(this.renderingPipeline.imageProcessing.vignetteCenterX=_.vignette.center.x,this.renderingPipeline.imageProcessing.vignetteCenterY=_.vignette.center.y),e.vignette)switch(e.vignette?.blendMode??_.vignette.blendMode){case"Multiply":this.renderingPipeline.imageProcessing.vignetteBlendMode=E.ImageProcessingConfiguration.VIGNETTEMODE_MULTIPLY;break;case"Opaque":this.renderingPipeline.imageProcessing.vignetteBlendMode=E.ImageProcessingConfiguration.VIGNETTEMODE_OPAQUE}e.vignette?.colorRgba?this.renderingPipeline.imageProcessing.vignetteColor=new(0,s.Color4)(e.vignette.colorRgba.r,e.vignette.colorRgba.g,e.vignette.colorRgba.b,e.vignette.colorRgba.a):e.vignette?.colorHex?this.renderingPipeline.imageProcessing.vignetteColor=s.Color4.FromHexString(e.vignette.colorHex):this.renderingPipeline.imageProcessing.vignetteColor=new(0,s.Color4)(_.vignette.colorRgba.r,_.vignette.colorRgba.g,_.vignette.colorRgba.b,_.vignette.colorRgba.a),this.renderingPipeline.imageProcessing.vignetteStretch=e.vignette?.stretch??_.vignette.stretch,this.renderingPipeline.imageProcessing.vignetteWeight=e.vignette?.weight??_.vignette.weight,this.renderingPipeline.prepare(),this.currentConfiguration=e}}updateColorCurve(e){const t=new(0,O.ColorCurves);return t.globalDensity=e.globalDensity??t.globalDensity,t.globalExposure=e.globalExposure??t.globalExposure,t.globalHue=e.globalHue??t.globalHue,t.globalSaturation=e.globalSaturation??t.globalSaturation,t.highlightsDensity=e.highlightsDensity??t.highlightsDensity,t.highlightsExposure=e.highlightsExposure??t.highlightsExposure,t.highlightsHue=e.highlightsHue??t.highlightsHue,t.highlightsSaturation=e.highlightsSaturation??t.highlightsSaturation,t.midtonesDensity=e.midtonesDensity??t.midtonesDensity,t.midtonesExposure=e.midtonesExposure??t.midtonesExposure,t.midtonesHue=e.midtonesHue??t.midtonesHue,t.midtonesSaturation=e.midtonesSaturation??t.midtonesSaturation,t.shadowsDensity=e.shadowsDensity??t.shadowsDensity,t.shadowsExposure=e.shadowsExposure??t.shadowsExposure,t.shadowsHue=e.shadowsHue??t.shadowsHue,t.shadowsSaturation=e.shadowsSaturation??t.shadowsSaturation,t}}function fe(e,t,i){return t in e?Object.defineProperty(e,t,{value:i,enumerable:!0,configurable:!0,writable:!0}):e[t]=i,e}u.GLTF2.GLTFLoader.RegisterExtension("glbPostProcessor",(function(e){return new K(e)})),n.SceneLoader.OnPluginActivatedObservable.add((e=>{if("gltf"===e.name){e.transparencyAsCoverage=!0}}));class ve{constructor(e){fe(this,"camera",void 0),fe(this,"configuration",void 0),fe(this,"engine",void 0),fe(this,"scene",void 0),fe(this,"loadProgress",new Map([["initialScene",0]])),fe(this,"queuedCameraAnimation",void 0),fe(this,"focusLostNotified",!1),fe(this,"loadObservable",new(0,h.Observable)),fe(this,"focusLostObservable",new(0,h.Observable)),fe(this,"initializedCallbacks",[]),fe(this,"isInitialized",!1),fe(this,"modelLoadEventCallbacks",[]),fe(this,"highlightLayer",void 0),fe(this,"renderingPipeline",void 0),fe(this,"modelContainers",new Map),fe(this,"plugins",[]),fe(this,"screenshotPrepareResolve",void 0);const a=e?.noRender?void 0:document.createElement("canvas");this.configuration=new z(e);l.DracoCompression.Configuration={decoder:{wasmUrl:"https://www.gstatic.com/draco/versioned/decoders/1.5.6/draco_wasm_wrapper_gltf.js",wasmBinaryUrl:"https://www.gstatic.com/draco/versioned/decoders/1.5.6/draco_decoder_gltf.wasm",fallbackUrl:"https://www.gstatic.com/draco/versioned/decoders/1.5.6/draco_decoder_gltf.js"}},a&&(a.getContext("webgl2")||a.getContext("webgl"));const n=console.log;console.log=()=>{};const r=a?new(0,t.Engine)(a,!0,{adaptToDeviceRatio:!0,limitDeviceRatio:2,premultipliedAlpha:!1,preserveDrawingBuffer:!!e?.backgroundImage,audioEngine:!1,stencil:this.configuration.highlights.enabled,forceSRGBBufferSupportState:!0}):new(0,i.NullEngine);console.log=n,r.hideLoadingUI(),window.addEventListener("resize",this.fireResizeEvent.bind(this)),this.engine=r,this.scene=new(0,d.Scene)(r),this.camera=ge.create(this.scene,this.configuration),this.renderingPipeline=new be(this.scene,!1,this.camera),this.scene.imageProcessingConfiguration.exposure=this.configuration.lighting.exposure,this.scene.imageProcessingConfiguration.contrast=this.configuration.lighting.contrast}getEngineContext(){return{engine:this.engine,scene:this.scene,camera:this.camera}}registerFocusLostListener(e){this.focusLostObservable.add(e)}unregisterFocusLostListener(e){this.focusLostObservable.removeCallback(e)}registerLoadProgressListener(e){this.loadObservable.add(e),e(this.getLoadListenerEvent())}unregisterLoadProgressListener(e){this.loadObservable.removeCallback(e)}registerInitializedListener(e){this.isInitialized||!this.isInitialized&&this.initializedCallbacks.push(e)}unregisterInitializedListener(e){if(this.isInitialized)return;const t=this.initializedCallbacks.indexOf(e);t>-1&&this.initializedCallbacks.splice(t,1)}getIsInitialized(){return this.isInitialized}registerModelLoadEventListener(e){this.modelLoadEventCallbacks.push(e)}unregisterModelLoadEventListener(e){const t=this.modelLoadEventCallbacks.indexOf(e);t>-1&&this.modelLoadEventCallbacks.splice(t,1)}registerView(e){const t=e.height,i=e.width;this.engine.registerView(e),e.setAttribute("height",t.toString()),e.setAttribute("width",i.toString()),this.orbitEnabled()||this.setCameraState(F.Pan),this.reattachControls(e)}getNumViewports(){return this.engine.views?.length||0}unregisterView(e){this.engine.unRegisterView(e)}shutdown(){this.plugins.forEach((e=>e.dispose(!0))),this.renderingPipeline.dispose(),this.engine&&this.engine.dispose(),window.removeEventListener("resize",this.fireResizeEvent)}getSceneInitializationProgress(){return this.loadProgress.get("initialScene")}async initialize(e){let t;if(this.scene.clearColor=this.configuration.scene.clearColor,this.scene.environmentTexture=r.CubeTexture.CreateFromPrefilteredData(this.configuration.scene.environmentFile,this.scene),e){const i=100;t=await this.loadModel(e,(e=>{this.loadProgress.set("initialScene",e.loaded*i/e.total),this.notifyLoadHandlers()})).getInitializationPromise()}return this.loadProgress.set("initialScene",100),this.notifyLoadHandlers(),this.scene.activeCamera=this.camera,this.camera.rerunFramingBehavior(void 0,1),J(this.scene.animationGroups),this.engine.views?.length>=1&&this.reattachControls(this.engine.views[this.engine.views.length-1].target),this.queuedCameraAnimation&&(this.executeCameraAnimation(this.queuedCameraAnimation),this.queuedCameraAnimation=void 0),this.isInitialized=!0,await Promise.all(this.initializedCallbacks.map((e=>e()))),this.initializedCallbacks=[],this.configuration.options?.renderingPipelineConfiguration&&this.renderingPipeline.setConfiguration(this.configuration.options.renderingPipelineConfiguration),this.engine.runRenderLoop((()=>{this.engine.views&&(this.modelContainers.forEach((e=>{e.updateDynamicTextures()})),this.configuration.scene.transparentBackground&&this.engine.views.forEach((e=>{const t=this.engine.getRenderingCanvas();e.target.getContext("2d").clearRect(0,0,t.width,t.height)})),this.scene.render(),this.camera.target.equalsWithEpsilon(this.camera.lastFocus,.1)||this.focusLostNotified||(this.focusLostObservable.notifyObservers(void 0),this.focusLostNotified=!0),this.screenshotPrepareResolve&&(this.screenshotPrepareResolve(),this.screenshotPrepareResolve=void 0))})),t}executeCameraAnimation(e){100===this.getSceneInitializationProgress()&&this.camera&&this.scene.activeCamera===this.camera?ee(this.scene,this.scene.activeCamera,e):this.queuedCameraAnimation=e}getCameraPose(){if(this.scene&&this.camera)return{lonDeg:Math.round(180*this.camera.alpha/Math.PI),latDeg:Math.round(180*this.camera.beta/Math.PI),radius:Math.round(1e4*(this.camera.radius+Number.EPSILON))/1e4,target:{x:this.camera.target.x,y:this.camera.target.y,z:this.camera.target.z}}}setCameraPose(e){this.scene&&this.camera&&(this.camera.target=new(0,o.Vector3)(e.target.x,e.target.y,e.target.z),this.camera.radius=e.radius,this.camera.alpha=e.latDeg,this.camera.beta=e.lonDeg)}setCameraState(e){if(!this.engine?.views||!this.engine?.views[0])throw new Error("No views attached, camera state requires a view to attach controls onto.");e===F.Orbit?this.reattachControls(this.engine.views[0].target,2):this.reattachControls(this.engine.views[0].target,0)}animateToLastCameraFocus(){return new Promise((e=>{const t=this.configuration;this.camera.rerunFramingBehavior((()=>{this.focusLostNotified=!1,t.camera.limits.min.radius&&(this.camera.lowerRadiusLimit=t.camera.limits.min.radius),t.camera.limits.max.radius&&(this.camera.upperRadiusLimit=t.camera.limits.max.radius),e()}))}))}setAutoRotation(e){this.configuration.camera.autoRotation.enabled&&this.camera&&(e?this.camera.enableAutoRotationBehavior(this.configuration.camera.autoRotation.idleTimeMs):this.camera.disableAutoRotationBehavior())}getCurrentConfiguration(){return this.configuration.options}async renderSceneScreenshot(t,i){if(!this.camera)throw new Error("Missing product camera, cannot render screenshot!");const a=new(0,e.ArcRotateCamera)("screenshotCamera",0,0,0,o.Vector3.Zero(),this.scene);try{const e=i.latDeg*Math.PI/180,n=i.lonDeg*Math.PI/180;a.target=i.target?new(0,o.Vector3)(i.target.x,i.target.y,i.target.z):o.Vector3.Zero(),a.alpha=n,a.beta=e,a.radius=i.radius||this.camera.radius,a.minZ=.01,this.scene.render();const r=await c.Tools.CreateScreenshotUsingRenderTargetAsync(this.engine,a,t,"image/png",2,!0);return a.dispose(),r}catch(e){throw a.isDisposed()||a.dispose(),new Error("Failed to render screenshot")}}orbitEnabled(){const e=this.configuration;if(!e)return!0;const t=e.camera.limits.min.alpha,i=e.camera.limits.max.alpha,a=e.camera.limits.min.beta,n=e.camera.limits.max.beta;if(void 0===t||void 0===i||void 0===a||void 0===n)return!0;const r=[a,n],s=[t,i].every((e=>e===t)),o=r.every((e=>e===a));return!s&&!o}fireResizeEvent(){this.getNumViewports()>0&&this.engine.resize()}setHighlights(e,t){0===e.length&&(this.highlightLayer?.dispose(),this.highlightLayer=void 0),this.highlightLayer||(this.highlightLayer=new(0,a.HighlightLayer)("highlights",this.scene,{isStroke:!0,blurVerticalSize:.85,blurHorizontalSize:.85}),this.highlightLayer.innerGlow=!0,this.highlightLayer.outerGlow=!1),this.highlightLayer.removeAllMeshes();const i=t?new(0,s.Color3)(t[0],t[1],t[2]).toLinearSpace():void 0;e.forEach((e=>{const t=this.scene.materials.find((t=>t.name===e.name&&t.id===e.id));t&&t.getBindedMeshes().forEach((e=>this.highlightLayer?.addMesh(e,i||s.Color3.FromHexString("#fcba03"))))}))}setRenderingPipelineConfiguration(e){this.renderingPipeline&&this.renderingPipeline.setConfiguration(e)}loadModel(e,t){const i=new de({enablePicking:this.configuration.highlights.enabled,modelDetails:e,scene:this.scene,previewService:this,progressHandler:t});return i.registerMaterialVariantListener((e=>this.handleMaterialProgressCallback(e.remainingCount,e.totalCount,e.taskName))),i.registerModelVariantListener((e=>this.handleModelProgressCallback(e,e.key))),this.configuration.highlights.enabled&&(i.registerMaterialSelectedCallback((e=>{this.setHighlights([e])})),i.registerMaterialDeselectedCallback((()=>{this.setHighlights([])}))),this.modelContainers.set(i.getId(),i),this.triggerModelLoadEvent({eventType:"load",modelContainer:i}),i}getAllModels(){return Array.from(this.modelContainers.values())}getModelById(e){return this.modelContainers.get(e)}registerPlugin(e){this.plugins.push(e),e.initialize(this,{camera:this.camera,engine:this.engine,scene:this.scene})}unregisterPlugin(e){const t=this.plugins.indexOf(e);if(t>-1){this.plugins.splice(t,1).forEach((e=>e.dispose(!1)))}}modelUnloaded(e){this.modelContainers.delete(e.getId()),this.triggerModelLoadEvent({eventType:"unload",modelContainer:e})}triggerModelLoadEvent(e){this.modelLoadEventCallbacks.forEach((t=>t(e)))}handleMaterialProgressCallback(e,t,i){this.loadProgress.set(`key_${i}`,e/t*100),this.notifyLoadHandlers()}handleModelProgressCallback(e,t){this.loadProgress.set(t,100*e.loaded/e.total),this.notifyLoadHandlers()}reattachControls(e,t=2){if(this.scene.detachControl(),this.engine.inputElement=e,this.camera){this.camera.attachControl(!0,!1,t);this.camera.inputs.attached.pointers.multiTouchPanning=!1}this.scene.attachControl(!0,!0,!0)}getLoadListenerEvent(){const e=Array.from(this.loadProgress.values()).filter((e=>e<100)),t=e.reduce(((e,t)=>e+t),0)/e.length||0;return{loadValue:0===e.length?100:t,sceneInitialized:100===this.getSceneInitializationProgress()}}notifyLoadHandlers(){this.loadObservable.notifyObservers(this.getLoadListenerEvent())}}T(module.exports,S),T(module.exports,q),T(module.exports,N);
|
|
1
|
+
var e=require("@babylonjs/core/Cameras/arcRotateCamera"),t=require("@babylonjs/core/Engines/engine"),i=require("@babylonjs/core/Engines/nullEngine"),a=require("@babylonjs/core/Layers/highlightLayer"),n=require("@babylonjs/core/Loading/sceneLoader"),r=require("@babylonjs/core/Materials/Textures/cubeTexture"),s=require("@babylonjs/core/Maths/math.color"),o=require("@babylonjs/core/Maths/math.vector"),l=require("@babylonjs/core/Meshes/Compression/dracoCompression"),h=require("@babylonjs/core/Misc/observable"),c=require("@babylonjs/core/Misc/tools"),d=require("@babylonjs/core/scene"),u=require("@babylonjs/loaders/glTF");require("@babylonjs/core/Engines/Extensions/engine.views"),require("@babylonjs/core/Meshes/instancedMesh"),require("@babylonjs/core/Materials/Textures/Loaders/ddsTextureLoader"),require("@babylonjs/core/Materials/Textures/Loaders/envTextureLoader"),require("@babylonjs/core/Materials/Textures/Loaders/ktxTextureLoader"),require("@babylonjs/core/Animations/animatable"),require("@babylonjs/core/Misc/screenshotTools"),require("@babylonjs/core/Rendering/boundingBoxRenderer"),require("@babylonjs/loaders/glTF/2.0/Extensions");var g=require("@babylonjs/core/Materials/PBR/pbrMaterial"),m=require("@babylonjs/core/Materials/Textures/mirrorTexture"),p=require("@babylonjs/core/Maths/math"),b=require("@babylonjs/core/Probes/reflectionProbe"),f=require("@babylonjs/core/Actions/actionManager"),v=require("@babylonjs/core/Actions/directActions"),y=require("@babylonjs/core/Layers/glowLayer"),C=require("@babylonjs/core/Meshes/transformNode"),M=require("@babylonjs/core/Materials/Textures/dynamicTexture"),P=require("@babylonjs/core/Materials/Textures/texture"),w=require("@babylonjs/core/Animations/animation"),x=require("@babylonjs/core/Animations/easing"),O=require("@babylonjs/core/Misc/assetsManager"),A=require("@babylonjs/core/Materials/colorCurves"),E=require("@babylonjs/core/Materials/imageProcessingConfiguration"),L=require("@babylonjs/core/PostProcesses/RenderPipeline"),R=require("@babylonjs/core/PostProcesses/depthOfFieldEffect");function T(e,t){return Object.keys(t).forEach((function(i){"default"===i||"__esModule"===i||e.hasOwnProperty(i)||Object.defineProperty(e,i,{enumerable:!0,get:function(){return t[i]}})})),e}function I(e,t,i,a){Object.defineProperty(e,t,{get:i,set:a,enumerable:!0,configurable:!0})}require("@babylonjs/core/Rendering/depthRendererSceneComponent");var S={};let F;var k;let D;var B;I(S,"ProductCameraRig",(()=>F)),I(S,"MaterialEffectMode",(()=>D)),(k=F||(F={}))[k.Orbit=0]="Orbit",k[k.Pan=1]="Pan",(B=D||(D={})).None="None",B.RemoveWhenSelected="RemoveWhenSelected",B.ApplyWhenSelected="ApplyWhenSelected";var q={};function V(e,t,i){return t in e?Object.defineProperty(e,t,{value:i,enumerable:!0,configurable:!0,writable:!0}):e[t]=i,e}I(q,"SpiffCommerce3DPreviewService",(()=>ve));class z{constructor(e){V(this,"customOptions",void 0),V(this,"getSceneClearColor",(()=>{const e=this.customOptions?.transparentBackground||this.customOptions?.backgroundImage?0:1;if(this.customOptions&&this.customOptions?.transparentBackground||this.customOptions?.backgroundImage)return new(0,s.Color4)(0,0,0,e).toLinearSpace();if(this.customOptions&&this.customOptions.backgroundColor){const t=s.Color3.FromHexString(this.customOptions.backgroundColor);return new(0,s.Color4)(t.r,t.g,t.b,e).toLinearSpace()}return new(0,s.Color4)(.98,.98,.98,e).toLinearSpace()})),V(this,"highlightColorFromConfig",(()=>this.customOptions&&this.customOptions.highlightColor?this.hexToColor4(this.customOptions.highlightColor):new(0,s.Color4)(.98,.98,.98,1).toLinearSpace())),V(this,"hexToColor4",((e,t=1)=>{const i=s.Color3.FromHexString(e);return new(0,s.Color4)(i.r,i.g,i.b,t).toLinearSpace()})),this.customOptions=e}get options(){return this.customOptions}get scene(){return{clearColor:this.getSceneClearColor(),transparentBackground:this.customOptions?.transparentBackground||this.customOptions?.backgroundImage,environmentFile:this.customOptions?.environmentFile??"assets/model-viewer/default.env"}}get camera(){return{autoOrientation:this.customOptions?.disableAutomaticOrientation??!0,autoRotation:{enabled:this.customOptions?.autoRotation??!1,idleTimeMs:this.customOptions?.idleTimeBeforeRotation??5e3},limits:{min:{alpha:this.customOptions?.lowerAlphaLimitDeg?this.customOptions?.lowerAlphaLimitDeg*Math.PI/180:void 0,beta:this.customOptions?.lowerBetaLimitDeg?this.customOptions?.lowerBetaLimitDeg*Math.PI/180:void 0,radius:this.customOptions?.minZoomOverride},max:{alpha:this.customOptions?.upperAlphaLimitDeg?this.customOptions?.upperAlphaLimitDeg*Math.PI/180:void 0,beta:this.customOptions?.upperBetaLimitDeg?this.customOptions?.upperBetaLimitDeg*Math.PI/180:void 0,radius:this.customOptions?.maxZoomOverride}}}}get highlights(){return{enabled:this.customOptions?.highlightOnMaterialHover??!1,color:this.highlightColorFromConfig()}}get lighting(){return{exposure:this.customOptions?.lighting?.exposure??.9,contrast:this.customOptions?.lighting?.contrast??1.6}}get emissiveGlowIntensity(){return this.customOptions?.emissiveGlowIntensity??.5}}var N={};I(N,"RenderingConfiguration",(()=>j)),I(N,"REFLECTION_PROBE_RESOLUTION",(()=>H)),I(N,"renderingPipelineDefaults",(()=>_));class j{static getDynamicTextureResolution(){return this.getIsMobile()||!j.offscreenRenderingSupported()?{width:1024,height:1024}:{width:2048,height:2048}}static shouldMipMap(){return!0}static offscreenRenderingSupported(){return!navigator.userAgent.includes("SamsungBrowser")&&(!!window.Worker&&!!window.OffscreenCanvas)}static getMirrorTextureResolution(){return this.getIsMobile()?512:1024}static getIsMobile(){try{return!("undefined"==typeof window||!window.navigator)&&(/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(window.navigator.userAgent)||window.innerWidth<=480)}catch(e){return!1}}}const H=128,_={antiAliasing:{samples:4,fxaaEnabled:!1},bloom:{enabled:!1,kernel:64,scale:.5,threshold:.9,weight:.15},chromaticAberration:{enabled:!1,aberrationAmount:30,direction:{x:0,y:0},radialIntensity:0},colorCurves:{enabled:!1},depthOfField:{enabled:!1,blurLevel:"Low",focalLength:50,focusDistance:2e3,fStop:1.4,lensSize:50},grain:{enabled:!1,animated:!1,intensity:30},misc:{contrast:1,exposure:1,toneMappingEnabled:!1,toneMappingType:"Standard"},sharpen:{enabled:!1,colorAmount:1,edgeAmount:.3},vignette:{enabled:!1,blendMode:"Multiply",cameraFov:.5,center:{x:0,y:0},colorHex:"#000000ff",colorRgba:{r:0,g:0,b:0,a:1},stretch:0,weight:1}};function G(e,t,i){return t in e?Object.defineProperty(e,t,{value:i,enumerable:!0,configurable:!0,writable:!0}):e[t]=i,e}class K{constructor(e){G(this,"name",void 0),G(this,"enabled",void 0),G(this,"loader",void 0),this.name="glbPostProcessor",this.enabled=!0,this.loader=e}onReady(){this.applyReflections(this.loader.babylonScene)}loadNodeAsync(e,t,i){return this.loader.loadNodeAsync(e,t,(function(e){t.extras&&Object.keys(t.extras).forEach((i=>{const a=t.extras[i];e.metadata[i]=a})),i(e)}))}async loadMaterialPropertiesAsync(e,t,i){await this.loader.loadMaterialPropertiesAsync(e,t,i),this.enableMaterialExtrasIfRequired(t,i),i.needDepthPrePass=!0}dispose(){}enableMaterialExtrasIfRequired(e,t){if(e.extras&&t instanceof g.PBRMaterial){if(e.extras.sheen){const i=t;i.sheen.isEnabled=!0,i.sheen.intensity=e.extras.sheen}if(e.extras.translucency){const i=t;i.subSurface.isTranslucencyEnabled=!0,i.subSurface.translucencyIntensity=e.extras.translucency,e.extras.translucencyR&&e.extras.translucencyG&&e.extras.translucencyB&&(i.subSurface.tintColor=new(0,p.Color3)(e.extras.translucencyR,e.extras.translucencyG,e.extras.translucencyB))}if(e.extras.refractionIOR){const i=t;i.subSurface.isRefractionEnabled=!0,i.subSurface.volumeIndexOfRefraction=e.extras.refractionIOR}if(e.extras.useDepthPrePass){const e=t;e.needDepthPrePass=!0,e.forceIrradianceInFragment=!0}if(e.extras.useParallax){const i=t;i.useParallax=!0,i.useParallaxOcclusion=!0,i.parallaxScaleBias=e.extras.useParallax}}}applyReflections(e){function t(e){const t=[];return e.transformNodes.forEach((e=>{e.metadata&&e.metadata.reflective&&t.push(...e.getChildMeshes())})),e.meshes.forEach((e=>{e.metadata&&e.metadata.reflective&&!t.includes(e)&&t.push(e)})),t}e.meshes.forEach((i=>{const a=i.metadata;a&&(a.mirrorTexture&&function(i,a=1){const n=i.material;if(!n)return;const r=new(0,m.MirrorTexture)("mirror",j.getMirrorTextureResolution(),e,!0);r.renderList=t(e);const s=i.getVerticesData("normal");if(!s)throw new Error("Mirror attribute specified on: "+i.name+"But no normals exist to generate a mirror from!");i.computeWorldMatrix(!0);const o=i.getWorldMatrix(),l=p.Vector3.TransformNormal(new(0,p.Vector3)(s[0],s[1],s[2]),o).normalize(),h=p.Plane.FromPositionAndNormal(i.position,l.scale(-1));r.mirrorPlane=h,r.level=a,n.reflectionTexture=r}(i,a.mirrorTexture),a.reflectionProbe&&function(i){const a=i.material,n=new(0,b.ReflectionProbe)("probe-"+a.name,H,e);n.attachToMesh(i),n.renderList&&n.renderList.push(...t(e)),a.reflectionTexture=n.cubeTexture}(i))}))}}const U=new Map;async function W(e,t,i){return new Promise(((a,r)=>{const s=U.get(e);if(s&&s.scene.uid===t.uid)return a(s);n.SceneLoader.LoadAssetContainerAsync(e,void 0,t,i).then((t=>{U.set(e,t),a(t)})).catch(r)}))}function Z(e,i,a,n,r=""){a.forEach((a=>{const s=a.getID(),o=a.getName(),l=j.getDynamicTextureResolution();e.filter((e=>e.name===r+o)).forEach((e=>{const r=n.get(s);if(r)Q(e,r),r.update(false);else{const r=function(e,i,a,n){const r=new(0,M.DynamicTexture)(e,{width:a,height:n},i,j.shouldMipMap(),P.Texture.TRILINEAR_SAMPLINGMODE,t.Engine.TEXTUREFORMAT_RGBA),s=r.getContext();s&&(s.fillStyle="#f5f5f5",s.fillRect(0,0,a,n),r.update());return r}(o,i,l.width,l.height);n.set(s,r),a.setStaticContext(r.getContext()),Q(e,r),r.onLoadObservable.addOnce((()=>{r.update(false)}))}}))}))}function Q(e,t){if(e instanceof g.PBRMaterial){const i=e,a=i.albedoTexture;a?(t.wrapU=a.wrapU,t.wrapV=a.wrapV):(t.wrapU=1,t.wrapV=1),i.albedoTexture=t}else{const i=e,a=i.diffuseTexture;a&&(t.wrapU=a.wrapU,t.wrapV=a.wrapV),i.diffuseTexture=t}}function Y(){const e=()=>Math.floor(65536*(1+Math.random())).toString(16).substring(1);return e()+e()+"-"+e()+"-"+e()+"-"+e()+"-"+e()+e()+e()}function $(e){return e.targetedAnimations.map((e=>e.animation.framePerSecond)).reduce(((e,t)=>e+t),0)/e.targetedAnimations.length||0}function X(e,t,i,a,n){const r=n?e.filter((e=>e.name===n)):e;0!==r.length?void 0===a||void 0===i||a!==i?r.forEach((e=>{e.stop();const n=$(e),r=void 0!==a?a*n:void 0,s=void 0!==i?i*n:void 0;e.start(t,1,r,s)})):r.forEach((e=>{e.stop();const i=$(e),n=a*i;e.start(t,1,n,n)})):console.warn(`No animations found for name: ${n}`)}function J(e){e.forEach((e=>{e.stop()}))}function ee(e,t,i){var a,n,r;e.stopAnimation(t),t.animations=[],Math.abs(t.alpha)>2*Math.PI&&(t.alpha=(a=t.alpha,n=0,r=2*Math.PI,a<n?r-(n-a)%(r-n):n+(a-n)%(r-n)));const s=[],l=i.target,h=l?1:0;if(i.target&&Object.keys(i.target).length>0&&s.push(ie("cameraTargetLerp","target",(new(0,o.Vector3)).copyFrom(t.target),new(0,o.Vector3)(i.target.x,i.target.y,i.target.z),w.Animation.ANIMATIONTYPE_VECTOR3,0)),s.push(ie("cameraAlphaLerp","alpha",t.alpha,te(i.lonDeg),w.Animation.ANIMATIONTYPE_FLOAT,h)),s.push(ie("cameraBetaLerp","beta",t.beta,te(i.latDeg),w.Animation.ANIMATIONTYPE_FLOAT,h)),void 0!==i.radius){const e=Math.max(.01,i.radius);s.push(ie("cameraRadiusLerp","radius",t.radius,e,w.Animation.ANIMATIONTYPE_FLOAT,h))}t.animations.push(...s);const c=t.useAutoRotationBehavior;t.disableAutoRotationBehavior(),e.beginAnimation(t,0,l?120:60,!1,1,(()=>{t.animations=[],c&&t.enableAutoRotationBehavior()}))}function te(e){return e*Math.PI/180}function ie(e,t,i,a,n,r=0,s=w.Animation.ANIMATIONLOOPMODE_CONSTANT){const o=new(0,x.QuadraticEase);o.setEasingMode(x.EasingFunction.EASINGMODE_EASEINOUT);const l=new(0,w.Animation)(e,t,60,n,s),h=[];return r>0&&h.push({frame:0,value:i}),h.push({frame:60*r,value:i}),h.push({frame:60*(r+1),value:a}),l.setKeys(h),l.setEasingFunction(o),l}const ae={albedoTexture:"albedoMap",bumpTexture:"normalMap",ambientTexture:"ambientMap",emissiveTexture:"emissionMap",opacityTexture:"alphaMap",metallicTexture:"metallicMap",refractionTexture:"refractionMap"};function ne(e,t,i,a){["albedoTexture","bumpTexture","ambientTexture","emissiveTexture","opacityTexture","metallicTexture","refractionTexture"].forEach((n=>{!function(e,t,i,a,n){const r=ae[e];if(!r)throw new Error("Unexpected texture name encountered.");const s=t[r]?.fileLink;s?a.addTextureTask(e,s,!1,!1):n&&i[e]&&(i[e]&&i[e].dispose(),i[e]=null,function(e,t){"opacityTexture"===e&&(t.useAlphaFromAlbedoTexture=!0);"metallicTexture"===e&&(t.useRoughnessFromMetallicTextureAlpha=!1,t.useRoughnessFromMetallicTextureGreen=!1,t.useMetallnessFromMetallicTextureBlue=!1);"refractionTexture"===e&&(t.subSurface.isRefractionEnabled=!1,t.subSurface.refractionIntensity=1)}(e,i))}(n,e,t,i,a)})),function(e,t){if(!e.clearCoat)return;e.clearCoat===D.RemoveWhenSelected?(t.clearCoat.isEnabled=!1,t.clearCoat.indexOfRefraction=1.5):e.clearCoat===D.ApplyWhenSelected&&(t.clearCoat.isEnabled=!0,t.clearCoat.indexOfRefraction=e.clearCoatIOR||t.clearCoat.indexOfRefraction)}(e,t)}function re(e,t,i,a){"opacityTexture"===e&&(t.useAlphaFromAlbedoTexture=!1),"metallicTexture"===e&&(t.useRoughnessFromMetallicTextureAlpha=!1,t.useRoughnessFromMetallicTextureGreen=!0,t.useMetallnessFromMetallicTextureBlue=!0),"refractionTexture"===e&&(t.subSurface.isRefractionEnabled=!0,t.subSurface.refractionIntensity=i.refractionIntensity||1),t[e]=a}function se(e,t,i){return t in e?Object.defineProperty(e,t,{value:i,enumerable:!0,configurable:!0,writable:!0}):e[t]=i,e}class oe{constructor(e,t,i){se(this,"materialVariantMap",new Map),se(this,"keysThatRemovedBaseModel",[]),se(this,"loadedContainerForKey",new Map),se(this,"loadedMaterialsForKey",new Map),se(this,"scene",void 0),se(this,"renameClonedAsset",void 0),se(this,"setBaseModelEnabled",void 0),this.scene=e,this.renameClonedAsset=t,this.setBaseModelEnabled=i}async applyMaterial(e,t,i,a){return new Promise((n=>{const r=this.materialVariantMap.get(e);this.materialVariantMap.set(e,{...r,...t});const s=this.renameClonedAsset(e),o=this.scene.materials.filter((e=>e.name===s));if(0===o.length)return void n();const l=new(0,O.AssetsManager)(this.scene);l.useDefaultLoadingScreen=!1,o.forEach((e=>ne(t,e,l,a))),l.onProgress=(e,t,a)=>{i&&i(e/t*100,100,a.name)},l.onFinish=e=>{e.forEach((e=>{const a=e;i&&i(100,100,e.name),o.forEach((i=>re(e.name,i,t,a.texture)))})),n()},l.loadAsync()}))}async applyModel(e,t,i,a){if(i&&t&&!this.keysThatRemovedBaseModel.includes(e)&&this.keysThatRemovedBaseModel.push(e),!i)return this.keysThatRemovedBaseModel.includes(e)&&this.setBaseModelEnabled(!0),this.loadedContainerForKey.get(e)?.dispose(),this.loadedContainerForKey.delete(e),this.loadedMaterialsForKey.delete(e),Promise.resolve(void 0);this.loadedContainerForKey.has(e)&&(this.loadedContainerForKey.get(e)?.dispose(),this.loadedContainerForKey.delete(e),this.loadedMaterialsForKey.delete(e)),t&&this.setBaseModelEnabled(!1);const n=(await W(i,this.scene,a)).instantiateModelsToScene(this.renameClonedAsset,!0);this.loadedContainerForKey.set(e,n),this.loadedMaterialsForKey.set(e,le(n));const r=[];return this.materialVariantMap.forEach((async(e,t)=>{r.push(this.applyMaterial(t,e))})),await Promise.all(r),n}dispose(){this.loadedContainerForKey.forEach((e=>e?.dispose())),this.loadedContainerForKey.clear(),this.loadedMaterialsForKey.forEach((e=>e.forEach((e=>e?.dispose())))),this.loadedMaterialsForKey.clear(),this.materialVariantMap.clear(),this.keysThatRemovedBaseModel=[]}getAllMaterials(){const e=[];return this.loadedMaterialsForKey.forEach((t=>{t.forEach((t=>{e.includes(t)||e.push(t)}))})),e}getAnimationGroups(){const e=[];return this.loadedContainerForKey.forEach((t=>{e.push(...t.animationGroups)})),e}}function le(e){const t=[];return e.rootNodes.forEach((e=>{e.getChildMeshes().forEach((e=>{e.material&&!t.includes(e.material)&&t.push(e.material),e.subMeshes&&e.subMeshes.forEach((e=>{const i=e.getMaterial(!1);i&&!t.includes(i)&&t.push(i)}))}))})),t}function he(e,t,i){return t in e?Object.defineProperty(e,t,{value:i,enumerable:!0,configurable:!0,writable:!0}):e[t]=i,e}function ce(e,t=""){return e.map((e=>({name:e.name.substring(t.length),loop:e.loopAnimation,to:e.to,from:e.from})))}class de{constructor(e){he(this,"metadata",new Map),he(this,"id",void 0),he(this,"previewService",void 0),he(this,"scene",void 0),he(this,"variantManager",void 0),he(this,"materialSelectedObservable",new(0,h.Observable)),he(this,"materialDeselectedObservable",new(0,h.Observable)),he(this,"materialVariantObservable",new(0,h.Observable)),he(this,"modelVariantObservable",new(0,h.Observable)),he(this,"queuedModelAnimation",void 0),he(this,"materialReadyToLoadCallbacks",new Map),he(this,"modelReadyToLoadCallbacks",new Map),he(this,"dynamicTextures",new Map),he(this,"queuedMaterialChanges",new Map),he(this,"materialChangesInProgress",[]),he(this,"queuedModelChanges",new Map),he(this,"modelChangesInProgress",[]),he(this,"animations",[]),he(this,"assetContainer",void 0),he(this,"canvasPanels",void 0),he(this,"contextService",void 0),he(this,"enablePicking",void 0),he(this,"importPromise",void 0),he(this,"initialized",!1),he(this,"materials",[]),he(this,"modelInstance",void 0),he(this,"transformRoot",void 0);const{enablePicking:t,modelDetails:i,previewService:a,progressHandler:n,scene:r}=e;this.enablePicking=t,this.contextService=i.contextService,this.id=Y(),this.previewService=a,this.scene=r,this.variantManager=new oe(r,this.renameClonedAsset.bind(this),this.setEnabled.bind(this)),this.previewService.registerInitializedListener((async()=>await this.processQueuedEvents())),this.transformRoot=new(0,C.TransformNode)("root",this.scene);this.importPromise=(async()=>(this.assetContainer=await W(i.model,r,n),this.initialized=!0,this.instantiate(),this))()}async applyMaterialVariant(e,t,i,a){if(100!==this.previewService.getSceneInitializationProgress()||!this.initialized){if(this.materialReadyToLoadCallbacks.has(e)){this.materialReadyToLoadCallbacks.get(e)?.set(t,this.applyMaterialVariant.bind(this,e,t,i,a))}else{this.materialReadyToLoadCallbacks.set(e,new Map);this.materialReadyToLoadCallbacks.get(e)?.set(t,this.applyMaterialVariant.bind(this,e,t,i,a))}return}const n=async()=>{await this.variantManager.applyMaterial(e,i,((e,t,i)=>{this.materialVariantObservable.notifyObservers({remainingCount:e,totalCount:t,taskName:i})}),a)};if(this.materialChangesInProgress.includes(e))if(this.queuedMaterialChanges.has(e)){this.queuedMaterialChanges.get(e)?.set(t,n)}else{this.queuedMaterialChanges.set(e,new Map);this.queuedMaterialChanges.get(e)?.set(t,n)}else{if(this.materialChangesInProgress.push(e),await n(),this.queuedMaterialChanges.has(e)){this.queuedMaterialChanges.get(e).forEach((async e=>{await e()})),this.queuedMaterialChanges.delete(e)}this.materialChangesInProgress.splice(this.materialChangesInProgress.indexOf(e),1)}}async applyModelVariant(e,t,i){if(!this.previewService.getIsInitialized()||!this.initialized)return void this.modelReadyToLoadCallbacks.set(e,this.applyModelVariant.bind(this,e,t,i));const a=()=>this.variantManager.applyModel(e,i,t?.model,(t=>{this.modelVariantObservable.notifyObservers({...t,key:e})}));if(this.modelChangesInProgress.includes(e))return void this.queuedModelChanges.set(e,a);const n=await(async()=>{this.modelChangesInProgress.push(e);let t=await a();if(this.queuedModelChanges.has(e)){const i=this.queuedModelChanges.get(e);t=await i(),this.queuedModelChanges.delete(e)}return this.modelChangesInProgress.splice(this.modelChangesInProgress.indexOf(e),1),t})();this.modelInstance&&J(this.modelInstance.animationGroups),this.contextService||(this.contextService=t?.contextService),n&&this.configureModelInstance(n)}dispose(){this.destroyInstance(),this.variantManager.dispose(),this.dynamicTextures.forEach((e=>e?.dispose())),this.dynamicTextures.clear(),this.materials.forEach((e=>e&&e?.dispose())),this.materials=[],this.transformRoot?.dispose(),this.transformRoot=void 0,this.previewService.modelUnloaded(this)}executeAnimation(e){this.previewService.getIsInitialized()?this.modelInstance&&X([...this.modelInstance.animationGroups,...this.variantManager.getAnimationGroups()],e.loop,e.to,e.from,e.name?this.renameClonedAsset(e.name):void 0):this.queuedModelAnimation=e}getAnimations(e){return[...this.animations,...e?ce(this.variantManager.getAnimationGroups(),this.renameClonedAsset("")):[]]}getId(){return this.id}listMaterials(){const e=this.scene?.materials.filter((e=>e.name.startsWith(this.id)));return e?e.map((e=>({id:e.id,name:this.stripIdFromName(e.name)}))):[]}registerMaterialSelectedCallback(e){this.materialSelectedObservable.add(e)}unregisterMaterialSelectedCallback(e){this.materialSelectedObservable.removeCallback(e)}registerMaterialDeselectedCallback(e){this.materialDeselectedObservable.add(e)}unregisterMaterialDeselectedCallback(e){this.materialDeselectedObservable.removeCallback(e)}get position(){return this.transformRoot.position}set position(e){this.transformRoot.position=new(0,o.Vector3)(e.x,e.y,e.z)}get rotation(){return this.transformRoot.rotation}set rotation(e){this.transformRoot.rotation=new(0,o.Vector3)(e.x,e.y,e.z)}get scale(){return this.transformRoot.scaling}set scale(e){this.transformRoot.scaling=new(0,o.Vector3)(e.x,e.y,e.z)}attachPickingHandler(e){e.rootNodes.forEach((e=>{e.getChildMeshes(!1).forEach((e=>{"targetcube_t"!==e.name&&"backgroundShell"!==e.name&&(e.actionManager||(e.actionManager=new(0,f.ActionManager)(this.scene)),e.actionManager.registerAction(new(0,v.ExecuteCodeAction)(f.ActionManager.OnPointerOverTrigger,(t=>{t.meshUnderPointer&&e.material&&this.materialSelectedObservable.notifyObservers({id:e.material.id,name:this.stripIdFromName(e.material.name)})}))),e.actionManager.registerAction(new(0,v.ExecuteCodeAction)(f.ActionManager.OnPointerOutTrigger,(()=>{e.material&&this.materialDeselectedObservable.notifyObservers({id:e.material.id,name:this.stripIdFromName(e.material.name)})}))))}))}))}getInitializationPromise(){return this.importPromise}getIsInitialized(){return this.initialized}getQueuedMaterialVariantCount(){return this.materialReadyToLoadCallbacks.size}getQueuedModelVariantCount(){return this.modelReadyToLoadCallbacks.size}configureModelInstance(e){const t=this.transformRoot.position,i=this.transformRoot.rotation,a=this.transformRoot.scaling;this.transformRoot.position=o.Vector3.Zero(),this.transformRoot.rotation=o.Vector3.Zero(),this.transformRoot.scaling=o.Vector3.One(),e.rootNodes.forEach((e=>{e.parent=this.transformRoot})),this.transformRoot.position=t,this.transformRoot.rotation=i,this.transformRoot.scaling=a,this.canvasPanels=this.contextService?.getAll()||new Map,Z(this.materials.concat(this.variantManager.getAllMaterials()),this.scene,this.canvasPanels,this.dynamicTextures,`${this.id}_`),this.enablePicking&&this.attachPickingHandler(e)}destroyInstance(){this.modelInstance?.dispose(),this.modelInstance=void 0}instantiate(){this.modelInstance=this.assetContainer.instantiateModelsToScene(this.renameClonedAsset.bind(this),!0),this.materials=le(this.modelInstance),this.configureModelInstance(this.modelInstance);if(this.materials.some((e=>"emissiveTexture"in e&&null!==e.emissiveTexture))){new(0,y.GlowLayer)("GlowLayer",this.scene).intensity=this.previewService.getConfiguration().emissiveGlowIntensity}this.animations=ce(this.modelInstance.animationGroups,this.renameClonedAsset("")),this.processQueuedEvents()}renameClonedAsset(e){return`${this.id}_${e}`}setEnabled(e){e&&!this.modelInstance?this.instantiate():!e&&this.modelInstance&&this.destroyInstance()}updateDynamicTextures(){this.canvasPanels?.forEach(((e,t)=>{const i=this.dynamicTextures.get(t);i&&e.getStaticContextDirty()&&i.isReady()&&(i.update(!1),e.setStaticContextDirty(!1))}))}registerMaterialVariantListener(e){this.materialVariantObservable.add(e)}unregisterMaterialVariantListener(e){this.materialVariantObservable.removeCallback(e)}registerModelVariantListener(e){this.modelVariantObservable.add(e)}unregisterModelVariantListener(e){this.modelVariantObservable.removeCallback(e)}stripIdFromName(e){return e.substring(this.id.length+1)}async processQueuedEvents(){this.previewService.getIsInitialized()&&(await Promise.all(Array.from(this.materialReadyToLoadCallbacks.values()).map((e=>Array.from(e.values()).map((e=>e()))))),this.materialReadyToLoadCallbacks.clear(),await Promise.all(Array.from(this.modelReadyToLoadCallbacks.values()).map((e=>e()))),this.modelReadyToLoadCallbacks.clear(),this.queuedModelAnimation&&(this.executeAnimation(this.queuedModelAnimation),this.queuedModelAnimation=void 0))}}function ue(e,t,i){return t in e?Object.defineProperty(e,t,{value:i,enumerable:!0,configurable:!0,writable:!0}):e[t]=i,e}class ge extends e.ArcRotateCamera{constructor(e,t,i,a,n,r,s,l){super(e,t,i,a,n,r,l),ue(this,"lastFocus",new(0,o.Vector3)(0,0,0)),ue(this,"panDenominator",1),this.minZ=.01,this.setRadius(this.radius),this.enableFramingBehavior(),this.wheelDeltaPercentage=.01,this.pinchDeltaPercentage=.005,this.useNaturalPinchZoom=!0,s.camera.autoOrientation&&(this.alpha+=Math.PI),s&&(s.camera.limits.min.beta&&(this.lowerBetaLimit=s.camera.limits.min.beta),s.camera.limits.max.beta&&(this.upperBetaLimit=s.camera.limits.max.beta),s.camera.limits.min.alpha&&(this.lowerAlphaLimit=s.camera.limits.min.alpha),s.camera.limits.max.alpha&&(this.upperAlphaLimit=s.camera.limits.max.alpha),s.camera.limits.min.radius&&(this.lowerRadiusLimit=s.camera.limits.min.radius),s.camera.limits.max.radius&&(this.upperRadiusLimit=s.camera.limits.max.radius),s.camera.autoRotation.enabled&&this.enableAutoRotationBehavior(s.camera.autoRotation.idleTimeMs))}getFramingBehavior(){return this.getBehaviorByName("Framing")}getAutoRotationBehavior(){const e=this.getBehaviorByName("AutoRotation");return e||void 0}enableFramingBehavior(){this.useFramingBehavior=!0;const e=this.getFramingBehavior();e.attach(this),e.framingTime=0,e.elevationReturnTime=-1,e.zoomStopsAnimation=!1,this.lowerRadiusLimit=null;const t=me(this._scene);return e.zoomOnBoundingInfo(t.min,t.max),this.wheelPrecision=100/this.radius,null===this.lowerRadiusLimit&&(this.lowerRadiusLimit=.1),this.lastFocus.copyFrom(this.target),e}rerunFramingBehavior(e,t){const i=this.getFramingBehavior();i.framingTime=t||800;const a=me(this._scene),n=a.max.subtract(a.min),r=a.min.add(n.scale(.5));this.setRadius(1.5*n.length()),this.wheelPrecision=100/this.radius,this.panningInertia=0,this.panningOriginTarget.copyFrom(r),this.panDenominator=n.length(),i.zoomOnBoundingInfo(a.min,a.max,void 0,(()=>{e&&e()})),i.framingTime=0}enableAutoRotationBehavior(e=5e3){this.useAutoRotationBehavior=!0;const t=this.getAutoRotationBehavior();t&&(t.idleRotationWaitTime=e)}disableAutoRotationBehavior(){this.useAutoRotationBehavior=!1}setRadius(e){this.radius=e,this.maxZ=1e3*this.radius,this.lowerRadiusLimit=.01*this.radius,this.upperRadiusLimit=1.5*this.radius,this.wheelPrecision=100/this.radius,this.pinchPrecision=300/this.radius}static create(e,t,i){const a=me(e),n=a.max.subtract(a.min),r=a.min.add(n.scale(.5)),s=new ge("ProductCamera",-Math.PI/2,Math.PI/2,1.5*n.length(),r,e,t);return s.panningInertia=0,s.panningOriginTarget.copyFrom(r),s.panDenominator=n.length(),s.onAfterCheckInputsObservable.add((()=>{s.panningSensibility=1e3/s.panDenominator})),i&&(e.activeCamera=s),s}}function me(e){if(0===e.meshes.length)return{min:new(0,o.Vector3)(-1,-1,-1),max:new(0,o.Vector3)(1,1,1)};const t=e.meshes.filter((e=>e.name.toLowerCase().endsWith("_t")||e.name.toLowerCase().includes("_t_")));return e.getWorldExtends((e=>e.isVisible&&e.isEnabled()&&(0===t.length||t.includes(e))))}function pe(e,t,i){return t in e?Object.defineProperty(e,t,{value:i,enumerable:!0,configurable:!0,writable:!0}):e[t]=i,e}class be{constructor(e,t=!1,i){pe(this,"renderingPipeline",void 0),pe(this,"currentConfiguration",void 0),this.renderingPipeline=new(0,L.DefaultRenderingPipeline)("default",t,e,i?[i]:void 0,!1),this.renderingPipeline.isSupported&&(this.renderingPipeline.prepare(),this.setConfiguration(_))}dispose(){this.renderingPipeline.dispose()}getConfiguration(){return this.currentConfiguration}setConfiguration(e){if(this.renderingPipeline.isSupported){if(this.renderingPipeline.samples=e.antiAliasing?.samples??_.antiAliasing.samples,this.renderingPipeline.fxaaEnabled=e.antiAliasing?.fxaaEnabled??_.antiAliasing.fxaaEnabled,this.renderingPipeline.bloomEnabled=e.bloom?.enabled??_.bloom.enabled,this.renderingPipeline.bloomKernel=e.bloom?.kernel??_.bloom.kernel,this.renderingPipeline.bloomScale=e.bloom?.scale??_.bloom.scale,this.renderingPipeline.bloomThreshold=e.bloom?.threshold??_.bloom.threshold,this.renderingPipeline.bloomWeight=e.bloom?.weight??_.bloom.weight,this.renderingPipeline.chromaticAberrationEnabled=e.chromaticAberration?.enabled??_.chromaticAberration.enabled,this.renderingPipeline.chromaticAberration.aberrationAmount=e.chromaticAberration?.aberrationAmount??_.chromaticAberration.aberrationAmount,this.renderingPipeline.chromaticAberration.radialIntensity=e.chromaticAberration?.radialIntensity??_.chromaticAberration.radialIntensity,this.renderingPipeline.chromaticAberration.direction=e.chromaticAberration?.direction?new(0,o.Vector2)(e.chromaticAberration.direction.x,e.chromaticAberration.direction.y):new(0,o.Vector2)(_.chromaticAberration.direction.x,_.chromaticAberration.direction.y),this.renderingPipeline.imageProcessing.colorCurvesEnabled=e.colorCurves?.enabled??_.colorCurves.enabled,this.renderingPipeline.imageProcessing.colorCurves=e.colorCurves?this.updateColorCurve(e.colorCurves):new(0,A.ColorCurves),this.renderingPipeline.depthOfFieldEnabled=e.depthOfField?.enabled??_.depthOfField.enabled,e.depthOfField)switch(e.depthOfField.blurLevel??_.depthOfField.blurLevel){case"Low":this.renderingPipeline.depthOfFieldBlurLevel=R.DepthOfFieldEffectBlurLevel.Low;break;case"Medium":this.renderingPipeline.depthOfFieldBlurLevel=R.DepthOfFieldEffectBlurLevel.Medium;break;case"High":this.renderingPipeline.depthOfFieldBlurLevel=R.DepthOfFieldEffectBlurLevel.High}if(this.renderingPipeline.depthOfField.focalLength=e.depthOfField?.focalLength??_.depthOfField.focalLength,this.renderingPipeline.depthOfField.fStop=e.depthOfField?.fStop??_.depthOfField.fStop,this.renderingPipeline.depthOfField.focusDistance=e.depthOfField?.focusDistance??_.depthOfField.focusDistance,this.renderingPipeline.depthOfField.lensSize=e.depthOfField?.lensSize??_.depthOfField.lensSize,this.renderingPipeline.grainEnabled=e.grain?.enabled??_.grain.enabled,this.renderingPipeline.grain.animated=e.grain?.animated??_.grain.animated,this.renderingPipeline.grain.intensity=e.grain?.intensity??_.grain.intensity,this.renderingPipeline.imageProcessing.contrast=e.misc?.contrast??_.misc.contrast,this.renderingPipeline.imageProcessing.exposure=e.misc?.exposure??_.misc.exposure,this.renderingPipeline.imageProcessing.toneMappingEnabled=e.misc?.toneMappingEnabled??_.misc.toneMappingEnabled,this.renderingPipeline.imageProcessing.toneMappingEnabled)switch(e.misc.toneMappingType??_.misc.toneMappingType){case"Standard":this.renderingPipeline.imageProcessing.toneMappingType=E.ImageProcessingConfiguration.TONEMAPPING_STANDARD;break;case"ACES":this.renderingPipeline.imageProcessing.toneMappingType=E.ImageProcessingConfiguration.TONEMAPPING_ACES}if(this.renderingPipeline.sharpenEnabled=e.sharpen?.enabled??_.sharpen.enabled,this.renderingPipeline.sharpen.colorAmount=e.sharpen?.colorAmount??_.sharpen.colorAmount,this.renderingPipeline.sharpen.edgeAmount=e.sharpen?.edgeAmount??_.sharpen.edgeAmount,this.renderingPipeline.imageProcessing.vignetteEnabled=e.vignette?.enabled??_.vignette.enabled,e.vignette?.center?(this.renderingPipeline.imageProcessing.vignetteCenterX=e.vignette.center.x,this.renderingPipeline.imageProcessing.vignetteCenterY=e.vignette.center.y):(this.renderingPipeline.imageProcessing.vignetteCenterX=_.vignette.center.x,this.renderingPipeline.imageProcessing.vignetteCenterY=_.vignette.center.y),e.vignette)switch(e.vignette?.blendMode??_.vignette.blendMode){case"Multiply":this.renderingPipeline.imageProcessing.vignetteBlendMode=E.ImageProcessingConfiguration.VIGNETTEMODE_MULTIPLY;break;case"Opaque":this.renderingPipeline.imageProcessing.vignetteBlendMode=E.ImageProcessingConfiguration.VIGNETTEMODE_OPAQUE}e.vignette?.colorRgba?this.renderingPipeline.imageProcessing.vignetteColor=new(0,s.Color4)(e.vignette.colorRgba.r,e.vignette.colorRgba.g,e.vignette.colorRgba.b,e.vignette.colorRgba.a):e.vignette?.colorHex?this.renderingPipeline.imageProcessing.vignetteColor=s.Color4.FromHexString(e.vignette.colorHex):this.renderingPipeline.imageProcessing.vignetteColor=new(0,s.Color4)(_.vignette.colorRgba.r,_.vignette.colorRgba.g,_.vignette.colorRgba.b,_.vignette.colorRgba.a),this.renderingPipeline.imageProcessing.vignetteStretch=e.vignette?.stretch??_.vignette.stretch,this.renderingPipeline.imageProcessing.vignetteWeight=e.vignette?.weight??_.vignette.weight,this.renderingPipeline.prepare(),this.currentConfiguration=e}}updateColorCurve(e){const t=new(0,A.ColorCurves);return t.globalDensity=e.globalDensity??t.globalDensity,t.globalExposure=e.globalExposure??t.globalExposure,t.globalHue=e.globalHue??t.globalHue,t.globalSaturation=e.globalSaturation??t.globalSaturation,t.highlightsDensity=e.highlightsDensity??t.highlightsDensity,t.highlightsExposure=e.highlightsExposure??t.highlightsExposure,t.highlightsHue=e.highlightsHue??t.highlightsHue,t.highlightsSaturation=e.highlightsSaturation??t.highlightsSaturation,t.midtonesDensity=e.midtonesDensity??t.midtonesDensity,t.midtonesExposure=e.midtonesExposure??t.midtonesExposure,t.midtonesHue=e.midtonesHue??t.midtonesHue,t.midtonesSaturation=e.midtonesSaturation??t.midtonesSaturation,t.shadowsDensity=e.shadowsDensity??t.shadowsDensity,t.shadowsExposure=e.shadowsExposure??t.shadowsExposure,t.shadowsHue=e.shadowsHue??t.shadowsHue,t.shadowsSaturation=e.shadowsSaturation??t.shadowsSaturation,t}}function fe(e,t,i){return t in e?Object.defineProperty(e,t,{value:i,enumerable:!0,configurable:!0,writable:!0}):e[t]=i,e}u.GLTF2.GLTFLoader.RegisterExtension("glbPostProcessor",(function(e){return new K(e)})),n.SceneLoader.OnPluginActivatedObservable.add((e=>{if("gltf"===e.name){e.transparencyAsCoverage=!0}}));class ve{constructor(e){fe(this,"camera",void 0),fe(this,"configuration",void 0),fe(this,"engine",void 0),fe(this,"scene",void 0),fe(this,"loadProgress",new Map([["initialScene",0]])),fe(this,"queuedCameraAnimation",void 0),fe(this,"focusLostNotified",!1),fe(this,"loadObservable",new(0,h.Observable)),fe(this,"focusLostObservable",new(0,h.Observable)),fe(this,"initializedCallbacks",[]),fe(this,"isInitialized",!1),fe(this,"modelLoadEventCallbacks",[]),fe(this,"highlightLayer",void 0),fe(this,"renderingPipeline",void 0),fe(this,"modelContainers",new Map),fe(this,"plugins",[]),fe(this,"screenshotPrepareResolve",void 0);const a=e?.noRender?void 0:document.createElement("canvas");this.configuration=new z(e);l.DracoCompression.Configuration={decoder:{wasmUrl:"https://www.gstatic.com/draco/versioned/decoders/1.5.6/draco_wasm_wrapper_gltf.js",wasmBinaryUrl:"https://www.gstatic.com/draco/versioned/decoders/1.5.6/draco_decoder_gltf.wasm",fallbackUrl:"https://www.gstatic.com/draco/versioned/decoders/1.5.6/draco_decoder_gltf.js"}},a&&(a.getContext("webgl2")||a.getContext("webgl"));const n=console.log;console.log=()=>{};const r=a?new(0,t.Engine)(a,!0,{adaptToDeviceRatio:!0,limitDeviceRatio:2,premultipliedAlpha:!1,preserveDrawingBuffer:!!e?.backgroundImage,audioEngine:!1,stencil:this.configuration.highlights.enabled,forceSRGBBufferSupportState:!0}):new(0,i.NullEngine);console.log=n,r.hideLoadingUI(),window.addEventListener("resize",this.fireResizeEvent.bind(this)),this.engine=r,this.scene=new(0,d.Scene)(r),this.camera=ge.create(this.scene,this.configuration),this.renderingPipeline=new be(this.scene,!1,this.camera),this.scene.imageProcessingConfiguration.exposure=this.configuration.lighting.exposure,this.scene.imageProcessingConfiguration.contrast=this.configuration.lighting.contrast}getEngineContext(){return{engine:this.engine,scene:this.scene,camera:this.camera}}registerFocusLostListener(e){this.focusLostObservable.add(e)}unregisterFocusLostListener(e){this.focusLostObservable.removeCallback(e)}registerLoadProgressListener(e){this.loadObservable.add(e),e(this.getLoadListenerEvent())}unregisterLoadProgressListener(e){this.loadObservable.removeCallback(e)}registerInitializedListener(e){this.isInitialized||!this.isInitialized&&this.initializedCallbacks.push(e)}unregisterInitializedListener(e){if(this.isInitialized)return;const t=this.initializedCallbacks.indexOf(e);t>-1&&this.initializedCallbacks.splice(t,1)}getIsInitialized(){return this.isInitialized}registerModelLoadEventListener(e){this.modelLoadEventCallbacks.push(e)}unregisterModelLoadEventListener(e){const t=this.modelLoadEventCallbacks.indexOf(e);t>-1&&this.modelLoadEventCallbacks.splice(t,1)}registerView(e){const t=e.height,i=e.width;this.engine.registerView(e),e.setAttribute("height",t.toString()),e.setAttribute("width",i.toString()),this.orbitEnabled()||this.setCameraState(F.Pan),this.reattachControls(e)}getNumViewports(){return this.engine.views?.length||0}unregisterView(e){this.engine.unRegisterView(e)}shutdown(){this.plugins.forEach((e=>e.dispose(!0))),this.renderingPipeline.dispose(),this.engine&&this.engine.dispose(),window.removeEventListener("resize",this.fireResizeEvent)}getSceneInitializationProgress(){return this.loadProgress.get("initialScene")}async initialize(e){let t;if(this.scene.clearColor=this.configuration.scene.clearColor,this.scene.environmentTexture=r.CubeTexture.CreateFromPrefilteredData(this.configuration.scene.environmentFile,this.scene),e){const i=100;t=await this.loadModel(e,(e=>{this.loadProgress.set("initialScene",e.loaded*i/e.total),this.notifyLoadHandlers()})).getInitializationPromise()}return this.loadProgress.set("initialScene",100),this.notifyLoadHandlers(),this.scene.activeCamera=this.camera,this.camera.rerunFramingBehavior(void 0,1),J(this.scene.animationGroups),this.engine.views?.length>=1&&this.reattachControls(this.engine.views[this.engine.views.length-1].target),this.queuedCameraAnimation&&(this.executeCameraAnimation(this.queuedCameraAnimation),this.queuedCameraAnimation=void 0),this.isInitialized=!0,await Promise.all(this.initializedCallbacks.map((e=>e()))),this.initializedCallbacks=[],this.configuration.options?.renderingPipelineConfiguration&&this.renderingPipeline.setConfiguration(this.configuration.options.renderingPipelineConfiguration),this.engine.runRenderLoop((()=>{this.engine.views&&(this.modelContainers.forEach((e=>{e.updateDynamicTextures()})),this.configuration.scene.transparentBackground&&this.engine.views.forEach((e=>{const t=this.engine.getRenderingCanvas();e.target.getContext("2d").clearRect(0,0,t.width,t.height)})),this.scene.render(),this.camera.target.equalsWithEpsilon(this.camera.lastFocus,.1)||this.focusLostNotified||(this.focusLostObservable.notifyObservers(void 0),this.focusLostNotified=!0),this.screenshotPrepareResolve&&(this.screenshotPrepareResolve(),this.screenshotPrepareResolve=void 0))})),t}executeCameraAnimation(e){100===this.getSceneInitializationProgress()&&this.camera&&this.scene.activeCamera===this.camera?ee(this.scene,this.scene.activeCamera,e):this.queuedCameraAnimation=e}getCameraPose(){if(this.scene&&this.camera)return{lonDeg:Math.round(180*this.camera.alpha/Math.PI),latDeg:Math.round(180*this.camera.beta/Math.PI),radius:Math.round(1e4*(this.camera.radius+Number.EPSILON))/1e4,target:{x:this.camera.target.x,y:this.camera.target.y,z:this.camera.target.z}}}setCameraPose(e){this.scene&&this.camera&&(this.camera.target=new(0,o.Vector3)(e.target.x,e.target.y,e.target.z),this.camera.radius=e.radius,this.camera.alpha=e.latDeg,this.camera.beta=e.lonDeg)}setCameraState(e){if(!this.engine?.views||!this.engine?.views[0])throw new Error("No views attached, camera state requires a view to attach controls onto.");e===F.Orbit?this.reattachControls(this.engine.views[0].target,2):this.reattachControls(this.engine.views[0].target,0)}animateToLastCameraFocus(){return new Promise((e=>{const t=this.configuration;this.camera.rerunFramingBehavior((()=>{this.focusLostNotified=!1,t.camera.limits.min.radius&&(this.camera.lowerRadiusLimit=t.camera.limits.min.radius),t.camera.limits.max.radius&&(this.camera.upperRadiusLimit=t.camera.limits.max.radius),e()}))}))}setAutoRotation(e){this.configuration.camera.autoRotation.enabled&&this.camera&&(e?this.camera.enableAutoRotationBehavior(this.configuration.camera.autoRotation.idleTimeMs):this.camera.disableAutoRotationBehavior())}getCurrentConfiguration(){return this.configuration.options}async renderSceneScreenshot(t,i){if(!this.camera)throw new Error("Missing product camera, cannot render screenshot!");const a=new(0,e.ArcRotateCamera)("screenshotCamera",0,0,0,o.Vector3.Zero(),this.scene);try{const e=i.latDeg*Math.PI/180,n=i.lonDeg*Math.PI/180;a.target=i.target?new(0,o.Vector3)(i.target.x,i.target.y,i.target.z):o.Vector3.Zero(),a.alpha=n,a.beta=e,a.radius=i.radius||this.camera.radius,a.minZ=.01,this.scene.render();const r=await c.Tools.CreateScreenshotUsingRenderTargetAsync(this.engine,a,t,"image/png",2,!0);return a.dispose(),r}catch(e){throw a.isDisposed()||a.dispose(),new Error("Failed to render screenshot")}}orbitEnabled(){const e=this.configuration;if(!e)return!0;const t=e.camera.limits.min.alpha,i=e.camera.limits.max.alpha,a=e.camera.limits.min.beta,n=e.camera.limits.max.beta;if(void 0===t||void 0===i||void 0===a||void 0===n)return!0;const r=[a,n],s=[t,i].every((e=>e===t)),o=r.every((e=>e===a));return!s&&!o}fireResizeEvent(){this.getNumViewports()>0&&this.engine.resize()}setHighlights(e,t){0===e.length&&(this.highlightLayer?.dispose(),this.highlightLayer=void 0),this.highlightLayer||(this.highlightLayer=new(0,a.HighlightLayer)("highlights",this.scene,{isStroke:!0,blurVerticalSize:.85,blurHorizontalSize:.85}),this.highlightLayer.innerGlow=!0,this.highlightLayer.outerGlow=!1),this.highlightLayer.removeAllMeshes();const i=t?new(0,s.Color3)(t[0],t[1],t[2]).toLinearSpace():void 0;e.forEach((e=>{const t=this.scene.materials.find((t=>t.name===e.name&&t.id===e.id));t&&t.getBindedMeshes().forEach((e=>this.highlightLayer?.addMesh(e,i||s.Color3.FromHexString("#fcba03"))))}))}setRenderingPipelineConfiguration(e){this.renderingPipeline&&this.renderingPipeline.setConfiguration(e)}loadModel(e,t){const i=new de({enablePicking:this.configuration.highlights.enabled,modelDetails:e,scene:this.scene,previewService:this,progressHandler:t});return i.registerMaterialVariantListener((e=>this.handleMaterialProgressCallback(e.remainingCount,e.totalCount,e.taskName))),i.registerModelVariantListener((e=>this.handleModelProgressCallback(e,e.key))),this.configuration.highlights.enabled&&(i.registerMaterialSelectedCallback((e=>{this.setHighlights([e])})),i.registerMaterialDeselectedCallback((()=>{this.setHighlights([])}))),this.modelContainers.set(i.getId(),i),this.triggerModelLoadEvent({eventType:"load",modelContainer:i}),i}getAllModels(){return Array.from(this.modelContainers.values())}getModelById(e){return this.modelContainers.get(e)}registerPlugin(e){this.plugins.push(e),e.initialize(this,{camera:this.camera,engine:this.engine,scene:this.scene})}unregisterPlugin(e){const t=this.plugins.indexOf(e);if(t>-1){this.plugins.splice(t,1).forEach((e=>e.dispose(!1)))}}getConfiguration(){return this.configuration}modelUnloaded(e){this.modelContainers.delete(e.getId()),this.triggerModelLoadEvent({eventType:"unload",modelContainer:e})}triggerModelLoadEvent(e){this.modelLoadEventCallbacks.forEach((t=>t(e)))}handleMaterialProgressCallback(e,t,i){this.loadProgress.set(`key_${i}`,e/t*100),this.notifyLoadHandlers()}handleModelProgressCallback(e,t){this.loadProgress.set(t,100*e.loaded/e.total),this.notifyLoadHandlers()}reattachControls(e,t=2){if(this.scene.detachControl(),this.engine.inputElement=e,this.camera){this.camera.attachControl(!0,!1,t);this.camera.inputs.attached.pointers.multiTouchPanning=!1}this.scene.attachControl(!0,!0,!0)}getLoadListenerEvent(){const e=Array.from(this.loadProgress.values()).filter((e=>e<100)),t=e.reduce(((e,t)=>e+t),0)/e.length||0;return{loadValue:0===e.length?100:t,sceneInitialized:100===this.getSceneInitializationProgress()}}notifyLoadHandlers(){this.loadObservable.notifyObservers(this.getLoadListenerEvent())}}T(module.exports,S),T(module.exports,q),T(module.exports,N);
|
|
2
2
|
//# sourceMappingURL=main.js.map
|
package/dist/module.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{ArcRotateCamera as e}from"@babylonjs/core/Cameras/arcRotateCamera";import{Engine as t}from"@babylonjs/core/Engines/engine";import{NullEngine as i}from"@babylonjs/core/Engines/nullEngine";import{HighlightLayer as a}from"@babylonjs/core/Layers/highlightLayer";import{SceneLoader as n}from"@babylonjs/core/Loading/sceneLoader";import{CubeTexture as s}from"@babylonjs/core/Materials/Textures/cubeTexture";import{Color3 as r,Color4 as o}from"@babylonjs/core/Maths/math.color";import{Vector3 as l,Vector2 as h}from"@babylonjs/core/Maths/math.vector";import{DracoCompression as c}from"@babylonjs/core/Meshes/Compression/dracoCompression";import{Observable as d}from"@babylonjs/core/Misc/observable";import{Tools as m}from"@babylonjs/core/Misc/tools";import{Scene as g}from"@babylonjs/core/scene";import{GLTF2 as u}from"@babylonjs/loaders/glTF";import"@babylonjs/core/Engines/Extensions/engine.views";import"@babylonjs/core/Meshes/instancedMesh";import"@babylonjs/core/Materials/Textures/Loaders/ddsTextureLoader";import"@babylonjs/core/Materials/Textures/Loaders/envTextureLoader";import"@babylonjs/core/Materials/Textures/Loaders/ktxTextureLoader";import"@babylonjs/core/Animations/animatable";import"@babylonjs/core/Misc/screenshotTools";import"@babylonjs/core/Rendering/boundingBoxRenderer";import"@babylonjs/loaders/glTF/2.0/Extensions";import{PBRMaterial as p}from"@babylonjs/core/Materials/PBR/pbrMaterial";import{MirrorTexture as b}from"@babylonjs/core/Materials/Textures/mirrorTexture";import{Color3 as f,Vector3 as v,Plane as y}from"@babylonjs/core/Maths/math";import{ReflectionProbe as M}from"@babylonjs/core/Probes/reflectionProbe";import{ActionManager as P}from"@babylonjs/core/Actions/actionManager";import{ExecuteCodeAction as w}from"@babylonjs/core/Actions/directActions";import{GlowLayer as C}from"@babylonjs/core/Layers/glowLayer";import{TransformNode as x}from"@babylonjs/core/Meshes/transformNode";import{DynamicTexture as O}from"@babylonjs/core/Materials/Textures/dynamicTexture";import{Texture as E}from"@babylonjs/core/Materials/Textures/texture";import{Animation as A}from"@babylonjs/core/Animations/animation";import{QuadraticEase as R,EasingFunction as L}from"@babylonjs/core/Animations/easing";import{AssetsManager as T}from"@babylonjs/core/Misc/assetsManager";import{ColorCurves as I}from"@babylonjs/core/Materials/colorCurves";import{ImageProcessingConfiguration as S}from"@babylonjs/core/Materials/imageProcessingConfiguration";import{DefaultRenderingPipeline as F}from"@babylonjs/core/PostProcesses/RenderPipeline";import{DepthOfFieldEffectBlurLevel as k}from"@babylonjs/core/PostProcesses/depthOfFieldEffect";import"@babylonjs/core/Rendering/depthRendererSceneComponent";function D(e,t,i,a){Object.defineProperty(e,t,{get:i,set:a,enumerable:!0,configurable:!0})}var B={};let z;var N;let j;var V;D(B,"ProductCameraRig",(()=>z)),D(B,"MaterialEffectMode",(()=>j)),(N=z||(z={}))[N.Orbit=0]="Orbit",N[N.Pan=1]="Pan",(V=j||(j={})).None="None",V.RemoveWhenSelected="RemoveWhenSelected",V.ApplyWhenSelected="ApplyWhenSelected";function H(e,t,i){return t in e?Object.defineProperty(e,t,{value:i,enumerable:!0,configurable:!0,writable:!0}):e[t]=i,e}D({},"SpiffCommerce3DPreviewService",(()=>Pe));class _{constructor(e){H(this,"customOptions",void 0),H(this,"getSceneClearColor",(()=>{const e=this.customOptions?.transparentBackground||this.customOptions?.backgroundImage?0:1;if(this.customOptions&&this.customOptions?.transparentBackground||this.customOptions?.backgroundImage)return new o(0,0,0,e).toLinearSpace();if(this.customOptions&&this.customOptions.backgroundColor){const t=r.FromHexString(this.customOptions.backgroundColor);return new o(t.r,t.g,t.b,e).toLinearSpace()}return new o(.98,.98,.98,e).toLinearSpace()})),H(this,"highlightColorFromConfig",(()=>this.customOptions&&this.customOptions.highlightColor?this.hexToColor4(this.customOptions.highlightColor):new o(.98,.98,.98,1).toLinearSpace())),H(this,"hexToColor4",((e,t=1)=>{const i=r.FromHexString(e);return new o(i.r,i.g,i.b,t).toLinearSpace()})),this.customOptions=e}get options(){return this.customOptions}get scene(){return{clearColor:this.getSceneClearColor(),transparentBackground:this.customOptions?.transparentBackground||this.customOptions?.backgroundImage,environmentFile:this.customOptions?.environmentFile??"assets/model-viewer/default.env"}}get camera(){return{autoOrientation:this.customOptions?.disableAutomaticOrientation??!0,autoRotation:{enabled:this.customOptions?.autoRotation??!1,idleTimeMs:this.customOptions?.idleTimeBeforeRotation??5e3},limits:{min:{alpha:this.customOptions?.lowerAlphaLimitDeg?this.customOptions?.lowerAlphaLimitDeg*Math.PI/180:void 0,beta:this.customOptions?.lowerBetaLimitDeg?this.customOptions?.lowerBetaLimitDeg*Math.PI/180:void 0,radius:this.customOptions?.minZoomOverride},max:{alpha:this.customOptions?.upperAlphaLimitDeg?this.customOptions?.upperAlphaLimitDeg*Math.PI/180:void 0,beta:this.customOptions?.upperBetaLimitDeg?this.customOptions?.upperBetaLimitDeg*Math.PI/180:void 0,radius:this.customOptions?.maxZoomOverride}}}}get highlights(){return{enabled:this.customOptions?.highlightOnMaterialHover??!1,color:this.highlightColorFromConfig()}}get lighting(){return{exposure:this.customOptions?.lighting?.exposure??.9,contrast:this.customOptions?.lighting?.contrast??1.6}}}var q={};D(q,"RenderingConfiguration",(()=>G)),D(q,"REFLECTION_PROBE_RESOLUTION",(()=>U)),D(q,"renderingPipelineDefaults",(()=>K));class G{static getDynamicTextureResolution(){return this.getIsMobile()||!G.offscreenRenderingSupported()?{width:1024,height:1024}:{width:2048,height:2048}}static shouldMipMap(){return!0}static offscreenRenderingSupported(){return!navigator.userAgent.includes("SamsungBrowser")&&(!!window.Worker&&!!window.OffscreenCanvas)}static getMirrorTextureResolution(){return this.getIsMobile()?512:1024}static getIsMobile(){try{return!("undefined"==typeof window||!window.navigator)&&(/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(window.navigator.userAgent)||window.innerWidth<=480)}catch(e){return!1}}}const U=128,K={antiAliasing:{samples:4,fxaaEnabled:!1},bloom:{enabled:!1,kernel:64,scale:.5,threshold:.9,weight:.15},chromaticAberration:{enabled:!1,aberrationAmount:30,direction:{x:0,y:0},radialIntensity:0},colorCurves:{enabled:!1},depthOfField:{enabled:!1,blurLevel:"Low",focalLength:50,focusDistance:2e3,fStop:1.4,lensSize:50},grain:{enabled:!1,animated:!1,intensity:30},misc:{contrast:1,exposure:1,toneMappingEnabled:!1,toneMappingType:"Standard"},sharpen:{enabled:!1,colorAmount:1,edgeAmount:.3},vignette:{enabled:!1,blendMode:"Multiply",cameraFov:.5,center:{x:0,y:0},colorHex:"#000000ff",colorRgba:{r:0,g:0,b:0,a:1},stretch:0,weight:1}};function W(e,t,i){return t in e?Object.defineProperty(e,t,{value:i,enumerable:!0,configurable:!0,writable:!0}):e[t]=i,e}class Z{constructor(e){W(this,"name",void 0),W(this,"enabled",void 0),W(this,"loader",void 0),this.name="glbPostProcessor",this.enabled=!0,this.loader=e}onReady(){this.applyReflections(this.loader.babylonScene)}loadNodeAsync(e,t,i){return this.loader.loadNodeAsync(e,t,(function(e){t.extras&&Object.keys(t.extras).forEach((i=>{const a=t.extras[i];e.metadata[i]=a})),i(e)}))}async loadMaterialPropertiesAsync(e,t,i){await this.loader.loadMaterialPropertiesAsync(e,t,i),this.enableMaterialExtrasIfRequired(t,i),i.needDepthPrePass=!0}dispose(){}enableMaterialExtrasIfRequired(e,t){if(e.extras&&t instanceof p){if(e.extras.sheen){const i=t;i.sheen.isEnabled=!0,i.sheen.intensity=e.extras.sheen}if(e.extras.translucency){const i=t;i.subSurface.isTranslucencyEnabled=!0,i.subSurface.translucencyIntensity=e.extras.translucency,e.extras.translucencyR&&e.extras.translucencyG&&e.extras.translucencyB&&(i.subSurface.tintColor=new f(e.extras.translucencyR,e.extras.translucencyG,e.extras.translucencyB))}if(e.extras.refractionIOR){const i=t;i.subSurface.isRefractionEnabled=!0,i.subSurface.volumeIndexOfRefraction=e.extras.refractionIOR}if(e.extras.useDepthPrePass){const e=t;e.needDepthPrePass=!0,e.forceIrradianceInFragment=!0}if(e.extras.useParallax){const i=t;i.useParallax=!0,i.useParallaxOcclusion=!0,i.parallaxScaleBias=e.extras.useParallax}}}applyReflections(e){function t(e){const t=[];return e.transformNodes.forEach((e=>{e.metadata&&e.metadata.reflective&&t.push(...e.getChildMeshes())})),e.meshes.forEach((e=>{e.metadata&&e.metadata.reflective&&!t.includes(e)&&t.push(e)})),t}e.meshes.forEach((i=>{const a=i.metadata;a&&(a.mirrorTexture&&function(i,a=1){const n=i.material;if(!n)return;const s=new b("mirror",G.getMirrorTextureResolution(),e,!0);s.renderList=t(e);const r=i.getVerticesData("normal");if(!r)throw new Error("Mirror attribute specified on: "+i.name+"But no normals exist to generate a mirror from!");i.computeWorldMatrix(!0);const o=i.getWorldMatrix(),l=v.TransformNormal(new v(r[0],r[1],r[2]),o).normalize(),h=y.FromPositionAndNormal(i.position,l.scale(-1));s.mirrorPlane=h,s.level=a,n.reflectionTexture=s}(i,a.mirrorTexture),a.reflectionProbe&&function(i){const a=i.material,n=new M("probe-"+a.name,U,e);n.attachToMesh(i),n.renderList&&n.renderList.push(...t(e)),a.reflectionTexture=n.cubeTexture}(i))}))}}const Q=new Map;async function Y(e,t,i){return new Promise(((a,s)=>{const r=Q.get(e);if(r&&r.scene.uid===t.uid)return a(r);n.LoadAssetContainerAsync(e,void 0,t,i).then((t=>{Q.set(e,t),a(t)})).catch(s)}))}function $(e,i,a,n,s=""){a.forEach((a=>{const r=a.getID(),o=a.getName(),l=G.getDynamicTextureResolution();e.filter((e=>e.name===s+o)).forEach((e=>{const s=n.get(r);if(s)X(e,s),s.update(false);else{const s=function(e,i,a,n){const s=new O(e,{width:a,height:n},i,G.shouldMipMap(),E.TRILINEAR_SAMPLINGMODE,t.TEXTUREFORMAT_RGBA),r=s.getContext();r&&(r.fillStyle="#f5f5f5",r.fillRect(0,0,a,n),s.update());return s}(o,i,l.width,l.height);n.set(r,s),a.setStaticContext(s.getContext()),X(e,s),s.onLoadObservable.addOnce((()=>{s.update(false)}))}}))}))}function X(e,t){if(e instanceof p){const i=e,a=i.albedoTexture;a?(t.wrapU=a.wrapU,t.wrapV=a.wrapV):(t.wrapU=1,t.wrapV=1),i.albedoTexture=t}else{const i=e,a=i.diffuseTexture;a&&(t.wrapU=a.wrapU,t.wrapV=a.wrapV),i.diffuseTexture=t}}function J(){const e=()=>Math.floor(65536*(1+Math.random())).toString(16).substring(1);return e()+e()+"-"+e()+"-"+e()+"-"+e()+"-"+e()+e()+e()}function ee(e){return e.targetedAnimations.map((e=>e.animation.framePerSecond)).reduce(((e,t)=>e+t),0)/e.targetedAnimations.length||0}function te(e,t,i,a,n){const s=n?e.filter((e=>e.name===n)):e;0!==s.length?void 0===a||void 0===i||a!==i?s.forEach((e=>{e.stop();const n=ee(e),s=void 0!==a?a*n:void 0,r=void 0!==i?i*n:void 0;e.start(t,1,s,r)})):s.forEach((e=>{e.stop();const i=ee(e),n=a*i;e.start(t,1,n,n)})):console.warn(`No animations found for name: ${n}`)}function ie(e){e.forEach((e=>{e.stop()}))}function ae(e,t,i){var a,n,s;e.stopAnimation(t),t.animations=[],Math.abs(t.alpha)>2*Math.PI&&(t.alpha=(a=t.alpha,n=0,s=2*Math.PI,a<n?s-(n-a)%(s-n):n+(a-n)%(s-n)));const r=[],o=i.target,h=o?1:0;if(i.target&&Object.keys(i.target).length>0&&r.push(se("cameraTargetLerp","target",(new l).copyFrom(t.target),new l(i.target.x,i.target.y,i.target.z),A.ANIMATIONTYPE_VECTOR3,0)),r.push(se("cameraAlphaLerp","alpha",t.alpha,ne(i.lonDeg),A.ANIMATIONTYPE_FLOAT,h)),r.push(se("cameraBetaLerp","beta",t.beta,ne(i.latDeg),A.ANIMATIONTYPE_FLOAT,h)),void 0!==i.radius){const e=Math.max(.01,i.radius);r.push(se("cameraRadiusLerp","radius",t.radius,e,A.ANIMATIONTYPE_FLOAT,h))}t.animations.push(...r);const c=t.useAutoRotationBehavior;t.disableAutoRotationBehavior(),e.beginAnimation(t,0,o?120:60,!1,1,(()=>{t.animations=[],c&&t.enableAutoRotationBehavior()}))}function ne(e){return e*Math.PI/180}function se(e,t,i,a,n,s=0,r=A.ANIMATIONLOOPMODE_CONSTANT){const o=new R;o.setEasingMode(L.EASINGMODE_EASEINOUT);const l=new A(e,t,60,n,r),h=[];return s>0&&h.push({frame:0,value:i}),h.push({frame:60*s,value:i}),h.push({frame:60*(s+1),value:a}),l.setKeys(h),l.setEasingFunction(o),l}const re={albedoTexture:"albedoMap",bumpTexture:"normalMap",ambientTexture:"ambientMap",emissiveTexture:"emissionMap",opacityTexture:"alphaMap",metallicTexture:"metallicMap",refractionTexture:"refractionMap"};function oe(e,t,i,a){["albedoTexture","bumpTexture","ambientTexture","emissiveTexture","opacityTexture","metallicTexture","refractionTexture"].forEach((n=>{!function(e,t,i,a,n){const s=re[e];if(!s)throw new Error("Unexpected texture name encountered.");const r=t[s]?.fileLink;r?a.addTextureTask(e,r,!1,!1):n&&i[e]&&(i[e]&&i[e].dispose(),i[e]=null,function(e,t){"opacityTexture"===e&&(t.useAlphaFromAlbedoTexture=!0);"metallicTexture"===e&&(t.useRoughnessFromMetallicTextureAlpha=!1,t.useRoughnessFromMetallicTextureGreen=!1,t.useMetallnessFromMetallicTextureBlue=!1);"refractionTexture"===e&&(t.subSurface.isRefractionEnabled=!1,t.subSurface.refractionIntensity=1)}(e,i))}(n,e,t,i,a)})),function(e,t){if(!e.clearCoat)return;e.clearCoat===j.RemoveWhenSelected?(t.clearCoat.isEnabled=!1,t.clearCoat.indexOfRefraction=1.5):e.clearCoat===j.ApplyWhenSelected&&(t.clearCoat.isEnabled=!0,t.clearCoat.indexOfRefraction=e.clearCoatIOR||t.clearCoat.indexOfRefraction)}(e,t)}function le(e,t,i,a){"opacityTexture"===e&&(t.useAlphaFromAlbedoTexture=!1),"metallicTexture"===e&&(t.useRoughnessFromMetallicTextureAlpha=!1,t.useRoughnessFromMetallicTextureGreen=!0,t.useMetallnessFromMetallicTextureBlue=!0),"refractionTexture"===e&&(t.subSurface.isRefractionEnabled=!0,t.subSurface.refractionIntensity=i.refractionIntensity||1),t[e]=a}function he(e,t,i){return t in e?Object.defineProperty(e,t,{value:i,enumerable:!0,configurable:!0,writable:!0}):e[t]=i,e}class ce{constructor(e,t,i){he(this,"materialVariantMap",new Map),he(this,"keysThatRemovedBaseModel",[]),he(this,"loadedContainerForKey",new Map),he(this,"loadedMaterialsForKey",new Map),he(this,"scene",void 0),he(this,"renameClonedAsset",void 0),he(this,"setBaseModelEnabled",void 0),this.scene=e,this.renameClonedAsset=t,this.setBaseModelEnabled=i}async applyMaterial(e,t,i,a){return new Promise((n=>{const s=this.materialVariantMap.get(e);this.materialVariantMap.set(e,{...s,...t});const r=this.renameClonedAsset(e),o=this.scene.materials.filter((e=>e.name===r));if(0===o.length)return void n();const l=new T(this.scene);l.useDefaultLoadingScreen=!1,o.forEach((e=>oe(t,e,l,a))),l.onProgress=(e,t,a)=>{i&&i(e/t*100,100,a.name)},l.onFinish=e=>{e.forEach((e=>{const a=e;i&&i(100,100,e.name),o.forEach((i=>le(e.name,i,t,a.texture)))})),n()},l.loadAsync()}))}async applyModel(e,t,i,a){if(i&&t&&!this.keysThatRemovedBaseModel.includes(e)&&this.keysThatRemovedBaseModel.push(e),!i)return this.keysThatRemovedBaseModel.includes(e)&&this.setBaseModelEnabled(!0),this.loadedContainerForKey.get(e)?.dispose(),this.loadedContainerForKey.delete(e),this.loadedMaterialsForKey.delete(e),Promise.resolve(void 0);this.loadedContainerForKey.has(e)&&(this.loadedContainerForKey.get(e)?.dispose(),this.loadedContainerForKey.delete(e),this.loadedMaterialsForKey.delete(e)),t&&this.setBaseModelEnabled(!1);const n=(await Y(i,this.scene,a)).instantiateModelsToScene(this.renameClonedAsset,!0);this.loadedContainerForKey.set(e,n),this.loadedMaterialsForKey.set(e,de(n));const s=[];return this.materialVariantMap.forEach((async(e,t)=>{s.push(this.applyMaterial(t,e))})),await Promise.all(s),n}dispose(){this.loadedContainerForKey.forEach((e=>e?.dispose())),this.loadedContainerForKey.clear(),this.loadedMaterialsForKey.forEach((e=>e.forEach((e=>e?.dispose())))),this.loadedMaterialsForKey.clear(),this.materialVariantMap.clear(),this.keysThatRemovedBaseModel=[]}getAllMaterials(){const e=[];return this.loadedMaterialsForKey.forEach((t=>{t.forEach((t=>{e.includes(t)||e.push(t)}))})),e}getAnimationGroups(){const e=[];return this.loadedContainerForKey.forEach((t=>{e.push(...t.animationGroups)})),e}}function de(e){const t=[];return e.rootNodes.forEach((e=>{e.getChildMeshes().forEach((e=>{e.material&&!t.includes(e.material)&&t.push(e.material),e.subMeshes&&e.subMeshes.forEach((e=>{const i=e.getMaterial(!1);i&&!t.includes(i)&&t.push(i)}))}))})),t}function me(e,t,i){return t in e?Object.defineProperty(e,t,{value:i,enumerable:!0,configurable:!0,writable:!0}):e[t]=i,e}function ge(e,t=""){return e.map((e=>({name:e.name.substring(t.length),loop:e.loopAnimation,to:e.to,from:e.from})))}class ue{constructor(e){me(this,"metadata",new Map),me(this,"id",void 0),me(this,"previewService",void 0),me(this,"scene",void 0),me(this,"variantManager",void 0),me(this,"materialSelectedObservable",new d),me(this,"materialDeselectedObservable",new d),me(this,"materialVariantObservable",new d),me(this,"modelVariantObservable",new d),me(this,"queuedModelAnimation",void 0),me(this,"materialReadyToLoadCallbacks",new Map),me(this,"modelReadyToLoadCallbacks",new Map),me(this,"dynamicTextures",new Map),me(this,"queuedMaterialChanges",new Map),me(this,"materialChangesInProgress",[]),me(this,"queuedModelChanges",new Map),me(this,"modelChangesInProgress",[]),me(this,"animations",[]),me(this,"assetContainer",void 0),me(this,"canvasPanels",void 0),me(this,"contextService",void 0),me(this,"enablePicking",void 0),me(this,"importPromise",void 0),me(this,"initialized",!1),me(this,"materials",[]),me(this,"modelInstance",void 0),me(this,"transformRoot",void 0);const{enablePicking:t,modelDetails:i,previewService:a,progressHandler:n,scene:s}=e;this.enablePicking=t,this.contextService=i.contextService,this.id=J(),this.previewService=a,this.scene=s,this.variantManager=new ce(s,this.renameClonedAsset.bind(this),this.setEnabled.bind(this)),this.previewService.registerInitializedListener((async()=>await this.processQueuedEvents())),this.transformRoot=new x("root",this.scene);this.importPromise=(async()=>(this.assetContainer=await Y(i.model,s,n),this.initialized=!0,this.instantiate(),this))()}async applyMaterialVariant(e,t,i,a){if(100!==this.previewService.getSceneInitializationProgress()||!this.initialized){if(this.materialReadyToLoadCallbacks.has(e)){this.materialReadyToLoadCallbacks.get(e)?.set(t,this.applyMaterialVariant.bind(this,e,t,i,a))}else{this.materialReadyToLoadCallbacks.set(e,new Map);this.materialReadyToLoadCallbacks.get(e)?.set(t,this.applyMaterialVariant.bind(this,e,t,i,a))}return}const n=async()=>{await this.variantManager.applyMaterial(e,i,((e,t,i)=>{this.materialVariantObservable.notifyObservers({remainingCount:e,totalCount:t,taskName:i})}),a)};if(this.materialChangesInProgress.includes(e))if(this.queuedMaterialChanges.has(e)){this.queuedMaterialChanges.get(e)?.set(t,n)}else{this.queuedMaterialChanges.set(e,new Map);this.queuedMaterialChanges.get(e)?.set(t,n)}else{if(this.materialChangesInProgress.push(e),await n(),this.queuedMaterialChanges.has(e)){this.queuedMaterialChanges.get(e).forEach((async e=>{await e()})),this.queuedMaterialChanges.delete(e)}this.materialChangesInProgress.splice(this.materialChangesInProgress.indexOf(e),1)}}async applyModelVariant(e,t,i){if(!this.previewService.getIsInitialized()||!this.initialized)return void this.modelReadyToLoadCallbacks.set(e,this.applyModelVariant.bind(this,e,t,i));const a=()=>this.variantManager.applyModel(e,i,t?.model,(t=>{this.modelVariantObservable.notifyObservers({...t,key:e})}));if(this.modelChangesInProgress.includes(e))return void this.queuedModelChanges.set(e,a);const n=await(async()=>{this.modelChangesInProgress.push(e);let t=await a();if(this.queuedModelChanges.has(e)){const i=this.queuedModelChanges.get(e);t=await i(),this.queuedModelChanges.delete(e)}return this.modelChangesInProgress.splice(this.modelChangesInProgress.indexOf(e),1),t})();this.modelInstance&&ie(this.modelInstance.animationGroups),this.contextService||(this.contextService=t?.contextService),n&&this.configureModelInstance(n)}dispose(){this.destroyInstance(),this.variantManager.dispose(),this.dynamicTextures.forEach((e=>e?.dispose())),this.dynamicTextures.clear(),this.materials.forEach((e=>e&&e?.dispose())),this.materials=[],this.transformRoot?.dispose(),this.transformRoot=void 0,this.previewService.modelUnloaded(this)}executeAnimation(e){this.previewService.getIsInitialized()?this.modelInstance&&te([...this.modelInstance.animationGroups,...this.variantManager.getAnimationGroups()],e.loop,e.to,e.from,e.name?this.renameClonedAsset(e.name):void 0):this.queuedModelAnimation=e}getAnimations(e){return[...this.animations,...e?ge(this.variantManager.getAnimationGroups(),this.renameClonedAsset("")):[]]}getId(){return this.id}listMaterials(){const e=this.scene?.materials.filter((e=>e.name.startsWith(this.id)));return e?e.map((e=>({id:e.id,name:this.stripIdFromName(e.name)}))):[]}registerMaterialSelectedCallback(e){this.materialSelectedObservable.add(e)}unregisterMaterialSelectedCallback(e){this.materialSelectedObservable.removeCallback(e)}registerMaterialDeselectedCallback(e){this.materialDeselectedObservable.add(e)}unregisterMaterialDeselectedCallback(e){this.materialDeselectedObservable.removeCallback(e)}get position(){return this.transformRoot.position}set position(e){this.transformRoot.position=new l(e.x,e.y,e.z)}get rotation(){return this.transformRoot.rotation}set rotation(e){this.transformRoot.rotation=new l(e.x,e.y,e.z)}get scale(){return this.transformRoot.scaling}set scale(e){this.transformRoot.scaling=new l(e.x,e.y,e.z)}attachPickingHandler(e){e.rootNodes.forEach((e=>{e.getChildMeshes(!1).forEach((e=>{"targetcube_t"!==e.name&&"backgroundShell"!==e.name&&(e.actionManager||(e.actionManager=new P(this.scene)),e.actionManager.registerAction(new w(P.OnPointerOverTrigger,(t=>{t.meshUnderPointer&&e.material&&this.materialSelectedObservable.notifyObservers({id:e.material.id,name:this.stripIdFromName(e.material.name)})}))),e.actionManager.registerAction(new w(P.OnPointerOutTrigger,(()=>{e.material&&this.materialDeselectedObservable.notifyObservers({id:e.material.id,name:this.stripIdFromName(e.material.name)})}))))}))}))}getInitializationPromise(){return this.importPromise}getIsInitialized(){return this.initialized}getQueuedMaterialVariantCount(){return this.materialReadyToLoadCallbacks.size}getQueuedModelVariantCount(){return this.modelReadyToLoadCallbacks.size}configureModelInstance(e){const t=this.transformRoot.position,i=this.transformRoot.rotation,a=this.transformRoot.scaling;this.transformRoot.position=l.Zero(),this.transformRoot.rotation=l.Zero(),this.transformRoot.scaling=l.One(),e.rootNodes.forEach((e=>{e.parent=this.transformRoot})),this.transformRoot.position=t,this.transformRoot.rotation=i,this.transformRoot.scaling=a,this.canvasPanels=this.contextService?.getAll()||new Map,$(this.materials.concat(this.variantManager.getAllMaterials()),this.scene,this.canvasPanels,this.dynamicTextures,`${this.id}_`),this.enablePicking&&this.attachPickingHandler(e)}destroyInstance(){this.modelInstance?.dispose(),this.modelInstance=void 0}instantiate(){this.modelInstance=this.assetContainer.instantiateModelsToScene(this.renameClonedAsset.bind(this),!0),this.materials=de(this.modelInstance),this.configureModelInstance(this.modelInstance);if(this.materials.some((e=>"emissiveTexture"in e&&null!==e.emissiveTexture))){new C("GlowLayer",this.scene).intensity=.5}this.animations=ge(this.modelInstance.animationGroups,this.renameClonedAsset("")),this.processQueuedEvents()}renameClonedAsset(e){return`${this.id}_${e}`}setEnabled(e){e&&!this.modelInstance?this.instantiate():!e&&this.modelInstance&&this.destroyInstance()}updateDynamicTextures(){this.canvasPanels?.forEach(((e,t)=>{const i=this.dynamicTextures.get(t);i&&e.getStaticContextDirty()&&i.isReady()&&(i.update(!1),e.setStaticContextDirty(!1))}))}registerMaterialVariantListener(e){this.materialVariantObservable.add(e)}unregisterMaterialVariantListener(e){this.materialVariantObservable.removeCallback(e)}registerModelVariantListener(e){this.modelVariantObservable.add(e)}unregisterModelVariantListener(e){this.modelVariantObservable.removeCallback(e)}stripIdFromName(e){return e.substring(this.id.length+1)}async processQueuedEvents(){this.previewService.getIsInitialized()&&(await Promise.all(Array.from(this.materialReadyToLoadCallbacks.values()).map((e=>Array.from(e.values()).map((e=>e()))))),this.materialReadyToLoadCallbacks.clear(),await Promise.all(Array.from(this.modelReadyToLoadCallbacks.values()).map((e=>e()))),this.modelReadyToLoadCallbacks.clear(),this.queuedModelAnimation&&(this.executeAnimation(this.queuedModelAnimation),this.queuedModelAnimation=void 0))}}function pe(e,t,i){return t in e?Object.defineProperty(e,t,{value:i,enumerable:!0,configurable:!0,writable:!0}):e[t]=i,e}class be extends e{constructor(e,t,i,a,n,s,r,o){super(e,t,i,a,n,s,o),pe(this,"lastFocus",new l(0,0,0)),pe(this,"panDenominator",1),this.minZ=.01,this.setRadius(this.radius),this.enableFramingBehavior(),this.wheelDeltaPercentage=.01,this.pinchDeltaPercentage=.005,this.useNaturalPinchZoom=!0,r.camera.autoOrientation&&(this.alpha+=Math.PI),r&&(r.camera.limits.min.beta&&(this.lowerBetaLimit=r.camera.limits.min.beta),r.camera.limits.max.beta&&(this.upperBetaLimit=r.camera.limits.max.beta),r.camera.limits.min.alpha&&(this.lowerAlphaLimit=r.camera.limits.min.alpha),r.camera.limits.max.alpha&&(this.upperAlphaLimit=r.camera.limits.max.alpha),r.camera.limits.min.radius&&(this.lowerRadiusLimit=r.camera.limits.min.radius),r.camera.limits.max.radius&&(this.upperRadiusLimit=r.camera.limits.max.radius),r.camera.autoRotation.enabled&&this.enableAutoRotationBehavior(r.camera.autoRotation.idleTimeMs))}getFramingBehavior(){return this.getBehaviorByName("Framing")}getAutoRotationBehavior(){const e=this.getBehaviorByName("AutoRotation");return e||void 0}enableFramingBehavior(){this.useFramingBehavior=!0;const e=this.getFramingBehavior();e.attach(this),e.framingTime=0,e.elevationReturnTime=-1,e.zoomStopsAnimation=!1,this.lowerRadiusLimit=null;const t=fe(this._scene);return e.zoomOnBoundingInfo(t.min,t.max),this.wheelPrecision=100/this.radius,null===this.lowerRadiusLimit&&(this.lowerRadiusLimit=.1),this.lastFocus.copyFrom(this.target),e}rerunFramingBehavior(e,t){const i=this.getFramingBehavior();i.framingTime=t||800;const a=fe(this._scene),n=a.max.subtract(a.min),s=a.min.add(n.scale(.5));this.setRadius(1.5*n.length()),this.wheelPrecision=100/this.radius,this.panningInertia=0,this.panningOriginTarget.copyFrom(s),this.panDenominator=n.length(),i.zoomOnBoundingInfo(a.min,a.max,void 0,(()=>{e&&e()})),i.framingTime=0}enableAutoRotationBehavior(e=5e3){this.useAutoRotationBehavior=!0;const t=this.getAutoRotationBehavior();t&&(t.idleRotationWaitTime=e)}disableAutoRotationBehavior(){this.useAutoRotationBehavior=!1}setRadius(e){this.radius=e,this.maxZ=1e3*this.radius,this.lowerRadiusLimit=.01*this.radius,this.upperRadiusLimit=1.5*this.radius,this.wheelPrecision=100/this.radius,this.pinchPrecision=300/this.radius}static create(e,t,i){const a=fe(e),n=a.max.subtract(a.min),s=a.min.add(n.scale(.5)),r=new be("ProductCamera",-Math.PI/2,Math.PI/2,1.5*n.length(),s,e,t);return r.panningInertia=0,r.panningOriginTarget.copyFrom(s),r.panDenominator=n.length(),r.onAfterCheckInputsObservable.add((()=>{r.panningSensibility=1e3/r.panDenominator})),i&&(e.activeCamera=r),r}}function fe(e){if(0===e.meshes.length)return{min:new l(-1,-1,-1),max:new l(1,1,1)};const t=e.meshes.filter((e=>e.name.toLowerCase().endsWith("_t")||e.name.toLowerCase().includes("_t_")));return e.getWorldExtends((e=>e.isVisible&&e.isEnabled()&&(0===t.length||t.includes(e))))}function ve(e,t,i){return t in e?Object.defineProperty(e,t,{value:i,enumerable:!0,configurable:!0,writable:!0}):e[t]=i,e}class ye{constructor(e,t=!1,i){ve(this,"renderingPipeline",void 0),ve(this,"currentConfiguration",void 0),this.renderingPipeline=new F("default",t,e,i?[i]:void 0,!1),this.renderingPipeline.isSupported&&(this.renderingPipeline.prepare(),this.setConfiguration(K))}dispose(){this.renderingPipeline.dispose()}getConfiguration(){return this.currentConfiguration}setConfiguration(e){if(this.renderingPipeline.isSupported){if(this.renderingPipeline.samples=e.antiAliasing?.samples??K.antiAliasing.samples,this.renderingPipeline.fxaaEnabled=e.antiAliasing?.fxaaEnabled??K.antiAliasing.fxaaEnabled,this.renderingPipeline.bloomEnabled=e.bloom?.enabled??K.bloom.enabled,this.renderingPipeline.bloomKernel=e.bloom?.kernel??K.bloom.kernel,this.renderingPipeline.bloomScale=e.bloom?.scale??K.bloom.scale,this.renderingPipeline.bloomThreshold=e.bloom?.threshold??K.bloom.threshold,this.renderingPipeline.bloomWeight=e.bloom?.weight??K.bloom.weight,this.renderingPipeline.chromaticAberrationEnabled=e.chromaticAberration?.enabled??K.chromaticAberration.enabled,this.renderingPipeline.chromaticAberration.aberrationAmount=e.chromaticAberration?.aberrationAmount??K.chromaticAberration.aberrationAmount,this.renderingPipeline.chromaticAberration.radialIntensity=e.chromaticAberration?.radialIntensity??K.chromaticAberration.radialIntensity,this.renderingPipeline.chromaticAberration.direction=e.chromaticAberration?.direction?new h(e.chromaticAberration.direction.x,e.chromaticAberration.direction.y):new h(K.chromaticAberration.direction.x,K.chromaticAberration.direction.y),this.renderingPipeline.imageProcessing.colorCurvesEnabled=e.colorCurves?.enabled??K.colorCurves.enabled,this.renderingPipeline.imageProcessing.colorCurves=e.colorCurves?this.updateColorCurve(e.colorCurves):new I,this.renderingPipeline.depthOfFieldEnabled=e.depthOfField?.enabled??K.depthOfField.enabled,e.depthOfField)switch(e.depthOfField.blurLevel??K.depthOfField.blurLevel){case"Low":this.renderingPipeline.depthOfFieldBlurLevel=k.Low;break;case"Medium":this.renderingPipeline.depthOfFieldBlurLevel=k.Medium;break;case"High":this.renderingPipeline.depthOfFieldBlurLevel=k.High}if(this.renderingPipeline.depthOfField.focalLength=e.depthOfField?.focalLength??K.depthOfField.focalLength,this.renderingPipeline.depthOfField.fStop=e.depthOfField?.fStop??K.depthOfField.fStop,this.renderingPipeline.depthOfField.focusDistance=e.depthOfField?.focusDistance??K.depthOfField.focusDistance,this.renderingPipeline.depthOfField.lensSize=e.depthOfField?.lensSize??K.depthOfField.lensSize,this.renderingPipeline.grainEnabled=e.grain?.enabled??K.grain.enabled,this.renderingPipeline.grain.animated=e.grain?.animated??K.grain.animated,this.renderingPipeline.grain.intensity=e.grain?.intensity??K.grain.intensity,this.renderingPipeline.imageProcessing.contrast=e.misc?.contrast??K.misc.contrast,this.renderingPipeline.imageProcessing.exposure=e.misc?.exposure??K.misc.exposure,this.renderingPipeline.imageProcessing.toneMappingEnabled=e.misc?.toneMappingEnabled??K.misc.toneMappingEnabled,this.renderingPipeline.imageProcessing.toneMappingEnabled)switch(e.misc.toneMappingType??K.misc.toneMappingType){case"Standard":this.renderingPipeline.imageProcessing.toneMappingType=S.TONEMAPPING_STANDARD;break;case"ACES":this.renderingPipeline.imageProcessing.toneMappingType=S.TONEMAPPING_ACES}if(this.renderingPipeline.sharpenEnabled=e.sharpen?.enabled??K.sharpen.enabled,this.renderingPipeline.sharpen.colorAmount=e.sharpen?.colorAmount??K.sharpen.colorAmount,this.renderingPipeline.sharpen.edgeAmount=e.sharpen?.edgeAmount??K.sharpen.edgeAmount,this.renderingPipeline.imageProcessing.vignetteEnabled=e.vignette?.enabled??K.vignette.enabled,e.vignette?.center?(this.renderingPipeline.imageProcessing.vignetteCenterX=e.vignette.center.x,this.renderingPipeline.imageProcessing.vignetteCenterY=e.vignette.center.y):(this.renderingPipeline.imageProcessing.vignetteCenterX=K.vignette.center.x,this.renderingPipeline.imageProcessing.vignetteCenterY=K.vignette.center.y),e.vignette)switch(e.vignette?.blendMode??K.vignette.blendMode){case"Multiply":this.renderingPipeline.imageProcessing.vignetteBlendMode=S.VIGNETTEMODE_MULTIPLY;break;case"Opaque":this.renderingPipeline.imageProcessing.vignetteBlendMode=S.VIGNETTEMODE_OPAQUE}e.vignette?.colorRgba?this.renderingPipeline.imageProcessing.vignetteColor=new o(e.vignette.colorRgba.r,e.vignette.colorRgba.g,e.vignette.colorRgba.b,e.vignette.colorRgba.a):e.vignette?.colorHex?this.renderingPipeline.imageProcessing.vignetteColor=o.FromHexString(e.vignette.colorHex):this.renderingPipeline.imageProcessing.vignetteColor=new o(K.vignette.colorRgba.r,K.vignette.colorRgba.g,K.vignette.colorRgba.b,K.vignette.colorRgba.a),this.renderingPipeline.imageProcessing.vignetteStretch=e.vignette?.stretch??K.vignette.stretch,this.renderingPipeline.imageProcessing.vignetteWeight=e.vignette?.weight??K.vignette.weight,this.renderingPipeline.prepare(),this.currentConfiguration=e}}updateColorCurve(e){const t=new I;return t.globalDensity=e.globalDensity??t.globalDensity,t.globalExposure=e.globalExposure??t.globalExposure,t.globalHue=e.globalHue??t.globalHue,t.globalSaturation=e.globalSaturation??t.globalSaturation,t.highlightsDensity=e.highlightsDensity??t.highlightsDensity,t.highlightsExposure=e.highlightsExposure??t.highlightsExposure,t.highlightsHue=e.highlightsHue??t.highlightsHue,t.highlightsSaturation=e.highlightsSaturation??t.highlightsSaturation,t.midtonesDensity=e.midtonesDensity??t.midtonesDensity,t.midtonesExposure=e.midtonesExposure??t.midtonesExposure,t.midtonesHue=e.midtonesHue??t.midtonesHue,t.midtonesSaturation=e.midtonesSaturation??t.midtonesSaturation,t.shadowsDensity=e.shadowsDensity??t.shadowsDensity,t.shadowsExposure=e.shadowsExposure??t.shadowsExposure,t.shadowsHue=e.shadowsHue??t.shadowsHue,t.shadowsSaturation=e.shadowsSaturation??t.shadowsSaturation,t}}function Me(e,t,i){return t in e?Object.defineProperty(e,t,{value:i,enumerable:!0,configurable:!0,writable:!0}):e[t]=i,e}u.GLTFLoader.RegisterExtension("glbPostProcessor",(function(e){return new Z(e)})),n.OnPluginActivatedObservable.add((e=>{if("gltf"===e.name){e.transparencyAsCoverage=!0}}));class Pe{constructor(e){Me(this,"camera",void 0),Me(this,"configuration",void 0),Me(this,"engine",void 0),Me(this,"scene",void 0),Me(this,"loadProgress",new Map([["initialScene",0]])),Me(this,"queuedCameraAnimation",void 0),Me(this,"focusLostNotified",!1),Me(this,"loadObservable",new d),Me(this,"focusLostObservable",new d),Me(this,"initializedCallbacks",[]),Me(this,"isInitialized",!1),Me(this,"modelLoadEventCallbacks",[]),Me(this,"highlightLayer",void 0),Me(this,"renderingPipeline",void 0),Me(this,"modelContainers",new Map),Me(this,"plugins",[]),Me(this,"screenshotPrepareResolve",void 0);const a=e?.noRender?void 0:document.createElement("canvas");this.configuration=new _(e);c.Configuration={decoder:{wasmUrl:"https://www.gstatic.com/draco/versioned/decoders/1.5.6/draco_wasm_wrapper_gltf.js",wasmBinaryUrl:"https://www.gstatic.com/draco/versioned/decoders/1.5.6/draco_decoder_gltf.wasm",fallbackUrl:"https://www.gstatic.com/draco/versioned/decoders/1.5.6/draco_decoder_gltf.js"}},a&&(a.getContext("webgl2")||a.getContext("webgl"));const n=console.log;console.log=()=>{};const s=a?new t(a,!0,{adaptToDeviceRatio:!0,limitDeviceRatio:2,premultipliedAlpha:!1,preserveDrawingBuffer:!!e?.backgroundImage,audioEngine:!1,stencil:this.configuration.highlights.enabled,forceSRGBBufferSupportState:!0}):new i;console.log=n,s.hideLoadingUI(),window.addEventListener("resize",this.fireResizeEvent.bind(this)),this.engine=s,this.scene=new g(s),this.camera=be.create(this.scene,this.configuration),this.renderingPipeline=new ye(this.scene,!1,this.camera),this.scene.imageProcessingConfiguration.exposure=this.configuration.lighting.exposure,this.scene.imageProcessingConfiguration.contrast=this.configuration.lighting.contrast}getEngineContext(){return{engine:this.engine,scene:this.scene,camera:this.camera}}registerFocusLostListener(e){this.focusLostObservable.add(e)}unregisterFocusLostListener(e){this.focusLostObservable.removeCallback(e)}registerLoadProgressListener(e){this.loadObservable.add(e),e(this.getLoadListenerEvent())}unregisterLoadProgressListener(e){this.loadObservable.removeCallback(e)}registerInitializedListener(e){this.isInitialized||!this.isInitialized&&this.initializedCallbacks.push(e)}unregisterInitializedListener(e){if(this.isInitialized)return;const t=this.initializedCallbacks.indexOf(e);t>-1&&this.initializedCallbacks.splice(t,1)}getIsInitialized(){return this.isInitialized}registerModelLoadEventListener(e){this.modelLoadEventCallbacks.push(e)}unregisterModelLoadEventListener(e){const t=this.modelLoadEventCallbacks.indexOf(e);t>-1&&this.modelLoadEventCallbacks.splice(t,1)}registerView(e){const t=e.height,i=e.width;this.engine.registerView(e),e.setAttribute("height",t.toString()),e.setAttribute("width",i.toString()),this.orbitEnabled()||this.setCameraState(z.Pan),this.reattachControls(e)}getNumViewports(){return this.engine.views?.length||0}unregisterView(e){this.engine.unRegisterView(e)}shutdown(){this.plugins.forEach((e=>e.dispose(!0))),this.renderingPipeline.dispose(),this.engine&&this.engine.dispose(),window.removeEventListener("resize",this.fireResizeEvent)}getSceneInitializationProgress(){return this.loadProgress.get("initialScene")}async initialize(e){let t;if(this.scene.clearColor=this.configuration.scene.clearColor,this.scene.environmentTexture=s.CreateFromPrefilteredData(this.configuration.scene.environmentFile,this.scene),e){const i=100;t=await this.loadModel(e,(e=>{this.loadProgress.set("initialScene",e.loaded*i/e.total),this.notifyLoadHandlers()})).getInitializationPromise()}return this.loadProgress.set("initialScene",100),this.notifyLoadHandlers(),this.scene.activeCamera=this.camera,this.camera.rerunFramingBehavior(void 0,1),ie(this.scene.animationGroups),this.engine.views?.length>=1&&this.reattachControls(this.engine.views[this.engine.views.length-1].target),this.queuedCameraAnimation&&(this.executeCameraAnimation(this.queuedCameraAnimation),this.queuedCameraAnimation=void 0),this.isInitialized=!0,await Promise.all(this.initializedCallbacks.map((e=>e()))),this.initializedCallbacks=[],this.configuration.options?.renderingPipelineConfiguration&&this.renderingPipeline.setConfiguration(this.configuration.options.renderingPipelineConfiguration),this.engine.runRenderLoop((()=>{this.engine.views&&(this.modelContainers.forEach((e=>{e.updateDynamicTextures()})),this.configuration.scene.transparentBackground&&this.engine.views.forEach((e=>{const t=this.engine.getRenderingCanvas();e.target.getContext("2d").clearRect(0,0,t.width,t.height)})),this.scene.render(),this.camera.target.equalsWithEpsilon(this.camera.lastFocus,.1)||this.focusLostNotified||(this.focusLostObservable.notifyObservers(void 0),this.focusLostNotified=!0),this.screenshotPrepareResolve&&(this.screenshotPrepareResolve(),this.screenshotPrepareResolve=void 0))})),t}executeCameraAnimation(e){100===this.getSceneInitializationProgress()&&this.camera&&this.scene.activeCamera===this.camera?ae(this.scene,this.scene.activeCamera,e):this.queuedCameraAnimation=e}getCameraPose(){if(this.scene&&this.camera)return{lonDeg:Math.round(180*this.camera.alpha/Math.PI),latDeg:Math.round(180*this.camera.beta/Math.PI),radius:Math.round(1e4*(this.camera.radius+Number.EPSILON))/1e4,target:{x:this.camera.target.x,y:this.camera.target.y,z:this.camera.target.z}}}setCameraPose(e){this.scene&&this.camera&&(this.camera.target=new l(e.target.x,e.target.y,e.target.z),this.camera.radius=e.radius,this.camera.alpha=e.latDeg,this.camera.beta=e.lonDeg)}setCameraState(e){if(!this.engine?.views||!this.engine?.views[0])throw new Error("No views attached, camera state requires a view to attach controls onto.");e===z.Orbit?this.reattachControls(this.engine.views[0].target,2):this.reattachControls(this.engine.views[0].target,0)}animateToLastCameraFocus(){return new Promise((e=>{const t=this.configuration;this.camera.rerunFramingBehavior((()=>{this.focusLostNotified=!1,t.camera.limits.min.radius&&(this.camera.lowerRadiusLimit=t.camera.limits.min.radius),t.camera.limits.max.radius&&(this.camera.upperRadiusLimit=t.camera.limits.max.radius),e()}))}))}setAutoRotation(e){this.configuration.camera.autoRotation.enabled&&this.camera&&(e?this.camera.enableAutoRotationBehavior(this.configuration.camera.autoRotation.idleTimeMs):this.camera.disableAutoRotationBehavior())}getCurrentConfiguration(){return this.configuration.options}async renderSceneScreenshot(t,i){if(!this.camera)throw new Error("Missing product camera, cannot render screenshot!");const a=new e("screenshotCamera",0,0,0,l.Zero(),this.scene);try{const e=i.latDeg*Math.PI/180,n=i.lonDeg*Math.PI/180;a.target=i.target?new l(i.target.x,i.target.y,i.target.z):l.Zero(),a.alpha=n,a.beta=e,a.radius=i.radius||this.camera.radius,a.minZ=.01,this.scene.render();const s=await m.CreateScreenshotUsingRenderTargetAsync(this.engine,a,t,"image/png",2,!0);return a.dispose(),s}catch(e){throw a.isDisposed()||a.dispose(),new Error("Failed to render screenshot")}}orbitEnabled(){const e=this.configuration;if(!e)return!0;const t=e.camera.limits.min.alpha,i=e.camera.limits.max.alpha,a=e.camera.limits.min.beta,n=e.camera.limits.max.beta;if(void 0===t||void 0===i||void 0===a||void 0===n)return!0;const s=[a,n],r=[t,i].every((e=>e===t)),o=s.every((e=>e===a));return!r&&!o}fireResizeEvent(){this.getNumViewports()>0&&this.engine.resize()}setHighlights(e,t){0===e.length&&(this.highlightLayer?.dispose(),this.highlightLayer=void 0),this.highlightLayer||(this.highlightLayer=new a("highlights",this.scene,{isStroke:!0,blurVerticalSize:.85,blurHorizontalSize:.85}),this.highlightLayer.innerGlow=!0,this.highlightLayer.outerGlow=!1),this.highlightLayer.removeAllMeshes();const i=t?new r(t[0],t[1],t[2]).toLinearSpace():void 0;e.forEach((e=>{const t=this.scene.materials.find((t=>t.name===e.name&&t.id===e.id));t&&t.getBindedMeshes().forEach((e=>this.highlightLayer?.addMesh(e,i||r.FromHexString("#fcba03"))))}))}setRenderingPipelineConfiguration(e){this.renderingPipeline&&this.renderingPipeline.setConfiguration(e)}loadModel(e,t){const i=new ue({enablePicking:this.configuration.highlights.enabled,modelDetails:e,scene:this.scene,previewService:this,progressHandler:t});return i.registerMaterialVariantListener((e=>this.handleMaterialProgressCallback(e.remainingCount,e.totalCount,e.taskName))),i.registerModelVariantListener((e=>this.handleModelProgressCallback(e,e.key))),this.configuration.highlights.enabled&&(i.registerMaterialSelectedCallback((e=>{this.setHighlights([e])})),i.registerMaterialDeselectedCallback((()=>{this.setHighlights([])}))),this.modelContainers.set(i.getId(),i),this.triggerModelLoadEvent({eventType:"load",modelContainer:i}),i}getAllModels(){return Array.from(this.modelContainers.values())}getModelById(e){return this.modelContainers.get(e)}registerPlugin(e){this.plugins.push(e),e.initialize(this,{camera:this.camera,engine:this.engine,scene:this.scene})}unregisterPlugin(e){const t=this.plugins.indexOf(e);if(t>-1){this.plugins.splice(t,1).forEach((e=>e.dispose(!1)))}}modelUnloaded(e){this.modelContainers.delete(e.getId()),this.triggerModelLoadEvent({eventType:"unload",modelContainer:e})}triggerModelLoadEvent(e){this.modelLoadEventCallbacks.forEach((t=>t(e)))}handleMaterialProgressCallback(e,t,i){this.loadProgress.set(`key_${i}`,e/t*100),this.notifyLoadHandlers()}handleModelProgressCallback(e,t){this.loadProgress.set(t,100*e.loaded/e.total),this.notifyLoadHandlers()}reattachControls(e,t=2){if(this.scene.detachControl(),this.engine.inputElement=e,this.camera){this.camera.attachControl(!0,!1,t);this.camera.inputs.attached.pointers.multiTouchPanning=!1}this.scene.attachControl(!0,!0,!0)}getLoadListenerEvent(){const e=Array.from(this.loadProgress.values()).filter((e=>e<100)),t=e.reduce(((e,t)=>e+t),0)/e.length||0;return{loadValue:0===e.length?100:t,sceneInitialized:100===this.getSceneInitializationProgress()}}notifyLoadHandlers(){this.loadObservable.notifyObservers(this.getLoadListenerEvent())}}export{z as ProductCameraRig,j as MaterialEffectMode,Pe as SpiffCommerce3DPreviewService,G as RenderingConfiguration,U as REFLECTION_PROBE_RESOLUTION,K as renderingPipelineDefaults};
|
|
1
|
+
import{ArcRotateCamera as e}from"@babylonjs/core/Cameras/arcRotateCamera";import{Engine as t}from"@babylonjs/core/Engines/engine";import{NullEngine as i}from"@babylonjs/core/Engines/nullEngine";import{HighlightLayer as a}from"@babylonjs/core/Layers/highlightLayer";import{SceneLoader as n}from"@babylonjs/core/Loading/sceneLoader";import{CubeTexture as s}from"@babylonjs/core/Materials/Textures/cubeTexture";import{Color3 as r,Color4 as o}from"@babylonjs/core/Maths/math.color";import{Vector3 as l,Vector2 as h}from"@babylonjs/core/Maths/math.vector";import{DracoCompression as c}from"@babylonjs/core/Meshes/Compression/dracoCompression";import{Observable as d}from"@babylonjs/core/Misc/observable";import{Tools as m}from"@babylonjs/core/Misc/tools";import{Scene as g}from"@babylonjs/core/scene";import{GLTF2 as u}from"@babylonjs/loaders/glTF";import"@babylonjs/core/Engines/Extensions/engine.views";import"@babylonjs/core/Meshes/instancedMesh";import"@babylonjs/core/Materials/Textures/Loaders/ddsTextureLoader";import"@babylonjs/core/Materials/Textures/Loaders/envTextureLoader";import"@babylonjs/core/Materials/Textures/Loaders/ktxTextureLoader";import"@babylonjs/core/Animations/animatable";import"@babylonjs/core/Misc/screenshotTools";import"@babylonjs/core/Rendering/boundingBoxRenderer";import"@babylonjs/loaders/glTF/2.0/Extensions";import{PBRMaterial as p}from"@babylonjs/core/Materials/PBR/pbrMaterial";import{MirrorTexture as b}from"@babylonjs/core/Materials/Textures/mirrorTexture";import{Color3 as f,Vector3 as v,Plane as y}from"@babylonjs/core/Maths/math";import{ReflectionProbe as M}from"@babylonjs/core/Probes/reflectionProbe";import{ActionManager as w}from"@babylonjs/core/Actions/actionManager";import{ExecuteCodeAction as P}from"@babylonjs/core/Actions/directActions";import{GlowLayer as C}from"@babylonjs/core/Layers/glowLayer";import{TransformNode as x}from"@babylonjs/core/Meshes/transformNode";import{DynamicTexture as O}from"@babylonjs/core/Materials/Textures/dynamicTexture";import{Texture as E}from"@babylonjs/core/Materials/Textures/texture";import{Animation as A}from"@babylonjs/core/Animations/animation";import{QuadraticEase as R,EasingFunction as L}from"@babylonjs/core/Animations/easing";import{AssetsManager as T}from"@babylonjs/core/Misc/assetsManager";import{ColorCurves as I}from"@babylonjs/core/Materials/colorCurves";import{ImageProcessingConfiguration as S}from"@babylonjs/core/Materials/imageProcessingConfiguration";import{DefaultRenderingPipeline as F}from"@babylonjs/core/PostProcesses/RenderPipeline";import{DepthOfFieldEffectBlurLevel as k}from"@babylonjs/core/PostProcesses/depthOfFieldEffect";import"@babylonjs/core/Rendering/depthRendererSceneComponent";function D(e,t,i,a){Object.defineProperty(e,t,{get:i,set:a,enumerable:!0,configurable:!0})}var B={};let z;var N;let j;var V;D(B,"ProductCameraRig",(()=>z)),D(B,"MaterialEffectMode",(()=>j)),(N=z||(z={}))[N.Orbit=0]="Orbit",N[N.Pan=1]="Pan",(V=j||(j={})).None="None",V.RemoveWhenSelected="RemoveWhenSelected",V.ApplyWhenSelected="ApplyWhenSelected";function H(e,t,i){return t in e?Object.defineProperty(e,t,{value:i,enumerable:!0,configurable:!0,writable:!0}):e[t]=i,e}D({},"SpiffCommerce3DPreviewService",(()=>we));class _{constructor(e){H(this,"customOptions",void 0),H(this,"getSceneClearColor",(()=>{const e=this.customOptions?.transparentBackground||this.customOptions?.backgroundImage?0:1;if(this.customOptions&&this.customOptions?.transparentBackground||this.customOptions?.backgroundImage)return new o(0,0,0,e).toLinearSpace();if(this.customOptions&&this.customOptions.backgroundColor){const t=r.FromHexString(this.customOptions.backgroundColor);return new o(t.r,t.g,t.b,e).toLinearSpace()}return new o(.98,.98,.98,e).toLinearSpace()})),H(this,"highlightColorFromConfig",(()=>this.customOptions&&this.customOptions.highlightColor?this.hexToColor4(this.customOptions.highlightColor):new o(.98,.98,.98,1).toLinearSpace())),H(this,"hexToColor4",((e,t=1)=>{const i=r.FromHexString(e);return new o(i.r,i.g,i.b,t).toLinearSpace()})),this.customOptions=e}get options(){return this.customOptions}get scene(){return{clearColor:this.getSceneClearColor(),transparentBackground:this.customOptions?.transparentBackground||this.customOptions?.backgroundImage,environmentFile:this.customOptions?.environmentFile??"assets/model-viewer/default.env"}}get camera(){return{autoOrientation:this.customOptions?.disableAutomaticOrientation??!0,autoRotation:{enabled:this.customOptions?.autoRotation??!1,idleTimeMs:this.customOptions?.idleTimeBeforeRotation??5e3},limits:{min:{alpha:this.customOptions?.lowerAlphaLimitDeg?this.customOptions?.lowerAlphaLimitDeg*Math.PI/180:void 0,beta:this.customOptions?.lowerBetaLimitDeg?this.customOptions?.lowerBetaLimitDeg*Math.PI/180:void 0,radius:this.customOptions?.minZoomOverride},max:{alpha:this.customOptions?.upperAlphaLimitDeg?this.customOptions?.upperAlphaLimitDeg*Math.PI/180:void 0,beta:this.customOptions?.upperBetaLimitDeg?this.customOptions?.upperBetaLimitDeg*Math.PI/180:void 0,radius:this.customOptions?.maxZoomOverride}}}}get highlights(){return{enabled:this.customOptions?.highlightOnMaterialHover??!1,color:this.highlightColorFromConfig()}}get lighting(){return{exposure:this.customOptions?.lighting?.exposure??.9,contrast:this.customOptions?.lighting?.contrast??1.6}}get emissiveGlowIntensity(){return this.customOptions?.emissiveGlowIntensity??.5}}var G={};D(G,"RenderingConfiguration",(()=>q)),D(G,"REFLECTION_PROBE_RESOLUTION",(()=>U)),D(G,"renderingPipelineDefaults",(()=>K));class q{static getDynamicTextureResolution(){return this.getIsMobile()||!q.offscreenRenderingSupported()?{width:1024,height:1024}:{width:2048,height:2048}}static shouldMipMap(){return!0}static offscreenRenderingSupported(){return!navigator.userAgent.includes("SamsungBrowser")&&(!!window.Worker&&!!window.OffscreenCanvas)}static getMirrorTextureResolution(){return this.getIsMobile()?512:1024}static getIsMobile(){try{return!("undefined"==typeof window||!window.navigator)&&(/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(window.navigator.userAgent)||window.innerWidth<=480)}catch(e){return!1}}}const U=128,K={antiAliasing:{samples:4,fxaaEnabled:!1},bloom:{enabled:!1,kernel:64,scale:.5,threshold:.9,weight:.15},chromaticAberration:{enabled:!1,aberrationAmount:30,direction:{x:0,y:0},radialIntensity:0},colorCurves:{enabled:!1},depthOfField:{enabled:!1,blurLevel:"Low",focalLength:50,focusDistance:2e3,fStop:1.4,lensSize:50},grain:{enabled:!1,animated:!1,intensity:30},misc:{contrast:1,exposure:1,toneMappingEnabled:!1,toneMappingType:"Standard"},sharpen:{enabled:!1,colorAmount:1,edgeAmount:.3},vignette:{enabled:!1,blendMode:"Multiply",cameraFov:.5,center:{x:0,y:0},colorHex:"#000000ff",colorRgba:{r:0,g:0,b:0,a:1},stretch:0,weight:1}};function W(e,t,i){return t in e?Object.defineProperty(e,t,{value:i,enumerable:!0,configurable:!0,writable:!0}):e[t]=i,e}class Z{constructor(e){W(this,"name",void 0),W(this,"enabled",void 0),W(this,"loader",void 0),this.name="glbPostProcessor",this.enabled=!0,this.loader=e}onReady(){this.applyReflections(this.loader.babylonScene)}loadNodeAsync(e,t,i){return this.loader.loadNodeAsync(e,t,(function(e){t.extras&&Object.keys(t.extras).forEach((i=>{const a=t.extras[i];e.metadata[i]=a})),i(e)}))}async loadMaterialPropertiesAsync(e,t,i){await this.loader.loadMaterialPropertiesAsync(e,t,i),this.enableMaterialExtrasIfRequired(t,i),i.needDepthPrePass=!0}dispose(){}enableMaterialExtrasIfRequired(e,t){if(e.extras&&t instanceof p){if(e.extras.sheen){const i=t;i.sheen.isEnabled=!0,i.sheen.intensity=e.extras.sheen}if(e.extras.translucency){const i=t;i.subSurface.isTranslucencyEnabled=!0,i.subSurface.translucencyIntensity=e.extras.translucency,e.extras.translucencyR&&e.extras.translucencyG&&e.extras.translucencyB&&(i.subSurface.tintColor=new f(e.extras.translucencyR,e.extras.translucencyG,e.extras.translucencyB))}if(e.extras.refractionIOR){const i=t;i.subSurface.isRefractionEnabled=!0,i.subSurface.volumeIndexOfRefraction=e.extras.refractionIOR}if(e.extras.useDepthPrePass){const e=t;e.needDepthPrePass=!0,e.forceIrradianceInFragment=!0}if(e.extras.useParallax){const i=t;i.useParallax=!0,i.useParallaxOcclusion=!0,i.parallaxScaleBias=e.extras.useParallax}}}applyReflections(e){function t(e){const t=[];return e.transformNodes.forEach((e=>{e.metadata&&e.metadata.reflective&&t.push(...e.getChildMeshes())})),e.meshes.forEach((e=>{e.metadata&&e.metadata.reflective&&!t.includes(e)&&t.push(e)})),t}e.meshes.forEach((i=>{const a=i.metadata;a&&(a.mirrorTexture&&function(i,a=1){const n=i.material;if(!n)return;const s=new b("mirror",q.getMirrorTextureResolution(),e,!0);s.renderList=t(e);const r=i.getVerticesData("normal");if(!r)throw new Error("Mirror attribute specified on: "+i.name+"But no normals exist to generate a mirror from!");i.computeWorldMatrix(!0);const o=i.getWorldMatrix(),l=v.TransformNormal(new v(r[0],r[1],r[2]),o).normalize(),h=y.FromPositionAndNormal(i.position,l.scale(-1));s.mirrorPlane=h,s.level=a,n.reflectionTexture=s}(i,a.mirrorTexture),a.reflectionProbe&&function(i){const a=i.material,n=new M("probe-"+a.name,U,e);n.attachToMesh(i),n.renderList&&n.renderList.push(...t(e)),a.reflectionTexture=n.cubeTexture}(i))}))}}const Q=new Map;async function Y(e,t,i){return new Promise(((a,s)=>{const r=Q.get(e);if(r&&r.scene.uid===t.uid)return a(r);n.LoadAssetContainerAsync(e,void 0,t,i).then((t=>{Q.set(e,t),a(t)})).catch(s)}))}function $(e,i,a,n,s=""){a.forEach((a=>{const r=a.getID(),o=a.getName(),l=q.getDynamicTextureResolution();e.filter((e=>e.name===s+o)).forEach((e=>{const s=n.get(r);if(s)X(e,s),s.update(false);else{const s=function(e,i,a,n){const s=new O(e,{width:a,height:n},i,q.shouldMipMap(),E.TRILINEAR_SAMPLINGMODE,t.TEXTUREFORMAT_RGBA),r=s.getContext();r&&(r.fillStyle="#f5f5f5",r.fillRect(0,0,a,n),s.update());return s}(o,i,l.width,l.height);n.set(r,s),a.setStaticContext(s.getContext()),X(e,s),s.onLoadObservable.addOnce((()=>{s.update(false)}))}}))}))}function X(e,t){if(e instanceof p){const i=e,a=i.albedoTexture;a?(t.wrapU=a.wrapU,t.wrapV=a.wrapV):(t.wrapU=1,t.wrapV=1),i.albedoTexture=t}else{const i=e,a=i.diffuseTexture;a&&(t.wrapU=a.wrapU,t.wrapV=a.wrapV),i.diffuseTexture=t}}function J(){const e=()=>Math.floor(65536*(1+Math.random())).toString(16).substring(1);return e()+e()+"-"+e()+"-"+e()+"-"+e()+"-"+e()+e()+e()}function ee(e){return e.targetedAnimations.map((e=>e.animation.framePerSecond)).reduce(((e,t)=>e+t),0)/e.targetedAnimations.length||0}function te(e,t,i,a,n){const s=n?e.filter((e=>e.name===n)):e;0!==s.length?void 0===a||void 0===i||a!==i?s.forEach((e=>{e.stop();const n=ee(e),s=void 0!==a?a*n:void 0,r=void 0!==i?i*n:void 0;e.start(t,1,s,r)})):s.forEach((e=>{e.stop();const i=ee(e),n=a*i;e.start(t,1,n,n)})):console.warn(`No animations found for name: ${n}`)}function ie(e){e.forEach((e=>{e.stop()}))}function ae(e,t,i){var a,n,s;e.stopAnimation(t),t.animations=[],Math.abs(t.alpha)>2*Math.PI&&(t.alpha=(a=t.alpha,n=0,s=2*Math.PI,a<n?s-(n-a)%(s-n):n+(a-n)%(s-n)));const r=[],o=i.target,h=o?1:0;if(i.target&&Object.keys(i.target).length>0&&r.push(se("cameraTargetLerp","target",(new l).copyFrom(t.target),new l(i.target.x,i.target.y,i.target.z),A.ANIMATIONTYPE_VECTOR3,0)),r.push(se("cameraAlphaLerp","alpha",t.alpha,ne(i.lonDeg),A.ANIMATIONTYPE_FLOAT,h)),r.push(se("cameraBetaLerp","beta",t.beta,ne(i.latDeg),A.ANIMATIONTYPE_FLOAT,h)),void 0!==i.radius){const e=Math.max(.01,i.radius);r.push(se("cameraRadiusLerp","radius",t.radius,e,A.ANIMATIONTYPE_FLOAT,h))}t.animations.push(...r);const c=t.useAutoRotationBehavior;t.disableAutoRotationBehavior(),e.beginAnimation(t,0,o?120:60,!1,1,(()=>{t.animations=[],c&&t.enableAutoRotationBehavior()}))}function ne(e){return e*Math.PI/180}function se(e,t,i,a,n,s=0,r=A.ANIMATIONLOOPMODE_CONSTANT){const o=new R;o.setEasingMode(L.EASINGMODE_EASEINOUT);const l=new A(e,t,60,n,r),h=[];return s>0&&h.push({frame:0,value:i}),h.push({frame:60*s,value:i}),h.push({frame:60*(s+1),value:a}),l.setKeys(h),l.setEasingFunction(o),l}const re={albedoTexture:"albedoMap",bumpTexture:"normalMap",ambientTexture:"ambientMap",emissiveTexture:"emissionMap",opacityTexture:"alphaMap",metallicTexture:"metallicMap",refractionTexture:"refractionMap"};function oe(e,t,i,a){["albedoTexture","bumpTexture","ambientTexture","emissiveTexture","opacityTexture","metallicTexture","refractionTexture"].forEach((n=>{!function(e,t,i,a,n){const s=re[e];if(!s)throw new Error("Unexpected texture name encountered.");const r=t[s]?.fileLink;r?a.addTextureTask(e,r,!1,!1):n&&i[e]&&(i[e]&&i[e].dispose(),i[e]=null,function(e,t){"opacityTexture"===e&&(t.useAlphaFromAlbedoTexture=!0);"metallicTexture"===e&&(t.useRoughnessFromMetallicTextureAlpha=!1,t.useRoughnessFromMetallicTextureGreen=!1,t.useMetallnessFromMetallicTextureBlue=!1);"refractionTexture"===e&&(t.subSurface.isRefractionEnabled=!1,t.subSurface.refractionIntensity=1)}(e,i))}(n,e,t,i,a)})),function(e,t){if(!e.clearCoat)return;e.clearCoat===j.RemoveWhenSelected?(t.clearCoat.isEnabled=!1,t.clearCoat.indexOfRefraction=1.5):e.clearCoat===j.ApplyWhenSelected&&(t.clearCoat.isEnabled=!0,t.clearCoat.indexOfRefraction=e.clearCoatIOR||t.clearCoat.indexOfRefraction)}(e,t)}function le(e,t,i,a){"opacityTexture"===e&&(t.useAlphaFromAlbedoTexture=!1),"metallicTexture"===e&&(t.useRoughnessFromMetallicTextureAlpha=!1,t.useRoughnessFromMetallicTextureGreen=!0,t.useMetallnessFromMetallicTextureBlue=!0),"refractionTexture"===e&&(t.subSurface.isRefractionEnabled=!0,t.subSurface.refractionIntensity=i.refractionIntensity||1),t[e]=a}function he(e,t,i){return t in e?Object.defineProperty(e,t,{value:i,enumerable:!0,configurable:!0,writable:!0}):e[t]=i,e}class ce{constructor(e,t,i){he(this,"materialVariantMap",new Map),he(this,"keysThatRemovedBaseModel",[]),he(this,"loadedContainerForKey",new Map),he(this,"loadedMaterialsForKey",new Map),he(this,"scene",void 0),he(this,"renameClonedAsset",void 0),he(this,"setBaseModelEnabled",void 0),this.scene=e,this.renameClonedAsset=t,this.setBaseModelEnabled=i}async applyMaterial(e,t,i,a){return new Promise((n=>{const s=this.materialVariantMap.get(e);this.materialVariantMap.set(e,{...s,...t});const r=this.renameClonedAsset(e),o=this.scene.materials.filter((e=>e.name===r));if(0===o.length)return void n();const l=new T(this.scene);l.useDefaultLoadingScreen=!1,o.forEach((e=>oe(t,e,l,a))),l.onProgress=(e,t,a)=>{i&&i(e/t*100,100,a.name)},l.onFinish=e=>{e.forEach((e=>{const a=e;i&&i(100,100,e.name),o.forEach((i=>le(e.name,i,t,a.texture)))})),n()},l.loadAsync()}))}async applyModel(e,t,i,a){if(i&&t&&!this.keysThatRemovedBaseModel.includes(e)&&this.keysThatRemovedBaseModel.push(e),!i)return this.keysThatRemovedBaseModel.includes(e)&&this.setBaseModelEnabled(!0),this.loadedContainerForKey.get(e)?.dispose(),this.loadedContainerForKey.delete(e),this.loadedMaterialsForKey.delete(e),Promise.resolve(void 0);this.loadedContainerForKey.has(e)&&(this.loadedContainerForKey.get(e)?.dispose(),this.loadedContainerForKey.delete(e),this.loadedMaterialsForKey.delete(e)),t&&this.setBaseModelEnabled(!1);const n=(await Y(i,this.scene,a)).instantiateModelsToScene(this.renameClonedAsset,!0);this.loadedContainerForKey.set(e,n),this.loadedMaterialsForKey.set(e,de(n));const s=[];return this.materialVariantMap.forEach((async(e,t)=>{s.push(this.applyMaterial(t,e))})),await Promise.all(s),n}dispose(){this.loadedContainerForKey.forEach((e=>e?.dispose())),this.loadedContainerForKey.clear(),this.loadedMaterialsForKey.forEach((e=>e.forEach((e=>e?.dispose())))),this.loadedMaterialsForKey.clear(),this.materialVariantMap.clear(),this.keysThatRemovedBaseModel=[]}getAllMaterials(){const e=[];return this.loadedMaterialsForKey.forEach((t=>{t.forEach((t=>{e.includes(t)||e.push(t)}))})),e}getAnimationGroups(){const e=[];return this.loadedContainerForKey.forEach((t=>{e.push(...t.animationGroups)})),e}}function de(e){const t=[];return e.rootNodes.forEach((e=>{e.getChildMeshes().forEach((e=>{e.material&&!t.includes(e.material)&&t.push(e.material),e.subMeshes&&e.subMeshes.forEach((e=>{const i=e.getMaterial(!1);i&&!t.includes(i)&&t.push(i)}))}))})),t}function me(e,t,i){return t in e?Object.defineProperty(e,t,{value:i,enumerable:!0,configurable:!0,writable:!0}):e[t]=i,e}function ge(e,t=""){return e.map((e=>({name:e.name.substring(t.length),loop:e.loopAnimation,to:e.to,from:e.from})))}class ue{constructor(e){me(this,"metadata",new Map),me(this,"id",void 0),me(this,"previewService",void 0),me(this,"scene",void 0),me(this,"variantManager",void 0),me(this,"materialSelectedObservable",new d),me(this,"materialDeselectedObservable",new d),me(this,"materialVariantObservable",new d),me(this,"modelVariantObservable",new d),me(this,"queuedModelAnimation",void 0),me(this,"materialReadyToLoadCallbacks",new Map),me(this,"modelReadyToLoadCallbacks",new Map),me(this,"dynamicTextures",new Map),me(this,"queuedMaterialChanges",new Map),me(this,"materialChangesInProgress",[]),me(this,"queuedModelChanges",new Map),me(this,"modelChangesInProgress",[]),me(this,"animations",[]),me(this,"assetContainer",void 0),me(this,"canvasPanels",void 0),me(this,"contextService",void 0),me(this,"enablePicking",void 0),me(this,"importPromise",void 0),me(this,"initialized",!1),me(this,"materials",[]),me(this,"modelInstance",void 0),me(this,"transformRoot",void 0);const{enablePicking:t,modelDetails:i,previewService:a,progressHandler:n,scene:s}=e;this.enablePicking=t,this.contextService=i.contextService,this.id=J(),this.previewService=a,this.scene=s,this.variantManager=new ce(s,this.renameClonedAsset.bind(this),this.setEnabled.bind(this)),this.previewService.registerInitializedListener((async()=>await this.processQueuedEvents())),this.transformRoot=new x("root",this.scene);this.importPromise=(async()=>(this.assetContainer=await Y(i.model,s,n),this.initialized=!0,this.instantiate(),this))()}async applyMaterialVariant(e,t,i,a){if(100!==this.previewService.getSceneInitializationProgress()||!this.initialized){if(this.materialReadyToLoadCallbacks.has(e)){this.materialReadyToLoadCallbacks.get(e)?.set(t,this.applyMaterialVariant.bind(this,e,t,i,a))}else{this.materialReadyToLoadCallbacks.set(e,new Map);this.materialReadyToLoadCallbacks.get(e)?.set(t,this.applyMaterialVariant.bind(this,e,t,i,a))}return}const n=async()=>{await this.variantManager.applyMaterial(e,i,((e,t,i)=>{this.materialVariantObservable.notifyObservers({remainingCount:e,totalCount:t,taskName:i})}),a)};if(this.materialChangesInProgress.includes(e))if(this.queuedMaterialChanges.has(e)){this.queuedMaterialChanges.get(e)?.set(t,n)}else{this.queuedMaterialChanges.set(e,new Map);this.queuedMaterialChanges.get(e)?.set(t,n)}else{if(this.materialChangesInProgress.push(e),await n(),this.queuedMaterialChanges.has(e)){this.queuedMaterialChanges.get(e).forEach((async e=>{await e()})),this.queuedMaterialChanges.delete(e)}this.materialChangesInProgress.splice(this.materialChangesInProgress.indexOf(e),1)}}async applyModelVariant(e,t,i){if(!this.previewService.getIsInitialized()||!this.initialized)return void this.modelReadyToLoadCallbacks.set(e,this.applyModelVariant.bind(this,e,t,i));const a=()=>this.variantManager.applyModel(e,i,t?.model,(t=>{this.modelVariantObservable.notifyObservers({...t,key:e})}));if(this.modelChangesInProgress.includes(e))return void this.queuedModelChanges.set(e,a);const n=await(async()=>{this.modelChangesInProgress.push(e);let t=await a();if(this.queuedModelChanges.has(e)){const i=this.queuedModelChanges.get(e);t=await i(),this.queuedModelChanges.delete(e)}return this.modelChangesInProgress.splice(this.modelChangesInProgress.indexOf(e),1),t})();this.modelInstance&&ie(this.modelInstance.animationGroups),this.contextService||(this.contextService=t?.contextService),n&&this.configureModelInstance(n)}dispose(){this.destroyInstance(),this.variantManager.dispose(),this.dynamicTextures.forEach((e=>e?.dispose())),this.dynamicTextures.clear(),this.materials.forEach((e=>e&&e?.dispose())),this.materials=[],this.transformRoot?.dispose(),this.transformRoot=void 0,this.previewService.modelUnloaded(this)}executeAnimation(e){this.previewService.getIsInitialized()?this.modelInstance&&te([...this.modelInstance.animationGroups,...this.variantManager.getAnimationGroups()],e.loop,e.to,e.from,e.name?this.renameClonedAsset(e.name):void 0):this.queuedModelAnimation=e}getAnimations(e){return[...this.animations,...e?ge(this.variantManager.getAnimationGroups(),this.renameClonedAsset("")):[]]}getId(){return this.id}listMaterials(){const e=this.scene?.materials.filter((e=>e.name.startsWith(this.id)));return e?e.map((e=>({id:e.id,name:this.stripIdFromName(e.name)}))):[]}registerMaterialSelectedCallback(e){this.materialSelectedObservable.add(e)}unregisterMaterialSelectedCallback(e){this.materialSelectedObservable.removeCallback(e)}registerMaterialDeselectedCallback(e){this.materialDeselectedObservable.add(e)}unregisterMaterialDeselectedCallback(e){this.materialDeselectedObservable.removeCallback(e)}get position(){return this.transformRoot.position}set position(e){this.transformRoot.position=new l(e.x,e.y,e.z)}get rotation(){return this.transformRoot.rotation}set rotation(e){this.transformRoot.rotation=new l(e.x,e.y,e.z)}get scale(){return this.transformRoot.scaling}set scale(e){this.transformRoot.scaling=new l(e.x,e.y,e.z)}attachPickingHandler(e){e.rootNodes.forEach((e=>{e.getChildMeshes(!1).forEach((e=>{"targetcube_t"!==e.name&&"backgroundShell"!==e.name&&(e.actionManager||(e.actionManager=new w(this.scene)),e.actionManager.registerAction(new P(w.OnPointerOverTrigger,(t=>{t.meshUnderPointer&&e.material&&this.materialSelectedObservable.notifyObservers({id:e.material.id,name:this.stripIdFromName(e.material.name)})}))),e.actionManager.registerAction(new P(w.OnPointerOutTrigger,(()=>{e.material&&this.materialDeselectedObservable.notifyObservers({id:e.material.id,name:this.stripIdFromName(e.material.name)})}))))}))}))}getInitializationPromise(){return this.importPromise}getIsInitialized(){return this.initialized}getQueuedMaterialVariantCount(){return this.materialReadyToLoadCallbacks.size}getQueuedModelVariantCount(){return this.modelReadyToLoadCallbacks.size}configureModelInstance(e){const t=this.transformRoot.position,i=this.transformRoot.rotation,a=this.transformRoot.scaling;this.transformRoot.position=l.Zero(),this.transformRoot.rotation=l.Zero(),this.transformRoot.scaling=l.One(),e.rootNodes.forEach((e=>{e.parent=this.transformRoot})),this.transformRoot.position=t,this.transformRoot.rotation=i,this.transformRoot.scaling=a,this.canvasPanels=this.contextService?.getAll()||new Map,$(this.materials.concat(this.variantManager.getAllMaterials()),this.scene,this.canvasPanels,this.dynamicTextures,`${this.id}_`),this.enablePicking&&this.attachPickingHandler(e)}destroyInstance(){this.modelInstance?.dispose(),this.modelInstance=void 0}instantiate(){this.modelInstance=this.assetContainer.instantiateModelsToScene(this.renameClonedAsset.bind(this),!0),this.materials=de(this.modelInstance),this.configureModelInstance(this.modelInstance);if(this.materials.some((e=>"emissiveTexture"in e&&null!==e.emissiveTexture))){new C("GlowLayer",this.scene).intensity=this.previewService.getConfiguration().emissiveGlowIntensity}this.animations=ge(this.modelInstance.animationGroups,this.renameClonedAsset("")),this.processQueuedEvents()}renameClonedAsset(e){return`${this.id}_${e}`}setEnabled(e){e&&!this.modelInstance?this.instantiate():!e&&this.modelInstance&&this.destroyInstance()}updateDynamicTextures(){this.canvasPanels?.forEach(((e,t)=>{const i=this.dynamicTextures.get(t);i&&e.getStaticContextDirty()&&i.isReady()&&(i.update(!1),e.setStaticContextDirty(!1))}))}registerMaterialVariantListener(e){this.materialVariantObservable.add(e)}unregisterMaterialVariantListener(e){this.materialVariantObservable.removeCallback(e)}registerModelVariantListener(e){this.modelVariantObservable.add(e)}unregisterModelVariantListener(e){this.modelVariantObservable.removeCallback(e)}stripIdFromName(e){return e.substring(this.id.length+1)}async processQueuedEvents(){this.previewService.getIsInitialized()&&(await Promise.all(Array.from(this.materialReadyToLoadCallbacks.values()).map((e=>Array.from(e.values()).map((e=>e()))))),this.materialReadyToLoadCallbacks.clear(),await Promise.all(Array.from(this.modelReadyToLoadCallbacks.values()).map((e=>e()))),this.modelReadyToLoadCallbacks.clear(),this.queuedModelAnimation&&(this.executeAnimation(this.queuedModelAnimation),this.queuedModelAnimation=void 0))}}function pe(e,t,i){return t in e?Object.defineProperty(e,t,{value:i,enumerable:!0,configurable:!0,writable:!0}):e[t]=i,e}class be extends e{constructor(e,t,i,a,n,s,r,o){super(e,t,i,a,n,s,o),pe(this,"lastFocus",new l(0,0,0)),pe(this,"panDenominator",1),this.minZ=.01,this.setRadius(this.radius),this.enableFramingBehavior(),this.wheelDeltaPercentage=.01,this.pinchDeltaPercentage=.005,this.useNaturalPinchZoom=!0,r.camera.autoOrientation&&(this.alpha+=Math.PI),r&&(r.camera.limits.min.beta&&(this.lowerBetaLimit=r.camera.limits.min.beta),r.camera.limits.max.beta&&(this.upperBetaLimit=r.camera.limits.max.beta),r.camera.limits.min.alpha&&(this.lowerAlphaLimit=r.camera.limits.min.alpha),r.camera.limits.max.alpha&&(this.upperAlphaLimit=r.camera.limits.max.alpha),r.camera.limits.min.radius&&(this.lowerRadiusLimit=r.camera.limits.min.radius),r.camera.limits.max.radius&&(this.upperRadiusLimit=r.camera.limits.max.radius),r.camera.autoRotation.enabled&&this.enableAutoRotationBehavior(r.camera.autoRotation.idleTimeMs))}getFramingBehavior(){return this.getBehaviorByName("Framing")}getAutoRotationBehavior(){const e=this.getBehaviorByName("AutoRotation");return e||void 0}enableFramingBehavior(){this.useFramingBehavior=!0;const e=this.getFramingBehavior();e.attach(this),e.framingTime=0,e.elevationReturnTime=-1,e.zoomStopsAnimation=!1,this.lowerRadiusLimit=null;const t=fe(this._scene);return e.zoomOnBoundingInfo(t.min,t.max),this.wheelPrecision=100/this.radius,null===this.lowerRadiusLimit&&(this.lowerRadiusLimit=.1),this.lastFocus.copyFrom(this.target),e}rerunFramingBehavior(e,t){const i=this.getFramingBehavior();i.framingTime=t||800;const a=fe(this._scene),n=a.max.subtract(a.min),s=a.min.add(n.scale(.5));this.setRadius(1.5*n.length()),this.wheelPrecision=100/this.radius,this.panningInertia=0,this.panningOriginTarget.copyFrom(s),this.panDenominator=n.length(),i.zoomOnBoundingInfo(a.min,a.max,void 0,(()=>{e&&e()})),i.framingTime=0}enableAutoRotationBehavior(e=5e3){this.useAutoRotationBehavior=!0;const t=this.getAutoRotationBehavior();t&&(t.idleRotationWaitTime=e)}disableAutoRotationBehavior(){this.useAutoRotationBehavior=!1}setRadius(e){this.radius=e,this.maxZ=1e3*this.radius,this.lowerRadiusLimit=.01*this.radius,this.upperRadiusLimit=1.5*this.radius,this.wheelPrecision=100/this.radius,this.pinchPrecision=300/this.radius}static create(e,t,i){const a=fe(e),n=a.max.subtract(a.min),s=a.min.add(n.scale(.5)),r=new be("ProductCamera",-Math.PI/2,Math.PI/2,1.5*n.length(),s,e,t);return r.panningInertia=0,r.panningOriginTarget.copyFrom(s),r.panDenominator=n.length(),r.onAfterCheckInputsObservable.add((()=>{r.panningSensibility=1e3/r.panDenominator})),i&&(e.activeCamera=r),r}}function fe(e){if(0===e.meshes.length)return{min:new l(-1,-1,-1),max:new l(1,1,1)};const t=e.meshes.filter((e=>e.name.toLowerCase().endsWith("_t")||e.name.toLowerCase().includes("_t_")));return e.getWorldExtends((e=>e.isVisible&&e.isEnabled()&&(0===t.length||t.includes(e))))}function ve(e,t,i){return t in e?Object.defineProperty(e,t,{value:i,enumerable:!0,configurable:!0,writable:!0}):e[t]=i,e}class ye{constructor(e,t=!1,i){ve(this,"renderingPipeline",void 0),ve(this,"currentConfiguration",void 0),this.renderingPipeline=new F("default",t,e,i?[i]:void 0,!1),this.renderingPipeline.isSupported&&(this.renderingPipeline.prepare(),this.setConfiguration(K))}dispose(){this.renderingPipeline.dispose()}getConfiguration(){return this.currentConfiguration}setConfiguration(e){if(this.renderingPipeline.isSupported){if(this.renderingPipeline.samples=e.antiAliasing?.samples??K.antiAliasing.samples,this.renderingPipeline.fxaaEnabled=e.antiAliasing?.fxaaEnabled??K.antiAliasing.fxaaEnabled,this.renderingPipeline.bloomEnabled=e.bloom?.enabled??K.bloom.enabled,this.renderingPipeline.bloomKernel=e.bloom?.kernel??K.bloom.kernel,this.renderingPipeline.bloomScale=e.bloom?.scale??K.bloom.scale,this.renderingPipeline.bloomThreshold=e.bloom?.threshold??K.bloom.threshold,this.renderingPipeline.bloomWeight=e.bloom?.weight??K.bloom.weight,this.renderingPipeline.chromaticAberrationEnabled=e.chromaticAberration?.enabled??K.chromaticAberration.enabled,this.renderingPipeline.chromaticAberration.aberrationAmount=e.chromaticAberration?.aberrationAmount??K.chromaticAberration.aberrationAmount,this.renderingPipeline.chromaticAberration.radialIntensity=e.chromaticAberration?.radialIntensity??K.chromaticAberration.radialIntensity,this.renderingPipeline.chromaticAberration.direction=e.chromaticAberration?.direction?new h(e.chromaticAberration.direction.x,e.chromaticAberration.direction.y):new h(K.chromaticAberration.direction.x,K.chromaticAberration.direction.y),this.renderingPipeline.imageProcessing.colorCurvesEnabled=e.colorCurves?.enabled??K.colorCurves.enabled,this.renderingPipeline.imageProcessing.colorCurves=e.colorCurves?this.updateColorCurve(e.colorCurves):new I,this.renderingPipeline.depthOfFieldEnabled=e.depthOfField?.enabled??K.depthOfField.enabled,e.depthOfField)switch(e.depthOfField.blurLevel??K.depthOfField.blurLevel){case"Low":this.renderingPipeline.depthOfFieldBlurLevel=k.Low;break;case"Medium":this.renderingPipeline.depthOfFieldBlurLevel=k.Medium;break;case"High":this.renderingPipeline.depthOfFieldBlurLevel=k.High}if(this.renderingPipeline.depthOfField.focalLength=e.depthOfField?.focalLength??K.depthOfField.focalLength,this.renderingPipeline.depthOfField.fStop=e.depthOfField?.fStop??K.depthOfField.fStop,this.renderingPipeline.depthOfField.focusDistance=e.depthOfField?.focusDistance??K.depthOfField.focusDistance,this.renderingPipeline.depthOfField.lensSize=e.depthOfField?.lensSize??K.depthOfField.lensSize,this.renderingPipeline.grainEnabled=e.grain?.enabled??K.grain.enabled,this.renderingPipeline.grain.animated=e.grain?.animated??K.grain.animated,this.renderingPipeline.grain.intensity=e.grain?.intensity??K.grain.intensity,this.renderingPipeline.imageProcessing.contrast=e.misc?.contrast??K.misc.contrast,this.renderingPipeline.imageProcessing.exposure=e.misc?.exposure??K.misc.exposure,this.renderingPipeline.imageProcessing.toneMappingEnabled=e.misc?.toneMappingEnabled??K.misc.toneMappingEnabled,this.renderingPipeline.imageProcessing.toneMappingEnabled)switch(e.misc.toneMappingType??K.misc.toneMappingType){case"Standard":this.renderingPipeline.imageProcessing.toneMappingType=S.TONEMAPPING_STANDARD;break;case"ACES":this.renderingPipeline.imageProcessing.toneMappingType=S.TONEMAPPING_ACES}if(this.renderingPipeline.sharpenEnabled=e.sharpen?.enabled??K.sharpen.enabled,this.renderingPipeline.sharpen.colorAmount=e.sharpen?.colorAmount??K.sharpen.colorAmount,this.renderingPipeline.sharpen.edgeAmount=e.sharpen?.edgeAmount??K.sharpen.edgeAmount,this.renderingPipeline.imageProcessing.vignetteEnabled=e.vignette?.enabled??K.vignette.enabled,e.vignette?.center?(this.renderingPipeline.imageProcessing.vignetteCenterX=e.vignette.center.x,this.renderingPipeline.imageProcessing.vignetteCenterY=e.vignette.center.y):(this.renderingPipeline.imageProcessing.vignetteCenterX=K.vignette.center.x,this.renderingPipeline.imageProcessing.vignetteCenterY=K.vignette.center.y),e.vignette)switch(e.vignette?.blendMode??K.vignette.blendMode){case"Multiply":this.renderingPipeline.imageProcessing.vignetteBlendMode=S.VIGNETTEMODE_MULTIPLY;break;case"Opaque":this.renderingPipeline.imageProcessing.vignetteBlendMode=S.VIGNETTEMODE_OPAQUE}e.vignette?.colorRgba?this.renderingPipeline.imageProcessing.vignetteColor=new o(e.vignette.colorRgba.r,e.vignette.colorRgba.g,e.vignette.colorRgba.b,e.vignette.colorRgba.a):e.vignette?.colorHex?this.renderingPipeline.imageProcessing.vignetteColor=o.FromHexString(e.vignette.colorHex):this.renderingPipeline.imageProcessing.vignetteColor=new o(K.vignette.colorRgba.r,K.vignette.colorRgba.g,K.vignette.colorRgba.b,K.vignette.colorRgba.a),this.renderingPipeline.imageProcessing.vignetteStretch=e.vignette?.stretch??K.vignette.stretch,this.renderingPipeline.imageProcessing.vignetteWeight=e.vignette?.weight??K.vignette.weight,this.renderingPipeline.prepare(),this.currentConfiguration=e}}updateColorCurve(e){const t=new I;return t.globalDensity=e.globalDensity??t.globalDensity,t.globalExposure=e.globalExposure??t.globalExposure,t.globalHue=e.globalHue??t.globalHue,t.globalSaturation=e.globalSaturation??t.globalSaturation,t.highlightsDensity=e.highlightsDensity??t.highlightsDensity,t.highlightsExposure=e.highlightsExposure??t.highlightsExposure,t.highlightsHue=e.highlightsHue??t.highlightsHue,t.highlightsSaturation=e.highlightsSaturation??t.highlightsSaturation,t.midtonesDensity=e.midtonesDensity??t.midtonesDensity,t.midtonesExposure=e.midtonesExposure??t.midtonesExposure,t.midtonesHue=e.midtonesHue??t.midtonesHue,t.midtonesSaturation=e.midtonesSaturation??t.midtonesSaturation,t.shadowsDensity=e.shadowsDensity??t.shadowsDensity,t.shadowsExposure=e.shadowsExposure??t.shadowsExposure,t.shadowsHue=e.shadowsHue??t.shadowsHue,t.shadowsSaturation=e.shadowsSaturation??t.shadowsSaturation,t}}function Me(e,t,i){return t in e?Object.defineProperty(e,t,{value:i,enumerable:!0,configurable:!0,writable:!0}):e[t]=i,e}u.GLTFLoader.RegisterExtension("glbPostProcessor",(function(e){return new Z(e)})),n.OnPluginActivatedObservable.add((e=>{if("gltf"===e.name){e.transparencyAsCoverage=!0}}));class we{constructor(e){Me(this,"camera",void 0),Me(this,"configuration",void 0),Me(this,"engine",void 0),Me(this,"scene",void 0),Me(this,"loadProgress",new Map([["initialScene",0]])),Me(this,"queuedCameraAnimation",void 0),Me(this,"focusLostNotified",!1),Me(this,"loadObservable",new d),Me(this,"focusLostObservable",new d),Me(this,"initializedCallbacks",[]),Me(this,"isInitialized",!1),Me(this,"modelLoadEventCallbacks",[]),Me(this,"highlightLayer",void 0),Me(this,"renderingPipeline",void 0),Me(this,"modelContainers",new Map),Me(this,"plugins",[]),Me(this,"screenshotPrepareResolve",void 0);const a=e?.noRender?void 0:document.createElement("canvas");this.configuration=new _(e);c.Configuration={decoder:{wasmUrl:"https://www.gstatic.com/draco/versioned/decoders/1.5.6/draco_wasm_wrapper_gltf.js",wasmBinaryUrl:"https://www.gstatic.com/draco/versioned/decoders/1.5.6/draco_decoder_gltf.wasm",fallbackUrl:"https://www.gstatic.com/draco/versioned/decoders/1.5.6/draco_decoder_gltf.js"}},a&&(a.getContext("webgl2")||a.getContext("webgl"));const n=console.log;console.log=()=>{};const s=a?new t(a,!0,{adaptToDeviceRatio:!0,limitDeviceRatio:2,premultipliedAlpha:!1,preserveDrawingBuffer:!!e?.backgroundImage,audioEngine:!1,stencil:this.configuration.highlights.enabled,forceSRGBBufferSupportState:!0}):new i;console.log=n,s.hideLoadingUI(),window.addEventListener("resize",this.fireResizeEvent.bind(this)),this.engine=s,this.scene=new g(s),this.camera=be.create(this.scene,this.configuration),this.renderingPipeline=new ye(this.scene,!1,this.camera),this.scene.imageProcessingConfiguration.exposure=this.configuration.lighting.exposure,this.scene.imageProcessingConfiguration.contrast=this.configuration.lighting.contrast}getEngineContext(){return{engine:this.engine,scene:this.scene,camera:this.camera}}registerFocusLostListener(e){this.focusLostObservable.add(e)}unregisterFocusLostListener(e){this.focusLostObservable.removeCallback(e)}registerLoadProgressListener(e){this.loadObservable.add(e),e(this.getLoadListenerEvent())}unregisterLoadProgressListener(e){this.loadObservable.removeCallback(e)}registerInitializedListener(e){this.isInitialized||!this.isInitialized&&this.initializedCallbacks.push(e)}unregisterInitializedListener(e){if(this.isInitialized)return;const t=this.initializedCallbacks.indexOf(e);t>-1&&this.initializedCallbacks.splice(t,1)}getIsInitialized(){return this.isInitialized}registerModelLoadEventListener(e){this.modelLoadEventCallbacks.push(e)}unregisterModelLoadEventListener(e){const t=this.modelLoadEventCallbacks.indexOf(e);t>-1&&this.modelLoadEventCallbacks.splice(t,1)}registerView(e){const t=e.height,i=e.width;this.engine.registerView(e),e.setAttribute("height",t.toString()),e.setAttribute("width",i.toString()),this.orbitEnabled()||this.setCameraState(z.Pan),this.reattachControls(e)}getNumViewports(){return this.engine.views?.length||0}unregisterView(e){this.engine.unRegisterView(e)}shutdown(){this.plugins.forEach((e=>e.dispose(!0))),this.renderingPipeline.dispose(),this.engine&&this.engine.dispose(),window.removeEventListener("resize",this.fireResizeEvent)}getSceneInitializationProgress(){return this.loadProgress.get("initialScene")}async initialize(e){let t;if(this.scene.clearColor=this.configuration.scene.clearColor,this.scene.environmentTexture=s.CreateFromPrefilteredData(this.configuration.scene.environmentFile,this.scene),e){const i=100;t=await this.loadModel(e,(e=>{this.loadProgress.set("initialScene",e.loaded*i/e.total),this.notifyLoadHandlers()})).getInitializationPromise()}return this.loadProgress.set("initialScene",100),this.notifyLoadHandlers(),this.scene.activeCamera=this.camera,this.camera.rerunFramingBehavior(void 0,1),ie(this.scene.animationGroups),this.engine.views?.length>=1&&this.reattachControls(this.engine.views[this.engine.views.length-1].target),this.queuedCameraAnimation&&(this.executeCameraAnimation(this.queuedCameraAnimation),this.queuedCameraAnimation=void 0),this.isInitialized=!0,await Promise.all(this.initializedCallbacks.map((e=>e()))),this.initializedCallbacks=[],this.configuration.options?.renderingPipelineConfiguration&&this.renderingPipeline.setConfiguration(this.configuration.options.renderingPipelineConfiguration),this.engine.runRenderLoop((()=>{this.engine.views&&(this.modelContainers.forEach((e=>{e.updateDynamicTextures()})),this.configuration.scene.transparentBackground&&this.engine.views.forEach((e=>{const t=this.engine.getRenderingCanvas();e.target.getContext("2d").clearRect(0,0,t.width,t.height)})),this.scene.render(),this.camera.target.equalsWithEpsilon(this.camera.lastFocus,.1)||this.focusLostNotified||(this.focusLostObservable.notifyObservers(void 0),this.focusLostNotified=!0),this.screenshotPrepareResolve&&(this.screenshotPrepareResolve(),this.screenshotPrepareResolve=void 0))})),t}executeCameraAnimation(e){100===this.getSceneInitializationProgress()&&this.camera&&this.scene.activeCamera===this.camera?ae(this.scene,this.scene.activeCamera,e):this.queuedCameraAnimation=e}getCameraPose(){if(this.scene&&this.camera)return{lonDeg:Math.round(180*this.camera.alpha/Math.PI),latDeg:Math.round(180*this.camera.beta/Math.PI),radius:Math.round(1e4*(this.camera.radius+Number.EPSILON))/1e4,target:{x:this.camera.target.x,y:this.camera.target.y,z:this.camera.target.z}}}setCameraPose(e){this.scene&&this.camera&&(this.camera.target=new l(e.target.x,e.target.y,e.target.z),this.camera.radius=e.radius,this.camera.alpha=e.latDeg,this.camera.beta=e.lonDeg)}setCameraState(e){if(!this.engine?.views||!this.engine?.views[0])throw new Error("No views attached, camera state requires a view to attach controls onto.");e===z.Orbit?this.reattachControls(this.engine.views[0].target,2):this.reattachControls(this.engine.views[0].target,0)}animateToLastCameraFocus(){return new Promise((e=>{const t=this.configuration;this.camera.rerunFramingBehavior((()=>{this.focusLostNotified=!1,t.camera.limits.min.radius&&(this.camera.lowerRadiusLimit=t.camera.limits.min.radius),t.camera.limits.max.radius&&(this.camera.upperRadiusLimit=t.camera.limits.max.radius),e()}))}))}setAutoRotation(e){this.configuration.camera.autoRotation.enabled&&this.camera&&(e?this.camera.enableAutoRotationBehavior(this.configuration.camera.autoRotation.idleTimeMs):this.camera.disableAutoRotationBehavior())}getCurrentConfiguration(){return this.configuration.options}async renderSceneScreenshot(t,i){if(!this.camera)throw new Error("Missing product camera, cannot render screenshot!");const a=new e("screenshotCamera",0,0,0,l.Zero(),this.scene);try{const e=i.latDeg*Math.PI/180,n=i.lonDeg*Math.PI/180;a.target=i.target?new l(i.target.x,i.target.y,i.target.z):l.Zero(),a.alpha=n,a.beta=e,a.radius=i.radius||this.camera.radius,a.minZ=.01,this.scene.render();const s=await m.CreateScreenshotUsingRenderTargetAsync(this.engine,a,t,"image/png",2,!0);return a.dispose(),s}catch(e){throw a.isDisposed()||a.dispose(),new Error("Failed to render screenshot")}}orbitEnabled(){const e=this.configuration;if(!e)return!0;const t=e.camera.limits.min.alpha,i=e.camera.limits.max.alpha,a=e.camera.limits.min.beta,n=e.camera.limits.max.beta;if(void 0===t||void 0===i||void 0===a||void 0===n)return!0;const s=[a,n],r=[t,i].every((e=>e===t)),o=s.every((e=>e===a));return!r&&!o}fireResizeEvent(){this.getNumViewports()>0&&this.engine.resize()}setHighlights(e,t){0===e.length&&(this.highlightLayer?.dispose(),this.highlightLayer=void 0),this.highlightLayer||(this.highlightLayer=new a("highlights",this.scene,{isStroke:!0,blurVerticalSize:.85,blurHorizontalSize:.85}),this.highlightLayer.innerGlow=!0,this.highlightLayer.outerGlow=!1),this.highlightLayer.removeAllMeshes();const i=t?new r(t[0],t[1],t[2]).toLinearSpace():void 0;e.forEach((e=>{const t=this.scene.materials.find((t=>t.name===e.name&&t.id===e.id));t&&t.getBindedMeshes().forEach((e=>this.highlightLayer?.addMesh(e,i||r.FromHexString("#fcba03"))))}))}setRenderingPipelineConfiguration(e){this.renderingPipeline&&this.renderingPipeline.setConfiguration(e)}loadModel(e,t){const i=new ue({enablePicking:this.configuration.highlights.enabled,modelDetails:e,scene:this.scene,previewService:this,progressHandler:t});return i.registerMaterialVariantListener((e=>this.handleMaterialProgressCallback(e.remainingCount,e.totalCount,e.taskName))),i.registerModelVariantListener((e=>this.handleModelProgressCallback(e,e.key))),this.configuration.highlights.enabled&&(i.registerMaterialSelectedCallback((e=>{this.setHighlights([e])})),i.registerMaterialDeselectedCallback((()=>{this.setHighlights([])}))),this.modelContainers.set(i.getId(),i),this.triggerModelLoadEvent({eventType:"load",modelContainer:i}),i}getAllModels(){return Array.from(this.modelContainers.values())}getModelById(e){return this.modelContainers.get(e)}registerPlugin(e){this.plugins.push(e),e.initialize(this,{camera:this.camera,engine:this.engine,scene:this.scene})}unregisterPlugin(e){const t=this.plugins.indexOf(e);if(t>-1){this.plugins.splice(t,1).forEach((e=>e.dispose(!1)))}}getConfiguration(){return this.configuration}modelUnloaded(e){this.modelContainers.delete(e.getId()),this.triggerModelLoadEvent({eventType:"unload",modelContainer:e})}triggerModelLoadEvent(e){this.modelLoadEventCallbacks.forEach((t=>t(e)))}handleMaterialProgressCallback(e,t,i){this.loadProgress.set(`key_${i}`,e/t*100),this.notifyLoadHandlers()}handleModelProgressCallback(e,t){this.loadProgress.set(t,100*e.loaded/e.total),this.notifyLoadHandlers()}reattachControls(e,t=2){if(this.scene.detachControl(),this.engine.inputElement=e,this.camera){this.camera.attachControl(!0,!1,t);this.camera.inputs.attached.pointers.multiTouchPanning=!1}this.scene.attachControl(!0,!0,!0)}getLoadListenerEvent(){const e=Array.from(this.loadProgress.values()).filter((e=>e<100)),t=e.reduce(((e,t)=>e+t),0)/e.length||0;return{loadValue:0===e.length?100:t,sceneInitialized:100===this.getSceneInitializationProgress()}}notifyLoadHandlers(){this.loadObservable.notifyObservers(this.getLoadListenerEvent())}}export{z as ProductCameraRig,j as MaterialEffectMode,we as SpiffCommerce3DPreviewService,q as RenderingConfiguration,U as REFLECTION_PROBE_RESOLUTION,K as renderingPipelineDefaults};
|
|
2
2
|
//# sourceMappingURL=module.js.map
|
package/dist/types.d.ts
CHANGED
|
@@ -469,6 +469,10 @@ export type PreviewOptions = {
|
|
|
469
469
|
*/
|
|
470
470
|
contrast?: number;
|
|
471
471
|
};
|
|
472
|
+
/**
|
|
473
|
+
* The intensity of the glow effect that is present when a material has an emissive texture.
|
|
474
|
+
*/
|
|
475
|
+
readonly emissiveGlowIntensity?: number;
|
|
472
476
|
/**
|
|
473
477
|
* When true the preview system operates in a noRender mode. It silently accepts all requests and modifies internal state
|
|
474
478
|
* based on those requests. However no rendering will actually be occuring. Can be useful in situations where testing requires
|
|
@@ -916,6 +920,7 @@ declare class Configuration {
|
|
|
916
920
|
exposure: number;
|
|
917
921
|
contrast: number;
|
|
918
922
|
};
|
|
923
|
+
get emissiveGlowIntensity(): number;
|
|
919
924
|
}
|
|
920
925
|
/**
|
|
921
926
|
* Represents the dimensions of a texture, enforcing power of two numbers.
|
|
@@ -1044,6 +1049,7 @@ export class SpiffCommerce3DPreviewService implements ThreeDPreviewService {
|
|
|
1044
1049
|
getModelById(id: string): ModelContainer | undefined;
|
|
1045
1050
|
registerPlugin(plugin: PreviewServicePlugin): void;
|
|
1046
1051
|
unregisterPlugin(plugin: PreviewServicePlugin): void;
|
|
1052
|
+
getConfiguration(): Configuration;
|
|
1047
1053
|
modelUnloaded(modelContainer: ModelContainer): void;
|
|
1048
1054
|
}
|
|
1049
1055
|
|
package/package.json
CHANGED