@selvajs/visualization 1.5.0 → 1.6.0-beta.1
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/parse.cjs +8 -8
- package/dist/parse.cjs.map +1 -1
- package/dist/parse.js +8 -8
- package/dist/parse.js.map +1 -1
- package/dist/render.cjs +1 -1
- package/dist/render.cjs.map +1 -1
- package/dist/render.d.cts +1 -1
- package/dist/render.d.ts +1 -1
- package/dist/render.js +1 -1
- package/dist/render.js.map +1 -1
- package/package.json +1 -1
package/dist/render.d.cts
CHANGED
|
@@ -256,7 +256,7 @@ type EventConfig = {
|
|
|
256
256
|
enableEventHandlers?: boolean;
|
|
257
257
|
enableKeyboardControls?: boolean;
|
|
258
258
|
enableClickToFocus?: boolean;
|
|
259
|
-
/** Default true. */
|
|
259
|
+
/** Double-click frames the object under the cursor, or all content on empty background. Default true. */
|
|
260
260
|
enableDoubleClickZoom?: boolean;
|
|
261
261
|
onReady?: () => void;
|
|
262
262
|
/** Fires every animation frame, after controls update and before render. */
|
package/dist/render.d.ts
CHANGED
|
@@ -256,7 +256,7 @@ type EventConfig = {
|
|
|
256
256
|
enableEventHandlers?: boolean;
|
|
257
257
|
enableKeyboardControls?: boolean;
|
|
258
258
|
enableClickToFocus?: boolean;
|
|
259
|
-
/** Default true. */
|
|
259
|
+
/** Double-click frames the object under the cursor, or all content on empty background. Default true. */
|
|
260
260
|
enableDoubleClickZoom?: boolean;
|
|
261
261
|
onReady?: () => void;
|
|
262
262
|
/** Fires every animation frame, after controls update and before render. */
|
package/dist/render.js
CHANGED
|
@@ -104,5 +104,5 @@ import{a as e,c as t,d as n,f as r,g as i,h as a,l as o,m as s,p as c,r as l,s a
|
|
|
104
104
|
float edge = max(depthEdge, normalEdge) * uOpacity;
|
|
105
105
|
gl_FragColor = vec4(mix(color.rgb, uColor, edge), color.a);
|
|
106
106
|
}
|
|
107
|
-
`};var Pt=class extends N{camera;scene;normalMaterial;edgeMaterial;fsQuad;normalTarget=null;width;height;constructor(e,t,n,r,i={}){super(),this.scene=e,this.camera=t,this.width=Math.max(1,n),this.height=Math.max(1,r),this.normalMaterial=new v.MeshNormalMaterial,this.normalMaterial.blending=v.NoBlending,this.edgeMaterial=new v.ShaderMaterial({uniforms:v.UniformsUtils.clone(Nt.uniforms),vertexShader:Nt.vertexShader,fragmentShader:Nt.fragmentShader});let a=this.edgeMaterial.uniforms;a.uColor.value=new v.Color(i.color??2236962),a.uOpacity.value=i.opacity??1,a.uNormalThreshold.value=i.normalThreshold??.4,a.uDepthThreshold.value=i.depthThreshold??.02,a.uThickness.value=i.thickness??1,this.fsQuad=new ee(this.edgeMaterial),this.needsSwap=!0}acquireNormalTarget(){if(!this.normalTarget){let e=new v.DepthTexture(this.width,this.height);this.normalTarget=new v.WebGLRenderTarget(this.width,this.height,{minFilter:v.NearestFilter,magFilter:v.NearestFilter,depthTexture:e})}return this.normalTarget}setSize(e,t){this.width=Math.max(1,e),this.height=Math.max(1,t),this.normalTarget?.setSize(this.width,this.height)}render(e,t,n){let r=this.acquireNormalTarget(),i=e.getRenderTarget(),a=e.autoClear,o=e.getClearColor(new v.Color),s=e.getClearAlpha(),c=this.scene.overrideMaterial;e.setRenderTarget(r),e.setClearColor(7829503,1),e.autoClear=!0,this.scene.overrideMaterial=this.normalMaterial,e.render(this.scene,this.camera),this.scene.overrideMaterial=c,e.setClearColor(o,s),e.autoClear=a;let l=this.edgeMaterial.uniforms;l.tDiffuse.value=n.texture,l.tNormal.value=r.texture,l.tDepth.value=r.depthTexture,l.uResolution.value.set(this.width,this.height);let u=this.camera;l.uPerspective.value=+!!u.isPerspectiveCamera,l.uNear.value=this.camera.near??.1,l.uFar.value=this.camera.far??1e3,e.setRenderTarget(this.renderToScreen?null:t),this.fsQuad.render(e),e.setRenderTarget(i)}dispose(){this.normalTarget?.dispose(),this.normalMaterial.dispose(),this.edgeMaterial.dispose(),this.fsQuad.dispose()}};function Ft(e){return e>=2?0:4}function It(e,t,n,r,i,a){let o=new v.WebGLRenderTarget(r,i,{type:v.HalfFloatType}),s=new O(e,o);s.renderTarget2.samples=0;let c=e=>{s.readBuffer=o,s.writeBuffer=s.renderTarget2,s.render(e)},l=new k(t,n);s.addPass(l);let u=null;(a.ambientOcclusion??!0)&&(u=new A(t,n,r,i),u.blendIntensity=a.aoIntensity??1,u.updateGtaoMaterial({screenSpaceRadius:!0}),s.addPass(u));let d=new Pt(t,n,r,i,typeof a.edgeDetection==`object`?a.edgeDetection:{});d.enabled=!!a.edgeDetection,s.addPass(d);let f=new j;s.addPass(f);let p=new M;s.addPass(p),e.toneMapping=a.toneMapping,e.toneMappingExposure=a.toneMappingExposure;let m=a.aoPixelRatio??1,h=1;if(u){let e=u.setSize.bind(u);u.setSize=(t,n)=>e(Math.max(1,Math.round(t*h)),Math.max(1,Math.round(n*h)))}let g=e=>{h=Math.min(e,m)/e;let t=Ft(e);o.samples!==t&&(o.samples=t,o.dispose()),s.setPixelRatio(e)};return g(e.getPixelRatio()),s.setSize(r,i),{render:c,setSize:(e,t,n)=>{g(n),s.setSize(e,t)},setCamera:e=>{if(l.camera=e,d.camera=e,!u)return;u.camera=e;let t=+!!e.isPerspectiveCamera;u.gtaoMaterial.defines.PERSPECTIVE_CAMERA!==t&&(u.gtaoMaterial.defines.PERSPECTIVE_CAMERA=t,u.gtaoMaterial.needsUpdate=!0)},setEdgeDetection:e=>{d.enabled=e},edgeDetectionEnabled:()=>d.enabled,dispose:()=>{s.dispose(),u?.dispose(),d.dispose(),f.dispose(),p.dispose()}}}function Lt(e){let{renderer:t,scene:n,getActiveCamera:r,getCanvasSize:i,pixelRatio:a,config:o,requestRender:s}=e,c=null,l=!!o.render.ambientOcclusion,u=!1,d=!1,f=e=>{let{width:s,height:c}=i(),l=It(t,n,r(),Math.max(1,s),Math.max(1,c),{toneMapping:o.render.toneMapping??v.NeutralToneMapping,toneMappingExposure:o.render.toneMappingExposure??1,ambientOcclusion:e,aoIntensity:o.render.aoIntensity,aoPixelRatio:o.render.aoPixelRatio,edgeDetection:!1});return l.setSize(Math.max(1,s),Math.max(1,c),a),l},p=()=>{if(!(l||u)){c?.dispose(),c=null,s();return}(!c||d!==l)&&(c?.dispose(),c=f(l),d=l),c.setEdgeDetection(u),s()};return{get:()=>c,sync:p,rebuild:()=>{c?.dispose(),c=null,p()},setAmbientOcclusion:e=>{l=e,p()},setEdgeFallback:e=>{e!==u&&(u=e,p())},isEdgeFallbackActive:()=>u,dispose:()=>{c?.dispose(),c=null}}}function Rt(e,t,n){let r=new P(e,t),i=n.camera.target;return i&&r.target.set(i.x,i.y,i.z),r.enableDamping=n.controls.enableDamping||!1,r.dampingFactor=n.controls.dampingFactor||.05,r.autoRotate=n.controls.autoRotate||!1,r.autoRotateSpeed=n.controls.autoRotateSpeed||.5,r.enableZoom=n.controls.enableZoom??!0,r.enablePan=n.controls.enablePan??!0,r.minDistance=n.controls.minDistance||.001,r.maxDistance=n.controls.maxDistance||1/0,r.screenSpacePanning=!1,r.maxPolarAngle=Math.PI,r.update(),r}function zt(e,t,n,r){n.environment.enableEnvironmentLighting?(V(e,t,le(n.environment.sceneUp??Q)),new F().load(n.environment.hdrPath||`/baseHDR.hdr`,function(i){if(r()){i.dispose();return}if(!i?.image){c().warn(`HDR loaded without image data; skipping environment map.`),i?.dispose(),n.events.onReady?.();return}i.mapping=v.EquirectangularReflectionMapping;let a=new v.PMREMGenerator(t);a.compileEquirectangularShader();let o=a.fromEquirectangular(i).texture;a.dispose(),e.environment=o,e.environmentIntensity=n.environment.environmentIntensity??1;let s=le(n.environment.sceneUp??Q);e.environmentRotation.copy(s),n.environment.showEnvironment?(e.background=i,e.backgroundRotation.copy(s)):i.dispose(),n.events.onReady?.()},void 0,function(e){r()||(c().warn(`HDR texture could not be loaded, falling back to basic lighting:`,e),n.events.onReady?.())})):n.events.onReady?.()}function Bt(e,t){let n=t.floor.size,r=new v.PlaneGeometry(n,n),i=typeof t.floor.color==`string`?new v.Color(t.floor.color):t.floor.color,a=new v.MeshStandardMaterial({color:i,roughness:t.floor.roughness,metalness:t.floor.metalness,side:v.DoubleSide}),o=new v.Mesh(r,a);o.userData.id=`floor`,o.name=`floor`;let s=(t.environment?.sceneUp||Q).clone().normalize();o.quaternion.setFromUnitVectors(new v.Vector3(0,0,1),s),o.position.set(0,0,0),t.floor.receiveShadow&&t.render.enableShadows&&(o.receiveShadow=!0),e.add(o)}function Vt(e,t,n){if(n&&`emissive`in e){let n=e;n.emissive=t.clone(),n.emissiveIntensity=.6,n.color.lerp(t,.75),n.metalness=Math.min(n.metalness,.2),n.opacity<1&&(n.opacity=1,n.transparent=!1,n.depthWrite=!0);return}`color`in e&&(e.color=t.clone())}function Ht(e,t,n,r){let i=new Set,a=new Map,o=null,s=null,l=null,u=new v.Raycaster,d=new v.Vector2,f=new v.Vector2,p=()=>n.getActiveCamera(),h=e=>{let t=e;for(;t;){if(!t.visible)return!1;t=t.parent}return!0},g=()=>{let e=G(t);if(e.isEmpty()){c().warn(`No objects to fit to view`);return}n.frameBounds(e,!1)},_=typeof r.events.selectionColor==`string`?new v.Color(r.events.selectionColor):r.events.selectionColor instanceof v.Color?r.events.selectionColor:new v.Color(`#ff0000`),y=()=>{o&&(o(),o=null,l?.dispose(),l=null),i.forEach(e=>{let n=e;if(a.has(e)){let r=a.get(e),i=n.material;i instanceof v.Material?i.dispose():Array.isArray(i)&&i.forEach(e=>e.dispose()),n.material=r,a.delete(e);let o=e;for(;o.parent;)o=o.parent;o!==t&&(r instanceof v.Material?r.dispose():r.forEach(e=>e.dispose()))}}),i.clear(),s=null},b=(e,t)=>{if(t&&e instanceof v.Mesh){let n=m(e).clone();return Vt(n,_,!0),l=n,o=Re(e,t,n),!0}let n=e;if(!(n.material instanceof v.Material))return!1;let r=n.material.clone();return Vt(r,_,e instanceof v.Mesh),a.set(e,n.material),n.material=r,!0},x=null,S=-1,C=()=>{if(x===null||t.children.length!==S){let e=G(t);x=e.isEmpty()?1:e.getSize(new v.Vector3).length(),S=t.children.length}u.params.Points.threshold=x*.01},w=(n,r)=>{let i=e.getBoundingClientRect();d.x=(n-i.left)/i.width*2-1,d.y=-((r-i.top)/i.height)*2+1,C(),u.setFromCamera(d,p());for(let e of u.intersectObjects(t.children,!0))if(h(e.object)&&!me(e.object))return e;return null},T=e=>{f.set(e.clientX,e.clientY)},E=e=>{let t=new v.Vector2(e.clientX,e.clientY);if(f.distanceTo(t)>5)return;let n=w(e.clientX,e.clientY);if(!n){y(),r.events?.onBackgroundClicked?.({x:d.x,y:d.y});return}let a=n.object,o=Ie(n),c=o?.index??null;i.has(a)&&c===s||(y(),i.add(a),s=c,b(a,o?.member??null),r.events?.onObjectSelected?.(a),o?r.events?.onMeshMetadataClicked?.({source:a.userData?.source,name:o.member.name,layer:o.member.layer,trackingKey:o.member.trackingKey,metadata:o.member.metadata}):a instanceof v.Mesh&&Object.keys(a.userData).length>0&&r.events?.onMeshMetadataClicked?.(a.userData))},D=e=>{let t=w(e.clientX,e.clientY);if(!t)return;let i=t.object;if(r.events?.onMeshDoubleClicked?.(i),!r.events?.enableDoubleClickZoom)return;let a=Ie(t),o=a&&i instanceof v.Mesh?Le(i,a.member):new v.Box3().setFromObject(i);o.isEmpty()||n.frameBounds(o,!0)},O=e=>{if(r.events?.enableKeyboardControls)switch(e.key.toLowerCase()){case`f`:e.preventDefault(),g();break;case`escape`:e.preventDefault(),y();break;case` `:e.preventDefault(),g()}};return r.events?.enableClickToFocus&&(e.addEventListener(`mousedown`,T),e.addEventListener(`click`,E),e.addEventListener(`dblclick`,D)),r.events?.enableKeyboardControls&&(e.setAttribute(`tabindex`,`0`),e.addEventListener(`keydown`,O)),{dispose:()=>{e.removeEventListener(`mousedown`,T),e.removeEventListener(`click`,E),e.removeEventListener(`dblclick`,D),e.removeEventListener(`keydown`,O),y()},fitToView:g,clearSelection:y}}function Ut(e,t){let n=new v.AmbientLight(t.lighting.ambientLightColor,t.lighting.ambientLightIntensity);e.add(n);let r=null;if(t.lighting.enableHemisphereLight){r=new v.HemisphereLight(t.lighting.hemisphereSkyColor,t.lighting.hemisphereGroundColor,t.lighting.hemisphereIntensity);let n=t.environment.sceneUp??Q;r.position.copy(n),e.add(r)}if(!t.lighting.enableSunlight)return{ambient:n,hemisphere:r,sun:null};let i=new v.DirectionalLight(t.lighting.sunlightColor??16777215,t.lighting.sunlightIntensity),a=t.lighting.sunlightPosition;return a&&i.position.set(a.x,a.y,a.z),t.render.enableShadows?(i.castShadow=!0,i.shadow.mapSize.width=t.render.shadowMapSize||2048,i.shadow.mapSize.height=t.render.shadowMapSize||2048,i.shadow.bias=-1e-4,i.shadow.normalBias=.02,i.shadow.radius=4,e.add(i),e.add(i.target),{ambient:n,hemisphere:r,sun:i}):(e.add(i),{ambient:n,hemisphere:r,sun:null})}function Wt(e,t){if(t.isEmpty())return;let n=t.getCenter(new v.Vector3),r=t.getSize(new v.Vector3).length()*.5*1.2,i=e.shadow.camera;i.left=-r,i.right=r,i.top=r,i.bottom=-r,e.target.position.copy(n),e.target.updateMatrixWorld();let a=e.position.distanceTo(n);i.near=Math.max(r*.01,a-r),i.far=a+r,i.updateProjectionMatrix()}function Gt(e,t,n){let r=new v.WebGLRenderer({antialias:t.render.antialias,canvas:e,alpha:!0,powerPreference:`high-performance`,preserveDrawingBuffer:t.render.preserveDrawingBuffer,logarithmicDepthBuffer:!1}),i=e.parentElement,a=i?i.clientWidth:window.innerWidth,o=i?i.clientHeight:window.innerHeight;return i&&(e.style.width=`100%`,e.style.height=`100%`,e.style.display=`block`),r.setSize(a,o,!1),r.setPixelRatio(n),t.render.enableShadows&&(r.shadowMap.enabled=!0,r.shadowMap.type=v.VSMShadowMap),r.toneMapping=t.render.toneMapping,r.toneMappingExposure=t.render.toneMappingExposure??1,r.outputColorSpace=v.SRGBColorSpace,r.sortObjects=!0,r}const Kt=function(e,t){let n=wt(t||{}),r=n.environment?.sceneUp||Q,i=n.render.pixelRatio??Math.min(window.devicePixelRatio,2),a=jt(n),o=At(n,e);o.up.copy(r);let s=Gt(e,n,i);l(s.capabilities.getMaxAnisotropy()),t?.onMaxAnisotropy?.(s.capabilities.getMaxAnisotropy());let c=Rt(o,e,n),u=ve({scene:a,perspective:o,controls:c,onActiveCameraChange:()=>{},up:r}),f=()=>u.getActiveCamera(),p=!1;zt(a,s,n,()=>p);let m=Ut(a,n),h=m.sun,g=()=>{h&&Wt(h,G(a))};n.floor?.enabled&&Bt(a,n);let _=n.floor?.enabled?a.children.find(e=>e.userData.id===`floor`)??null:null,y=n.grid.enabled?it({cellSize:n.grid.cellSize,majorEvery:n.grid.majorEvery,cellColor:n.grid.cellColor,majorColor:n.grid.majorColor,fadeDistance:n.grid.fadeDistance,plane:n.grid.plane}):null;y&&a.add(y.object);let b=()=>{y&&y.fitToContent(G(a))},x=n.gizmo.enabled?St({camera:o,domElement:e,controller:u}):null,S=n.grid.plane??ue(r),C=new v.Vector3(+(S===`x`),+(S===`y`),+(S===`z`)),w=r.clone().normalize(),T=n.camera.dynamicNear?mt({camera:o,scene:a,groundNormals:()=>{let e=[];return y?.object.visible&&e.push(C),n.floor.enabled&&_?.visible&&e.push(w),e}}):null,E=at(e.parentElement??e,a),D=n.measure.enabled?ft({canvas:e,scene:a,getActiveCamera:f,labelLayer:E,options:{snapPixels:n.measure.snapPixels,color:n.measure.color,labelClassName:n.measure.labelClassName,displayUnit:n.measure.displayUnit,format:n.measure.format}}):null,O=n.events.enableEventHandlers===!1?{dispose:()=>{},fitToView:()=>{},clearSelection:()=>{}}:Ht(e,a,u,n),k=bt();D&&k.register({id:`measure`,tool:D,priority:0}),x&&k.register({id:`gizmo`,tool:x,priority:-100});let A=0,j=0,M=e=>{A=e.clientX,j=e.clientY},ee=e=>Math.hypot(e.clientX-A,e.clientY-j)>5,N=e=>{ee(e)||k.handleClick(e)&&e.stopImmediatePropagation()};e.addEventListener(`mousedown`,M,{capture:!0}),e.addEventListener(`click`,N,{capture:!0});let P=e=>k.handleMove(e);e.addEventListener(`mousemove`,P,{passive:!0});let F=()=>{},te=(e,t)=>{tt(e,{color:n.edges.color,darken:n.edges.darken,width:n.edges.width,thresholdAngle:n.edges.thresholdAngle,distanceFade:n.edges.distanceFade,maxTriangles:n.edges.maxTriangles,maxSegments:n.edges.maxSegments,maxOverlays:n.edges.maxOverlays,...t}).then(()=>{ne(e),F()})},ne=e=>{if(n.edges.screenSpaceFallback===!1)return;let t=!1;e.traverse(e=>{let n=e.userData?.edgesSkipped;(n===`triangle-cap`||n===`overlay-budget`)&&(t=!0)}),B.setEdgeFallback(t)},I=e=>{nt(e),B.setEdgeFallback(!1),F()},R=e.parentElement,z=()=>R?{width:R.clientWidth,height:R.clientHeight}:{width:window.innerWidth,height:window.innerHeight},B=Lt({renderer:s,scene:a,getActiveCamera:f,getCanvasSize:z,pixelRatio:i,config:n,requestRender:()=>F()});B.sync();let V=kt({scene:a,renderer:s,lights:m,config:n,pipeline:B,requestRender:()=>F()}),{animate:ae,dispose:oe,invalidate:H,renderNow:U}=Ct(s,a,o,f,u,c,z,i,n.events.onFrame,y,x,()=>B.get(),E,T,n.render.onDemand??!0);return F=H,ae(),a.up.set(r.x,r.y,r.z),g(),b(),{scene:a,camera:o,controls:c,renderer:s,cameraController:u,grid:y,gizmo:x,measureTool:D,labelLayer:E,tools:k,applyEdges:te,clearEdges:I,invalidate:H,captureImage:(e=`image/png`,t)=>(U(),new Promise(n=>s.domElement.toBlob(n,e,t))),setAmbientOcclusion:B.setAmbientOcclusion,setLook:V.setLook,setFillLights:V.setFillLights,setEnvironmentIntensity:V.setEnvironmentIntensity,setToneMappingExposure:V.setToneMappingExposure,setAoIntensity:V.setAoIntensity,getMaterialAppearance:V.getMaterialAppearance,updateShadowBounds:g,updateGridScale:b,dispose:()=>{p||(p=!0,oe(),O.dispose(),e.removeEventListener(`mousedown`,M,{capture:!0}),e.removeEventListener(`click`,N,{capture:!0}),e.removeEventListener(`mousemove`,P),D?.dispose(),E?.dispose(),x?.dispose(),y?.dispose(),B.dispose(),u.dispose(),c.dispose(),s.dispose(),s.forceContextLoss(),Mt(a))},fitToView:O.fitToView,clearSelection:O.clearSelection,addUserGeometry:(e,t)=>{e.userData.source=t===void 0?re:L(t),a.add(e),F()},removeUserGeometry:e=>{e.removeFromParent(),d(e),F()},clearUserGeometry:e=>{a.children.filter(t=>ie(t,e)).forEach(e=>{e.removeFromParent(),d(e)}),F()}}};export{u as DEFAULT_LOOK,a as ErrorCodes,te as LOOKS,t as LOOK_PRESETS,ne as SOURCE_COMPUTE,re as SOURCE_USER,i as VisualizationError,R as appIdFromSource,L as appSource,r as enableDebugLogging,c as getLogger,Kt as initThree,z as isHostOwned,ie as isOwnedBy,n as materialAppearanceForLook,lt as pickThreshold,xt as pointerToNdc,s as setLogger,dt as snapToVertex,de as updateScene};
|
|
107
|
+
`};var Pt=class extends N{camera;scene;normalMaterial;edgeMaterial;fsQuad;normalTarget=null;width;height;constructor(e,t,n,r,i={}){super(),this.scene=e,this.camera=t,this.width=Math.max(1,n),this.height=Math.max(1,r),this.normalMaterial=new v.MeshNormalMaterial,this.normalMaterial.blending=v.NoBlending,this.edgeMaterial=new v.ShaderMaterial({uniforms:v.UniformsUtils.clone(Nt.uniforms),vertexShader:Nt.vertexShader,fragmentShader:Nt.fragmentShader});let a=this.edgeMaterial.uniforms;a.uColor.value=new v.Color(i.color??2236962),a.uOpacity.value=i.opacity??1,a.uNormalThreshold.value=i.normalThreshold??.4,a.uDepthThreshold.value=i.depthThreshold??.02,a.uThickness.value=i.thickness??1,this.fsQuad=new ee(this.edgeMaterial),this.needsSwap=!0}acquireNormalTarget(){if(!this.normalTarget){let e=new v.DepthTexture(this.width,this.height);this.normalTarget=new v.WebGLRenderTarget(this.width,this.height,{minFilter:v.NearestFilter,magFilter:v.NearestFilter,depthTexture:e})}return this.normalTarget}setSize(e,t){this.width=Math.max(1,e),this.height=Math.max(1,t),this.normalTarget?.setSize(this.width,this.height)}render(e,t,n){let r=this.acquireNormalTarget(),i=e.getRenderTarget(),a=e.autoClear,o=e.getClearColor(new v.Color),s=e.getClearAlpha(),c=this.scene.overrideMaterial;e.setRenderTarget(r),e.setClearColor(7829503,1),e.autoClear=!0,this.scene.overrideMaterial=this.normalMaterial,e.render(this.scene,this.camera),this.scene.overrideMaterial=c,e.setClearColor(o,s),e.autoClear=a;let l=this.edgeMaterial.uniforms;l.tDiffuse.value=n.texture,l.tNormal.value=r.texture,l.tDepth.value=r.depthTexture,l.uResolution.value.set(this.width,this.height);let u=this.camera;l.uPerspective.value=+!!u.isPerspectiveCamera,l.uNear.value=this.camera.near??.1,l.uFar.value=this.camera.far??1e3,e.setRenderTarget(this.renderToScreen?null:t),this.fsQuad.render(e),e.setRenderTarget(i)}dispose(){this.normalTarget?.dispose(),this.normalMaterial.dispose(),this.edgeMaterial.dispose(),this.fsQuad.dispose()}};function Ft(e){return e>=2?0:4}function It(e,t,n,r,i,a){let o=new v.WebGLRenderTarget(r,i,{type:v.HalfFloatType}),s=new O(e,o);s.renderTarget2.samples=0;let c=e=>{s.readBuffer=o,s.writeBuffer=s.renderTarget2,s.render(e)},l=new k(t,n);s.addPass(l);let u=null;(a.ambientOcclusion??!0)&&(u=new A(t,n,r,i),u.blendIntensity=a.aoIntensity??1,u.updateGtaoMaterial({screenSpaceRadius:!0}),s.addPass(u));let d=new Pt(t,n,r,i,typeof a.edgeDetection==`object`?a.edgeDetection:{});d.enabled=!!a.edgeDetection,s.addPass(d);let f=new j;s.addPass(f);let p=new M;s.addPass(p),e.toneMapping=a.toneMapping,e.toneMappingExposure=a.toneMappingExposure;let m=a.aoPixelRatio??1,h=1;if(u){let e=u.setSize.bind(u);u.setSize=(t,n)=>e(Math.max(1,Math.round(t*h)),Math.max(1,Math.round(n*h)))}let g=e=>{h=Math.min(e,m)/e;let t=Ft(e);o.samples!==t&&(o.samples=t,o.dispose()),s.setPixelRatio(e)};return g(e.getPixelRatio()),s.setSize(r,i),{render:c,setSize:(e,t,n)=>{g(n),s.setSize(e,t)},setCamera:e=>{if(l.camera=e,d.camera=e,!u)return;u.camera=e;let t=+!!e.isPerspectiveCamera;u.gtaoMaterial.defines.PERSPECTIVE_CAMERA!==t&&(u.gtaoMaterial.defines.PERSPECTIVE_CAMERA=t,u.gtaoMaterial.needsUpdate=!0)},setEdgeDetection:e=>{d.enabled=e},edgeDetectionEnabled:()=>d.enabled,dispose:()=>{s.dispose(),u?.dispose(),d.dispose(),f.dispose(),p.dispose()}}}function Lt(e){let{renderer:t,scene:n,getActiveCamera:r,getCanvasSize:i,pixelRatio:a,config:o,requestRender:s}=e,c=null,l=!!o.render.ambientOcclusion,u=!1,d=!1,f=e=>{let{width:s,height:c}=i(),l=It(t,n,r(),Math.max(1,s),Math.max(1,c),{toneMapping:o.render.toneMapping??v.NeutralToneMapping,toneMappingExposure:o.render.toneMappingExposure??1,ambientOcclusion:e,aoIntensity:o.render.aoIntensity,aoPixelRatio:o.render.aoPixelRatio,edgeDetection:!1});return l.setSize(Math.max(1,s),Math.max(1,c),a),l},p=()=>{if(!(l||u)){c?.dispose(),c=null,s();return}(!c||d!==l)&&(c?.dispose(),c=f(l),d=l),c.setEdgeDetection(u),s()};return{get:()=>c,sync:p,rebuild:()=>{c?.dispose(),c=null,p()},setAmbientOcclusion:e=>{l=e,p()},setEdgeFallback:e=>{e!==u&&(u=e,p())},isEdgeFallbackActive:()=>u,dispose:()=>{c?.dispose(),c=null}}}function Rt(e,t,n){let r=new P(e,t),i=n.camera.target;return i&&r.target.set(i.x,i.y,i.z),r.enableDamping=n.controls.enableDamping||!1,r.dampingFactor=n.controls.dampingFactor||.05,r.autoRotate=n.controls.autoRotate||!1,r.autoRotateSpeed=n.controls.autoRotateSpeed||.5,r.enableZoom=n.controls.enableZoom??!0,r.enablePan=n.controls.enablePan??!0,r.minDistance=n.controls.minDistance||.001,r.maxDistance=n.controls.maxDistance||1/0,r.screenSpacePanning=!1,r.maxPolarAngle=Math.PI,r.update(),r}function zt(e,t,n,r){n.environment.enableEnvironmentLighting?(V(e,t,le(n.environment.sceneUp??Q)),new F().load(n.environment.hdrPath||`/baseHDR.hdr`,function(i){if(r()){i.dispose();return}if(!i?.image){c().warn(`HDR loaded without image data; skipping environment map.`),i?.dispose(),n.events.onReady?.();return}i.mapping=v.EquirectangularReflectionMapping;let a=new v.PMREMGenerator(t);a.compileEquirectangularShader();let o=a.fromEquirectangular(i).texture;a.dispose(),e.environment=o,e.environmentIntensity=n.environment.environmentIntensity??1;let s=le(n.environment.sceneUp??Q);e.environmentRotation.copy(s),n.environment.showEnvironment?(e.background=i,e.backgroundRotation.copy(s)):i.dispose(),n.events.onReady?.()},void 0,function(e){r()||(c().warn(`HDR texture could not be loaded, falling back to basic lighting:`,e),n.events.onReady?.())})):n.events.onReady?.()}function Bt(e,t){let n=t.floor.size,r=new v.PlaneGeometry(n,n),i=typeof t.floor.color==`string`?new v.Color(t.floor.color):t.floor.color,a=new v.MeshStandardMaterial({color:i,roughness:t.floor.roughness,metalness:t.floor.metalness,side:v.DoubleSide}),o=new v.Mesh(r,a);o.userData.id=`floor`,o.name=`floor`;let s=(t.environment?.sceneUp||Q).clone().normalize();o.quaternion.setFromUnitVectors(new v.Vector3(0,0,1),s),o.position.set(0,0,0),t.floor.receiveShadow&&t.render.enableShadows&&(o.receiveShadow=!0),e.add(o)}function Vt(e,t,n){if(n&&`emissive`in e){let n=e;n.emissive=t.clone(),n.emissiveIntensity=.6,n.color.lerp(t,.75),n.metalness=Math.min(n.metalness,.2),n.opacity<1&&(n.opacity=1,n.transparent=!1,n.depthWrite=!0);return}`color`in e&&(e.color=t.clone())}function Ht(e,t,n,r){let i=new Set,a=new Map,o=null,s=null,l=null,u=new v.Raycaster,d=new v.Vector2,f=new v.Vector2,p=()=>n.getActiveCamera(),h=e=>{let t=e;for(;t;){if(!t.visible)return!1;t=t.parent}return!0},g=()=>{let e=G(t);if(e.isEmpty()){c().warn(`No objects to fit to view`);return}n.frameBounds(e,!1)},_=typeof r.events.selectionColor==`string`?new v.Color(r.events.selectionColor):r.events.selectionColor instanceof v.Color?r.events.selectionColor:new v.Color(`#ff0000`),y=()=>{o&&(o(),o=null,l?.dispose(),l=null),i.forEach(e=>{let n=e;if(a.has(e)){let r=a.get(e),i=n.material;i instanceof v.Material?i.dispose():Array.isArray(i)&&i.forEach(e=>e.dispose()),n.material=r,a.delete(e);let o=e;for(;o.parent;)o=o.parent;o!==t&&(r instanceof v.Material?r.dispose():r.forEach(e=>e.dispose()))}}),i.clear(),s=null},b=(e,t)=>{if(t&&e instanceof v.Mesh){let n=m(e).clone();return Vt(n,_,!0),l=n,o=Re(e,t,n),!0}let n=e;if(!(n.material instanceof v.Material))return!1;let r=n.material.clone();return Vt(r,_,e instanceof v.Mesh),a.set(e,n.material),n.material=r,!0},x=null,S=-1,C=()=>{if(x===null||t.children.length!==S){let e=G(t);x=e.isEmpty()?1:e.getSize(new v.Vector3).length(),S=t.children.length}u.params.Points.threshold=x*.01},w=(n,r)=>{let i=e.getBoundingClientRect();d.x=(n-i.left)/i.width*2-1,d.y=-((r-i.top)/i.height)*2+1,C(),u.setFromCamera(d,p());for(let e of u.intersectObjects(t.children,!0))if(h(e.object)&&!me(e.object))return e;return null},T=e=>{f.set(e.clientX,e.clientY)},E=e=>{let t=new v.Vector2(e.clientX,e.clientY);if(f.distanceTo(t)>5)return;let n=w(e.clientX,e.clientY);if(!n){y(),r.events?.onBackgroundClicked?.({x:d.x,y:d.y});return}let a=n.object,o=Ie(n),c=o?.index??null;i.has(a)&&c===s||(y(),i.add(a),s=c,b(a,o?.member??null),r.events?.onObjectSelected?.(a),o?r.events?.onMeshMetadataClicked?.({source:a.userData?.source,name:o.member.name,layer:o.member.layer,trackingKey:o.member.trackingKey,metadata:o.member.metadata}):a instanceof v.Mesh&&Object.keys(a.userData).length>0&&r.events?.onMeshMetadataClicked?.(a.userData))},D=e=>{let i=w(e.clientX,e.clientY);if(!i){r.events?.enableDoubleClickZoom&&n.frameBounds(G(t),!0);return}let a=i.object;if(r.events?.onMeshDoubleClicked?.(a),!r.events?.enableDoubleClickZoom)return;let o=Ie(i),s=o&&a instanceof v.Mesh?Le(a,o.member):new v.Box3().setFromObject(a);s.isEmpty()||n.frameBounds(s,!0)},O=e=>{if(r.events?.enableKeyboardControls)switch(e.key.toLowerCase()){case`f`:e.preventDefault(),g();break;case`escape`:e.preventDefault(),y();break;case` `:e.preventDefault(),g()}};return r.events?.enableClickToFocus&&(e.addEventListener(`mousedown`,T),e.addEventListener(`click`,E),e.addEventListener(`dblclick`,D)),r.events?.enableKeyboardControls&&(e.setAttribute(`tabindex`,`0`),e.addEventListener(`keydown`,O)),{dispose:()=>{e.removeEventListener(`mousedown`,T),e.removeEventListener(`click`,E),e.removeEventListener(`dblclick`,D),e.removeEventListener(`keydown`,O),y()},fitToView:g,clearSelection:y}}function Ut(e,t){let n=new v.AmbientLight(t.lighting.ambientLightColor,t.lighting.ambientLightIntensity);e.add(n);let r=null;if(t.lighting.enableHemisphereLight){r=new v.HemisphereLight(t.lighting.hemisphereSkyColor,t.lighting.hemisphereGroundColor,t.lighting.hemisphereIntensity);let n=t.environment.sceneUp??Q;r.position.copy(n),e.add(r)}if(!t.lighting.enableSunlight)return{ambient:n,hemisphere:r,sun:null};let i=new v.DirectionalLight(t.lighting.sunlightColor??16777215,t.lighting.sunlightIntensity),a=t.lighting.sunlightPosition;return a&&i.position.set(a.x,a.y,a.z),t.render.enableShadows?(i.castShadow=!0,i.shadow.mapSize.width=t.render.shadowMapSize||2048,i.shadow.mapSize.height=t.render.shadowMapSize||2048,i.shadow.bias=-1e-4,i.shadow.normalBias=.02,i.shadow.radius=4,e.add(i),e.add(i.target),{ambient:n,hemisphere:r,sun:i}):(e.add(i),{ambient:n,hemisphere:r,sun:null})}function Wt(e,t){if(t.isEmpty())return;let n=t.getCenter(new v.Vector3),r=t.getSize(new v.Vector3).length()*.5*1.2,i=e.shadow.camera;i.left=-r,i.right=r,i.top=r,i.bottom=-r,e.target.position.copy(n),e.target.updateMatrixWorld();let a=e.position.distanceTo(n);i.near=Math.max(r*.01,a-r),i.far=a+r,i.updateProjectionMatrix()}function Gt(e,t,n){let r=new v.WebGLRenderer({antialias:t.render.antialias,canvas:e,alpha:!0,powerPreference:`high-performance`,preserveDrawingBuffer:t.render.preserveDrawingBuffer,logarithmicDepthBuffer:!1}),i=e.parentElement,a=i?i.clientWidth:window.innerWidth,o=i?i.clientHeight:window.innerHeight;return i&&(e.style.width=`100%`,e.style.height=`100%`,e.style.display=`block`),r.setSize(a,o,!1),r.setPixelRatio(n),t.render.enableShadows&&(r.shadowMap.enabled=!0,r.shadowMap.type=v.VSMShadowMap),r.toneMapping=t.render.toneMapping,r.toneMappingExposure=t.render.toneMappingExposure??1,r.outputColorSpace=v.SRGBColorSpace,r.sortObjects=!0,r}const Kt=function(e,t){let n=wt(t||{}),r=n.environment?.sceneUp||Q,i=n.render.pixelRatio??Math.min(window.devicePixelRatio,2),a=jt(n),o=At(n,e);o.up.copy(r);let s=Gt(e,n,i);l(s.capabilities.getMaxAnisotropy()),t?.onMaxAnisotropy?.(s.capabilities.getMaxAnisotropy());let c=Rt(o,e,n),u=ve({scene:a,perspective:o,controls:c,onActiveCameraChange:()=>{},up:r}),f=()=>u.getActiveCamera(),p=!1;zt(a,s,n,()=>p);let m=Ut(a,n),h=m.sun,g=()=>{h&&Wt(h,G(a))};n.floor?.enabled&&Bt(a,n);let _=n.floor?.enabled?a.children.find(e=>e.userData.id===`floor`)??null:null,y=n.grid.enabled?it({cellSize:n.grid.cellSize,majorEvery:n.grid.majorEvery,cellColor:n.grid.cellColor,majorColor:n.grid.majorColor,fadeDistance:n.grid.fadeDistance,plane:n.grid.plane}):null;y&&a.add(y.object);let b=()=>{y&&y.fitToContent(G(a))},x=n.gizmo.enabled?St({camera:o,domElement:e,controller:u}):null,S=n.grid.plane??ue(r),C=new v.Vector3(+(S===`x`),+(S===`y`),+(S===`z`)),w=r.clone().normalize(),T=n.camera.dynamicNear?mt({camera:o,scene:a,groundNormals:()=>{let e=[];return y?.object.visible&&e.push(C),n.floor.enabled&&_?.visible&&e.push(w),e}}):null,E=at(e.parentElement??e,a),D=n.measure.enabled?ft({canvas:e,scene:a,getActiveCamera:f,labelLayer:E,options:{snapPixels:n.measure.snapPixels,color:n.measure.color,labelClassName:n.measure.labelClassName,displayUnit:n.measure.displayUnit,format:n.measure.format}}):null,O=n.events.enableEventHandlers===!1?{dispose:()=>{},fitToView:()=>{},clearSelection:()=>{}}:Ht(e,a,u,n),k=bt();D&&k.register({id:`measure`,tool:D,priority:0}),x&&k.register({id:`gizmo`,tool:x,priority:-100});let A=0,j=0,M=e=>{A=e.clientX,j=e.clientY},ee=e=>Math.hypot(e.clientX-A,e.clientY-j)>5,N=e=>{ee(e)||k.handleClick(e)&&e.stopImmediatePropagation()};e.addEventListener(`mousedown`,M,{capture:!0}),e.addEventListener(`click`,N,{capture:!0});let P=e=>k.handleMove(e);e.addEventListener(`mousemove`,P,{passive:!0});let F=()=>{},te=(e,t)=>{tt(e,{color:n.edges.color,darken:n.edges.darken,width:n.edges.width,thresholdAngle:n.edges.thresholdAngle,distanceFade:n.edges.distanceFade,maxTriangles:n.edges.maxTriangles,maxSegments:n.edges.maxSegments,maxOverlays:n.edges.maxOverlays,...t}).then(()=>{ne(e),F()})},ne=e=>{if(n.edges.screenSpaceFallback===!1)return;let t=!1;e.traverse(e=>{let n=e.userData?.edgesSkipped;(n===`triangle-cap`||n===`overlay-budget`)&&(t=!0)}),B.setEdgeFallback(t)},I=e=>{nt(e),B.setEdgeFallback(!1),F()},R=e.parentElement,z=()=>R?{width:R.clientWidth,height:R.clientHeight}:{width:window.innerWidth,height:window.innerHeight},B=Lt({renderer:s,scene:a,getActiveCamera:f,getCanvasSize:z,pixelRatio:i,config:n,requestRender:()=>F()});B.sync();let V=kt({scene:a,renderer:s,lights:m,config:n,pipeline:B,requestRender:()=>F()}),{animate:ae,dispose:oe,invalidate:H,renderNow:U}=Ct(s,a,o,f,u,c,z,i,n.events.onFrame,y,x,()=>B.get(),E,T,n.render.onDemand??!0);return F=H,ae(),a.up.set(r.x,r.y,r.z),g(),b(),{scene:a,camera:o,controls:c,renderer:s,cameraController:u,grid:y,gizmo:x,measureTool:D,labelLayer:E,tools:k,applyEdges:te,clearEdges:I,invalidate:H,captureImage:(e=`image/png`,t)=>(U(),new Promise(n=>s.domElement.toBlob(n,e,t))),setAmbientOcclusion:B.setAmbientOcclusion,setLook:V.setLook,setFillLights:V.setFillLights,setEnvironmentIntensity:V.setEnvironmentIntensity,setToneMappingExposure:V.setToneMappingExposure,setAoIntensity:V.setAoIntensity,getMaterialAppearance:V.getMaterialAppearance,updateShadowBounds:g,updateGridScale:b,dispose:()=>{p||(p=!0,oe(),O.dispose(),e.removeEventListener(`mousedown`,M,{capture:!0}),e.removeEventListener(`click`,N,{capture:!0}),e.removeEventListener(`mousemove`,P),D?.dispose(),E?.dispose(),x?.dispose(),y?.dispose(),B.dispose(),u.dispose(),c.dispose(),s.dispose(),s.forceContextLoss(),Mt(a))},fitToView:O.fitToView,clearSelection:O.clearSelection,addUserGeometry:(e,t)=>{e.userData.source=t===void 0?re:L(t),a.add(e),F()},removeUserGeometry:e=>{e.removeFromParent(),d(e),F()},clearUserGeometry:e=>{a.children.filter(t=>ie(t,e)).forEach(e=>{e.removeFromParent(),d(e)}),F()}}};export{u as DEFAULT_LOOK,a as ErrorCodes,te as LOOKS,t as LOOK_PRESETS,ne as SOURCE_COMPUTE,re as SOURCE_USER,i as VisualizationError,R as appIdFromSource,L as appSource,r as enableDebugLogging,c as getLogger,Kt as initThree,z as isHostOwned,ie as isOwnedBy,n as materialAppearanceForLook,lt as pickThreshold,xt as pointerToNdc,s as setLogger,dt as snapToVertex,de as updateScene};
|
|
108
108
|
//# sourceMappingURL=render.js.map
|