1try{!function(){var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},t=(new e.Error).stack;t&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[t]="55785cc7-1aaa-49be-a5ef-c8bb1e3982eb",e._sentryDebugIdIdentifier="sentry-dbid-55785cc7-1aaa-49be-a5ef-c8bb1e3982eb")}()}catch(e){}(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[3311],{28114:function(e,t,a){(window.__NEXT_P=window.__NEXT_P||[]).push(["/playground",function(){return a(3178)}])},3178:function(e,t,a){"use strict";a.r(t),a.d(t,{__N_SSG:function(){return h}});var o=a(85893),n=a(67294),d=a(99477),r=a(74250),s=a(68968),i=a(82854),l=a(54917),c=a(69365),p=a(68243);let m=[{label:"Factory",src:"/models/factory.glb"},{label:"Hayward",src:"/models/hayward.glb"},{label:"San Carlos",src:"/models/san-carlos.glb"}];var h=!0;t.default=e=>{let{features:t=[]}=e,a=(0,n.useRef)(null),[h,g]=(0,n.useState)(0),u=(0,n.useRef)(null);(0,n.useEffect)(()=>{let e=a.current;if(!e)return;let o=new d.CP7({antialias:!0,alpha:!0});o.setPixelRatio(Math.min(devicePixelRatio,2)),o.setClearColor(0,0),o.toneMapping=r.LY2,o.toneMappingExposure=3,o.shadowMap.enabled=!0,o.shadowMap.type=r._iA,o.domElement.style.display="block",o.domElement.style.width="100%",o.domElement.style.height="100%",e.appendChild(o.domElement);let n=new r.xsS,g=new r.vmT(16777215,15263978,.35);n.add(g);let y=new r.Mig(16777215,.3);n.add(y);let f=new r.Ox3(16777215,6.8);f.castShadow=!0,f.shadow.mapSize.set(1024,1024),f.shadow.bias=-.0005,f.shadow.radius=6.5,n.add(f),n.add(f.target);let x=new r.Pa4,w=60,C={azimuth:81,elevation:82},b=()=>{let e=r.M8C.degToRad(C.azimuth),t=r.M8C.degToRad(C.elevation),a=1.5*w;f.position.set(x.x+a*Math.cos(t)*Math.sin(e),x.y+a*Math.sin(t),x.z+a*Math.cos(t)*Math.cos(e)),f.target.position.copy(x),f.target.updateMatrixWorld()},v={clay:!0,flatShading:!0,roughness:0,metalness:.75},F=null,z=new Map,M=new r.Wid({color:16250871,roughness:0,metalness:.75,side:r.ehD}),E=new r.Wid({color:16250871,roughness:0,metalness:0,flatShading:!0,side:r.ehD}),P=()=>{F&&F.traverse(e=>{if(e.isMesh&&"__groundPlane"!==e.name){if(e.castShadow=!0,e.receiveShadow=!0,z.has(e)||z.set(e,e.material),v.clay){let t=v.flatShading?E:M;t.roughness=v.roughness,t.metalness=v.metalness,e.material=t}else e.material=z.get(e)}})},_=new p.ZP({title:"Scene Controls"});_.domElement.style.position="absolute",_.domElement.style.top="16px",_.domElement.style.right="16px";let S=_.addFolder("Material");S.add(v,"clay").name("Clay Override").onChange(P),S.add(v,"flatShading").name("Flat Shading").onChange(P),S.add(v,"roughness",0,1,.05).name("Roughness").onChange(P),S.add(v,"metalness",0,1,.05).name("Metalness").onChange(P);let T=_.addFolder("Key Light");T.add(C,"azimuth",0,360,1).name("Azimuth").onChange(b),T.add(C,"elevation",5,89,1).name("Elevation").onChange(b),T.add(f,"intensity",0,10,.1).name("Intensity"),T.add(f.shadow,"radius",0,20,.5).name("Shadow Softness");let j=_.addFolder("Ambient");j.add(y,"intensity",0,2,.05).name("Ambient"),j.add(g,"intensity",0,2,.05).name("Hemisphere");let k=_.addFolder("Render");k.add(o,"toneMappingExposure",0,5,.05).name("Exposure"),k.add({shadowOpacity:.37},"shadowOpacity",0,1,.01).name("Shadow Opacity").onChange(e=>{n.traverse(t=>{if(t.isMesh){let a=t.material;a.isShadowMaterial&&(a.opacity=e)}})});let D={color:"#F8F8F8"},O=null;k.addColor({clay:"#f7f7f7"},"clay").name("Clay Color").onChange(e=>{M.color.set(e),E.color.set(e)}),k.addColor({background:"#F8F8F8"},"background").name("Background").onChange(t=>{e.style.backgroundColor=t}),_.addFolder("Ground Plane").addColor(D,"color").name("Color").onChange(e=>{O&&O.color.set(e)});let R=e.clientWidth,A=e.clientHeight,I=new r.cPb(28,R/A,.01,1e3);I.position.set(40,25,40);let N=new c.z(I,o.domElement);N.enableDamping=!0,N.dampingFactor=.08,N.enabled=!0;let W=_.addFolder("Camera"),X={x:0,y:0,z:0,tx:0,ty:0,tz:0,fov:28},Z=()=>{X.x=+I.position.x.toFixed(2),X.y=+I.position.y.toFixed(2),X.z=+I.position.z.toFixed(2),X.tx=+N.target.x.toFixed(2),X.ty=+N.target.y.toFixed(2),X.tz=+N.target.z.toFixed(2),X.fov=I.fov,W.controllers.forEac
1h(e=>e.updateDisplay())},Y=()=>{I.position.set(X.x,X.y,X.z),N.target.set(X.tx,X.ty,X.tz),N.update()};if(W.add(X,"x",-200,200,.1).name("Pos X").onChange(Y),W.add(X,"y",-200,200,.1).name("Pos Y").onChange(Y),W.add(X,"z",-200,200,.1).name("Pos Z").onChange(Y),W.add(X,"tx",-200,200,.1).name("Target X").onChange(Y),W.add(X,"ty",-200,200,.1).name("Target Y").onChange(Y),W.add(X,"tz",-200,200,.1).name("Target Z").onChange(Y),W.add(X,"fov",10,120,1).name("FOV").onChange(()=>{I.fov=X.fov,I.updateProjectionMatrix()}),W.add({copy:()=>{let e="position: [".concat(X.x,", ").concat(X.y,", ").concat(X.z,"], target: [").concat(X.tx,", ").concat(X.ty,", ").concat(X.tz,"], fov: ").concat(X.fov);navigator.clipboard.writeText(e),console.log("Copied:",e)}},"copy").name("\uD83D\uDCCB Copy Camera Values"),N.addEventListener("change",Z),t.length>0){let e=_.addFolder("Features"),a=t.map(()=>({position:[0,0,0],target:[0,0,0]}));t.forEach((t,o)=>{let n=e.addFolder("".concat(o," â ").concat(t.title)),d={px:0,py:0,pz:0,tx:0,ty:0,tz:0};n.add(d,"px",-100,100,.01).name("Pos X").onChange(e=>{a[o].position[0]=e}),n.add(d,"py",-100,100,.01).name("Pos Y").onChange(e=>{a[o].position[1]=e}),n.add(d,"pz",-100,100,.01).name("Pos Z").onChange(e=>{a[o].position[2]=e}),n.add(d,"tx",-100,100,.01).name("Target X").onChange(e=>{a[o].target[0]=e}),n.add(d,"ty",-100,100,.01).name("Target Y").onChange(e=>{a[o].target[1]=e}),n.add(d,"tz",-100,100,.01).name("Target Z").onChange(e=>{a[o].target[2]=e}),n.add({jumpTo:()=>{I.position.set(d.px,d.py,d.pz),N.target.set(d.tx,d.ty,d.tz),N.update(),Z()}},"jumpTo").name("Jump To"),n.add({setFromCurrent:()=>{d.px=+I.position.x.toFixed(2),d.py=+I.position.y.toFixed(2),d.pz=+I.position.z.toFixed(2),d.tx=+N.target.x.toFixed(2),d.ty=+N.target.y.toFixed(2),d.tz=+N.target.z.toFixed(2),a[o]={position:[d.px,d.py,d.pz],target:[d.tx,d.ty,d.tz]},n.controllers.forEach(e=>e.updateDisplay())}},"setFromCurrent").name("Set From Current"),n.close()}),e.add({copyAll:()=>{var e;let o=(null===(e=m[h])||void 0===e?void 0:e.src)||m[0].src,n=a.map((e,a)=>{var o;let n=(null===(o=t[a])||void 0===o?void 0:o.title)||"".concat(a);return" { position: [".concat(e.position.join(", "),"], target: [").concat(e.target.join(", "),"] }, // ").concat(a," â ").concat(n)}),d="'".concat(o,"': [\n").concat(n.join("\n"),"\n],");navigator.clipboard.writeText(d),console.log("Copied feature cameras:\n"+d)}},"copyAll").name("Copy All Positions")}o.setSize(R,A,!1);let L=new i._().setDecoderPath("https://www.gstatic.com/draco/versioned/decoders/1.5.7/"),H=new s.E;H.setDRACOLoader(L),H.setMeshoptDecoder(l.z);let V=new Map,q=e=>{F&&(n.remove(F),F=null);let t=V.get(e);if(t){B(t.clone(!0),e);return}H.load(e,t=>{V.set(e,t.scene.clone(!0)),B(t.scene,e)})},B=(e,t)=>{F=e,z.clear(),e.traverse(e=>{e.isMesh&&!e.geometry.attributes.normal&&e.geometry.computeVertexNormals()});let a=[];e.traverse(e=>{e.name.startsWith("Truck")&&a.push(e)}),a.forEach(e=>e.removeFromParent()),n.add(e),e.updateMatrixWorld(!0);let o=new r.ZzF().setFromObject(e),d=o.getCenter(new r.Pa4);e.position.sub(d),o.setFromObject(e);let s=o.getSize(new r.Pa4),i=.85*Math.max(s.x,s.y,s.z);P();let l=o.min.y-e.position.y,c=new r.Wid({color:new r.Ilk(D.color),roughness:1,metalness:0}),p=new r.Kj0(new r._12(2e3,2e3),c);p.name="__groundPlane",p.rotation.x=-Math.PI/2,p.position.y=l,p.receiveShadow=!0,e.add(p),O=c,x.set(0,0,0),w=i,b();let m=f.shadow.camera;m.left=-i,m.right=i,m.top=i,m.bottom=-i,m.near=.1,m.far=8*i,m.updateProjectionMatrix(),I.position.set(.8*i,.5*i,.8*i),N.target.set(0,0,0),I.near=.001*i,I.far=100*i,I.updateProjectionMatrix(),N.update(),Z()};m.forEach(e=>{V.has(e.src)||H.load(e.src,t=>{V.set(e.src,t.scene.clone(!0))})}),q(m[0].src),u.current={loadModel:q};let G=()=>{N.update(),o.render(n,I),requestAnimationFrame(G)},K=requestAnimationFrame(G),J=new ResizeObserver(e=>{let[t]=e,{width:a,height:n}=t.contentRect;0!==a&&0!==n&&(I.aspect=a/n,I.updateProjectionMatrix(),o.setSize(a,n,!1))});return J.observe(e),()=>{_.destroy(),J.disconnect(),cancelAnimationFrame(K),N.dispose(),o.dispose(),e.removeChild(o.domElement),u.current=null}},[]);let y=e=>{var t;g(e),null===(t=u.current)||void 0===t||t.loadModel(m[e].src)};return(0,o.jsxs)("div",{style:{width:"100vw",height:"100vh",position:"relative",backgroundColor:"#F8F8F8"},children:[(0,o.jsx)("div",{style:{position:"absolute",bottom:16,left:16,zIndex:10,display:"flex",gap:8},children:m.map((e,t)=>(0,o.jsx)("button",{onClick:()=>y(t),style:{padding:"8px 16px",border:"1px solid #ccc",borderRadius:6,background:h===t?"#000":"#fff",color:h===t?"#fff":"#000",cursor:"pointer",fontSize:14,fontFamily:"system-ui, sans-serif"},children:e.label},e.src))}),(0,o.jsx)("div",{ref:a,style:{width:"100%",height:"100%",overflow:"hidden"}})]})}}},function(e){e.O(0,[2934,3737,840,8243,2888,9774,179],function(){return e(e.s=28114)}),_N_E=e.O()}]);
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.