shop-components 0.4.8 → 0.4.9

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.
@@ -1,4 +1,4 @@
1
- import { ColorRepresentation, Object3D, Vector3, Ray } from "three";
1
+ import { Camera, ColorRepresentation, Object3D, Ray, Vector3, Intersection } from "three";
2
2
  export interface LaserEmitter2DParams {
3
3
  initialAngle?: number;
4
4
  fov?: number;
@@ -7,42 +7,76 @@ export interface LaserEmitter2DParams {
7
7
  color?: ColorRepresentation;
8
8
  lineWidth?: number;
9
9
  plane?: 'xy' | 'xz' | 'yz';
10
- glow?: boolean;
11
- glowIntensity?: number;
12
- fadeTime?: number;
10
+ clockwise?: boolean;
13
11
  trailSegments?: number;
12
+ collisionTargets?: Object3D[];
13
+ camera?: Camera;
14
+ }
15
+ export interface LaserHitInfo {
16
+ hit: boolean;
17
+ point?: Vector3;
18
+ distance?: number;
19
+ object?: Object3D;
20
+ intersection?: Intersection;
14
21
  }
15
22
  export declare class LaserEmitter2D extends Object3D {
16
23
  private params;
17
- private laserLine;
18
- private laserMaterial;
19
- private laserGeometry;
20
24
  private glowLine;
21
25
  private glowMaterial;
22
26
  private trailLines;
23
27
  private trailGeometry;
24
28
  private trailMaterial;
25
- private segmentTimestamps;
29
+ private sweepMesh;
30
+ private sweepGeometry;
31
+ private sweepMaterial;
32
+ private sweepBorder;
33
+ private sweepBorderGeometry;
34
+ private sweepBorderMaterial;
35
+ private sweepBorderGlow;
36
+ private sweepBorderGlowMaterial;
37
+ private sweepBorderPositions;
38
+ private sweepBorderPulseSpeed;
26
39
  private currentTime;
27
40
  private currentAngleOffset;
28
- private scanDirection;
29
41
  private _color;
42
+ private raycaster;
43
+ private collisionTargets;
44
+ private _camera;
45
+ private _currentHitInfo;
46
+ private segmentDistances;
47
+ private lastCollisionUpdateTime;
48
+ private collisionUpdateInterval;
49
+ private collisionCache;
50
+ private anglePrecision;
51
+ private cacheValid;
30
52
  constructor(options?: LaserEmitter2DParams);
31
- private createGlowEffect;
53
+ private createSweepMesh;
54
+ private updateSweepBorderGlowStyle;
55
+ private updateSweepMeshPositions;
56
+ private getDirectionFromAngle;
32
57
  private getEndPointFromAngle;
58
+ private checkCollision;
33
59
  private getSegmentIndex;
60
+ private getAngleFromOffset;
61
+ clearCache(): void;
34
62
  private getAngleFromSegment;
35
63
  private initTrailPositions;
64
+ private updateTrailPositions;
36
65
  private updateLaserPosition;
37
- private updateTrail;
66
+ private updateSweepRange;
38
67
  update(deltaTime: number): void;
39
68
  reset(): void;
40
69
  setColor(color: ColorRepresentation): void;
41
70
  setDistance(distance: number): void;
42
71
  setFov(fov: number): void;
43
72
  setRotationSpeed(speed: number): void;
44
- setFadeTime(time: number): void;
45
73
  setInitialAngle(angle: number): void;
74
+ setCollisionTargets(targets: Object3D[]): void;
75
+ addCollisionTarget(target: Object3D): void;
76
+ removeCollisionTarget(target: Object3D): void;
77
+ clearCollisionTargets(): void;
78
+ getHitInfo(): LaserHitInfo;
79
+ setCamera(camera: Camera): void;
46
80
  getCurrentDirection(): Vector3;
47
81
  getRay(): Ray;
48
82
  getEndPoint(): Vector3;
@@ -3924,7 +3924,7 @@ vec3 texelOld = texture2D(previousShadowMap, vUv).rgb;
3924
3924
  // Combine
3925
3925
  gl_FragColor = vec4(uColor, alpha * fade * uOpacity);
3926
3926
  }
3927
- `});super(s,a),this.position.z=-.02}}const Sc="https://cdn2.seer-group.com/libs/hdr/aristea_wreck_512.hdr",Mc="https://cdn2.seer-group.com/libs/hdr/lightroom_14b_512.hdr",Cc="https://cdn2.seer-group.com/libs/fonts.type.json",Rc=new hn.Font(Cc);class as{constructor(e){var t;this._props=e,this.name="",this._defaults={color:""},this.color="",this.name=this._props.name,this.color=this._defaults.color="#"+((t=e.target.color)==null?void 0:t.getHexString())}change(e){var t;this.color=e,(t=this._props.target.color)==null||t.set(e)}reset(){this.change(this._defaults.color)}}var Jr=(n=>(n[n.DEFAULT=0]="DEFAULT",n[n.CAN_INSTALL=1]="CAN_INSTALL",n))(Jr||{});const vr=.15;f.Object3D.DEFAULT_UP.set(0,0,1);let ot,ci=0,ls=0;const Ic=()=>{ot=void 0,ci=0,ls=0},Dc=new f.MeshBasicMaterial({colorWrite:!1});class Lc{constructor(e){this.props=e,this.stats=new Pt,this.scene=new f.Scene,this.overlayScene=new f.Scene,this.renderer=new f.WebGLRenderer({antialias:!0,alpha:!0,logarithmicDepthBuffer:!0,powerPreference:"high-performance",preserveDrawingBuffer:!0}),this.css2dRenderer=new ve.CSS2DRenderer,this.mousePos=new f.Vector2,this.mouseCoord=new f.Vector2,this.offset=new f.Vector2,this.size=new f.Vector2,this.amr=new Gr({showSizeBox:!0,showController:!0}),this._selectedForOutline=[],this._clock=new f.Clock(!0),this._uiHiddenTime=this._clock.getElapsedTime(),this.camera=new f.PerspectiveCamera(39.6,window.innerWidth/window.innerHeight,.1,1e4),this.d=2,this.orthographicCamera=new f.OrthographicCamera(-this.d*(window.innerWidth/window.innerHeight),this.d*(window.innerWidth/window.innerHeight),this.d,-this.d,.1,1e3),this._axisMoving=!1,this._container=new f.Group,this._raycaster=new f.Raycaster,this._selected=[],this._pointerDownTimeout=0,this._dragging=!1,this.maxSample=1024*2,this.sampleCount=0,this._usePathTracing=!1,this._fpsCache=[],this._fpsCacheMax=20,this._emitter=new mt,this.sound=new Na,this._rafId=null,this._destroyed=!1,this._ground=new f.Mesh(new f.PlaneGeometry(100,100),new f.MeshPhysicalMaterial({color:new f.Color("#eee"),metalness:.4,roughness:.1,clearcoat:1,clearcoatRoughness:.1})),this._sciFiGrid=new Tc(18,40),this._amrRender=new f.WebGLRenderTarget(1024,1024,{format:f.RGBAFormat,type:f.UnsignedByteType,colorSpace:f.SRGBColorSpace,samples:8}),this._lastTarget=new f.Vector3,this._shadowMode=!1,this.addEventListener=this._emitter.on.bind(this._emitter),this.removeEventListener=this._emitter.on.bind(this._emitter),this._showSlots=!0,this._showSize=!0,this._showControls=!0,this._drag=c=>{this._dragging=!0,this._pointermove(c)},this._dragend=c=>{this._dragging=!1},this._pointermove=c=>{if(this._pointerDownTimeout)return clearTimeout(this._pointerDownTimeout),this._pointerDownTimeout=0;let{top:u,left:d}=this.renderer.domElement.getBoundingClientRect();this.offset.set(d,u),this.mousePos.set(c.clientX-d,c.clientY-u),this.mouseCoord.set((c.clientX-d)/this.size.x*2-1,-((c.clientY-u)/this.size.y)*2+1),this._raycaster.setFromCamera(this.mouseCoord,this.camera)},this._pointerdown=c=>{const u=()=>{this.amr.slots.forEach(r=>r.selected=!1);const p=this._raycaster.intersectObjects(this.amr.slots,!1)[0];p&&this.amr.slots.forEach(r=>{r.traverse(l=>{l==p.object||(r.deviceSelected=!1)})}),this._pointerDownTimeout=0};this._pointerDownTimeout=window.setTimeout(u,200)},this._detectTrackpad=()=>{ot||typeof ot<"u"||(ci===0&&(ls=performance.now()),ci++,performance.now()-ls>66&&(ci>5?ot=!0:ot=!1,ot?this.controls.zoomSpeed=.2:this.controls.zoomSpeed=1,setTimeout(Ic,2e3)))},this.debounceForkHeightChange=Qa(()=>{var c;(c=this._progressShadow)==null||c.recalculate()},300),this.focusObjects=(c,u)=>{var X;if(!c.length){this.fit();return}this.scene.updateMatrixWorld(!0),this._focusRestoreView=void 0,(X=this._fitAnimation)==null||X.stop();const d=new f.Box3,p=new f.Box3,r=new f.Vector3,l=new f.Vector3,h=new f.Vector3,g=new f.Vector3,_=U=>{U.geometry&&(U.geometry.boundingBox||U.geometry.computeBoundingBox(),p.copy(U.geometry.boundingBox).applyMatrix4(U.matrixWorld),p.isEmpty()||d.union(p))},m=U=>{var bs,As;const G=U.geometry,ne=(bs=G==null?void 0:G.attributes)==null?void 0:bs.position;if(!ne){_(U);return}const te=((As=G.morphAttributes)==null?void 0:As.position)||[],ws=U.morphTargetInfluences||[],en=te.length>0&&ws.length>0;for(let Se=0;Se<ne.count;Se++){if(r.set(ne.getX(Se),ne.getY(Se),ne.getZ(Se)),en){l.set(0,0,0);let yi=0;for(let Ge=0;Ge<te.length;Ge++){const Ot=ws[Ge]||0;Ot&&(yi+=Ot,h.set(te[Ge].getX(Se),te[Ge].getY(Se),te[Ge].getZ(Se)),G.morphTargetsRelative,l.addScaledVector(h,Ot))}G.morphTargetsRelative?r.add(l):yi>0&&(r.multiplyScalar(1-yi),r.add(l))}g.copy(r).applyMatrix4(U.matrixWorld),d.expandByPoint(g)}};if(c.forEach(U=>{U.traverse(G=>{if(G.visible){if(G instanceof f.Mesh){m(G);return}(G.isPoint||G.isLine)&&_(G)}})}),d.isEmpty())return;const v=new f.Vector3;d.getCenter(v);const y=new f.Vector3;d.getSize(y);const x=v.clone();this._lastTarget.copy(x);let w;u?w=u.clone().normalize().negate():w=this.camera.position.clone().sub(this.controls.target).normalize();const b=y.clone().multiplyScalar(.5),A=[new f.Vector3(b.x,b.y,b.z),new f.Vector3(b.x,b.y,-b.z),new f.Vector3(b.x,-b.y,b.z),new f.Vector3(b.x,-b.y,-b.z),new f.Vector3(-b.x,b.y,b.z),new f.Vector3(-b.x,b.y,-b.z),new f.Vector3(-b.x,-b.y,b.z),new f.Vector3(-b.x,-b.y,-b.z)],S=new f.Vector3(0,1,0);Math.abs(w.dot(S))>.99&&S.set(0,0,1);const C=new f.Vector3().crossVectors(w,S).normalize(),M=new f.Vector3().crossVectors(C,w).normalize();let I=0;A.forEach(U=>{const G=U.dot(C),ne=U.dot(M),te=Math.sqrt(G*G+ne*ne);I=Math.max(I,te)}),I=I/2+.4;const D=this.camera.fov*Math.PI/180,T=2*Math.atan(Math.tan(D/2)*this.camera.aspect),R=I/Math.tan(T/2),L=I/Math.tan(D/2),F=Math.max(R,L),E=v.clone().add(w.multiplyScalar(F)),z=this.camera.position.clone(),N=this.controls.target.clone();let j=500;const Z=z.distanceTo(E)+N.distanceTo(x);Z>.001&&(j=Math.min(1e3,Math.max(450,Z*45))),this._animateCamera(z,E,N,x,j)},this.focusSlots=c=>{var M,I;if(this.amr.slots.forEach(D=>{D.focused=!1,D.hide()}),!c.length)if(this._lastTarget.set(0,0,this._lastTarget.z),this.amr.slots.forEach(D=>{D.show()}),this.shadowMode=!1,this._focusRestoreView){const D=this._focusRestoreView;this._focusRestoreView=void 0;const T=this.camera.position.clone(),R=this.controls.target.clone(),L=D.position.clone(),F=D.target.clone();let E=500;const z=T.distanceTo(L)+R.distanceTo(F);z>.001&&(E=Math.min(1e3,Math.max(450,z*45))),this._animateCamera(T,L,R,F,E,()=>{this.camera.up.copy(D.up)});return}else{this.fit();return}(M=this._fitAnimation)!=null&&M.isPlaying()||this.shadowMode||(this._focusRestoreView={position:this.camera.position.clone(),target:new f.Vector3(0,0,this.controls.target.z),up:this.camera.up.clone()}),(I=this._fitAnimation)==null||I.stop(),this.shadowMode=!0;const u=c.flatMap(D=>{if(D.show(),D.focused=!0,!D.parent)return[];const T=new f.Vector3;return D.parent.getWorldPosition(T),[T]});if(!u.length)return;const d=u.reduce((D,T)=>D.add(T),new f.Vector3).multiplyScalar(1/u.length),p=this.controls.target.clone(),r=this.camera.position.clone().sub(p).normalize();let l=0;for(const D of u){const T=D.clone().sub(d),R=T.dot(r),L=Math.sqrt(Math.max(0,T.lengthSq()-R*R));L>l&&(l=L)}l=l+.4;const h=this.camera.fov*Math.PI/180,g=2*Math.atan(Math.tan(h/2)*this.camera.aspect),_=l/Math.tan(g/2),m=l/Math.tan(h/2),v=Math.max(_,m),y=d.clone(),x=d.clone().add(r.clone().multiplyScalar(v<1?1:v)),w=this.camera.position.clone(),b=p.clone(),A={t:0};let S=500;const C=w.distanceTo(x)+b.distanceTo(y);C>.001&&(S=Math.min(1e3,Math.max(450,C*45))),this._lastTarget=y.clone(),this._fitAnimation=new hi(A).to({t:1},S).easing(Fe.Easing.Quadratic.InOut).onStart(()=>{this.controls.enabled=!1}).onUpdate(()=>{const D=A.t;this.camera.position.lerpVectors(w,x,D),this.controls.target.lerpVectors(b,y,D)}).onComplete(()=>{this.controls.enabled=!0}).start()},this.fit=()=>{this._focusRestoreView=void 0,new f.Box3().setFromObject(this._container);const u=this.amr.sizeBox.size.getSize(new f.Vector3),d=u.clone().multiplyScalar(.5),p=new f.Vector3(0,0,d.z);this._lastTarget.copy(p);let r=d.clone().sub(p);r.lengthSq()<1e-6&&(r=new f.Vector3(1,0,0));const l=r.clone().normalize(),h=u.clone().multiplyScalar(.5),g=[new f.Vector3(h.x,h.y,h.z),new f.Vector3(h.x,h.y,-h.z),new f.Vector3(h.x,-h.y,h.z),new f.Vector3(h.x,-h.y,-h.z),new f.Vector3(-h.x,h.y,h.z),new f.Vector3(-h.x,h.y,-h.z),new f.Vector3(-h.x,-h.y,h.z),new f.Vector3(-h.x,-h.y,-h.z)];let _=0;for(const T of g){const R=T.dot(l),L=Math.sqrt(Math.max(0,T.lengthSq()-R*R));L>_&&(_=L)}_=_*1.05;const m=this.camera.fov*Math.PI/180,v=2*Math.atan(Math.tan(m/2)*this.camera.aspect),y=_/Math.tan(v/2),x=_/Math.tan(m/2),w=Math.max(y,x),b=d.clone();let A=u.z/3;u.z<u.x&&u.z<u.y&&(A=u.x*.8),u.z>u.x&&u.z>u.y&&(A=0),b.z+=A;const S=r.clone().normalize().multiplyScalar(w<1?1:w).add(b);Math.max(u.x*2,5);const C=this.camera.position.clone(),M=this.controls.target.clone();let I=600;const D=C.distanceTo(S)+M.distanceTo(p);D>.001&&(I=Math.min(800,Math.max(650,D*45))),this._animateCamera(C,S,M,p,I,()=>{this.shadowMode||(this._progressShadow.visible=!0,this._progressShadow.isFinished||this._progressShadow.recalculate())}),this.controls.minDistance=Math.max(.2,Math.min(w*.25,w-.1)),this.controls.maxDistance=w*4},this.resize=()=>{var p,r;const c=this.renderer.domElement.parentElement;if(!c)return;c.style.display="flex",this.renderer.domElement.style.width="100%",this.renderer.domElement.style.height="100%",this.renderer.domElement.style.flexGrow="1";const u=c.clientWidth,d=c.clientHeight;this.size.set(u,d),this.camera.aspect=u/d,this.camera.updateProjectionMatrix(),this._amrRender.setSize(u,d),this._updateCamera(),this.css2dRenderer.setSize(u,d),this.renderer.getPixelRatio(),(p=this.pathTracer)==null||p.updateCamera(),this.sampleCount=0,this.renderer.setSize(u,d),(r=this._jumpFlood)==null||r.setSize(u,d)},this.ticker=c=>{if(!this._destroyed){if(this.stats.begin(),this.renderer.domElement.dispatchEvent(new CustomEvent("ticker",{detail:c})),this._rafId=requestAnimationFrame(this.ticker),this.renderer.clear(),this.usePathTracing){this.hideAmrUI(),this.sampleCount<this.maxSample?this.sampleCount++:this.pathTracer.pausePathTracing=!0,this.pathTracer.renderSample();const u=this.renderer.autoClear;this.renderer.autoClear=!1,this.scene.overrideMaterial=Dc,this.renderer.clearDepth(),this.renderer.render(this.scene,this.mainCamera),this.scene.overrideMaterial=null,this.renderer.render(this.overlayScene,this.mainCamera),this.renderer.autoClear=u}else{this._clock.getElapsedTime()-this._uiHiddenTime>.15?this.showControls&&this.amr.controllers.forEach(p=>p.show()):this.amr.controllers.forEach(p=>p.hide());const d=this.stats.fps();if(this.usePathTracing||(this._fpsCache.length>this._fpsCacheMax&&this._fpsCache.shift(),this._fpsCache.push(d)),this.amr.slots.forEach(p=>{this._dragging?p.getCanInstall()&&p.render(this):p.render(this)}),Fe.update(),this.controls.update(),this._progressShadow.update(this.mainCamera),this.css2dRenderer.render(this.scene,this.mainCamera),this.updatePosition(),this.scene.overrideMaterial=null,this.renderer.render(this.scene,this.mainCamera),this._jumpFlood&&this._selectedForOutline.length>0){const p=this.scene.background;this.scene.background=null,this._jumpFlood.render(this._selectedForOutline),this.scene.background=p}}this.stats.end()}},this.stats.showPanel(0),this.hideState(),e.fov&&(this.camera.fov=e.fov,this.camera.updateProjectionMatrix()),kr(He,this.renderer),this._ground.visible=!1,this.controls=new un.OrbitControls(this.camera,this.renderer.domElement),this.controls.enablePan=!0,this.controls.rotateSpeed=this.props.isMobile?.6:.5,this.controls.dampingFactor=vr,this.controls.enableDamping=!0,this.controls.maxDistance=10,this.controls.minDistance=1,this.controls.zoomSpeed=this.props.isMobile?.3:Vr()?.2:1,this._cameraPositionUI=new yc(this.controls),this.renderer.setPixelRatio(window.devicePixelRatio||1),this.renderer.autoClear=!0,this.renderer.toneMapping=f.ACESFilmicToneMapping,this.renderer.toneMappingExposure=1.4,this.renderer.outputColorSpace=f.SRGBColorSpace,this.renderer.localClippingEnabled=!0,this.renderer.shadowMap.enabled=!0,this.css2dRenderer.domElement.style.pointerEvents="none",this.css2dRenderer.domElement.style.position="absolute",this.css2dRenderer.domElement.style.top="0px",this.camera.position.set(10,-10,5),this.camera.lookAt(new f.Vector3);const{tiles:t}=qa();this.pathTracer=new na(this.renderer),this.pathTracer.filterGlossyFactor=.6;let i=window.devicePixelRatio;i<2&&(i=2),this.pathTracer.renderScale=this.props.isMobile?1:i,this.pathTracer.bounces=this.props.isMobile?8:10,this.pathTracer.transmissiveBounces=this.props.isMobile?1:3,this.pathTracer.tiles.set(t,t),this.pathTracer.fadeDuration=0;const s=new pc(e.workerUrl),a=typeof navigator<"u"?navigator.hardwareConcurrency:4;s.maxWorkerCount=a,this.pathTracer.setBVHWorker(s),this.orthographicCamera.left=-20,this.orthographicCamera.right=20,this.orthographicCamera.top=-20,this.orthographicCamera.bottom=20,this._lastTarget=this.controls.target.clone();const o=()=>{let c=this._lastTarget.x,u=this._lastTarget.y;this.controls.target.x=c,this.controls.target.y=u};this.controls.addEventListener("change",()=>{var c;this.sampleCount=0,o(),this._uiHiddenTime=this._clock.getElapsedTime(),this.orthographicCamera.position.copy(this.camera.position),this.orthographicCamera.lookAt(this.controls.target),this.usePathTracing&&(this.pathTracer.pausePathTracing=!1,(c=this.pathTracer)==null||c.updateCamera()),this._updateCamera(),!(Math.abs(this.camera.position.x)<.001||Math.abs(this.camera.position.y)<.001)&&(this._axisMoving||(this.mainCamera=this.camera,this.usePathTracing&&this.generateBVH().then()))}),this._mainCamera=this.camera,this._progressShadow=new gc(this.renderer,this.scene,{size:8,lightCount:e.isMobile?6:12,frames:e.isMobile?80:120,lightRadius:8,ambientWeight:.8}),this._progressShadow.lightOrigin.position.set(3,2.5,6),this._progressShadow.visible=!1,this._container.add(this.amr),this.scene.add(this._container),this.ticker(),this._loadEnv(),this._initEvents(),this.scene.add(this._cameraPositionUI),this._ground.rotateX(-Math.PI/2),this.scene.add(this._ground),this._jumpFlood=new Ac(this.renderer,this.scene,this.camera,{thickness:4,color:"#fff"}),(typeof e.useAxisBall!="boolean"||e.useAxisBall)&&(this._controlsGizmo=new mc(this.controls,{size:160,padding:12,offset:e.axisBallOffset||new f.Vector2(10,10),fontSize:17,bubbleSizePrimary:18,bubbleSizeSecondary:14}),this._controlsGizmo.addListener("axis-select-start",()=>{this._axisMoving=!0,this.mainCamera=this.orthographicCamera,this.usePathTracing&&this.generateBVH().then()}),this._controlsGizmo.addListener("axis-select-end",()=>{this._axisMoving=!1}))}get usePathTracing(){return this._usePathTracing}_clearAmrContent(){const e=this.renderer.getRenderTarget();this.renderer.setRenderTarget(this._amrRender),this.renderer.setClearColor(0,0),this.renderer.clear(!0,!0,!0),this.renderer.setRenderTarget(e)}get shadowMode(){return this._shadowMode}set shadowMode(e){e?(this._progressShadow.visible=!1,this.amr.bodyOpacity=.2):(this._progressShadow.visible=!0,this.amr.bodyOpacity=1,this._progressShadow.isFinished||this._progressShadow.recalculate().then()),this._shadowMode=e}set usePathTracing(e){this._clearAmrContent(),e?(this.renderer.toneMappingExposure=1.8,this.overlayScene.add(this._progressShadow.shadowCatcherMesh),this.amr&&(this.amr.bodyOpacity=1),this.hideAmrUI(),this.pathTracer.renderToCanvas=!0,this.scene.background=null,this._ptEnvMap?(this.scene.environment=this._ptEnvMap,this.pathTracer.updateEnvironment()):new Ss.HDRLoader().load(Mc,t=>{t.mapping=f.EquirectangularReflectionMapping,this._ptEnvMap=t,this.usePathTracing&&(this.scene.environment=t,this.pathTracer.updateEnvironment())})):(this.renderer.toneMappingExposure=1.4,this.scene.add(this._progressShadow.shadowCatcherMesh),this.pathTracer.renderToCanvas=!1,this.amr.logos.forEach(t=>{var i;(i=t.parent)==null||i.add(t.target)}),this.showAmrUI(),this.amr&&this.amr.opacityCache!==void 0?(this.amr.bodyOpacity=this.amr.opacityCache,this.amr.opacityCache=void 0):this.amr&&(this.amr.bodyOpacity=1),this.pathTracer.reset(),this._ground.visible=!1,this._envMap&&(this.scene.background=this._envMap,this.scene.environment=this._envMap)),this._usePathTracing=e,this.controls.dampingFactor=e?1:vr,this.sampleCount=0}get fpsAverage(){return zr(this._fpsCache)}get mainCamera(){return this._mainCamera}set mainCamera(e){this._mainCamera=e,e instanceof f.OrthographicCamera?this.scene.background=null:this.scene.background=this.scene.environment}showState(){this.stats.dom.style.display="block"}hideState(){this.stats.dom.style.display="none"}hideAmrUI(e=!0,t=!0){this.shadowMode||this.amr.slots.forEach(i=>i.hide()),this.amr.sizeBox.hide(e),this.amr.controllers.forEach(i=>i.hide()),t&&this.amr.goods.forEach(i=>i.hide())}showAmrUI(e=!0){this.showSlots&&this.amr.slots.forEach(t=>t.show()),this.showSize&&this.amr.sizeBox.show(e),this.showControls&&this.amr.controllers.forEach(t=>t.show()),this.amr.goods.forEach(t=>t.show())}get showSlots(){return this._showSlots}set showSlots(e){this._showSlots=e,this.amr.slots.forEach(t=>e?t.show():t.hide())}get showSize(){return this._showSize}set showSize(e){this._showSize=e,e?this.amr.sizeBox.show(!0):this.amr.sizeBox.hide(!0)}get showControls(){return this._showControls}set showControls(e){this._showControls=e,this.amr.controllers.forEach(t=>e?t.show():t.hide())}_updateCamera(){const e=this.mainCamera.position.distanceTo(this.controls.target),t=2*Math.tan(this.camera.fov*.5*Math.PI/180)*e,i=this.size.x/this.size.y;this.orthographicCamera.left=-t*i/2,this.orthographicCamera.right=t*i/2,this.orthographicCamera.top=t/2,this.orthographicCamera.bottom=-t/2,this.orthographicCamera.updateProjectionMatrix()}_loadEnv(){new Ss.HDRLoader().load(Sc,t=>{t.mapping=f.EquirectangularReflectionMapping,this._envMap=t,this._usePathTracing||(this.scene.background=t,this.scene.backgroundBlurriness=1,this.scene.backgroundIntensity=1,this.scene.backgroundRotation=new f.Euler(Math.PI/2,0,Math.PI*.98*.8),this.scene.environment=t,this.overlayScene.environment=t,this.scene.environmentRotation=this.scene.backgroundRotation,this.overlayScene.environmentRotation=this.scene.environmentRotation,this.scene.environmentIntensity=1.4,this.overlayScene.environmentIntensity=this.scene.environmentIntensity),this.pathTracer.updateEnvironment()},()=>{},()=>{})}_initEvents(){window.addEventListener("drag",this._drag),window.addEventListener("dragend",this._dragend),document.addEventListener("wheel",this._detectTrackpad),window.addEventListener("pointermove",this._pointermove),this.renderer.domElement.addEventListener("pointerdown",this._pointerdown);const e=this.scene.children.find(t=>t.type==="Mesh");e&&this.select(e)}switchCamera(){this.mainCamera=this.mainCamera===this.camera?this.orthographicCamera:this.camera}toCameraTop(){const e=this.camera.position.distanceTo(this.controls.target);this.camera.position.copy(new f.Vector3(0,e+this.controls.target.y,0))}toCameraRight(){const e=this.camera.position.distanceTo(this.controls.target);this.camera.position.copy(new f.Vector3(0,this.controls.target.y,e))}toCameraFace(){const e=this.camera.position.distanceTo(this.controls.target);this.camera.position.copy(new f.Vector3(e,this.controls.target.y,0))}async generateBVH(){this.pathTracer.pausePathTracing=!1,this.amr.slots.forEach(e=>e.hide()),this.amr&&(this.amr.opacityCache=this.amr.bodyOpacity,this.amr.bodyOpacity=1,this.overlayScene.clear(),this.amr.logos.forEach(e=>{const t=new f.Group;e.target.updateMatrixWorld(!0),t.applyMatrix4(e.target.matrixWorld),t.add(e.target),this.overlayScene.add(t)})),this.usePathTracing=!0,this.pathTracer.setScene(this.scene,this.mainCamera)}async download(e=!1){if(e&&!this.usePathTracing){const t=this._amrRender.width,i=this._amrRender.height,s=new Uint8Array(t*i*4);this.renderer.setRenderTarget(this._amrRender),this.renderer.readRenderTargetPixels(this._amrRender,0,0,t,i,s),this.renderer.setRenderTarget(null);const a=document.createElement("canvas");a.width=t,a.height=i;const o=a.getContext("2d"),c=new ImageData(t,i);for(let u=0;u<i;u++)for(let d=0;d<t;d++){const p=((i-u-1)*t+d)*4,r=(u*t+d)*4;c.data[r]=s[p],c.data[r+1]=s[p+1],c.data[r+2]=s[p+2],c.data[r+3]=s[p+3]}return o.putImageData(c,0,0),a.toDataURL("image/png")}else return new Promise((t,i)=>{this._uiHiddenTime=this._clock.getElapsedTime(),this.hideAmrUI();const s=this.scene.background;this.scene.background=null,setTimeout(()=>{const a=this.renderer.domElement.toDataURL("image/png");return this.scene.background=s,t(a)},this.fpsAverage)})}async captureTriViews(e){var o;const t=(e==null?void 0:e.subject)??this._container;(o=this._progressShadow)==null||o.visible;const i=this.scene.background,s=this.showSize;return new $r({renderer:this.renderer,scene:this.scene,overlayScene:this.overlayScene,subject:t,onBeforeCapture:()=>{this.scene.background=null,this.hideAmrUI(),this.showSize=!1,this.usePathTracing&&(this.usePathTracing=!1),this._progressShadow.visible=!1},onAfterCapture:()=>{this.scene.background=i,this.showAmrUI(),this.showSize=s,this._progressShadow.visible=!0}}).capture(e)}clearAMR(){Ae(this.overlayScene),this.amr.clean(),this.usePathTracing=!1}async exportAMR(){const e=this._container.clone(!0);return e.traverse(t=>{t.dispose&&(t.dispose(),t.removeFromParent())}),await Wr.parseAsync(e,{onlyVisible:!0,binary:!0})}async addAMR(e,t=""){this.amr.init(this),await this.amr.load(e,t),this.amr.addEventListener("fork-height-change",this.debounceForkHeightChange),this.amr.addEventListener("shape-key-changed",(i,s)=>{this.pathTracer.reset(),this.sampleCount=0,this.pathTracer.setScene(this.scene,this.camera),this.overlayScene.traverse(a=>{if(!Object.keys(a.morphTargetDictionary||{}).includes(i))return;let o=s;a.userData[`origin_${i}`]&&(o-=a.userData[`origin_${i}`]);const c=a.morphTargetDictionary[i];a.morphTargetInfluences&&(a.morphTargetInfluences[c]=o),a instanceof f.Mesh&&a.geometry.translate(0,0,1e-5)}),["width","length","liftLength","liftWidth","liftOuterWidth"].includes(i)&&(this._progressShadow.clear(),this._progressShadow.recalculate())})}_animateCamera(e,t,i,s,a,o){var u;const c={t:0};(u=this._fitAnimation)==null||u.stop(),this._fitAnimation=new hi(c).to({t:1},a).easing(Fe.Easing.Quadratic.InOut).onStart(()=>{this.controls.enabled=!1}).onUpdate(()=>{const d=c.t;this.controls.target.lerpVectors(i,s,d);const p=s.clone(),r=e.clone().sub(p),l=t.clone().sub(p),h=r.length(),g=l.length(),_=h+(g-h)*d;let m;if(h>.001&&g>.001){const v=r.clone().normalize(),y=l.clone().normalize(),x=v.angleTo(y);if(x>.001){const w=new f.Vector3().crossVectors(v,y);if(w.lengthSq()>.001){w.normalize();const b=new f.Quaternion().setFromAxisAngle(w,x*d),A=v.clone().applyQuaternion(b);m=p.clone().add(A.multiplyScalar(_))}else m=p.clone().add(v.multiplyScalar(_))}else m=p.clone().add(v.multiplyScalar(_))}else m=e.clone().lerp(t,d);this.camera.position.copy(m),this.camera.lookAt(this.controls.target)}).onComplete(()=>{this.controls.enabled=!0,o==null||o()}).start()}select(e){typeof e=="string"||(Array.isArray(e)?this._selectedForOutline=[...e]:this._selectedForOutline=[e])}appendTo(e){e.append(this.renderer.domElement),e.append(this.stats.dom),e.append(this.css2dRenderer.domElement),this.props.isMobile&&(e.classList.add("is-mobile"),e.style.cssText=`
3927
+ `});super(s,a),this.position.z=-.02}}const Sc="https://cdn2.seer-group.com/libs/hdr/aristea_wreck_512.hdr",Mc="https://cdn2.seer-group.com/libs/hdr/lightroom_14b_512.hdr",Cc="https://cdn2.seer-group.com/libs/fonts.type.json",Rc=new hn.Font(Cc);class as{constructor(e){var t;this._props=e,this.name="",this._defaults={color:""},this.color="",this.name=this._props.name,this.color=this._defaults.color="#"+((t=e.target.color)==null?void 0:t.getHexString())}change(e){var t;this.color=e,(t=this._props.target.color)==null||t.set(e)}reset(){this.change(this._defaults.color)}}var Jr=(n=>(n[n.DEFAULT=0]="DEFAULT",n[n.CAN_INSTALL=1]="CAN_INSTALL",n))(Jr||{});const vr=.15;f.Object3D.DEFAULT_UP.set(0,0,1);let ot,ci=0,ls=0;const Ic=()=>{ot=void 0,ci=0,ls=0},Dc=new f.MeshBasicMaterial({colorWrite:!1});class Lc{constructor(e){this.props=e,this.stats=new Pt,this.scene=new f.Scene,this.overlayScene=new f.Scene,this.renderer=new f.WebGLRenderer({antialias:!0,alpha:!0,logarithmicDepthBuffer:!0,powerPreference:"high-performance",preserveDrawingBuffer:!0}),this.css2dRenderer=new ve.CSS2DRenderer,this.mousePos=new f.Vector2,this.mouseCoord=new f.Vector2,this.offset=new f.Vector2,this.size=new f.Vector2,this.amr=new Gr({showSizeBox:!0,showController:!0}),this._selectedForOutline=[],this._clock=new f.Clock(!0),this._uiHiddenTime=this._clock.getElapsedTime(),this.camera=new f.PerspectiveCamera(39.6,window.innerWidth/window.innerHeight,.1,1e4),this.d=2,this.orthographicCamera=new f.OrthographicCamera(-this.d*(window.innerWidth/window.innerHeight),this.d*(window.innerWidth/window.innerHeight),this.d,-this.d,.1,1e3),this._axisMoving=!1,this._container=new f.Group,this._raycaster=new f.Raycaster,this._selected=[],this._pointerDownTimeout=0,this._dragging=!1,this.maxSample=1024*2,this.sampleCount=0,this._usePathTracing=!1,this._fpsCache=[],this._fpsCacheMax=20,this._emitter=new mt,this.sound=new Na,this._rafId=null,this._destroyed=!1,this._ground=new f.Mesh(new f.PlaneGeometry(100,100),new f.MeshPhysicalMaterial({color:new f.Color("#eee"),metalness:.4,roughness:.1,clearcoat:1,clearcoatRoughness:.1})),this._sciFiGrid=new Tc(18,40),this._amrRender=new f.WebGLRenderTarget(1024,1024,{format:f.RGBAFormat,type:f.UnsignedByteType,colorSpace:f.SRGBColorSpace,samples:8}),this._lastTarget=new f.Vector3,this._shadowMode=!1,this.addEventListener=this._emitter.on.bind(this._emitter),this.removeEventListener=this._emitter.on.bind(this._emitter),this._showSlots=!0,this._showSize=!0,this._showControls=!0,this._drag=c=>{this._dragging=!0,this._pointermove(c)},this._dragend=c=>{this._dragging=!1},this._pointermove=c=>{if(this._pointerDownTimeout)return clearTimeout(this._pointerDownTimeout),this._pointerDownTimeout=0;let{top:u,left:d}=this.renderer.domElement.getBoundingClientRect();this.offset.set(d,u),this.mousePos.set(c.clientX-d,c.clientY-u),this.mouseCoord.set((c.clientX-d)/this.size.x*2-1,-((c.clientY-u)/this.size.y)*2+1),this._raycaster.setFromCamera(this.mouseCoord,this.camera)},this._pointerdown=c=>{const u=()=>{this.amr.slots.forEach(r=>r.selected=!1);const p=this._raycaster.intersectObjects(this.amr.slots,!1)[0];p&&this.amr.slots.forEach(r=>{r.traverse(l=>{l==p.object||(r.deviceSelected=!1)})}),this._pointerDownTimeout=0};this._pointerDownTimeout=window.setTimeout(u,200)},this._detectTrackpad=()=>{ot||typeof ot<"u"||(ci===0&&(ls=performance.now()),ci++,performance.now()-ls>66&&(ci>5?ot=!0:ot=!1,ot?this.controls.zoomSpeed=.2:this.controls.zoomSpeed=1,setTimeout(Ic,2e3)))},this.debounceForkHeightChange=Qa(()=>{var c;(c=this._progressShadow)==null||c.recalculate()},300),this.focusObjects=(c,u)=>{var X;if(!c.length){this.fit();return}this.scene.updateMatrixWorld(!0),this._focusRestoreView=void 0,(X=this._fitAnimation)==null||X.stop();const d=new f.Box3,p=new f.Box3,r=new f.Vector3,l=new f.Vector3,h=new f.Vector3,g=new f.Vector3,_=U=>{U.geometry&&(U.geometry.boundingBox||U.geometry.computeBoundingBox(),p.copy(U.geometry.boundingBox).applyMatrix4(U.matrixWorld),p.isEmpty()||d.union(p))},m=U=>{var bs,As;const G=U.geometry,ne=(bs=G==null?void 0:G.attributes)==null?void 0:bs.position;if(!ne){_(U);return}const te=((As=G.morphAttributes)==null?void 0:As.position)||[],ws=U.morphTargetInfluences||[],en=te.length>0&&ws.length>0;for(let Se=0;Se<ne.count;Se++){if(r.set(ne.getX(Se),ne.getY(Se),ne.getZ(Se)),en){l.set(0,0,0);let yi=0;for(let Ge=0;Ge<te.length;Ge++){const Ot=ws[Ge]||0;Ot&&(yi+=Ot,h.set(te[Ge].getX(Se),te[Ge].getY(Se),te[Ge].getZ(Se)),G.morphTargetsRelative,l.addScaledVector(h,Ot))}G.morphTargetsRelative?r.add(l):yi>0&&(r.multiplyScalar(1-yi),r.add(l))}g.copy(r).applyMatrix4(U.matrixWorld),d.expandByPoint(g)}};if(c.forEach(U=>{U.traverse(G=>{if(G.visible){if(G instanceof f.Mesh){m(G);return}(G.isPoint||G.isLine)&&_(G)}})}),d.isEmpty())return;const v=new f.Vector3;d.getCenter(v);const y=new f.Vector3;d.getSize(y);const x=v.clone();this._lastTarget.copy(x);let w;u?w=u.clone().normalize().negate():w=this.camera.position.clone().sub(this.controls.target).normalize();const b=y.clone().multiplyScalar(.5),A=[new f.Vector3(b.x,b.y,b.z),new f.Vector3(b.x,b.y,-b.z),new f.Vector3(b.x,-b.y,b.z),new f.Vector3(b.x,-b.y,-b.z),new f.Vector3(-b.x,b.y,b.z),new f.Vector3(-b.x,b.y,-b.z),new f.Vector3(-b.x,-b.y,b.z),new f.Vector3(-b.x,-b.y,-b.z)],S=new f.Vector3(0,1,0);Math.abs(w.dot(S))>.99&&S.set(0,0,1);const C=new f.Vector3().crossVectors(w,S).normalize(),M=new f.Vector3().crossVectors(C,w).normalize();let I=0;A.forEach(U=>{const G=U.dot(C),ne=U.dot(M),te=Math.sqrt(G*G+ne*ne);I=Math.max(I,te)}),I=I/2+.4;const D=this.camera.fov*Math.PI/180,T=2*Math.atan(Math.tan(D/2)*this.camera.aspect),R=I/Math.tan(T/2),L=I/Math.tan(D/2),F=Math.max(R,L),E=v.clone().add(w.multiplyScalar(F)),z=this.camera.position.clone(),N=this.controls.target.clone();let j=500;const Z=z.distanceTo(E)+N.distanceTo(x);Z>.001&&(j=Math.min(1e3,Math.max(450,Z*45))),this._animateCamera(z,E,N,x,j)},this.focusSlots=c=>{var M,I;if(this.amr.slots.forEach(D=>{D.focused=!1,D.hide()}),!c.length)if(this._lastTarget.set(0,0,this._lastTarget.z),this.amr.slots.forEach(D=>{D.show()}),this.shadowMode=!1,this._focusRestoreView){const D=this._focusRestoreView;this._focusRestoreView=void 0;const T=this.camera.position.clone(),R=this.controls.target.clone(),L=D.position.clone(),F=D.target.clone();let E=500;const z=T.distanceTo(L)+R.distanceTo(F);z>.001&&(E=Math.min(1e3,Math.max(450,z*45))),this._animateCamera(T,L,R,F,E,()=>{this.camera.up.copy(D.up)});return}else{this.fit();return}(M=this._fitAnimation)!=null&&M.isPlaying()||this.shadowMode||(this._focusRestoreView={position:this.camera.position.clone(),target:new f.Vector3(0,0,this.controls.target.z),up:this.camera.up.clone()}),(I=this._fitAnimation)==null||I.stop(),this.shadowMode=!0;const u=c.flatMap(D=>{if(D.show(),D.focused=!0,!D.parent)return[];const T=new f.Vector3;return D.parent.getWorldPosition(T),[T]});if(!u.length)return;const d=u.reduce((D,T)=>D.add(T),new f.Vector3).multiplyScalar(1/u.length),p=this.controls.target.clone(),r=this.camera.position.clone().sub(p).normalize();let l=0;for(const D of u){const T=D.clone().sub(d),R=T.dot(r),L=Math.sqrt(Math.max(0,T.lengthSq()-R*R));L>l&&(l=L)}l=l+.4;const h=this.camera.fov*Math.PI/180,g=2*Math.atan(Math.tan(h/2)*this.camera.aspect),_=l/Math.tan(g/2),m=l/Math.tan(h/2),v=Math.max(_,m),y=d.clone(),x=d.clone().add(r.clone().multiplyScalar(v<1?1:v)),w=this.camera.position.clone(),b=p.clone(),A={t:0};let S=500;const C=w.distanceTo(x)+b.distanceTo(y);C>.001&&(S=Math.min(1e3,Math.max(450,C*45))),this._lastTarget=y.clone(),this._fitAnimation=new hi(A).to({t:1},S).easing(Fe.Easing.Quadratic.InOut).onStart(()=>{this.controls.enabled=!1}).onUpdate(()=>{const D=A.t;this.camera.position.lerpVectors(w,x,D),this.controls.target.lerpVectors(b,y,D)}).onComplete(()=>{this.controls.enabled=!0}).start()},this.fit=()=>{this._focusRestoreView=void 0,new f.Box3().setFromObject(this._container);const u=this.amr.sizeBox.size.getSize(new f.Vector3),d=u.clone().multiplyScalar(.5),p=new f.Vector3(0,0,d.z);this._lastTarget.copy(p);let r=d.clone().sub(p);r.lengthSq()<1e-6&&(r=new f.Vector3(1,0,0));const l=r.clone().normalize(),h=u.clone().multiplyScalar(.5),g=[new f.Vector3(h.x,h.y,h.z),new f.Vector3(h.x,h.y,-h.z),new f.Vector3(h.x,-h.y,h.z),new f.Vector3(h.x,-h.y,-h.z),new f.Vector3(-h.x,h.y,h.z),new f.Vector3(-h.x,h.y,-h.z),new f.Vector3(-h.x,-h.y,h.z),new f.Vector3(-h.x,-h.y,-h.z)];let _=0;for(const T of g){const R=T.dot(l),L=Math.sqrt(Math.max(0,T.lengthSq()-R*R));L>_&&(_=L)}_=_*1.05;const m=this.camera.fov*Math.PI/180,v=2*Math.atan(Math.tan(m/2)*this.camera.aspect),y=_/Math.tan(v/2),x=_/Math.tan(m/2),w=Math.max(y,x),b=d.clone();let A=u.z/3;u.z<u.x&&u.z<u.y&&(A=u.x*.8),u.z>u.x&&u.z>u.y&&(A=0),b.z+=A;const S=r.clone().normalize().multiplyScalar(w<1?1:w).add(b);Math.max(u.x*2,5);const C=this.camera.position.clone(),M=this.controls.target.clone();let I=600;const D=C.distanceTo(S)+M.distanceTo(p);D>.001&&(I=Math.min(800,Math.max(650,D*45))),this._animateCamera(C,S,M,p,I,()=>{this.shadowMode||(this._progressShadow.visible=!0,this._progressShadow.isFinished||this._progressShadow.recalculate())}),this.controls.minDistance=Math.max(.2,Math.min(w*.25,w-.1)),this.controls.maxDistance=w*4},this.resize=()=>{var p,r;const c=this.renderer.domElement.parentElement;if(!c)return;c.style.display="flex",this.renderer.domElement.style.width="100%",this.renderer.domElement.style.height="100%",this.renderer.domElement.style.flexGrow="1";const u=c.clientWidth,d=c.clientHeight;this.size.set(u,d),this.camera.aspect=u/d,this.camera.updateProjectionMatrix(),this._amrRender.setSize(u,d),this._updateCamera(),this.css2dRenderer.setSize(u,d),this.renderer.getPixelRatio(),(p=this.pathTracer)==null||p.updateCamera(),this.sampleCount=0,this.renderer.setSize(u,d),(r=this._jumpFlood)==null||r.setSize(u,d)},this.ticker=c=>{if(!this._destroyed){if(this.stats.begin(),this.renderer.domElement.dispatchEvent(new CustomEvent("ticker",{detail:c})),this._rafId=requestAnimationFrame(this.ticker),this.renderer.clear(),this.usePathTracing){this.hideAmrUI(),this.sampleCount<this.maxSample?this.sampleCount++:this.pathTracer.pausePathTracing=!0,this.pathTracer.renderSample();const u=this.renderer.autoClear;this.renderer.autoClear=!1,this.scene.overrideMaterial=Dc,this.renderer.clearDepth(),this.renderer.render(this.scene,this.mainCamera),this.scene.overrideMaterial=null,this.renderer.render(this.overlayScene,this.mainCamera),this.renderer.autoClear=u}else{this._clock.getElapsedTime()-this._uiHiddenTime>.15?this.showControls&&this.amr.controllers.forEach(p=>p.show()):this.amr.controllers.forEach(p=>p.hide());const d=this.stats.fps();if(this.usePathTracing||(this._fpsCache.length>this._fpsCacheMax&&this._fpsCache.shift(),this._fpsCache.push(d)),this.amr.slots.forEach(p=>{this._dragging?p.getCanInstall()&&p.render(this):p.render(this)}),Fe.update(),this.controls.update(),this._progressShadow.update(this.mainCamera),this.css2dRenderer.render(this.scene,this.mainCamera),this.updatePosition(),this.scene.overrideMaterial=null,this.renderer.render(this.scene,this.mainCamera),this._jumpFlood&&this._selectedForOutline.length>0){const p=this.scene.background;this.scene.background=null,this._jumpFlood.render(this._selectedForOutline),this.scene.background=p}}this.stats.end()}},this.stats.showPanel(0),this.hideState(),e.fov&&(this.camera.fov=e.fov,this.camera.updateProjectionMatrix()),kr(He,this.renderer),this._ground.visible=!1,this.controls=new un.OrbitControls(this.camera,this.renderer.domElement),this.controls.enablePan=!0,this.controls.rotateSpeed=this.props.isMobile?.6:.5,this.controls.dampingFactor=vr,this.controls.enableDamping=!0,this.controls.maxDistance=10,this.controls.minDistance=1,this.controls.zoomSpeed=this.props.isMobile?.3:Vr()?.2:1,this._cameraPositionUI=new yc(this.controls),this.renderer.setPixelRatio(window.devicePixelRatio||1),this.renderer.autoClear=!0,this.renderer.toneMapping=f.ACESFilmicToneMapping,this.renderer.toneMappingExposure=1.4,this.renderer.outputColorSpace=f.SRGBColorSpace,this.renderer.localClippingEnabled=!0,this.renderer.shadowMap.enabled=!0,this.css2dRenderer.domElement.style.pointerEvents="none",this.css2dRenderer.domElement.style.position="absolute",this.css2dRenderer.domElement.style.top="0px",this.camera.position.set(10,-10,5),this.camera.lookAt(new f.Vector3);const{tiles:t}=qa();this.pathTracer=new na(this.renderer),this.pathTracer.multipleImportanceSampling=!0,this.pathTracer.filterGlossyFactor=.6;let i=window.devicePixelRatio;i<2&&(i=2),this.pathTracer.renderScale=this.props.isMobile?1:i,this.pathTracer.bounces=this.props.isMobile?8:10,this.pathTracer.transmissiveBounces=this.props.isMobile?1:3,this.pathTracer.tiles.set(t,t),this.pathTracer.minSamples=10,this.pathTracer.dynamicLowRes=!0,this.pathTracer.lowResScale=.5,this.pathTracer.fadeDuration=0;const s=new pc(e.workerUrl),a=typeof navigator<"u"?navigator.hardwareConcurrency:4;s.maxWorkerCount=a,this.pathTracer.setBVHWorker(s),this.orthographicCamera.left=-20,this.orthographicCamera.right=20,this.orthographicCamera.top=-20,this.orthographicCamera.bottom=20,this._lastTarget=this.controls.target.clone();const o=()=>{let c=this._lastTarget.x,u=this._lastTarget.y;this.controls.target.x=c,this.controls.target.y=u};this.controls.addEventListener("change",()=>{var c;this.sampleCount=0,o(),this._uiHiddenTime=this._clock.getElapsedTime(),this.orthographicCamera.position.copy(this.camera.position),this.orthographicCamera.lookAt(this.controls.target),this.usePathTracing&&(this.pathTracer.pausePathTracing=!1,(c=this.pathTracer)==null||c.updateCamera()),this._updateCamera(),!(Math.abs(this.camera.position.x)<.001||Math.abs(this.camera.position.y)<.001)&&(this._axisMoving||(this.mainCamera=this.camera,this.usePathTracing&&this.generateBVH().then()))}),this._mainCamera=this.camera,this._progressShadow=new gc(this.renderer,this.scene,{size:8,lightCount:e.isMobile?6:12,frames:e.isMobile?80:120,lightRadius:8,ambientWeight:.8}),this._progressShadow.lightOrigin.position.set(3,2.5,6),this._progressShadow.visible=!1,this._container.add(this.amr),this.scene.add(this._container),this.ticker(),this._loadEnv(),this._initEvents(),this.scene.add(this._cameraPositionUI),this._ground.rotateX(-Math.PI/2),this.scene.add(this._ground),this._jumpFlood=new Ac(this.renderer,this.scene,this.camera,{thickness:4,color:"#fff"}),(typeof e.useAxisBall!="boolean"||e.useAxisBall)&&(this._controlsGizmo=new mc(this.controls,{size:160,padding:12,offset:e.axisBallOffset||new f.Vector2(10,10),fontSize:17,bubbleSizePrimary:18,bubbleSizeSecondary:14}),this._controlsGizmo.addListener("axis-select-start",()=>{this._axisMoving=!0,this.mainCamera=this.orthographicCamera,this.usePathTracing&&this.generateBVH().then()}),this._controlsGizmo.addListener("axis-select-end",()=>{this._axisMoving=!1}))}get usePathTracing(){return this._usePathTracing}_clearAmrContent(){const e=this.renderer.getRenderTarget();this.renderer.setRenderTarget(this._amrRender),this.renderer.setClearColor(0,0),this.renderer.clear(!0,!0,!0),this.renderer.setRenderTarget(e)}get shadowMode(){return this._shadowMode}set shadowMode(e){e?(this._progressShadow.visible=!1,this.amr.bodyOpacity=.2):(this._progressShadow.visible=!0,this.amr.bodyOpacity=1,this._progressShadow.isFinished||this._progressShadow.recalculate().then()),this._shadowMode=e}set usePathTracing(e){this._clearAmrContent(),e?(this.renderer.toneMappingExposure=1.8,this.overlayScene.add(this._progressShadow.shadowCatcherMesh),this.amr&&(this.amr.bodyOpacity=1),this.hideAmrUI(),this.pathTracer.renderToCanvas=!0,this.scene.background=null,this._ptEnvMap?(this.scene.environment=this._ptEnvMap,this.pathTracer.updateEnvironment()):new Ss.HDRLoader().load(Mc,t=>{t.mapping=f.EquirectangularReflectionMapping,this._ptEnvMap=t,this.usePathTracing&&(this.scene.environment=t,this.pathTracer.updateEnvironment())})):(this.renderer.toneMappingExposure=1.4,this.scene.add(this._progressShadow.shadowCatcherMesh),this.pathTracer.renderToCanvas=!1,this.amr.logos.forEach(t=>{var i;(i=t.parent)==null||i.add(t.target)}),this.showAmrUI(),this.amr&&this.amr.opacityCache!==void 0?(this.amr.bodyOpacity=this.amr.opacityCache,this.amr.opacityCache=void 0):this.amr&&(this.amr.bodyOpacity=1),this.pathTracer.reset(),this._ground.visible=!1,this._envMap&&(this.scene.background=this._envMap,this.scene.environment=this._envMap)),this._usePathTracing=e,this.controls.dampingFactor=e?1:vr,this.sampleCount=0}get fpsAverage(){return zr(this._fpsCache)}get mainCamera(){return this._mainCamera}set mainCamera(e){this._mainCamera=e,e instanceof f.OrthographicCamera?this.scene.background=null:this.scene.background=this.scene.environment}showState(){this.stats.dom.style.display="block"}hideState(){this.stats.dom.style.display="none"}hideAmrUI(e=!0,t=!0){this.shadowMode||this.amr.slots.forEach(i=>i.hide()),this.amr.sizeBox.hide(e),this.amr.controllers.forEach(i=>i.hide()),t&&this.amr.goods.forEach(i=>i.hide())}showAmrUI(e=!0){this.showSlots&&this.amr.slots.forEach(t=>t.show()),this.showSize&&this.amr.sizeBox.show(e),this.showControls&&this.amr.controllers.forEach(t=>t.show()),this.amr.goods.forEach(t=>t.show())}get showSlots(){return this._showSlots}set showSlots(e){this._showSlots=e,this.amr.slots.forEach(t=>e?t.show():t.hide())}get showSize(){return this._showSize}set showSize(e){this._showSize=e,e?this.amr.sizeBox.show(!0):this.amr.sizeBox.hide(!0)}get showControls(){return this._showControls}set showControls(e){this._showControls=e,this.amr.controllers.forEach(t=>e?t.show():t.hide())}_updateCamera(){const e=this.mainCamera.position.distanceTo(this.controls.target),t=2*Math.tan(this.camera.fov*.5*Math.PI/180)*e,i=this.size.x/this.size.y;this.orthographicCamera.left=-t*i/2,this.orthographicCamera.right=t*i/2,this.orthographicCamera.top=t/2,this.orthographicCamera.bottom=-t/2,this.orthographicCamera.updateProjectionMatrix()}_loadEnv(){new Ss.HDRLoader().load(Sc,t=>{t.mapping=f.EquirectangularReflectionMapping,this._envMap=t,this._usePathTracing||(this.scene.background=t,this.scene.backgroundBlurriness=1,this.scene.backgroundIntensity=1,this.scene.backgroundRotation=new f.Euler(Math.PI/2,0,Math.PI*.98*.8),this.scene.environment=t,this.overlayScene.environment=t,this.scene.environmentRotation=this.scene.backgroundRotation,this.overlayScene.environmentRotation=this.scene.environmentRotation,this.scene.environmentIntensity=1.4,this.overlayScene.environmentIntensity=this.scene.environmentIntensity),this.pathTracer.updateEnvironment()},()=>{},()=>{})}_initEvents(){window.addEventListener("drag",this._drag),window.addEventListener("dragend",this._dragend),document.addEventListener("wheel",this._detectTrackpad),window.addEventListener("pointermove",this._pointermove),this.renderer.domElement.addEventListener("pointerdown",this._pointerdown);const e=this.scene.children.find(t=>t.type==="Mesh");e&&this.select(e)}switchCamera(){this.mainCamera=this.mainCamera===this.camera?this.orthographicCamera:this.camera}toCameraTop(){const e=this.camera.position.distanceTo(this.controls.target);this.camera.position.copy(new f.Vector3(0,e+this.controls.target.y,0))}toCameraRight(){const e=this.camera.position.distanceTo(this.controls.target);this.camera.position.copy(new f.Vector3(0,this.controls.target.y,e))}toCameraFace(){const e=this.camera.position.distanceTo(this.controls.target);this.camera.position.copy(new f.Vector3(e,this.controls.target.y,0))}async generateBVH(){this.pathTracer.pausePathTracing=!1,this.amr.slots.forEach(e=>e.hide()),this.amr&&(this.amr.opacityCache=this.amr.bodyOpacity,this.amr.bodyOpacity=1,this.overlayScene.clear(),this.amr.logos.forEach(e=>{const t=new f.Group;e.target.updateMatrixWorld(!0),t.applyMatrix4(e.target.matrixWorld),t.add(e.target),this.overlayScene.add(t)})),this.usePathTracing=!0,this.pathTracer.setScene(this.scene,this.mainCamera)}async download(e=!1){if(e&&!this.usePathTracing){const t=this._amrRender.width,i=this._amrRender.height,s=new Uint8Array(t*i*4);this.renderer.setRenderTarget(this._amrRender),this.renderer.readRenderTargetPixels(this._amrRender,0,0,t,i,s),this.renderer.setRenderTarget(null);const a=document.createElement("canvas");a.width=t,a.height=i;const o=a.getContext("2d"),c=new ImageData(t,i);for(let u=0;u<i;u++)for(let d=0;d<t;d++){const p=((i-u-1)*t+d)*4,r=(u*t+d)*4;c.data[r]=s[p],c.data[r+1]=s[p+1],c.data[r+2]=s[p+2],c.data[r+3]=s[p+3]}return o.putImageData(c,0,0),a.toDataURL("image/png")}else return new Promise((t,i)=>{this._uiHiddenTime=this._clock.getElapsedTime(),this.hideAmrUI();const s=this.scene.background;this.scene.background=null,setTimeout(()=>{const a=this.renderer.domElement.toDataURL("image/png");return this.scene.background=s,t(a)},this.fpsAverage)})}async captureTriViews(e){var o;const t=(e==null?void 0:e.subject)??this._container;(o=this._progressShadow)==null||o.visible;const i=this.scene.background,s=this.showSize;return new $r({renderer:this.renderer,scene:this.scene,overlayScene:this.overlayScene,subject:t,onBeforeCapture:()=>{this.scene.background=null,this.hideAmrUI(),this.showSize=!1,this.usePathTracing&&(this.usePathTracing=!1),this._progressShadow.visible=!1},onAfterCapture:()=>{this.scene.background=i,this.showAmrUI(),this.showSize=s,this._progressShadow.visible=!0}}).capture(e)}clearAMR(){Ae(this.overlayScene),this.amr.clean(),this.usePathTracing=!1}async exportAMR(){const e=this._container.clone(!0);return e.traverse(t=>{t.dispose&&(t.dispose(),t.removeFromParent())}),await Wr.parseAsync(e,{onlyVisible:!0,binary:!0})}async addAMR(e,t=""){this.amr.init(this),await this.amr.load(e,t),this.amr.addEventListener("fork-height-change",this.debounceForkHeightChange),this.amr.addEventListener("shape-key-changed",(i,s)=>{this.pathTracer.reset(),this.sampleCount=0,this.pathTracer.setScene(this.scene,this.camera),this.overlayScene.traverse(a=>{if(!Object.keys(a.morphTargetDictionary||{}).includes(i))return;let o=s;a.userData[`origin_${i}`]&&(o-=a.userData[`origin_${i}`]);const c=a.morphTargetDictionary[i];a.morphTargetInfluences&&(a.morphTargetInfluences[c]=o),a instanceof f.Mesh&&a.geometry.translate(0,0,1e-5)}),["width","length","liftLength","liftWidth","liftOuterWidth"].includes(i)&&(this._progressShadow.clear(),this._progressShadow.recalculate())})}_animateCamera(e,t,i,s,a,o){var u;const c={t:0};(u=this._fitAnimation)==null||u.stop(),this._fitAnimation=new hi(c).to({t:1},a).easing(Fe.Easing.Quadratic.InOut).onStart(()=>{this.controls.enabled=!1}).onUpdate(()=>{const d=c.t;this.controls.target.lerpVectors(i,s,d);const p=s.clone(),r=e.clone().sub(p),l=t.clone().sub(p),h=r.length(),g=l.length(),_=h+(g-h)*d;let m;if(h>.001&&g>.001){const v=r.clone().normalize(),y=l.clone().normalize(),x=v.angleTo(y);if(x>.001){const w=new f.Vector3().crossVectors(v,y);if(w.lengthSq()>.001){w.normalize();const b=new f.Quaternion().setFromAxisAngle(w,x*d),A=v.clone().applyQuaternion(b);m=p.clone().add(A.multiplyScalar(_))}else m=p.clone().add(v.multiplyScalar(_))}else m=p.clone().add(v.multiplyScalar(_))}else m=e.clone().lerp(t,d);this.camera.position.copy(m),this.camera.lookAt(this.controls.target)}).onComplete(()=>{this.controls.enabled=!0,o==null||o()}).start()}select(e){typeof e=="string"||(Array.isArray(e)?this._selectedForOutline=[...e]:this._selectedForOutline=[e])}appendTo(e){e.append(this.renderer.domElement),e.append(this.stats.dom),e.append(this.css2dRenderer.domElement),this.props.isMobile&&(e.classList.add("is-mobile"),e.style.cssText=`
3928
3928
  -webkit-user-select: none;
3929
3929
  user-select: none;
3930
3930
  touch-action: none;
@@ -13364,9 +13364,9 @@ class Lh {
13364
13364
  }
13365
13365
  }, this.stats.showPanel(0), this.hideState(), e.fov && (this.camera.fov = e.fov, this.camera.updateProjectionMatrix()), Rn(Ft, this.renderer), this._ground.visible = !1, this.controls = new yo(this.camera, this.renderer.domElement), this.controls.enablePan = !0, this.controls.rotateSpeed = this.props.isMobile ? 0.6 : 0.5, this.controls.dampingFactor = an, this.controls.enableDamping = !0, this.controls.maxDistance = 10, this.controls.minDistance = 1, this.controls.zoomSpeed = this.props.isMobile ? 0.3 : ec() ? 0.2 : 1, this._cameraPositionUI = new Eu(this.controls), this.renderer.setPixelRatio(window.devicePixelRatio || 1), this.renderer.autoClear = !0, this.renderer.toneMapping = vo, this.renderer.toneMappingExposure = 1.4, this.renderer.outputColorSpace = Bi, this.renderer.localClippingEnabled = !0, this.renderer.shadowMap.enabled = !0, this.css2dRenderer.domElement.style.pointerEvents = "none", this.css2dRenderer.domElement.style.position = "absolute", this.css2dRenderer.domElement.style.top = "0px", this.camera.position.set(10, -10, 5), this.camera.lookAt(new b());
13366
13366
  const { tiles: t } = rc();
13367
- this.pathTracer = new _l(this.renderer), this.pathTracer.filterGlossyFactor = 0.6;
13367
+ this.pathTracer = new _l(this.renderer), this.pathTracer.multipleImportanceSampling = !0, this.pathTracer.filterGlossyFactor = 0.6;
13368
13368
  let i = window.devicePixelRatio;
13369
- i < 2 && (i = 2), this.pathTracer.renderScale = this.props.isMobile ? 1 : i, this.pathTracer.bounces = this.props.isMobile ? 8 : 10, this.pathTracer.transmissiveBounces = this.props.isMobile ? 1 : 3, this.pathTracer.tiles.set(t, t), this.pathTracer.fadeDuration = 0;
13369
+ i < 2 && (i = 2), this.pathTracer.renderScale = this.props.isMobile ? 1 : i, this.pathTracer.bounces = this.props.isMobile ? 8 : 10, this.pathTracer.transmissiveBounces = this.props.isMobile ? 1 : 3, this.pathTracer.tiles.set(t, t), this.pathTracer.minSamples = 10, this.pathTracer.dynamicLowRes = !0, this.pathTracer.lowResScale = 0.5, this.pathTracer.fadeDuration = 0;
13370
13370
  const s = new Cu(e.workerUrl), a = typeof navigator < "u" ? navigator.hardwareConcurrency : 4;
13371
13371
  s.maxWorkerCount = a, this.pathTracer.setBVHWorker(s), this.orthographicCamera.left = -20, this.orthographicCamera.right = 20, this.orthographicCamera.top = -20, this.orthographicCamera.bottom = 20, this._lastTarget = this.controls.target.clone();
13372
13372
  const n = () => {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "shop-components",
3
- "version": "0.4.8",
3
+ "version": "0.4.9",
4
4
  "description": "Shop components",
5
5
  "main": "dist/shop-components.umd.js",
6
6
  "module": "dist/shop-components.mjs",