@fnndsc/argus 0.16.1 → 0.16.3
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/assets/{Settings-CpJHgU8P.js → Settings-BVUBuS7x.js} +1 -1
- package/dist/assets/{Texture-BFywN4BL.js → Texture-BuH3IMMI.js} +1 -1
- package/dist/assets/{addVolumesToViewports-CKWYzwhw.js → addVolumesToViewports-zNnk-4oH.js} +1 -1
- package/dist/assets/{cornerstoneEngine-DgoPMn1N.js → cornerstoneEngine-DeIhrHvT.js} +2 -2
- package/dist/assets/{index-Cdc7wwHW.js → index-BTt9F1R3.js} +1 -1
- package/dist/assets/{index-CokKuJob.js → index-BXcXxOfb.js} +1 -1
- package/dist/assets/index-CmMP4_Js.css +1 -0
- package/dist/assets/{index-Bm3uV1GS.js → index-DB3HmYze.js} +218 -213
- package/dist/assets/{index-TqVFBkTw.js → index-DQtCsA7x.js} +1 -1
- package/dist/assets/{index-CWklH47t.js → index-DUmQYDVj.js} +1 -1
- package/dist/assets/{index-DfeCnMQa.js → index-Dxm-9AiZ.js} +1 -1
- package/dist/assets/{index-DSjYEFdg.js → index-ebMONeyi.js} +1 -1
- package/dist/assets/{niivueEngine-DSlA46Rh.js → niivueEngine-CUXKkvoW.js} +2 -2
- package/dist/assets/slabScene-DBD3c_6P.js +559 -0
- package/dist/index.html +9 -9
- package/package.json +1 -1
- package/dist/assets/index-CIblWv2u.css +0 -1
- package/dist/assets/slabScene-D4-P_5n2.js +0 -559
|
@@ -1,559 +0,0 @@
|
|
|
1
|
-
import{m as v,as as _e,R as gt,K as Pe,L as Ge,W as ke,N as Le,k as de,E as j,t as ft,i as Me,x as ce,F as vt,Z as ht,h as St,D as dt,al as Tt,c as wt,at as yt,d as Ve,au as Ct,y as ue,ak as le,av as We,j as pe}from"./cornerstoneEngine-DgoPMn1N.js";import{ae as ze,am as De,an as ae,K as D,k as Q,al as W,D as se,U as Ne,X as Be,B as b,J as xt,E as Et,ak as Rt,$ as $e,a2 as _t,Z as Mt,b as Vt,_ as Ke,ao as Dt,ap as He,aq as Bt,ar as Te,as as mt,z as Ot,at as Ut,au as Ft,av as re,ad as Pt,R as Gt,aw as I,ah as kt,ai as Lt,C as Wt,P as zt,I as Nt,a as $t}from"./Texture-BFywN4BL.js";import"./index-Bm3uV1GS.js";import"./_commonjsHelpers-CE1G-McA.js";function Kt(t){return t}function ye(t){if(t===null||t==="null")return null;if(t==="true")return!0;if(t==="false")return!1;if(!(t===void 0||t==="undefined"))return t[0]==="["&&t[t.length-1]==="]"?t.substring(1,t.length-1).split(",").map(e=>ye(e.trim())):t===""||Number.isNaN(Number(t))?t:Number(t)}function Ht(t=!0,e=window.location.search){const a={},s=t?ye:Kt;return new URLSearchParams(e).forEach((n,r)=>{r&&(a[r]=n?s(n):!0)}),a}var bt={toNativeType:ye,extractURLParameters:Ht},It={IS_START:0,IS_NONE:0,IS_ROTATE:1,IS_PAN:2,IS_SPIN:3,IS_DOLLY:4,IS_CAMERA_POSE:11,IS_WINDOW_LEVEL:1024,IS_SLICE:1025},Ce={States:It},{vtkErrorMacro:jt,VOID:Qt}=v;function Yt(t,e,a,s){return t.getRenderWindow().getViews()[0].worldToDisplay(e,a,s,t)}function Xt(t,e,a,s){return t.getRenderWindow().getViews()[0].displayToWorld(e,a,s,t)}var Zt={computeWorldToDisplay:Yt,computeDisplayToWorld:Xt};function Jt(t,e){e.classHierarchy.push("vtkInteractorObserver");const a={...t};function s(){for(;e.subscribedEvents.length;)e.subscribedEvents.pop().unsubscribe()}function n(){ze.handledEvents.forEach(r=>{t[`handle${r}`]&&e.subscribedEvents.push(e._interactor[`on${r}`](o=>e.processEvents?t[`handle${r}`](o):Qt,e.priority))})}t.setInteractor=r=>{r!==e._interactor&&(s(),e._interactor=r,r&&e.enabled&&n(),t.modified())},t.setEnabled=r=>{r!==e.enabled&&(s(),r&&(e._interactor?n():jt(`
|
|
2
|
-
The interactor must be set before subscribing to events
|
|
3
|
-
`)),e.enabled=r,t.modified())},t.computeDisplayToWorld=(r,o,i,u)=>r?e._interactor.getView().displayToWorld(o,i,u,r):null,t.computeWorldToDisplay=(r,o,i,u)=>r?e._interactor.getView().worldToDisplay(o,i,u,r):null,t.setPriority=r=>{a.setPriority(r)&&e._interactor&&(s(),n())}}var qt={enabled:!0,priority:0,processEvents:!0,subscribedEvents:[]};function be(t,e,a={}){Object.assign(e,qt,a),v.obj(t,e),v.event(t,e,"InteractionEvent"),v.event(t,e,"StartInteractionEvent"),v.event(t,e,"EndInteractionEvent"),v.get(t,e,["_interactor","enabled"]),v.setGet(t,e,["priority","processEvents"]),v.moveToProtected(t,e,["interactor"]),Jt(t,e)}var At=v.newInstance(be,"vtkInteractorObserver"),en={newInstance:At,extend:be,...Zt},{States:L}=Ce,ge={Rotate:L.IS_ROTATE,Pan:L.IS_PAN,Spin:L.IS_SPIN,Dolly:L.IS_DOLLY,CameraPose:L.IS_CAMERA_POSE,WindowLevel:L.IS_WINDOW_LEVEL,Slice:L.IS_SLICE};function tn(t,e){e.classHierarchy.push("vtkInteractorStyle"),Object.keys(ge).forEach(a=>{v.event(t,e,`Start${a}Event`),t[`start${a}`]=()=>{e.state===L.IS_NONE&&(e.state=ge[a],e._interactor.requestAnimation(t),t.invokeStartInteractionEvent({type:"StartInteractionEvent"}),t[`invokeStart${a}Event`]({type:`Start${a}Event`}))},v.event(t,e,`End${a}Event`),t[`end${a}`]=()=>{e.state===ge[a]&&(e.state=L.IS_NONE,e._interactor.cancelAnimation(t),t.invokeEndInteractionEvent({type:"EndInteractionEvent"}),t[`invokeEnd${a}Event`]({type:`End${a}Event`}),e._interactor.render())}}),e.getRenderer=a=>e.focusedRenderer||a.pokedRenderer,t.handleKeyPress=a=>{const s=e._interactor;let n=null;switch(a.key){case"r":case"R":e.getRenderer(a).resetCamera(),s.render();break;case"w":case"W":n=e.getRenderer(a).getActors(),n.forEach(r=>{const o=r.getProperty();o.setRepresentationToWireframe&&o.setRepresentationToWireframe()}),s.render();break;case"s":case"S":n=e.getRenderer(a).getActors(),n.forEach(r=>{const o=r.getProperty();o.setRepresentationToSurface&&o.setRepresentationToSurface()}),s.render();break;case"v":case"V":n=e.getRenderer(a).getActors(),n.forEach(r=>{const o=r.getProperty();o.setRepresentationToPoints&&o.setRepresentationToPoints()}),s.render();break}}}var nn={state:L.IS_NONE,handleObservers:1,autoAdjustCameraClippingRange:1};function Ie(t,e,a={}){Object.assign(e,nn,a),en.extend(t,e,a),v.setGet(t,e,["focusedRenderer"]),tn(t,e)}var an=v.newInstance(Ie,"vtkInteractorStyle"),xe={newInstance:an,extend:Ie,...Ce},{States:G}=Ce;function rn(t,e){e.classHierarchy.push("vtkInteractorStyleTrackballCamera"),t.handleMouseMove=a=>{const s=a.position,n=e.getRenderer(a);switch(e.state){case G.IS_ROTATE:t.handleMouseRotate(n,s),t.invokeInteractionEvent({type:"InteractionEvent"});break;case G.IS_PAN:t.handleMousePan(n,s),t.invokeInteractionEvent({type:"InteractionEvent"});break;case G.IS_DOLLY:e.wheelDolly||(t.handleMouseDolly(n,s),t.invokeInteractionEvent({type:"InteractionEvent"}));break;case G.IS_SPIN:t.handleMouseSpin(n,s),t.invokeInteractionEvent({type:"InteractionEvent"});break}e.previousPosition=s},t.handleButton3D=a=>{if(a&&a.pressed&&a.device===De.RightController&&(a.input===ae.Trigger||a.input===ae.TrackPad)){t.startCameraPose();return}a&&!a.pressed&&a.device===De.RightController&&(a.input===ae.Trigger||a.input===ae.TrackPad)&&e.state===G.IS_CAMERA_POSE&&t.endCameraPose()},t.handleMove3D=a=>{e.state===G.IS_CAMERA_POSE&&t.updateCameraPose(a)},t.updateCameraPose=a=>{const s=e.getRenderer(a).getActiveCamera(),n=s.getPhysicalTranslation(),r=.5*.05*s.getPhysicalScale(),o=s.physicalOrientationToWorldDirection([a.orientation.x,a.orientation.y,a.orientation.z,a.orientation.w]);s.setPhysicalTranslation(n[0]+o[0]*r,n[1]+o[1]*r,n[2]+o[2]*r)},t.handleLeftButtonPress=a=>{e.previousPosition=a.position,a.shiftKey?a.controlKey||a.altKey?t.startDolly():t.startPan():a.controlKey||a.altKey?t.startSpin():t.startRotate()},t.handleLeftButtonRelease=()=>{switch(e.state){case G.IS_DOLLY:t.endDolly();break;case G.IS_PAN:t.endPan();break;case G.IS_SPIN:t.endSpin();break;case G.IS_ROTATE:t.endRotate();break}},t.handleStartMouseWheel=()=>{e.wheelDolly=!0,t.startDolly()},t.handleEndMouseWheel=()=>{t.endDolly(),e.wheelDolly=!1},t.handleStartPinch=a=>{e.previousScale=a.scale,t.startDolly()},t.handleEndPinch=()=>{t.endDolly()},t.handleStartRotate=a=>{e.previousRotation=a.rotation,t.startRotate()},t.handleEndRotate=()=>{t.endRotate()},t.handleStartPan=a=>{e.previousTranslation=a.translation,t.startPan()},t.handleEndPan=()=>{t.endPan()},t.handlePinch=a=>{t.dollyByFactor(e.getRenderer(a),a.scale/e.previousScale),e.previousScale=a.scale},t.handlePan=a=>{const s=e.getRenderer(a).getActiveCamera();let n=s.getFocalPoint();n=t.computeWorldToDisplay(e.getRenderer(a),n[0],n[1],n[2]);const r=n[2],o=a.translation,i=e.previousTranslation,u=t.computeDisplayToWorld(e.getRenderer(a),n[0]+o[0]-i[0],n[1]+o[1]-i[1],r),p=t.computeDisplayToWorld(e.getRenderer(a),n[0],n[1],r),c=[];c[0]=p[0]-u[0],c[1]=p[1]-u[1],c[2]=p[2]-u[2],n=s.getFocalPoint();const l=s.getPosition();s.setFocalPoint(c[0]+n[0],c[1]+n[1],c[2]+n[2]),s.setPosition(c[0]+l[0],c[1]+l[1],c[2]+l[2]),e._interactor.getLightFollowCamera()&&e.getRenderer(a).updateLightsGeometryToFollowCamera(),s.orthogonalizeViewUp(),e.previousTranslation=a.translation},t.handleRotate=a=>{const s=e.getRenderer(a).getActiveCamera();s.roll(a.rotation-e.previousRotation),s.orthogonalizeViewUp(),e.previousRotation=a.rotation},t.handleMouseRotate=(a,s)=>{if(!e.previousPosition)return;const n=e._interactor,r=s.x-e.previousPosition.x,o=s.y-e.previousPosition.y,i=n.getView().getViewportSize(a);let u=-.1,p=-.1;i[0]&&i[1]&&(u=-20/i[1],p=-20/i[0]);const c=r*p*e.motionFactor,l=o*u*e.motionFactor,g=a.getActiveCamera();!Number.isNaN(c)&&!Number.isNaN(l)&&(g.azimuth(c),g.elevation(l),g.orthogonalizeViewUp()),e.autoAdjustCameraClippingRange&&a.resetCameraClippingRange(),n.getLightFollowCamera()&&a.updateLightsGeometryToFollowCamera()},t.handleMouseSpin=(a,s)=>{if(!e.previousPosition)return;const n=e._interactor,r=a.getActiveCamera(),o=n.getView().getViewportCenter(a),i=_e(Math.atan2(e.previousPosition.y-o[1],e.previousPosition.x-o[0])),u=_e(Math.atan2(s.y-o[1],s.x-o[0]))-i;Number.isNaN(u)||(r.roll(u),r.orthogonalizeViewUp())},t.handleMousePan=(a,s)=>{if(!e.previousPosition)return;const n=a.getActiveCamera();let r=n.getFocalPoint();r=t.computeWorldToDisplay(a,r[0],r[1],r[2]);const o=r[2],i=t.computeDisplayToWorld(a,s.x,s.y,o),u=t.computeDisplayToWorld(a,e.previousPosition.x,e.previousPosition.y,o),p=[];p[0]=u[0]-i[0],p[1]=u[1]-i[1],p[2]=u[2]-i[2],r=n.getFocalPoint();const c=n.getPosition();n.setFocalPoint(p[0]+r[0],p[1]+r[1],p[2]+r[2]),n.setPosition(p[0]+c[0],p[1]+c[1],p[2]+c[2]),e._interactor.getLightFollowCamera()&&a.updateLightsGeometryToFollowCamera()},t.handleMouseDolly=(a,s)=>{if(!e.previousPosition)return;const n=s.y-e.previousPosition.y,r=e._interactor.getView().getViewportCenter(a),o=e.motionFactor*n/r[1];t.dollyByFactor(a,1.1**o)},t.handleMouseWheel=a=>{const s=1-a.spinY/e.zoomFactor;t.dollyByFactor(e.getRenderer(a),s)},t.dollyByFactor=(a,s)=>{if(Number.isNaN(s))return;const n=a.getActiveCamera();n.getParallelProjection()?n.setParallelScale(n.getParallelScale()/s):(n.dolly(s),e.autoAdjustCameraClippingRange&&a.resetCameraClippingRange()),e._interactor.getLightFollowCamera()&&a.updateLightsGeometryToFollowCamera()}}var sn={motionFactor:10,zoomFactor:10,wheelDolly:!1};function je(t,e,a={}){Object.assign(e,sn,a),xe.extend(t,e,a),v.setGet(t,e,["motionFactor","zoomFactor"]),rn(t,e)}var on=v.newInstance(je,"vtkInteractorStyleTrackballCamera"),cn={newInstance:on,extend:je},{vtkErrorMacro:un}=gt,fe=["setBindGroup","setIndexBuffer","setVertexBuffer","draw","drawIndexed"];function ln(t,e){e.classHierarchy.push("vtkWebGPURenderEncoder"),t.begin=a=>{e.drawCallbacks=[],e.handle=a.beginRenderPass(e.description),e.label&&e.handle.pushDebugGroup(e.label)},t.end=()=>{for(let a=0;a<e.drawCallbacks.length;a++){const s=e.drawCallbacks[a],n=s.pipeline;t.setPipeline(n);for(let r=0;r<s.callbacks.length;r++)s.callbacks[r](t)}e.label&&e.handle.popDebugGroup(),e.handle.end(),e.boundPipeline=null},t.setPipeline=a=>{if(e.boundPipeline===a)return;e.handle.setPipeline(a.getHandle());const s=a.getPipelineDescription(),n=s.fragment?.targets;if(e.colorTextureViews.length!==n.length)console.log(`mismatched attachment counts on pipeline ${n.length} while encoder has ${e.colorTextureViews.length}`),console.trace();else for(let r=0;r<e.colorTextureViews.length;r++){const o=e.colorTextureViews[r].getTexture()?.getFormat();o&&o!==n[r].format&&(console.log(`mismatched attachments for attachment ${r} on pipeline ${n[r].format} while encoder has ${o}`),console.trace())}if(!!e.depthTextureView!="depthStencil"in s)console.log("mismatched depth attachments"),console.trace();else if(e.depthTextureView){const r=e.depthTextureView.getTexture()?.getFormat();r&&r!==s.depthStencil.format&&(console.log(`mismatched depth attachments on pipeline ${s.depthStencil.format} while encoder has ${r}`),console.trace())}e.boundPipeline=a},t.replaceShaderCode=a=>{e.replaceShaderCodeFunction(a)},t.setColorTextureView=(a,s)=>{e.colorTextureViews[a]!==s&&(e.colorTextureViews[a]=s)},t.activateBindGroup=a=>{const s=e.boundPipeline.getDevice(),n=e.boundPipeline.getBindGroupLayoutIndex(a.getLabel());if(n<0){un(`vtkWebGPURenderEncoder: could not find bind group layout ${a.getLabel()}`);return}e.handle.setBindGroup(n,a.getBindGroup(s));const r=s.getBindGroupLayoutDescription(a.getBindGroupLayout(s)),o=s.getBindGroupLayoutDescription(e.boundPipeline.getBindGroupLayout(n));r!==o&&(console.log(`renderEncoder ${e.pipelineHash} mismatched bind group layouts bind group has
|
|
4
|
-
${r}
|
|
5
|
-
versus pipeline
|
|
6
|
-
${o}
|
|
7
|
-
`),console.trace())},t.attachTextureViews=()=>{for(let a=0;a<e.colorTextureViews.length;a++)e.description.colorAttachments[a]?e.description.colorAttachments[a].view=e.colorTextureViews[a].getHandle():e.description.colorAttachments[a]={view:e.colorTextureViews[a].getHandle()};e.depthTextureView&&(e.description.depthStencilAttachment.view=e.depthTextureView.getHandle())},t.registerDrawCallback=(a,s)=>{for(let n=0;n<e.drawCallbacks.length;n++)if(e.drawCallbacks[n].pipeline===a){e.drawCallbacks[n].callbacks.push(s);return}e.drawCallbacks.push({pipeline:a,callbacks:[s]})};for(let a=0;a<fe.length;a++)t[fe[a]]=(...s)=>e.handle[fe[a]](...s)}var pn={description:null,handle:null,boundPipeline:null,pipelineHash:null,pipelineSettings:null,replaceShaderCodeFunction:null,depthTextureView:null,label:null};function Qe(t,e,a={}){Object.assign(e,pn,a),Ge(t,e),e.description={colorAttachments:[{view:void 0,loadOp:"load",storeOp:"store"}],depthStencilAttachment:{view:void 0,depthLoadOp:"clear",depthClearValue:0,depthStoreOp:"store"}},e.replaceShaderCodeFunction=s=>{const n=s.getShaderDescription("fragment");n.addOutput("vec4<f32>","outColor");let r=n.getCode();r=D.substitute(r,"//VTK::RenderEncoder::Impl",["output.outColor = computedColor;"]).result,n.setCode(r)},e.pipelineSettings={primitive:{cullMode:"none"},depthStencil:{depthWriteEnabled:!0,depthCompare:"greater-equal",format:"depth32float"},fragment:{targets:[{format:"rgba16float",blend:{color:{srcFactor:"src-alpha",dstFactor:"one-minus-src-alpha"},alpha:{srcFactor:"one",dstFactor:"one-minus-src-alpha"}}}]}},e.colorTextureViews=[],ke(t,e,["boundPipeline","colorTextureViews"]),Le(t,e,["depthTextureView","description","handle","label","pipelineHash","pipelineSettings","replaceShaderCodeFunction"]),ln(t,e)}var gn=Pe(Qe,"vtkWebGPURenderEncoder"),z={newInstance:gn,extend:Qe};function fn(t,e){e.classHierarchy.push("vtkWebGPUOpaquePass"),t.traverse=(a,s)=>{if(e.deleted)return;e._currentParent=s;const n=s.getDevice();if(e.renderEncoder)e.colorTexture.resize(s.getCanvas().width,s.getCanvas().height),e.depthTexture.resize(s.getCanvas().width,s.getCanvas().height);else{t.createRenderEncoder(),e.colorTexture=W.newInstance({label:"opaquePassColor"}),e.colorTexture.create(n,{width:s.getCanvas().width,height:s.getCanvas().height,format:"rgba16float",usage:GPUTextureUsage.RENDER_ATTACHMENT|GPUTextureUsage.TEXTURE_BINDING|GPUTextureUsage.COPY_SRC});const r=e.colorTexture.createView("opaquePassColorTexture");e.renderEncoder.setColorTextureView(0,r),e.depthFormat="depth32float",e.depthTexture=W.newInstance({label:"opaquePassDepth"}),e.depthTexture.create(n,{width:s.getCanvas().width,height:s.getCanvas().height,format:e.depthFormat,usage:GPUTextureUsage.RENDER_ATTACHMENT|GPUTextureUsage.TEXTURE_BINDING|GPUTextureUsage.COPY_SRC});const o=e.depthTexture.createView("opaquePassDepthTexture");e.renderEncoder.setDepthTextureView(o)}e.renderEncoder.attachTextureViews(),t.setCurrentOperation("opaquePass"),a.setRenderEncoder(e.renderEncoder),a.traverse(t)},t.getColorTextureView=()=>e.renderEncoder.getColorTextureViews()[0],t.getDepthTextureView=()=>e.renderEncoder.getDepthTextureView(),t.createRenderEncoder=()=>{e.renderEncoder=z.newInstance({label:"OpaquePass"}),e.renderEncoder.setPipelineHash("op")},t.releaseGraphicsResources=()=>{e.renderEncoder=null,e.colorTexture=null,e.depthTexture=null}}var vn={renderEncoder:null,colorTexture:null,depthTexture:null};function Ye(t,e,a={}){Object.assign(e,vn,a),Q.extend(t,e,a),v.get(t,e,["colorTexture","depthTexture"]),fn(t,e)}var hn=v.newInstance(Ye,"vtkWebGPUOpaquePass"),Sn={newInstance:hn,extend:Ye},dn=`
|
|
8
|
-
//VTK::Mapper::Dec
|
|
9
|
-
|
|
10
|
-
//VTK::TCoord::Dec
|
|
11
|
-
|
|
12
|
-
//VTK::RenderEncoder::Dec
|
|
13
|
-
|
|
14
|
-
//VTK::IOStructs::Dec
|
|
15
|
-
|
|
16
|
-
@fragment
|
|
17
|
-
fn main(
|
|
18
|
-
//VTK::IOStructs::Input
|
|
19
|
-
)
|
|
20
|
-
//VTK::IOStructs::Output
|
|
21
|
-
{
|
|
22
|
-
var output: fragmentOutput;
|
|
23
|
-
|
|
24
|
-
var tcoord: vec2<i32> = vec2<i32>(i32(input.fragPos.x), i32(input.fragPos.y));
|
|
25
|
-
var reveal: f32 = textureLoad(oitpAccumTexture, tcoord, 0).r;
|
|
26
|
-
if (reveal == 1.0) { discard; }
|
|
27
|
-
var tcolor: vec4<f32> = textureLoad(oitpColorTexture, tcoord, 0);
|
|
28
|
-
var total: f32 = max(tcolor.a, 0.01);
|
|
29
|
-
var computedColor: vec4<f32> = vec4<f32>(tcolor.r/total, tcolor.g/total, tcolor.b/total, 1.0 - reveal);
|
|
30
|
-
|
|
31
|
-
//VTK::RenderEncoder::Impl
|
|
32
|
-
return output;
|
|
33
|
-
}
|
|
34
|
-
`;function Tn(t,e){e.classHierarchy.push("vtkWebGPUOrderIndependentTranslucentPass"),t.traverse=(a,s)=>{if(e.deleted)return;e._currentParent=s;const n=s.getDevice();if(e.translucentRenderEncoder)e.translucentColorTexture.resizeToMatch(e.colorTextureView.getTexture()),e.translucentAccumulateTexture.resizeToMatch(e.colorTextureView.getTexture());else{t.createRenderEncoder(),t.createFinalEncoder(),e.translucentColorTexture=W.newInstance({label:"translucentPassColor"}),e.translucentColorTexture.create(n,{width:s.getCanvas().width,height:s.getCanvas().height,format:"rgba16float",usage:GPUTextureUsage.RENDER_ATTACHMENT|GPUTextureUsage.TEXTURE_BINDING});const r=e.translucentColorTexture.createView("oitpColorTexture");e.translucentRenderEncoder.setColorTextureView(0,r),e.translucentAccumulateTexture=W.newInstance({label:"translucentPassAccumulate"}),e.translucentAccumulateTexture.create(n,{width:s.getCanvas().width,height:s.getCanvas().height,format:"r16float",usage:GPUTextureUsage.RENDER_ATTACHMENT|GPUTextureUsage.TEXTURE_BINDING});const o=e.translucentAccumulateTexture.createView("oitpAccumTexture");e.translucentRenderEncoder.setColorTextureView(1,o),e.fullScreenQuad=se.newInstance(),e.fullScreenQuad.setDevice(s.getDevice()),e.fullScreenQuad.setPipelineHash("oitpfsq"),e.fullScreenQuad.setTextureViews(e.translucentRenderEncoder.getColorTextureViews()),e.fullScreenQuad.setFragmentShaderTemplate(dn)}e.translucentRenderEncoder.setDepthTextureView(e.depthTextureView),e.translucentRenderEncoder.attachTextureViews(),t.setCurrentOperation("translucentPass"),a.setRenderEncoder(e.translucentRenderEncoder),a.traverse(t),t.finalPass(s,a)},t.finalPass=(a,s)=>{e.translucentFinalEncoder.setColorTextureView(0,e.colorTextureView),e.translucentFinalEncoder.attachTextureViews(),e.translucentFinalEncoder.begin(a.getCommandEncoder()),s.scissorAndViewport(e.translucentFinalEncoder),e.fullScreenQuad.prepareAndDraw(e.translucentFinalEncoder),e.translucentFinalEncoder.end()},t.getTextures=()=>[e.translucentColorTexture,e.translucentAccumulateTexture],t.createRenderEncoder=()=>{e.translucentRenderEncoder=z.newInstance({label:"translucentRender"});const a=e.translucentRenderEncoder.getDescription();a.colorAttachments=[{view:void 0,clearValue:[0,0,0,0],loadOp:"clear",storeOp:"store"},{view:void 0,clearValue:[1,0,0,0],loadOp:"clear",storeOp:"store"}],a.depthStencilAttachment={view:void 0,depthLoadOp:"load",depthStoreOp:"store"},e.translucentRenderEncoder.setReplaceShaderCodeFunction(s=>{const n=s.getShaderDescription("fragment");n.addOutput("vec4<f32>","outColor"),n.addOutput("f32","outAccum"),n.addBuiltinInput("vec4<f32>","@builtin(position) fragPos");let r=n.getCode();r=D.substitute(r,"//VTK::RenderEncoder::Impl",["var w: f32 = computedColor.a * pow(0.1 + input.fragPos.z, 2.0);","output.outColor = vec4<f32>(computedColor.rgb*w, w);","output.outAccum = computedColor.a;"]).result,n.setCode(r)}),e.translucentRenderEncoder.setPipelineHash("oitpr"),e.translucentRenderEncoder.setPipelineSettings({primitive:{cullMode:"none"},depthStencil:{depthWriteEnabled:!1,depthCompare:"greater",format:"depth32float"},fragment:{targets:[{format:"rgba16float",blend:{color:{srcFactor:"one",dstFactor:"one"},alpha:{srcFactor:"one",dstFactor:"one"}}},{format:"r16float",blend:{color:{srcFactor:"zero",dstFactor:"one-minus-src"},alpha:{srcFactor:"one",dstFactor:"one-minus-src-alpha"}}}]}})},t.createFinalEncoder=()=>{e.translucentFinalEncoder=z.newInstance({label:"translucentFinal"}),e.translucentFinalEncoder.setDescription({colorAttachments:[{view:null,loadOp:"load",storeOp:"store"}]}),e.translucentFinalEncoder.setReplaceShaderCodeFunction(a=>{const s=a.getShaderDescription("fragment");s.addOutput("vec4<f32>","outColor"),s.addBuiltinInput("vec4<f32>","@builtin(position) fragPos");let n=s.getCode();n=D.substitute(n,"//VTK::RenderEncoder::Impl",["output.outColor = vec4<f32>(computedColor.rgb, computedColor.a);"]).result,s.setCode(n)}),e.translucentFinalEncoder.setPipelineHash("oitpf"),e.translucentFinalEncoder.setPipelineSettings({primitive:{cullMode:"none"},fragment:{targets:[{format:"rgba16float",blend:{color:{srcFactor:"src-alpha",dstFactor:"one-minus-src-alpha"},alpha:{srcFactor:"one",dstFactor:"one-minus-src-alpha"}}}]}})},t.releaseGraphicsResources=()=>{e.translucentRenderEncoder=null,e.translucentFinalEncoder=null,e.translucentColorTexture=null,e.translucentAccumulateTexture=null,e.fullScreenQuad=null}}var wn={colorTextureView:null,depthTextureView:null};function Xe(t,e,a={}){Object.assign(e,wn,a),Q.extend(t,e,a),v.setGet(t,e,["colorTextureView","depthTextureView"]),Tn(t,e)}var yn=v.newInstance(Xe,"vtkWebGPUOrderIndependentTranslucentPass"),Cn={newInstance:yn,extend:Xe},xn=`
|
|
35
|
-
//VTK::Renderer::Dec
|
|
36
|
-
|
|
37
|
-
//VTK::Mapper::Dec
|
|
38
|
-
|
|
39
|
-
//VTK::TCoord::Dec
|
|
40
|
-
|
|
41
|
-
//VTK::Volume::TraverseDec
|
|
42
|
-
|
|
43
|
-
//VTK::RenderEncoder::Dec
|
|
44
|
-
|
|
45
|
-
//VTK::IOStructs::Dec
|
|
46
|
-
|
|
47
|
-
fn getTextureValue(vTex: texture_3d<f32>, tpos: vec4<f32>) -> f32
|
|
48
|
-
{
|
|
49
|
-
// todo multicomponent support
|
|
50
|
-
return textureSampleLevel(vTex, clampSampler, tpos.xyz, 0.0).r;
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
fn intersectRayBoundsWithClipPlanes(vNum: i32, minPosSC: vec4<f32>, rayStepSC: vec4<f32>, rayBounds: vec2<f32>) -> vec2<f32>
|
|
54
|
-
{
|
|
55
|
-
var result: vec2<f32> = rayBounds;
|
|
56
|
-
let clipCount: i32 = i32(volumeSSBO.values[vNum].clipPlaneStates.x);
|
|
57
|
-
if (clipCount <= 0)
|
|
58
|
-
{
|
|
59
|
-
return result;
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
${Array.from({length:6},(t,e)=>`
|
|
63
|
-
if (clipCount > ${e})
|
|
64
|
-
{
|
|
65
|
-
let clipPlane${e}: vec4<f32> = volumeSSBO.values[vNum].clipPlane${e};
|
|
66
|
-
let rayDirRatio${e}: f32 = dot(rayStepSC, clipPlane${e});
|
|
67
|
-
let equationResult${e}: f32 = dot(minPosSC, clipPlane${e});
|
|
68
|
-
|
|
69
|
-
let absRayDirRatio${e}: f32 = abs(rayDirRatio${e});
|
|
70
|
-
if (absRayDirRatio${e} > 1e-6)
|
|
71
|
-
{
|
|
72
|
-
let intersection${e}: f32 = -equationResult${e} / rayDirRatio${e};
|
|
73
|
-
result.x = select(result.x, max(result.x, intersection${e}), rayDirRatio${e} > 0.0);
|
|
74
|
-
result.y = select(result.y, min(result.y, intersection${e}), rayDirRatio${e} < 0.0);
|
|
75
|
-
}
|
|
76
|
-
else if (equationResult${e} < 0.0)
|
|
77
|
-
{
|
|
78
|
-
result.x = result.y;
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
if (result.x >= result.y)
|
|
82
|
-
{
|
|
83
|
-
return result;
|
|
84
|
-
}
|
|
85
|
-
}`).join(`
|
|
86
|
-
`)}
|
|
87
|
-
|
|
88
|
-
return result;
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
fn getGradient(vTex: texture_3d<f32>, tpos: vec4<f32>, vNum: i32, scalar: f32) -> vec4<f32>
|
|
92
|
-
{
|
|
93
|
-
var result: vec4<f32>;
|
|
94
|
-
|
|
95
|
-
var tstep: vec4<f32> = volumeSSBO.values[vNum].tstep;
|
|
96
|
-
result.x = getTextureValue(vTex, tpos + vec4<f32>(tstep.x, 0.0, 0.0, 1.0)) - scalar;
|
|
97
|
-
result.y = getTextureValue(vTex, tpos + vec4<f32>(0.0, tstep.y, 0.0, 1.0)) - scalar;
|
|
98
|
-
result.z = getTextureValue(vTex, tpos + vec4<f32>(0.0, 0.0, tstep.z, 1.0)) - scalar;
|
|
99
|
-
result.w = 0.0;
|
|
100
|
-
|
|
101
|
-
// divide by spacing as that is our delta
|
|
102
|
-
result = result / volumeSSBO.values[vNum].spacing;
|
|
103
|
-
// now we have a gradient in unit tcoords
|
|
104
|
-
|
|
105
|
-
var grad: f32 = length(result.xyz);
|
|
106
|
-
if (grad > 0.0)
|
|
107
|
-
{
|
|
108
|
-
// rotate to View Coords, needed for lighting and shading
|
|
109
|
-
var nMat: mat4x4<f32> = rendererUBO.SCVCMatrix * volumeSSBO.values[vNum].planeNormals;
|
|
110
|
-
result = nMat * result;
|
|
111
|
-
result = result / length(result);
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
// store gradient magnitude in .w
|
|
115
|
-
result.w = grad;
|
|
116
|
-
|
|
117
|
-
return result;
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
fn processVolume(vTex: texture_3d<f32>, vNum: i32, cNum: i32, posSC: vec4<f32>, tfunRows: f32) -> vec4<f32>
|
|
121
|
-
{
|
|
122
|
-
var outColor: vec4<f32> = vec4<f32>(0.0, 0.0, 0.0, 0.0);
|
|
123
|
-
|
|
124
|
-
// convert to tcoords and reject if outside the volume
|
|
125
|
-
var tpos: vec4<f32> = volumeSSBO.values[vNum].SCTCMatrix*posSC;
|
|
126
|
-
if (tpos.x < 0.0 || tpos.y < 0.0 || tpos.z < 0.0 ||
|
|
127
|
-
tpos.x > 1.0 || tpos.y > 1.0 || tpos.z > 1.0) { return outColor; }
|
|
128
|
-
|
|
129
|
-
var scalar: f32 = getTextureValue(vTex, tpos);
|
|
130
|
-
|
|
131
|
-
var coord: vec2<f32> =
|
|
132
|
-
vec2<f32>(scalar * componentSSBO.values[cNum].cScale + componentSSBO.values[cNum].cShift,
|
|
133
|
-
(0.5 + 2.0 * f32(vNum)) / tfunRows);
|
|
134
|
-
var color: vec4<f32> = textureSampleLevel(tfunTexture, clampSampler, coord, 0.0);
|
|
135
|
-
|
|
136
|
-
var gofactor: f32 = 1.0;
|
|
137
|
-
var normal: vec4<f32> = vec4<f32>(0.0,0.0,0.0,0.0);
|
|
138
|
-
if (componentSSBO.values[cNum].gomin < 1.0 || volumeSSBO.values[vNum].shade[0] > 0.0)
|
|
139
|
-
{
|
|
140
|
-
normal = getGradient(vTex, tpos, vNum, scalar);
|
|
141
|
-
if (componentSSBO.values[cNum].gomin < 1.0)
|
|
142
|
-
{
|
|
143
|
-
gofactor = clamp(normal.a*componentSSBO.values[cNum].goScale + componentSSBO.values[cNum].goShift,
|
|
144
|
-
componentSSBO.values[cNum].gomin, componentSSBO.values[cNum].gomax);
|
|
145
|
-
}
|
|
146
|
-
}
|
|
147
|
-
|
|
148
|
-
coord.x = (scalar * componentSSBO.values[cNum].oScale + componentSSBO.values[cNum].oShift);
|
|
149
|
-
var opacity: f32 = textureSampleLevel(ofunTexture, clampSampler, coord, 0.0).r;
|
|
150
|
-
|
|
151
|
-
if (volumeSSBO.values[vNum].shade[0] > 0.0)
|
|
152
|
-
{
|
|
153
|
-
color = color*abs(normal.z);
|
|
154
|
-
}
|
|
155
|
-
|
|
156
|
-
outColor = vec4<f32>(color.rgb, gofactor * opacity);
|
|
157
|
-
|
|
158
|
-
return outColor;
|
|
159
|
-
}
|
|
160
|
-
|
|
161
|
-
// adjust the start and end point of a raycast such that it intersects the unit cube.
|
|
162
|
-
// This function is used to take a raycast starting point and step vector
|
|
163
|
-
// and numSteps and return the startijng and ending steps for intersecting the
|
|
164
|
-
// unit cube. Recall for a 3D texture, the unit cube is the range of texture coordsinates
|
|
165
|
-
// that have valid values. So this funtion can be used to take a ray in texture coordinates
|
|
166
|
-
// and bound it to intersecting the texture.
|
|
167
|
-
//
|
|
168
|
-
fn adjustBounds(tpos: vec4<f32>, tstep: vec4<f32>, numSteps: f32) -> vec2<f32>
|
|
169
|
-
{
|
|
170
|
-
var result: vec2<f32> = vec2<f32>(0.0, numSteps);
|
|
171
|
-
var tpos2: vec4<f32> = tpos + tstep*numSteps;
|
|
172
|
-
|
|
173
|
-
// move tpos to the start of the volume
|
|
174
|
-
var adjust: f32 =
|
|
175
|
-
min(
|
|
176
|
-
max(tpos.x/tstep.x, (tpos.x - 1.0)/tstep.x),
|
|
177
|
-
min(
|
|
178
|
-
max((tpos.y - 1.0)/tstep.y, tpos.y/tstep.y),
|
|
179
|
-
max((tpos.z - 1.0)/tstep.z, tpos.z/tstep.z)));
|
|
180
|
-
if (adjust < 0.0)
|
|
181
|
-
{
|
|
182
|
-
result.x = result.x - adjust;
|
|
183
|
-
}
|
|
184
|
-
|
|
185
|
-
// adjust length to the end
|
|
186
|
-
adjust =
|
|
187
|
-
max(
|
|
188
|
-
min(tpos2.x/tstep.x, (tpos2.x - 1.0)/tstep.x),
|
|
189
|
-
max(
|
|
190
|
-
min((tpos2.y - 1.0)/tstep.y, tpos2.y/tstep.y),
|
|
191
|
-
min((tpos2.z - 1.0)/tstep.z, tpos2.z/tstep.z)));
|
|
192
|
-
if (adjust > 0.0)
|
|
193
|
-
{
|
|
194
|
-
result.y = result.y - adjust;
|
|
195
|
-
}
|
|
196
|
-
|
|
197
|
-
return result;
|
|
198
|
-
}
|
|
199
|
-
|
|
200
|
-
fn getSimpleColor(scalar: f32, vNum: i32, cNum: i32) -> vec4<f32>
|
|
201
|
-
{
|
|
202
|
-
// how many rows (tfuns) do we have in our tfunTexture
|
|
203
|
-
var tfunRows: f32 = f32(textureDimensions(tfunTexture).y);
|
|
204
|
-
|
|
205
|
-
var coord: vec2<f32> =
|
|
206
|
-
vec2<f32>(scalar * componentSSBO.values[cNum].cScale + componentSSBO.values[cNum].cShift,
|
|
207
|
-
(0.5 + 2.0 * f32(vNum)) / tfunRows);
|
|
208
|
-
var color: vec4<f32> = textureSampleLevel(tfunTexture, clampSampler, coord, 0.0);
|
|
209
|
-
coord.x = (scalar * componentSSBO.values[cNum].oScale + componentSSBO.values[cNum].oShift);
|
|
210
|
-
var opacity: f32 = textureSampleLevel(ofunTexture, clampSampler, coord, 0.0).r;
|
|
211
|
-
return vec4<f32>(color.rgb, opacity);
|
|
212
|
-
}
|
|
213
|
-
|
|
214
|
-
fn traverseMax(vTex: texture_3d<f32>, vNum: i32, cNum: i32, rayLengthSC: f32, minPosSC: vec4<f32>, rayStepSC: vec4<f32>)
|
|
215
|
-
{
|
|
216
|
-
// convert to tcoords and reject if outside the volume
|
|
217
|
-
var numSteps: f32 = rayLengthSC/mapperUBO.SampleDistance;
|
|
218
|
-
var tpos: vec4<f32> = volumeSSBO.values[vNum].SCTCMatrix*minPosSC;
|
|
219
|
-
var tpos2: vec4<f32> = volumeSSBO.values[vNum].SCTCMatrix*(minPosSC + rayStepSC);
|
|
220
|
-
var tstep: vec4<f32> = tpos2 - tpos;
|
|
221
|
-
|
|
222
|
-
var rayBounds: vec2<f32> = intersectRayBoundsWithClipPlanes(
|
|
223
|
-
vNum,
|
|
224
|
-
minPosSC,
|
|
225
|
-
rayStepSC,
|
|
226
|
-
adjustBounds(tpos, tstep, numSteps));
|
|
227
|
-
|
|
228
|
-
// did we hit anything
|
|
229
|
-
if (rayBounds.x >= rayBounds.y)
|
|
230
|
-
{
|
|
231
|
-
traverseVals[vNum] = vec4<f32>(0.0,0.0,0.0,0.0);
|
|
232
|
-
return;
|
|
233
|
-
}
|
|
234
|
-
|
|
235
|
-
tpos = tpos + tstep*rayBounds.x;
|
|
236
|
-
var curDist: f32 = rayBounds.x;
|
|
237
|
-
var maxVal: f32 = -1.0e37;
|
|
238
|
-
loop
|
|
239
|
-
{
|
|
240
|
-
var scalar: f32 = getTextureValue(vTex, tpos);
|
|
241
|
-
if (scalar > maxVal)
|
|
242
|
-
{
|
|
243
|
-
maxVal = scalar;
|
|
244
|
-
}
|
|
245
|
-
|
|
246
|
-
// increment position
|
|
247
|
-
curDist = curDist + 1.0;
|
|
248
|
-
tpos = tpos + tstep;
|
|
249
|
-
|
|
250
|
-
// check if we have reached a terminating condition
|
|
251
|
-
if (curDist > rayBounds.y) { break; }
|
|
252
|
-
}
|
|
253
|
-
|
|
254
|
-
// process to get the color and opacity
|
|
255
|
-
traverseVals[vNum] = getSimpleColor(maxVal, vNum, cNum);
|
|
256
|
-
}
|
|
257
|
-
|
|
258
|
-
fn traverseMin(vTex: texture_3d<f32>, vNum: i32, cNum: i32, rayLengthSC: f32, minPosSC: vec4<f32>, rayStepSC: vec4<f32>)
|
|
259
|
-
{
|
|
260
|
-
// convert to tcoords and reject if outside the volume
|
|
261
|
-
var numSteps: f32 = rayLengthSC/mapperUBO.SampleDistance;
|
|
262
|
-
var tpos: vec4<f32> = volumeSSBO.values[vNum].SCTCMatrix*minPosSC;
|
|
263
|
-
var tpos2: vec4<f32> = volumeSSBO.values[vNum].SCTCMatrix*(minPosSC + rayStepSC);
|
|
264
|
-
var tstep: vec4<f32> = tpos2 - tpos;
|
|
265
|
-
|
|
266
|
-
var rayBounds: vec2<f32> = intersectRayBoundsWithClipPlanes(
|
|
267
|
-
vNum,
|
|
268
|
-
minPosSC,
|
|
269
|
-
rayStepSC,
|
|
270
|
-
adjustBounds(tpos, tstep, numSteps));
|
|
271
|
-
|
|
272
|
-
// did we hit anything
|
|
273
|
-
if (rayBounds.x >= rayBounds.y)
|
|
274
|
-
{
|
|
275
|
-
traverseVals[vNum] = vec4<f32>(0.0,0.0,0.0,0.0);
|
|
276
|
-
return;
|
|
277
|
-
}
|
|
278
|
-
|
|
279
|
-
tpos = tpos + tstep*rayBounds.x;
|
|
280
|
-
var curDist: f32 = rayBounds.x;
|
|
281
|
-
var minVal: f32 = 1.0e37;
|
|
282
|
-
loop
|
|
283
|
-
{
|
|
284
|
-
var scalar: f32 = getTextureValue(vTex, tpos);
|
|
285
|
-
if (scalar < minVal)
|
|
286
|
-
{
|
|
287
|
-
minVal = scalar;
|
|
288
|
-
}
|
|
289
|
-
|
|
290
|
-
// increment position
|
|
291
|
-
curDist = curDist + 1.0;
|
|
292
|
-
tpos = tpos + tstep;
|
|
293
|
-
|
|
294
|
-
// check if we have reached a terminating condition
|
|
295
|
-
if (curDist > rayBounds.y) { break; }
|
|
296
|
-
}
|
|
297
|
-
|
|
298
|
-
// process to get the color and opacity
|
|
299
|
-
traverseVals[vNum] = getSimpleColor(minVal, vNum, cNum);
|
|
300
|
-
}
|
|
301
|
-
|
|
302
|
-
fn traverseAverage(vTex: texture_3d<f32>, vNum: i32, cNum: i32, rayLengthSC: f32, minPosSC: vec4<f32>, rayStepSC: vec4<f32>)
|
|
303
|
-
{
|
|
304
|
-
// convert to tcoords and reject if outside the volume
|
|
305
|
-
var numSteps: f32 = rayLengthSC/mapperUBO.SampleDistance;
|
|
306
|
-
var tpos: vec4<f32> = volumeSSBO.values[vNum].SCTCMatrix*minPosSC;
|
|
307
|
-
var tpos2: vec4<f32> = volumeSSBO.values[vNum].SCTCMatrix*(minPosSC + rayStepSC);
|
|
308
|
-
var tstep: vec4<f32> = tpos2 - tpos;
|
|
309
|
-
|
|
310
|
-
var rayBounds: vec2<f32> = intersectRayBoundsWithClipPlanes(
|
|
311
|
-
vNum,
|
|
312
|
-
minPosSC,
|
|
313
|
-
rayStepSC,
|
|
314
|
-
adjustBounds(tpos, tstep, numSteps));
|
|
315
|
-
|
|
316
|
-
// did we hit anything
|
|
317
|
-
if (rayBounds.x >= rayBounds.y)
|
|
318
|
-
{
|
|
319
|
-
traverseVals[vNum] = vec4<f32>(0.0,0.0,0.0,0.0);
|
|
320
|
-
return;
|
|
321
|
-
}
|
|
322
|
-
|
|
323
|
-
let ipRange: vec4<f32> = volumeSSBO.values[vNum].ipScalarRange;
|
|
324
|
-
tpos = tpos + tstep*rayBounds.x;
|
|
325
|
-
var curDist: f32 = rayBounds.x;
|
|
326
|
-
var avgVal: f32 = 0.0;
|
|
327
|
-
var sampleCount: f32 = 0.0;
|
|
328
|
-
loop
|
|
329
|
-
{
|
|
330
|
-
var sample: f32 = getTextureValue(vTex, tpos);
|
|
331
|
-
// right now leave filtering off until WebGL changes get merged
|
|
332
|
-
// if (ipRange.z == 0.0 || sample >= ipRange.x && sample <= ipRange.y)
|
|
333
|
-
// {
|
|
334
|
-
avgVal = avgVal + sample;
|
|
335
|
-
sampleCount = sampleCount + 1.0;
|
|
336
|
-
// }
|
|
337
|
-
|
|
338
|
-
// increment position
|
|
339
|
-
curDist = curDist + 1.0;
|
|
340
|
-
tpos = tpos + tstep;
|
|
341
|
-
|
|
342
|
-
// check if we have reached a terminating condition
|
|
343
|
-
if (curDist > rayBounds.y) { break; }
|
|
344
|
-
}
|
|
345
|
-
|
|
346
|
-
if (sampleCount <= 0.0)
|
|
347
|
-
{
|
|
348
|
-
traverseVals[vNum] = vec4<f32>(0.0,0.0,0.0,0.0);
|
|
349
|
-
return;
|
|
350
|
-
}
|
|
351
|
-
|
|
352
|
-
// process to get the color and opacity
|
|
353
|
-
traverseVals[vNum] = getSimpleColor(avgVal/sampleCount, vNum, cNum);
|
|
354
|
-
}
|
|
355
|
-
|
|
356
|
-
fn traverseAdditive(vTex: texture_3d<f32>, vNum: i32, cNum: i32, rayLengthSC: f32, minPosSC: vec4<f32>, rayStepSC: vec4<f32>)
|
|
357
|
-
{
|
|
358
|
-
// convert to tcoords and reject if outside the volume
|
|
359
|
-
var numSteps: f32 = rayLengthSC/mapperUBO.SampleDistance;
|
|
360
|
-
var tpos: vec4<f32> = volumeSSBO.values[vNum].SCTCMatrix*minPosSC;
|
|
361
|
-
var tpos2: vec4<f32> = volumeSSBO.values[vNum].SCTCMatrix*(minPosSC + rayStepSC);
|
|
362
|
-
var tstep: vec4<f32> = tpos2 - tpos;
|
|
363
|
-
|
|
364
|
-
var rayBounds: vec2<f32> = intersectRayBoundsWithClipPlanes(
|
|
365
|
-
vNum,
|
|
366
|
-
minPosSC,
|
|
367
|
-
rayStepSC,
|
|
368
|
-
adjustBounds(tpos, tstep, numSteps));
|
|
369
|
-
|
|
370
|
-
// did we hit anything
|
|
371
|
-
if (rayBounds.x >= rayBounds.y)
|
|
372
|
-
{
|
|
373
|
-
traverseVals[vNum] = vec4<f32>(0.0,0.0,0.0,0.0);
|
|
374
|
-
return;
|
|
375
|
-
}
|
|
376
|
-
|
|
377
|
-
let ipRange: vec4<f32> = volumeSSBO.values[vNum].ipScalarRange;
|
|
378
|
-
tpos = tpos + tstep*rayBounds.x;
|
|
379
|
-
var curDist: f32 = rayBounds.x;
|
|
380
|
-
var sumVal: f32 = 0.0;
|
|
381
|
-
loop
|
|
382
|
-
{
|
|
383
|
-
var sample: f32 = getTextureValue(vTex, tpos);
|
|
384
|
-
// right now leave filtering off until WebGL changes get merged
|
|
385
|
-
// if (ipRange.z == 0.0 || sample >= ipRange.x && sample <= ipRange.y)
|
|
386
|
-
// {
|
|
387
|
-
sumVal = sumVal + sample;
|
|
388
|
-
// }
|
|
389
|
-
// increment position
|
|
390
|
-
curDist = curDist + 1.0;
|
|
391
|
-
tpos = tpos + tstep;
|
|
392
|
-
|
|
393
|
-
// check if we have reached a terminating condition
|
|
394
|
-
if (curDist > rayBounds.y) { break; }
|
|
395
|
-
}
|
|
396
|
-
|
|
397
|
-
// process to get the color and opacity
|
|
398
|
-
traverseVals[vNum] = getSimpleColor(sumVal, vNum, cNum);
|
|
399
|
-
}
|
|
400
|
-
|
|
401
|
-
fn composite(rayLengthSC: f32, minPosSC: vec4<f32>, rayStepSC: vec4<f32>) -> vec4<f32>
|
|
402
|
-
{
|
|
403
|
-
// initial ray position is at the beginning
|
|
404
|
-
var rayPosSC: vec4<f32> = minPosSC;
|
|
405
|
-
|
|
406
|
-
// how many rows (tfuns) do we have in our tfunTexture
|
|
407
|
-
var tfunRows: f32 = f32(textureDimensions(tfunTexture).y);
|
|
408
|
-
|
|
409
|
-
var curDist: f32 = 0.0;
|
|
410
|
-
var computedColor: vec4<f32> = vec4<f32>(0.0, 0.0, 0.0, 0.0);
|
|
411
|
-
var sampleColor: vec4<f32>;
|
|
412
|
-
var numSteps: f32 = rayLengthSC/mapperUBO.SampleDistance;
|
|
413
|
-
//VTK::Volume::TraverseCalls
|
|
414
|
-
//VTK::Volume::TraverseInit
|
|
415
|
-
|
|
416
|
-
loop
|
|
417
|
-
{
|
|
418
|
-
// for each volume, sample and accumulate color
|
|
419
|
-
//VTK::Volume::CompositeCalls
|
|
420
|
-
|
|
421
|
-
// increment position
|
|
422
|
-
curDist = curDist + mapperUBO.SampleDistance;
|
|
423
|
-
rayPosSC = rayPosSC + rayStepSC;
|
|
424
|
-
|
|
425
|
-
// check if we have reached a terminating condition
|
|
426
|
-
if (curDist > rayLengthSC) { break; }
|
|
427
|
-
if (computedColor.a > 0.98) { break; }
|
|
428
|
-
}
|
|
429
|
-
return computedColor;
|
|
430
|
-
}
|
|
431
|
-
|
|
432
|
-
@fragment
|
|
433
|
-
fn main(
|
|
434
|
-
//VTK::IOStructs::Input
|
|
435
|
-
)
|
|
436
|
-
//VTK::IOStructs::Output
|
|
437
|
-
{
|
|
438
|
-
var output: fragmentOutput;
|
|
439
|
-
|
|
440
|
-
var rayMax: f32 = textureSampleLevel(maxTexture, clampSampler, input.tcoordVS, 0.0).r;
|
|
441
|
-
var rayMin: f32 = textureSampleLevel(minTexture, clampSampler, input.tcoordVS, 0.0).r;
|
|
442
|
-
|
|
443
|
-
// discard empty rays
|
|
444
|
-
if (rayMax <= rayMin) { discard; }
|
|
445
|
-
else
|
|
446
|
-
{
|
|
447
|
-
// compute start and end ray positions in view coordinates
|
|
448
|
-
var minPosSC: vec4<f32> = rendererUBO.PCSCMatrix*vec4<f32>(2.0 * input.tcoordVS.x - 1.0, 1.0 - 2.0 * input.tcoordVS.y, rayMax, 1.0);
|
|
449
|
-
minPosSC = minPosSC * (1.0 / minPosSC.w);
|
|
450
|
-
var maxPosSC: vec4<f32> = rendererUBO.PCSCMatrix*vec4<f32>(2.0 * input.tcoordVS.x - 1.0, 1.0 - 2.0 * input.tcoordVS.y, rayMin, 1.0);
|
|
451
|
-
maxPosSC = maxPosSC * (1.0 / maxPosSC.w);
|
|
452
|
-
|
|
453
|
-
var rayLengthSC: f32 = distance(minPosSC.xyz, maxPosSC.xyz);
|
|
454
|
-
var rayStepSC: vec4<f32> = (maxPosSC - minPosSC)*(mapperUBO.SampleDistance/rayLengthSC);
|
|
455
|
-
rayStepSC.w = 0.0;
|
|
456
|
-
|
|
457
|
-
var computedColor: vec4<f32>;
|
|
458
|
-
|
|
459
|
-
//VTK::Volume::Loop
|
|
460
|
-
|
|
461
|
-
//VTK::RenderEncoder::Impl
|
|
462
|
-
}
|
|
463
|
-
|
|
464
|
-
return output;
|
|
465
|
-
}
|
|
466
|
-
`,U=new Float64Array(16),k=new Float64Array(16);function En(t,e){e.classHierarchy.push("vtkWebGPUVolumePassFSQ"),t.replaceShaderPosition=(n,r,o)=>{const i=r.getShaderDescription("vertex");i.addBuiltinOutput("vec4<f32>","@builtin(position) Position");let u=i.getCode();u=D.substitute(u,"//VTK::Position::Impl",["output.tcoordVS = vec2<f32>(vertexBC.x * 0.5 + 0.5, 1.0 - vertexBC.y * 0.5 - 0.5);","output.Position = vec4<f32>(vertexBC, 1.0);"]).result,i.setCode(u),r.getShaderDescription("fragment").addBuiltinInput("vec4<f32>","@builtin(position) fragPos")},e.shaderReplacements.set("replaceShaderPosition",t.replaceShaderPosition),t.replaceShaderVolume=(n,r,o)=>{const i=r.getShaderDescription("fragment");let u=i.getCode();const p=[],c=[],l=[];for(let f=0;f<e.volumes.length;f++)e.volumes[f].getRenderable().getMapper().getBlendMode()===b.COMPOSITE_BLEND?(c.push(` var tpos${f}: vec4<f32> = volumeSSBO.values[${f}].SCTCMatrix*minPosSC;`),c.push(` var tpos2_${f}: vec4<f32> = volumeSSBO.values[${f}].SCTCMatrix*(minPosSC + rayStepSC);`),c.push(` var tstep${f}: vec4<f32> = tpos2_${f} - tpos${f};`),c.push(` var rayBounds${f}: vec2<f32> = intersectRayBoundsWithClipPlanes(${f}, minPosSC, rayStepSC, adjustBounds(tpos${f}, tstep${f}, numSteps));`),p.push(` if (curDist >= rayBounds${f}.x * mapperUBO.SampleDistance && curDist <= rayBounds${f}.y * mapperUBO.SampleDistance) {`),p.push(` sampleColor = processVolume(volTexture${f}, ${f}, ${e.rowStarts[f]}, rayPosSC, tfunRows);`),p.push(` computedColor = vec4<f32>(
|
|
467
|
-
sampleColor.a * sampleColor.rgb * (1.0 - computedColor.a) + computedColor.rgb,
|
|
468
|
-
(1.0 - computedColor.a)*sampleColor.a + computedColor.a);`),p.push(" }")):(l.push(` sampleColor = traverseVals[${f}];`),l.push(` computedColor = vec4<f32>(
|
|
469
|
-
sampleColor.a * sampleColor.rgb * (1.0 - computedColor.a) + computedColor.rgb,
|
|
470
|
-
(1.0 - computedColor.a)*sampleColor.a + computedColor.a);`));u=D.substitute(u,"//VTK::Volume::CompositeCalls",p).result,u=D.substitute(u,"//VTK::Volume::TraverseCalls",l).result,u=D.substitute(u,"//VTK::Volume::TraverseInit",c).result,u=D.substitute(u,"//VTK::Volume::TraverseDec",[`var<private> traverseVals: array<vec4<f32>,${e.volumes.length}>;`]).result;let g=!1;for(let f=0;f<e.volumes.length;f++){const h=e.volumes[f].getRenderable().getMapper().getBlendMode();h===b.COMPOSITE_BLEND?g=!0:h===b.MAXIMUM_INTENSITY_BLEND?u=D.substitute(u,"//VTK::Volume::Loop",[` traverseMax(volTexture${f}, ${f}, ${f}, rayLengthSC, minPosSC, rayStepSC);`,` computedColor = traverseVals[${f}];`,"//VTK::Volume::Loop"]).result:h===b.MINIMUM_INTENSITY_BLEND?u=D.substitute(u,"//VTK::Volume::Loop",[` traverseMin(volTexture${f}, ${f}, ${f}, rayLengthSC, minPosSC, rayStepSC);`,` computedColor = traverseVals[${f}];`,"//VTK::Volume::Loop"]).result:h===b.AVERAGE_INTENSITY_BLEND?u=D.substitute(u,"//VTK::Volume::Loop",[` traverseAverage(volTexture${f}, ${f}, ${f}, rayLengthSC, minPosSC, rayStepSC);`,` computedColor = traverseVals[${f}];`,"//VTK::Volume::Loop"]).result:h===b.ADDITIVE_INTENSITY_BLEND&&(u=D.substitute(u,"//VTK::Volume::Loop",[` traverseAdditive(volTexture${f}, ${f}, ${f}, rayLengthSC, minPosSC, rayStepSC);`,` computedColor = traverseVals[${f}];`,"//VTK::Volume::Loop"]).result)}g&&(u=D.substitute(u,"//VTK::Volume::Loop",[" computedColor = composite(rayLengthSC, minPosSC, rayStepSC);"]).result),i.setCode(u)},e.shaderReplacements.set("replaceShaderVolume",t.replaceShaderVolume),t.updateLUTImage=n=>{let r=t.getMTime();for(let l=0;l<e.volumes.length;l++){const g=e.volumes[l].getRenderable(),f=g.getMapper().getInputData();r=Math.max(r,g.getMTime(),f.getMTime())}if(r<e.lutBuildTime.getMTime())return;e.numRows=0,e.rowStarts=[];for(let l=0;l<e.volumes.length;l++){e.rowStarts.push(e.numRows);const g=e.volumes[l].getRenderable(),f=g.getMapper(),h=g.getProperty(),S=f.getInputData(),y=(S.getPointData()&&S.getPointData().getScalars()).getNumberOfComponents(),w=h.getIndependentComponents()?y:1;e.numRows+=w}const o=new Uint8ClampedArray(e.numRows*2*e.rowLength*4),i=new Float32Array(e.numRows*2*e.rowLength);let u=0;const p=new Float32Array(e.rowLength*3),c=e.rowLength;for(let l=0;l<e.volumes.length;l++){const g=e.volumes[l].getRenderable(),f=g.getMapper(),h=g.getProperty(),S=f.getInputData(),y=(S.getPointData()&&S.getPointData().getScalars()).getNumberOfComponents(),w=h.getIndependentComponents()?y:1;for(let R=0;R<w;++R){const E=h.getRGBTransferFunction(R),_=E.getRange();E.getTable(_[0],_[1],c,p,1);let T=u*c*4;for(let x=0;x<c;++x){o[T+x*4]=255*p[x*3],o[T+x*4+1]=255*p[x*3+1],o[T+x*4+2]=255*p[x*3+2],o[T+x*4+3]=255;for(let O=0;O<4;O++)o[T+(c+x)*4+O]=o[T+x*4+O]}const m=h.getScalarOpacity(R),V=e.sampleDist/h.getScalarOpacityUnitDistance(R),d=m.getRange();m.getTable(d[0],d[1],c,p,1),T=u*c;for(let x=0;x<c;++x)i[T+x]=1-(1-p[x])**V,i[T+x+c]=i[T+x];u+=2}}{const l={nativeArray:o,width:e.rowLength,height:e.numRows*2,depth:1,format:"rgba8unorm"},g=n.getTextureManager().getTexture(l).createView("tfunTexture");e.textureViews[2]=g}{const l={nativeArray:i,width:e.rowLength,height:e.numRows*2,depth:1,format:"r16float"},g=n.getTextureManager().getTexture(l).createView("ofunTexture");e.textureViews[3]=g}e.lutBuildTime.modified()},t.updateSSBO=n=>{let r=Math.max(t.getMTime(),e.WebGPURenderer.getStabilizedTime());for(let d=0;d<e.volumes.length;d++){const x=e.volumes[d].getRenderable(),O=x.getMapper(),B=O.getInputData();r=Math.max(r,x.getMTime(),B.getMTime(),O.getMTime(),O.getClippingPlanesMTime())}if(r<e.SSBO.getSendTime())return;const o=e.WebGPURenderer.getStabilizedCenterByReference();e.SSBO.clearData(),e.SSBO.setNumberOfInstances(e.volumes.length);const i=new Float64Array(e.volumes.length*16),u=new Float64Array(e.volumes.length*16),p=Array.from({length:6},()=>new Float64Array(e.volumes.length*4)),c=new Float64Array(e.volumes.length*4),l=new Float64Array(e.volumes.length*4),g=new Float64Array(e.volumes.length*4),f=new Float64Array(e.volumes.length*4),h=new Float64Array(e.volumes.length*4);for(let d=0;d<e.volumes.length;d++){const x=e.volumes[d].getRenderable(),O=x.getMapper(),B=O.getInputData();de(U),j(U,U,o);const M=x.getMatrix();ft(k,M),Me(k,k),ce(U,k,U);const F=B.getWorldToIndex();ce(U,F,U);const N=B.getDimensions();de(k),vt(k,k,[1/N[0],1/N[1],1/N[2]]),ce(U,k,U);for(let C=0;C<16;C++)i[d*16+C]=U[C];Me(U,U);for(let C=0;C<4;C++)u[d*16+C*4]=U[C*4],u[d*16+C*4+1]=U[C*4+1],u[d*16+C*4+2]=U[C*4+2],u[d*16+C*4+3]=0;l[d*4]=1/N[0],l[d*4+1]=1/N[1],l[d*4+2]=1/N[2],l[d*4+3]=1,g[d*4]=x.getProperty().getShade()?1:0;const Y=B.getSpacing();f[d*4]=Y[0],f[d*4+1]=Y[1],f[d*4+2]=Y[2],f[d*4+3]=1;const X=e.textureViews[d+4].getTexture().getScale(),te=x.getProperty().getIpScalarRange();h[d*4]=te[0]/X,h[d*4+1]=te[1]/X,h[d*4+2]=x.getProperty().getFilterMode(),ht(k,[-o[0],-o[1],-o[2]]);const K=xt(O,k,e.clipPlanes);c[d*4]=K;for(let C=0;C<K;C++){const P=d*4;p[C][P]=e.clipPlanes[C][0],p[C][P+1]=e.clipPlanes[C][1],p[C][P+2]=e.clipPlanes[C][2],p[C][P+3]=e.clipPlanes[C][3]}}e.SSBO.addEntry("SCTCMatrix","mat4x4<f32>"),e.SSBO.addEntry("planeNormals","mat4x4<f32>"),e.SSBO.addEntry("shade","vec4<f32>"),e.SSBO.addEntry("tstep","vec4<f32>"),e.SSBO.addEntry("spacing","vec4<f32>"),e.SSBO.addEntry("ipScalarRange","vec4<f32>"),Et(e.SSBO,"clipPlane"),e.SSBO.addEntry("clipPlaneStates","vec4<f32>"),e.SSBO.setAllInstancesFromArray("SCTCMatrix",i),e.SSBO.setAllInstancesFromArray("planeNormals",u),e.SSBO.setAllInstancesFromArray("shade",g),e.SSBO.setAllInstancesFromArray("tstep",l),e.SSBO.setAllInstancesFromArray("spacing",f),e.SSBO.setAllInstancesFromArray("ipScalarRange",h);for(let d=0;d<6;d++)e.SSBO.setAllInstancesFromArray(`clipPlane${d}`,p[d]);e.SSBO.setAllInstancesFromArray("clipPlaneStates",c),e.SSBO.send(n),e.componentSSBO.clearData(),e.componentSSBO.setNumberOfInstances(e.numRows);const S=new Float64Array(e.numRows),y=new Float64Array(e.numRows),w=new Float64Array(e.numRows),R=new Float64Array(e.numRows),E=new Float64Array(e.numRows),_=new Float64Array(e.numRows),T=new Float64Array(e.numRows),m=new Float64Array(e.numRows);let V=0;for(let d=0;d<e.volumes.length;d++){const x=e.volumes[d].getRenderable(),O=x.getMapper(),B=x.getProperty(),M=O.getInputData(),F=(M.getPointData()&&M.getPointData().getScalars()).getNumberOfComponents(),N=B.getIndependentComponents(),Y=e.textureViews[d+4].getTexture().getFormat(),X=Rt.getDetailsFromTextureFormat(Y),te=X.elementSize===2&&X.sampleType==="float",K={scale:[255],offset:[0]};te&&(K.scale[0]=1);for(let C=0;C<F;C++){const P=N?C:0,oe=K.scale[C],Z=B.getScalarOpacity(P).getRange(),pt=oe/(Z[1]-Z[0]);R[V]=(K.offset[C]-Z[0])/(Z[1]-Z[0]),w[V]=pt;const J=B.getRGBTransferFunction(P).getRange();if(y[V]=(K.offset[C]-J[0])/(J[1]-J[0]),S[V]=oe/(J[1]-J[0]),B.getUseGradientOpacity(P)){const ne=B.getGradientOpacityMinimumOpacity(P),ie=B.getGradientOpacityMaximumOpacity(P);E[V]=ne,_[V]=ie;const q=[B.getGradientOpacityMinimumValue(P),B.getGradientOpacityMaximumValue(P)];m[V]=oe*(ie-ne)/(q[1]-q[0]),T[V]=-q[0]*(ie-ne)/(q[1]-q[0])+ne}else E[V]=1,_[V]=1,m[V]=0,T[V]=1;V++}}e.componentSSBO.addEntry("cScale","f32"),e.componentSSBO.addEntry("cShift","f32"),e.componentSSBO.addEntry("oScale","f32"),e.componentSSBO.addEntry("oShift","f32"),e.componentSSBO.addEntry("goShift","f32"),e.componentSSBO.addEntry("goScale","f32"),e.componentSSBO.addEntry("gomin","f32"),e.componentSSBO.addEntry("gomax","f32"),e.componentSSBO.setAllInstancesFromArray("cScale",S),e.componentSSBO.setAllInstancesFromArray("cShift",y),e.componentSSBO.setAllInstancesFromArray("oScale",w),e.componentSSBO.setAllInstancesFromArray("oShift",R),e.componentSSBO.setAllInstancesFromArray("goScale",m),e.componentSSBO.setAllInstancesFromArray("goShift",T),e.componentSSBO.setAllInstancesFromArray("gomin",E),e.componentSSBO.setAllInstancesFromArray("gomax",_),e.componentSSBO.send(n)};const a=t.updateBuffers;t.updateBuffers=()=>{a();let n=e.volumes[0].getRenderable().getMapper().getSampleDistance();for(let r=0;r<e.volumes.length;r++){const o=e.volumes[r].getRenderable().getMapper().getSampleDistance();o<n&&(n=o)}e.sampleDist!==n&&(e.sampleDist=n,e.UBO.setValue("SampleDistance",n),e.UBO.sendIfNeeded(e.device));for(let r=0;r<e.volumes.length;r++){const o=e.volumes[r].getRenderable().getMapper().getInputData(),i=e.device.getTextureManager().getTextureForImageData(o);if(!e.textureViews[r+4]||e.textureViews[r+4].getTexture()!==i){const u=i.createView(`volTexture${r}`);e.textureViews[r+4]=u}}if(e.volumes.length<e.lastVolumeLength)for(let r=e.volumes.length;r<e.lastVolumeLength;r++)e.textureViews.pop();e.lastVolumeLength=e.volumes.length,t.updateLUTImage(e.device),t.updateSSBO(e.device),e.clampSampler||(e.clampSampler=$e.newInstance({label:"clampSampler"}),e.clampSampler.create(e.device,{minFilter:"linear",magFilter:"linear"}))},t.computePipelineHash=()=>{e.pipelineHash="volfsq";for(let n=0;n<e.volumes.length;n++){const r=e.volumes[n].getRenderable().getMapper().getBlendMode();e.pipelineHash+=`${r}`}},t.setVolumes=n=>{if(!e.volumes||e.volumes.length!==n.length){e.volumes=[...n],t.modified();return}for(let r=0;r<n.length;r++)if(n[r]!==e.volumes[r]){e.volumes=[...n],t.modified();return}};const s=t.getBindables;t.getBindables=()=>{const n=s();return n.push(e.componentSSBO),n.push(e.clampSampler),n}}var Rn={volumes:null,rowLength:1024,lastVolumeLength:0};function Ze(t,e,a={}){Object.assign(e,Rn,a),se.extend(t,e,a),e.fragmentShaderTemplate=xn,e.UBO=Ne.newInstance({label:"mapperUBO"}),e.UBO.addEntry("SampleDistance","f32"),e.SSBO=Be.newInstance({label:"volumeSSBO"}),e.componentSSBO=Be.newInstance({label:"componentSSBO"}),e.lutBuildTime={},v.obj(e.lutBuildTime,{mtime:0}),e.clipPlanes=Array.from({length:6},()=>[0,0,0,0]),En(t,e)}var _n=v.newInstance(Ze,"vtkWebGPUVolumePassFSQ"),Mn={newInstance:_n,extend:Ze},{Representation:Vn}=_t,{BufferUsage:me,PrimitiveTypes:Dn}=Ke,ve=[[0,4,6],[0,6,2],[1,3,7],[1,7,5],[0,5,4],[0,1,5],[2,6,7],[2,7,3],[0,3,1],[0,2,3],[4,5,7],[4,7,6]],Bn=`
|
|
471
|
-
//VTK::Renderer::Dec
|
|
472
|
-
|
|
473
|
-
//VTK::Select::Dec
|
|
474
|
-
|
|
475
|
-
//VTK::VolumePass::Dec
|
|
476
|
-
|
|
477
|
-
//VTK::TCoord::Dec
|
|
478
|
-
|
|
479
|
-
//VTK::RenderEncoder::Dec
|
|
480
|
-
|
|
481
|
-
//VTK::Mapper::Dec
|
|
482
|
-
|
|
483
|
-
//VTK::IOStructs::Dec
|
|
484
|
-
|
|
485
|
-
@fragment
|
|
486
|
-
fn main(
|
|
487
|
-
//VTK::IOStructs::Input
|
|
488
|
-
)
|
|
489
|
-
//VTK::IOStructs::Output
|
|
490
|
-
{
|
|
491
|
-
var output : fragmentOutput;
|
|
492
|
-
|
|
493
|
-
//VTK::Select::Impl
|
|
494
|
-
|
|
495
|
-
//VTK::TCoord::Impl
|
|
496
|
-
|
|
497
|
-
//VTK::VolumePass::Impl
|
|
498
|
-
|
|
499
|
-
// use the maximum (closest) of the current value and the zbuffer
|
|
500
|
-
// the blend func will then take the min to find the farthest stop value
|
|
501
|
-
var stopval: f32 = max(input.fragPos.z, textureLoad(opaquePassDepthTexture, vec2<i32>(i32(input.fragPos.x), i32(input.fragPos.y)), 0));
|
|
502
|
-
|
|
503
|
-
//VTK::RenderEncoder::Impl
|
|
504
|
-
return output;
|
|
505
|
-
}
|
|
506
|
-
`,mn=`
|
|
507
|
-
//VTK::Renderer::Dec
|
|
508
|
-
|
|
509
|
-
//VTK::Mapper::Dec
|
|
510
|
-
|
|
511
|
-
//VTK::TCoord::Dec
|
|
512
|
-
|
|
513
|
-
//VTK::RenderEncoder::Dec
|
|
514
|
-
|
|
515
|
-
//VTK::IOStructs::Dec
|
|
516
|
-
|
|
517
|
-
@fragment
|
|
518
|
-
fn main(
|
|
519
|
-
//VTK::IOStructs::Input
|
|
520
|
-
)
|
|
521
|
-
//VTK::IOStructs::Output
|
|
522
|
-
{
|
|
523
|
-
var output: fragmentOutput;
|
|
524
|
-
|
|
525
|
-
var computedColor: vec4<f32> = textureSample(volumePassColorTexture,
|
|
526
|
-
volumePassColorTextureSampler, mapperUBO.tscale*input.tcoordVS);
|
|
527
|
-
|
|
528
|
-
//VTK::RenderEncoder::Impl
|
|
529
|
-
return output;
|
|
530
|
-
}
|
|
531
|
-
`;function On(t,e){e.classHierarchy.push("vtkWebGPUVolumePass"),t.initialize=a=>{e._clearEncoder||t.createClearEncoder(a),e._mergeEncoder||t.createMergeEncoder(a),e._copyEncoder||t.createCopyEncoder(a),e._depthRangeEncoder||t.createDepthRangeEncoder(a),e.fullScreenQuad||(e.fullScreenQuad=Mn.newInstance(),e.fullScreenQuad.setDevice(a.getDevice()),e.fullScreenQuad.setTextureViews([...e._depthRangeEncoder.getColorTextureViews()])),e._volumeCopyQuad||(e._volumeCopyQuad=se.newInstance(),e._volumeCopyQuad.setPipelineHash("volpassfsq"),e._volumeCopyQuad.setDevice(a.getDevice()),e._volumeCopyQuad.setFragmentShaderTemplate(mn),e._copyUBO=Ne.newInstance({label:"mapperUBO"}),e._copyUBO.addEntry("tscale","vec2<f32>"),e._volumeCopyQuad.setUBO(e._copyUBO),e._volumeCopyQuad.setTextureViews([e._colorTextureView]))},t.traverse=(a,s)=>{if(e.deleted)return;e._currentParent=s,t.initialize(s),t.computeTiming(s),t.renderDepthBounds(a,s),e._firstGroup=!0;const n=s.getDevice(),r=n.getHandle().limits.maxSampledTexturesPerShaderStage-4;if(e.volumes.length>r){const o=a.getRenderable().getActiveCamera().getPosition(),i=[];for(let l=0;l<e.volumes.length;l++){const g=e.volumes[l].getRenderable().getBounds();i[l]=St([.5*(g[1]+g[0]),.5*(g[3]+g[2]),.5*(g[5]+g[4])],o)}const u=[...Array(e.volumes.length).keys()];u.sort((l,g)=>i[g]-i[l]);let p=[],c=u.length%r;for(let l=0;l<u.length;l++)p.push(e.volumes[u[l]]),p.length>=c&&(t.rayCastPass(s,a,p),p=[],c=r,e._firstGroup=!1)}else t.rayCastPass(s,a,e.volumes);if(e._volumeCopyQuad.setWebGPURenderer(a),e._useSmallViewport){const o=e._colorTextureView.getTexture().getWidth(),i=e._colorTextureView.getTexture().getHeight();e._copyUBO.setArray("tscale",[e._smallViewportWidth/o,e._smallViewportHeight/i])}else e._copyUBO.setArray("tscale",[1,1]);e._copyUBO.sendIfNeeded(n),e._copyEncoder.setColorTextureView(0,e.colorTextureView),e._copyEncoder.attachTextureViews(),e._copyEncoder.begin(s.getCommandEncoder()),a.scissorAndViewport(e._copyEncoder),e._volumeCopyQuad.prepareAndDraw(e._copyEncoder),e._copyEncoder.end()},t.delete=v.chain(()=>{e._animationRateSubscription&&(e._animationRateSubscription.unsubscribe(),e._animationRateSubscription=null)},t.delete),t.computeTiming=a=>{const s=a.getRenderable().getInteractor();e._lastScale==null&&(e._lastScale=e.volumes[0].getRenderable().getMapper().getInitialInteractionScale()||1),e._useSmallViewport=!1,s.isAnimating()&&e._lastScale>1.5&&(e._useSmallViewport=!0),e._colorTexture.resize(a.getCanvas().width,a.getCanvas().height),e._animationRateSubscription||(e._animationRateSubscription=s.onAnimationFrameRateUpdate(()=>{const n=e.volumes[0].getRenderable().getMapper();if(n.getAutoAdjustSampleDistances()){const r=s.getRecentAnimationFrameRate();e._lastScale=e._lastScale*s.getDesiredUpdateRate()/r,e._lastScale>400&&(e._lastScale=400)}else e._lastScale=n.getImageSampleDistance()*n.getImageSampleDistance();e._lastScale<1.5&&(e._lastScale=1.5)}))},t.rayCastPass=(a,s,n)=>{const r=e._firstGroup?e._clearEncoder:e._mergeEncoder;r.attachTextureViews(),r.begin(a.getCommandEncoder());let o=e._colorTextureView.getTexture().getWidth(),i=e._colorTextureView.getTexture().getHeight();if(e._useSmallViewport){const u=a.getCanvas(),p=1/Math.sqrt(e._lastScale);e._smallViewportWidth=Math.ceil(p*u.width),e._smallViewportHeight=Math.ceil(p*u.height),o=e._smallViewportWidth,i=e._smallViewportHeight}r.getHandle().setViewport(0,0,o,i,0,1),r.getHandle().setScissorRect(0,0,o,i),e.fullScreenQuad.setWebGPURenderer(s),e.fullScreenQuad.setVolumes(n),e.fullScreenQuad.prepareAndDraw(r),r.end()},t.renderDepthBounds=(a,s)=>{t.updateDepthPolyData(a);const n=e._boundsPoly,r=n.getPoints(),o=n.getPolys();let i={hash:`vp${o.getMTime()}`,usage:me.Index,cells:o,numberOfPoints:r.getNumberOfPoints(),primitiveType:Dn.Triangles,representation:Vn.SURFACE};const u=s.getDevice().getBufferManager().getBuffer(i);e._mapper.getVertexInput().setIndexBuffer(u),i={usage:me.PointArray,format:"float32x4",hash:`vp${r.getMTime()}${o.getMTime()}`,dataArray:r,indexBuffer:u,packExtra:!0};const p=s.getDevice().getBufferManager().getBuffer(i);e._mapper.getVertexInput().addBuffer(p,["vertexBC"]),e._mapper.setNumberOfVertices(p.getSizeInBytes()/p.getStrideInBytes()),t.drawDepthRange(a,s)},t.updateDepthPolyData=a=>{let s=!1;for(let c=0;c<e.volumes.length;c++){const l=e.volumes[c].getMTime();(!e._lastMTimes[c]||l!==e._lastMTimes[c])&&(s=!0,e._lastMTimes[c]=l)}const n=a.getStabilizedTime();if((e._lastMTimes.length<=e.volumes.length||n!==e._lastMTimes[e.volumes.length])&&(s=!0,e._lastMTimes[e.volumes.length]=n),!s)return;const r=a.getStabilizedCenterByReference(),o=e.volumes.length*8,i=new Float64Array(o*3),u=e.volumes.length*12,p=new Uint16Array(u*4);for(let c=0;c<e.volumes.length;c++){e.volumes[c].getBoundingCubePoints(i,c*24);let l=c*12*4;const g=c*8;for(let f=0;f<12;f++)p[l++]=3,p[l++]=g+ve[f][0],p[l++]=g+ve[f][1],p[l++]=g+ve[f][2]}for(let c=0;c<i.length;c+=3)i[c]-=r[0],i[c+1]-=r[1],i[c+2]-=r[2];e._boundsPoly.getPoints().setData(i,3),e._boundsPoly.getPoints().modified(),e._boundsPoly.getPolys().setData(p,1),e._boundsPoly.getPolys().modified(),e._boundsPoly.modified()},t.drawDepthRange=(a,s)=>{e._depthRangeTexture.resizeToMatch(e.colorTextureView.getTexture()),e._depthRangeTexture2.resizeToMatch(e.colorTextureView.getTexture()),e._depthRangeEncoder.attachTextureViews(),t.setCurrentOperation("volumeDepthRangePass"),a.setRenderEncoder(e._depthRangeEncoder),a.volumeDepthRangePass(!0),e._mapper.setWebGPURenderer(a),e._mapper.prepareToDraw(e._depthRangeEncoder),e._mapper.registerDrawCallback(e._depthRangeEncoder),a.volumeDepthRangePass(!1)},t.createDepthRangeEncoder=a=>{const s=a.getDevice();e._depthRangeEncoder=z.newInstance({label:"VolumePass DepthRange"}),e._depthRangeEncoder.setPipelineHash("volr"),e._depthRangeEncoder.setReplaceShaderCodeFunction(o=>{const i=o.getShaderDescription("fragment");i.addOutput("vec4<f32>","outColor1"),i.addOutput("vec4<f32>","outColor2");let u=i.getCode();u=D.substitute(u,"//VTK::RenderEncoder::Impl",["output.outColor1 = vec4<f32>(input.fragPos.z, 0.0, 0.0, 0.0);","output.outColor2 = vec4<f32>(stopval, 0.0, 0.0, 0.0);"]).result,i.setCode(u)}),e._depthRangeEncoder.setDescription({colorAttachments:[{view:null,clearValue:[0,0,0,0],loadOp:"clear",storeOp:"store"},{view:null,clearValue:[1,1,1,1],loadOp:"clear",storeOp:"store"}]}),e._depthRangeEncoder.setPipelineSettings({primitive:{cullMode:"none"},fragment:{targets:[{format:"r16float",blend:{color:{srcFactor:"one",dstFactor:"one",operation:"max"},alpha:{srcFactor:"one",dstFactor:"one",operation:"max"}}},{format:"r16float",blend:{color:{srcFactor:"one",dstFactor:"one",operation:"min"},alpha:{srcFactor:"one",dstFactor:"one",operation:"min"}}}]}}),e._depthRangeTexture=W.newInstance({label:"volumePassMaxDepth"}),e._depthRangeTexture.create(s,{width:a.getCanvas().width,height:a.getCanvas().height,format:"r16float",usage:GPUTextureUsage.RENDER_ATTACHMENT|GPUTextureUsage.TEXTURE_BINDING});const n=e._depthRangeTexture.createView("maxTexture");e._depthRangeEncoder.setColorTextureView(0,n),e._depthRangeTexture2=W.newInstance({label:"volumePassDepthMin"}),e._depthRangeTexture2.create(s,{width:a.getCanvas().width,height:a.getCanvas().height,format:"r16float",usage:GPUTextureUsage.RENDER_ATTACHMENT|GPUTextureUsage.TEXTURE_BINDING});const r=e._depthRangeTexture2.createView("minTexture");e._depthRangeEncoder.setColorTextureView(1,r),e._mapper.setDevice(a.getDevice()),e._mapper.setTextureViews([e.depthTextureView])},t.createClearEncoder=a=>{e._colorTexture=W.newInstance({label:"volumePassColor"}),e._colorTexture.create(a.getDevice(),{width:a.getCanvas().width,height:a.getCanvas().height,format:"bgra8unorm",usage:GPUTextureUsage.RENDER_ATTACHMENT|GPUTextureUsage.TEXTURE_BINDING|GPUTextureUsage.COPY_SRC}),e._colorTextureView=e._colorTexture.createView("volumePassColorTexture"),e._colorTextureView.addSampler(a.getDevice(),{minFilter:"linear",magFilter:"linear"}),e._clearEncoder=z.newInstance({label:"VolumePass Clear"}),e._clearEncoder.setColorTextureView(0,e._colorTextureView),e._clearEncoder.setDescription({colorAttachments:[{view:null,clearValue:[0,0,0,0],loadOp:"clear",storeOp:"store"}]}),e._clearEncoder.setPipelineHash("volpf"),e._clearEncoder.setPipelineSettings({primitive:{cullMode:"none"},fragment:{targets:[{format:"bgra8unorm",blend:{color:{srcFactor:"src-alpha",dstFactor:"one-minus-src-alpha"},alpha:{srcFactor:"one",dstFactor:"one-minus-src-alpha"}}}]}})},t.createCopyEncoder=a=>{e._copyEncoder=z.newInstance({label:"volumePassCopy"}),e._copyEncoder.setDescription({colorAttachments:[{view:null,loadOp:"load",storeOp:"store"}]}),e._copyEncoder.setPipelineHash("volcopypf"),e._copyEncoder.setPipelineSettings({primitive:{cullMode:"none"},fragment:{targets:[{format:"rgba16float",blend:{color:{srcFactor:"one",dstFactor:"one-minus-src-alpha"},alpha:{srcFactor:"one",dstFactor:"one-minus-src-alpha"}}}]}})},t.createMergeEncoder=a=>{e._mergeEncoder=z.newInstance({label:"volumePassMerge"}),e._mergeEncoder.setColorTextureView(0,e._colorTextureView),e._mergeEncoder.setDescription({colorAttachments:[{view:null,loadOp:"load",storeOp:"store"}]}),e._mergeEncoder.setReplaceShaderCodeFunction(s=>{const n=s.getShaderDescription("fragment");n.addOutput("vec4<f32>","outColor");let r=n.getCode();r=D.substitute(r,"//VTK::RenderEncoder::Impl",["output.outColor = vec4<f32>(computedColor.rgb, computedColor.a);"]).result,n.setCode(r)}),e._mergeEncoder.setPipelineHash("volpf"),e._mergeEncoder.setPipelineSettings({primitive:{cullMode:"none"},fragment:{targets:[{format:"bgra8unorm",blend:{color:{srcFactor:"src-alpha",dstFactor:"one-minus-src-alpha"},alpha:{srcFactor:"one",dstFactor:"one-minus-src-alpha"}}}]}})},t.setVolumes=a=>{if(!e.volumes||e.volumes.length!==a.length){e.volumes=[...a],t.modified();return}for(let s=0;s<a.length;s++)if(a[s]!==e.volumes[s]){e.volumes=[...a],t.modified();return}},t.releaseGraphicsResources=()=>{e._animationRateSubscription&&(e._animationRateSubscription.unsubscribe(),e._animationRateSubscription=null),e._clearEncoder=null,e._mergeEncoder=null,e._copyEncoder=null,e._depthRangeEncoder=null,e._colorTexture=null,e._colorTextureView=null,e._depthRangeTexture=null,e._depthRangeTexture2=null,e._volumeCopyQuad=null,e.fullScreenQuad=null,e._copyUBO=null,e.colorTextureView=null,e.depthTextureView=null}}var Un={colorTextureView:null,depthTextureView:null,volumes:null};function Je(t,e,a={}){Object.assign(e,Un,a),Q.extend(t,e,a),e._mapper=Mt.newInstance(),e._mapper.setFragmentShaderTemplate(Bn),e._mapper.getShaderReplacements().set("replaceShaderVolumePass",(s,n,r)=>{n.getShaderDescription("fragment").addBuiltinInput("vec4<f32>","@builtin(position) fragPos")}),e._boundsPoly=Vt.newInstance(),e._lastMTimes=[],v.setGet(t,e,["colorTextureView","depthTextureView"]),On(t,e)}var Fn=v.newInstance(Je,"vtkWebGPUVolumePass"),Pn={newInstance:Fn,extend:Je},Gn=`
|
|
532
|
-
//VTK::Mapper::Dec
|
|
533
|
-
|
|
534
|
-
//VTK::TCoord::Dec
|
|
535
|
-
|
|
536
|
-
//VTK::RenderEncoder::Dec
|
|
537
|
-
|
|
538
|
-
//VTK::IOStructs::Dec
|
|
539
|
-
|
|
540
|
-
@fragment
|
|
541
|
-
fn main(
|
|
542
|
-
//VTK::IOStructs::Input
|
|
543
|
-
)
|
|
544
|
-
//VTK::IOStructs::Output
|
|
545
|
-
{
|
|
546
|
-
var output: fragmentOutput;
|
|
547
|
-
|
|
548
|
-
var texCoord: vec2<i32> =
|
|
549
|
-
vec2<i32>(i32(input.fragPos.x), i32(input.fragPos.y));
|
|
550
|
-
var computedColor: vec4<f32> = clamp(
|
|
551
|
-
textureLoad(opaquePassColorTexture, texCoord, 0),
|
|
552
|
-
vec4<f32>(0.0),
|
|
553
|
-
vec4<f32>(1.0)
|
|
554
|
-
);
|
|
555
|
-
|
|
556
|
-
//VTK::RenderEncoder::Impl
|
|
557
|
-
return output;
|
|
558
|
-
}
|
|
559
|
-
`;function kn(t,e){e.classHierarchy.push("vtkForwardPass"),t.traverse=(a,s=null)=>{if(e.deleted)return;e._currentParent=s,t.setCurrentOperation("buildPass"),a.traverse(t),e.opaquePass||(e.opaquePass=Sn.newInstance());const n=a.getRenderable().getNumberOfLayers(),r=a.getChildren();for(let o=0;o<n;o++)for(let i=0;i<r.length;i++){const u=r[i],p=a.getRenderable().getRenderers()[i];p.getDraw()&&p.getLayer()===o&&(e.opaqueActorCount=0,e.translucentActorCount=0,e.volumes=[],t.setCurrentOperation("queryPass"),u.traverse(t),t.setCurrentOperation("cameraPass"),u.traverse(t),e.opaquePass.traverse(u,a),e.translucentActorCount>0&&(e.translucentPass||(e.translucentPass=Cn.newInstance()),e.translucentPass.setColorTextureView(e.opaquePass.getColorTextureView()),e.translucentPass.setDepthTextureView(e.opaquePass.getDepthTextureView()),e.translucentPass.traverse(u,a)),e.volumes.length>0&&(e.volumePass||(e.volumePass=Pn.newInstance()),e.volumePass.setColorTextureView(e.opaquePass.getColorTextureView()),e.volumePass.setDepthTextureView(e.opaquePass.getDepthTextureView()),e.volumePass.setVolumes(e.volumes),e.volumePass.traverse(u,a)),t.finalPass(a,u))}},t.finalPass=(a,s)=>{e._finalBlitEncoder||t.createFinalBlitEncoder(a),e._finalBlitOutputTextureView.createFromTextureHandle(a.getCurrentTexture(),{depth:1,format:a.getPresentationFormat()}),e._finalBlitEncoder.attachTextureViews(),e._finalBlitEncoder.begin(a.getCommandEncoder()),s.scissorAndViewport(e._finalBlitEncoder),e._fullScreenQuad.prepareAndDraw(e._finalBlitEncoder),e._finalBlitEncoder.end()},t.createFinalBlitEncoder=a=>{e._finalBlitEncoder=z.newInstance({label:"forwardPassBlit"}),e._finalBlitEncoder.setDescription({colorAttachments:[{view:null,loadOp:"load",storeOp:"store"}]}),e._finalBlitEncoder.setPipelineHash("fpf"),e._finalBlitEncoder.setPipelineSettings({primitive:{cullMode:"none"},fragment:{targets:[{format:a.getPresentationFormat(),blend:{color:{srcFactor:"src-alpha",dstFactor:"one-minus-src-alpha"},alpha:{srcFactor:"one",dstFactor:"one-minus-src-alpha"}}}]}}),e._fsqSampler=$e.newInstance({label:"finalPassSampler"}),e._fsqSampler.create(a.getDevice(),{minFilter:"linear",magFilter:"linear"}),e._fullScreenQuad=se.newInstance(),e._fullScreenQuad.setDevice(a.getDevice()),e._fullScreenQuad.setPipelineHash("fpfsq"),e._fullScreenQuad.setTextureViews([e.opaquePass.getColorTextureView()]),e._fullScreenQuad.setAdditionalBindables([e._fsqSampler]),e._fullScreenQuad.setFragmentShaderTemplate(Gn),e._fullScreenQuad.getShaderReplacements().set("replaceShaderTCoord",(s,n)=>{const r=n.getShaderDescription("vertex");r.hasOutput("tcoordVS")||r.addOutput("vec2<f32>","tcoordVS"),n.getShaderDescription("fragment").addBuiltinInput("vec4<f32>","@builtin(position) fragPos")}),e._finalBlitOutputTextureView=Dt.newInstance(),e._finalBlitEncoder.setColorTextureView(0,e._finalBlitOutputTextureView)},t.incrementOpaqueActorCount=()=>e.opaqueActorCount++,t.incrementTranslucentActorCount=()=>e.translucentActorCount++,t.addVolume=a=>{e.volumes.push(a)},t.releaseGraphicsResources=()=>{e.opaquePass?.releaseGraphicsResources?.(),e.translucentPass?.releaseGraphicsResources?.(),e.volumePass?.releaseGraphicsResources?.(),e.opaquePass=null,e.translucentPass=null,e.volumePass=null,e._finalBlitEncoder=null,e._finalBlitOutputTextureView=null,e._fullScreenQuad=null,e._fsqSampler=null}}var Ln={opaqueActorCount:0,translucentActorCount:0,volumes:null,opaqueRenderEncoder:null,translucentPass:null,volumePass:null};function qe(t,e,a={}){Object.assign(e,Ln,a),Q.extend(t,e,a),v.setGet(t,e,["opaquePass","translucentPass","volumePass"]),kn(t,e)}var Wn=v.newInstance(qe,"vtkForwardPass"),zn={newInstance:Wn,extend:qe},{VtkDataTypes:H}=dt;function Nn(t,e){e.classHierarchy.push("vtkWebGPUTextureManager");function a(n){if(n.imageData){n.dataArray=n.imageData.getPointData().getScalars(),n.time=n.dataArray.getMTime(),n.nativeArray=n.dataArray.getData();const r=n.imageData.getDimensions();switch(n.width=r[0],n.height=r[1],n.depth=r[2],n.dataArray.getNumberOfComponents()){case 1:n.format="r";break;case 2:n.format="rg";break;default:n.format="rgba";break}switch(n.dataArray.getDataType()){case H.UNSIGNED_CHAR:n.format+="8unorm";break;case H.FLOAT:case H.UNSIGNED_INT:case H.INT:case H.DOUBLE:case H.UNSIGNED_SHORT:case H.SHORT:default:n.format+="16float";break}}n.image&&(n.width=n.image.width,n.height=n.image.height,n.depth=1,n.format="rgba8unorm",n.flip=!0,n.usage=GPUTextureUsage.STORAGE_BINDING|GPUTextureUsage.COPY_DST|GPUTextureUsage.TEXTURE_BINDING|GPUTextureUsage.RENDER_ATTACHMENT),n.jsImageData&&(n.width=n.jsImageData.width,n.height=n.jsImageData.height,n.depth=1,n.format="rgba8unorm",n.flip=!0,n.nativeArray=n.jsImageData.data,n.usage=GPUTextureUsage.STORAGE_BINDING|GPUTextureUsage.COPY_DST|GPUTextureUsage.TEXTURE_BINDING|GPUTextureUsage.RENDER_ATTACHMENT),n.imageBitmap&&(n.width=n.imageBitmap.width,n.height=n.imageBitmap.height,n.depth=1,n.format="rgba8unorm",n.flip=!0,n.usage=GPUTextureUsage.STORAGE_BINDING|GPUTextureUsage.COPY_DST|GPUTextureUsage.TEXTURE_BINDING|GPUTextureUsage.RENDER_ATTACHMENT),n.canvas&&(n.width=n.canvas.width,n.height=n.canvas.height,n.depth=1,n.format="rgba8unorm",n.flip=!0,n.usage=GPUTextureUsage.STORAGE_BINDING|GPUTextureUsage.COPY_DST|GPUTextureUsage.TEXTURE_BINDING|GPUTextureUsage.RENDER_ATTACHMENT)}function s(n){const r=W.newInstance({label:n.label});return r.create(e.device,{width:n.width,height:n.height,depth:n.depth,format:n.format,usage:n.usage,mipLevel:n.mipLevel}),(n.nativeArray||n.image||n.canvas||n.imageBitmap)&&r.writeImageData(n),r}t.getTexture=n=>n.hash?e.device.getCachedObject(n.hash,s,n):s(n),t.getTextureForImageData=n=>{const r={time:n.getMTime()};return r.imageData=n,a(r),r.hash=r.time+r.format+r.mipLevel,e.device.getTextureManager().getTexture(r)},t.getTextureForVTKTexture=(n,r=void 0)=>{const o={time:n.getMTime(),label:r};return n.getInputData()?o.imageData=n.getInputData():n.getImage()?o.image=n.getImage():n.getJsImageData()?o.jsImageData=n.getJsImageData():n.getImageBitmap()?o.imageBitmap=n.getImageBitmap():n.getCanvas()&&(o.canvas=n.getCanvas()),a(o),o.mipLevel=n.getMipLevel(),o.hash=o.time+o.format+o.mipLevel,e.device.getTextureManager().getTexture(o)}}var $n={handle:null,device:null};function Ae(t,e,a={}){Object.assign(e,$n,a),v.obj(t,e),v.setGet(t,e,["device"]),Nn(t,e)}var Kn=v.newInstance(Ae),Hn={newInstance:Kn,extend:Ae},bn=class extends Map{constructor(){super(),this.registry=new FinalizationRegistry(t=>{const e=super.get(t);e&&e.deref&&e.deref()===void 0&&super.delete(t)})}getValue(t){const e=super.get(t);if(e){const a=e.deref();if(a!==void 0)return a;super.delete(t)}}setValue(t,e){let a;return e&&typeof e=="object"&&(a=new WeakRef(e),this.registry.register(e,t),super.set(t,a)),a}};function In(t,e){e.classHierarchy.push("vtkWebGPUDevice"),t.initialize=a=>{e.handle=a},t.createCommandEncoder=()=>e.handle.createCommandEncoder(),t.submitCommandEncoder=a=>{e.handle.queue.submit([a.finish()])},t.getShaderModule=a=>e.shaderCache.getShaderModule(a),t.getBindGroupLayout=a=>{if(!a.entries)return null;for(let r=0;r<a.entries.length;r++){const o=a.entries[r];o.binding=o.binding||0,o.visibility=o.visibility||GPUShaderStage.VERTEX|GPUShaderStage.FRAGMENT}const s=JSON.stringify(a);for(let r=0;r<e.bindGroupLayouts.length;r++)if(e.bindGroupLayouts[r].sval===s)return e.bindGroupLayouts[r].layout;const n=e.handle.createBindGroupLayout(a);return e.bindGroupLayouts.push({sval:s,layout:n}),n},t.getBindGroupLayoutDescription=a=>{for(let s=0;s<e.bindGroupLayouts.length;s++)if(e.bindGroupLayouts[s].layout===a)return e.bindGroupLayouts[s].sval;return vtkErrorMacro("layout not found"),console.trace(),null},t.getPipeline=a=>a in e.pipelines?e.pipelines[a]:null,t.createPipeline=(a,s)=>{s.initialize(t,a),e.pipelines[a]=s},t.onSubmittedWorkDone=()=>e.handle.queue.onSubmittedWorkDone(),t.hasCachedObject=a=>e.objectCache.getValue(a),t.getCachedObject=(a,s,...n)=>{if(!a)return vtkErrorMacro("attempt to cache an object without a hash"),null;const r=e.objectCache.getValue(a);if(r)return r;const o=s(...n);return e.objectCache.setValue(a,o),o}}var jn={handle:null,pipelines:null,shaderCache:null,bindGroupLayouts:null,bufferManager:null,textureManager:null};function et(t,e,a={}){Object.assign(e,jn,a),Ge(t,e),Le(t,e,["handle"]),ke(t,e,["bufferManager","shaderCache","textureManager"]),e.objectCache=new bn,e.shaderCache=D.newInstance(),e.shaderCache.setDevice(t),e.bindGroupLayouts=[],e.bufferManager=Ke.newInstance(),e.bufferManager.setDevice(t),e.textureManager=Hn.newInstance(),e.textureManager.setDevice(t),e.pipelines={},In(t,e)}var Qn=Pe(et,"vtkWebGPUDevice"),Yn={newInstance:Qn,extend:et};function Xn(t,e){e.classHierarchy.push("vtkWebGPUHardwareSelectionPass"),t.traverse=(a,s)=>{if(e.deleted)return;e._currentParent=null,t.setCurrentOperation("buildPass"),a.traverse(t);const n=a.getDevice();if(e.selectionRenderEncoder)e.colorTexture.resize(a.getCanvas().width,a.getCanvas().height),e.depthTexture.resizeToMatch(e.colorTexture);else{t.createRenderEncoder(),e.colorTexture=W.newInstance({label:"hardwareSelectorColor"}),e.colorTexture.create(n,{width:a.getCanvas().width,height:a.getCanvas().height,format:"rgba32uint",usage:GPUTextureUsage.RENDER_ATTACHMENT|GPUTextureUsage.COPY_SRC});const r=e.colorTexture.createView("hardwareSelectColorTexture");e.selectionRenderEncoder.setColorTextureView(0,r),e.depthTexture=W.newInstance({label:"hardwareSelectorDepth"}),e.depthTexture.create(n,{width:a.getCanvas().width,height:a.getCanvas().height,format:"depth32float",usage:GPUTextureUsage.RENDER_ATTACHMENT|GPUTextureUsage.COPY_SRC});const o=e.depthTexture.createView("hardwareSelectDepthTexture");e.selectionRenderEncoder.setDepthTextureView(o)}e.selectionRenderEncoder.attachTextureViews(),s.setRenderEncoder(e.selectionRenderEncoder),t.setCurrentOperation("cameraPass"),s.traverse(t),t.setCurrentOperation("opaquePass"),s.traverse(t)},t.createRenderEncoder=()=>{e.selectionRenderEncoder=z.newInstance({label:"HardwareSelectionPass"}),e.selectionRenderEncoder.setPipelineHash("sel"),e.selectionRenderEncoder.setReplaceShaderCodeFunction(s=>{const n=s.getShaderDescription("fragment");n.addOutput("vec4<u32>","outColor");let r=n.getCode();r=D.substitute(r,"//VTK::Select::Impl",[" var compositeID: u32 = 0u;"," var attributeID: u32 = compositeID;"]).result,r=D.substitute(r,"//VTK::RenderEncoder::Impl",["output.outColor = vec4<u32>(mapperUBO.PropID, compositeID, attributeID + 1u, 0u);"]).result,n.setCode(r)});const a=e.selectionRenderEncoder.getDescription();a.colorAttachments[0].clearValue=[0,0,0,0],e.selectionRenderEncoder.setPipelineSettings({primitive:{cullMode:"none"},depthStencil:{depthWriteEnabled:!0,depthCompare:"greater",format:"depth32float"},fragment:{targets:[{format:"rgba32uint",blend:void 0}]}})}}var Zn={selectionRenderEncoder:null,colorTexture:null,depthTexture:null};function tt(t,e,a={}){Object.assign(e,Zn,a),Q.extend(t,e,a),v.get(t,e,["colorTexture","depthTexture"]),Xn(t,e)}var Jn=v.newInstance(tt,"vtkWebGPUHardwareSelectionPass"),qn={newInstance:Jn,extend:tt},{SelectionContent:An,SelectionField:Oe}=He,{FieldAssociations:Ue}=Tt,{vtkErrorMacro:nt}=v;function ea(t){return`${t.propID} ${t.compositeID}`}function he(t,e,a,s){const n=((a.height-e-1)*a.colorBufferWidth+t)*4+s;return a.colorValues[n]}function ta(t,e,a,s){{if(s[0]=e[0],s[1]=e[1],e[0]<0||e[0]>=t.width||e[1]<0||e[1]>=t.height)return null;const n=he(e[0],e[1],t,0);if(n<=0||n-1>=(t.props?.length??0))return null;const r={};r.propID=n-1,r.prop=t.props?.[r.propID];let o=he(e[0],e[1],t,1);(o<0||o>16777215)&&(o=0),r.compositeID=o-1;let i=he(e[0],e[1],t,2);if(i<1&&(i=o),r.attributeID=i-1,t.captureZValues){const u=(t.height-e[1]-1)*t.zbufferBufferWidth+e[0];r.zValue=t.depthValues[u],r.zValue=t.webGPURenderer.convertToOpenGLDepth(r.zValue),r.displayPosition=e}return r}}function na(t,e,a){const s=[];let n=0;return e.forEach((r,o)=>{const i=He.newInstance();switch(i.setContentType(An.INDICES),t){case Ue.FIELD_ASSOCIATION_CELLS:i.setFieldType(Oe.CELL);break;case Ue.FIELD_ASSOCIATION_POINTS:i.setFieldType(Oe.POINT);break;default:nt("Unknown field association")}i.getProperties().propID=r.info.propID,i.getProperties().prop=r.info.prop,i.getProperties().compositeID=r.info.compositeID,i.getProperties().attributeID=r.info.attributeID,i.getProperties().pixelCount=r.pixelCount,a.captureZValues&&(i.getProperties().displayPosition=[r.info.displayPosition[0],r.info.displayPosition[1],r.info.zValue],i.getProperties().worldPosition=a.webGPURenderWindow.displayToWorld(r.info.displayPosition[0],r.info.displayPosition[1],r.info.zValue,a.renderer)),i.setSelectionList(r.attributeIDs),s[n]=i,n++}),s}function aa(t,e,a,s,n){const r=Math.floor(e),o=Math.floor(a),i=Math.floor(s),u=Math.floor(n),p=new Map,c=[0,0];for(let l=o;l<=u;l++)for(let g=r;g<=i;g++){const f=ta(t,[g,l],0,c);if(f){const h=ea(f);if(!p.has(h))p.set(h,{info:f,pixelCount:1,attributeIDs:[f.attributeID]});else{const S=p.get(h);S.pixelCount++,t.captureZValues&&f.zValue<S.info.zValue&&(S.info=f),S.attributeIDs.indexOf(f.attributeID)===-1&&S.attributeIDs.push(f.attributeID)}}}return na(t.fieldAssociation,p,t)}function ra(t,e){e.classHierarchy.push("vtkWebGPUHardwareSelector"),t.getPropIDForSelection=(a,s=null)=>{if(e._selectionPropMap.has(a))return e._selectionPropMap.get(a);const n=e._selectionProps.length;return e._selectionPropMap.set(a,n),e._selectionProps.push(s),n},t.endSelection=()=>{e.WebGPURenderer.setSelector(null)},t.getSourceDataAsync=async a=>{if(!a||!e._WebGPURenderWindow)return nt("Renderer and view must be set before calling Select."),!1;e._WebGPURenderWindow.getRenderable().preRender(),e._WebGPURenderWindow.getInitialized()||(e._WebGPURenderWindow.initialize(),await new Promise(h=>{e._WebGPURenderWindow.onInitialized(h)}));const s=e._WebGPURenderWindow.getViewNodeFor(a);if(!s)return!1;const n=s.getSuppressClear(),r=s.getSelector();e._selectionPropMap.clear(),e._selectionProps=[],s.setSuppressClear(!0),s.setSelector(t);try{e._selectionPass.traverse(e._WebGPURenderWindow,s)}finally{s.setSelector(r),s.setSuppressClear(n)}const o=e._WebGPURenderWindow.getDevice(),i=e._selectionPass.getColorTexture(),u=e._selectionPass.getDepthTexture(),p={area:[0,0,i.getWidth()-1,i.getHeight()-1],captureZValues:e.captureZValues,fieldAssociation:e.fieldAssociation,props:[...e._selectionProps],renderer:a,webGPURenderer:s,webGPURenderWindow:e._WebGPURenderWindow,width:i.getWidth(),height:i.getHeight()};p.colorBufferWidth=16*Math.floor((p.width+15)/16),p.colorBufferSizeInBytes=p.colorBufferWidth*p.height*4*4;const c=Te.newInstance({label:"hardwareSelectColorBuffer"});c.setDevice(o),c.create(p.colorBufferSizeInBytes,GPUBufferUsage.MAP_READ|GPUBufferUsage.COPY_DST);const l=e._WebGPURenderWindow.getCommandEncoder();l.copyTextureToBuffer({texture:i.getHandle()},{buffer:c.getHandle(),bytesPerRow:16*p.colorBufferWidth,rowsPerImage:p.height},{width:p.width,height:p.height,depthOrArrayLayers:1});let g;e.captureZValues&&(p.zbufferBufferWidth=64*Math.floor((p.width+63)/64),g=Te.newInstance({label:"hardwareSelectDepthBuffer"}),g.setDevice(o),p.zbufferSizeInBytes=p.height*p.zbufferBufferWidth*4,g.create(p.zbufferSizeInBytes,GPUBufferUsage.MAP_READ|GPUBufferUsage.COPY_DST),l.copyTextureToBuffer({texture:u.getHandle(),aspect:"depth-only"},{buffer:g.getHandle(),bytesPerRow:4*p.zbufferBufferWidth,rowsPerImage:p.height},{width:p.width,height:p.height,depthOrArrayLayers:1})),o.submitCommandEncoder(l);const f=c.mapAsync(GPUMapMode.READ);if(e.captureZValues){const h=g.mapAsync(GPUMapMode.READ);await Promise.all([f,h]),p.depthValues=new Float32Array(g.getMappedRange().slice()),g.unmap()}else await f;return p.colorValues=new Uint32Array(c.getMappedRange().slice()),c.unmap(),p.generateSelection=(h,S,y,w)=>aa(p,h,S,y,w),p}}var sa={_selectionPropMap:null,_selectionProps:null};function at(t,e,a={}){Object.assign(e,sa,a),Bt.extend(t,e,a),e._selectionPass=qn.newInstance(),e._selectionPropMap=new Map,e._selectionProps=[],v.setGet(t,e,["_WebGPURenderWindow"]),v.moveToProtected(t,e,["WebGPURenderWindow"]),ra(t,e)}var oa=v.newInstance(at,"vtkWebGPUHardwareSelector"),rt={newInstance:oa,extend:at},{vtkErrorMacro:Fe,vtkWarningMacro:ia}=v,ca={position:"absolute",top:0,left:0,width:"100%",height:"100%"};function ua(t,e){e.classHierarchy.push("vtkWebGPURenderWindow"),t.getViewNodeFactory=()=>e.myFactory;function a(c,l=new Set){if(!c||l.has(c))return;l.add(c);const g=c.getChildren?.()||[];for(let f=0;f<g.length;f++){const h=g[f];h?.releaseGraphicsResources?.(),a(h,l)}}function s(){const c=t.onInitialized(()=>{c.unsubscribe(),e.deleted||t.traverseAllPasses()})}function n(c,l){if(e.deleted||l!==e.deviceGeneration||e.handlingDeviceLost)return;e.handlingDeviceLost=!0,e.deviceLostInfo=c;const g=c?.reason??"unknown",f=c?.message||"WebGPU device was lost.";ia(`WebGPU device lost (${g}): ${f}`),t.releaseGraphicsResources(),t.invokeDeviceLost({reason:g,message:f,recoverable:g!=="destroyed"}),g!=="destroyed"&&(s(),t.initialize()),e.handlingDeviceLost=!1}function r(c,l){c.lost.then(g=>{n(g,l)})}const o=[0,0];function i(){e.renderable&&(e.size[0]!==o[0]||e.size[1]!==o[1])&&(o[0]=e.size[0],o[1]=e.size[1],e.canvas.setAttribute("width",e.size[0]),e.canvas.setAttribute("height",e.size[1]),t.recreateSwapChain()),e.viewStream&&e.viewStream.setSize(e.size[0],e.size[1]),e.canvas.style.display=e.useOffScreen?"none":"block",e.el&&(e.el.style.cursor=e.cursorVisibility?e.cursor:"none"),e.containerSize=null}t.onModified(i),t.recreateSwapChain=()=>{e.context&&(e.context.unconfigure(),e.presentationFormat=navigator.gpu.getPreferredCanvasFormat(e.adapter),e.context.configure({device:e.device.getHandle(),format:e.presentationFormat,alphaMode:"premultiplied",usage:GPUTextureUsage.RENDER_ATTACHMENT|GPUTextureUsage.COPY_DST,width:e.size[0],height:e.size[1]}),e._configured=!0)},t.getCurrentTexture=()=>e.context.getCurrentTexture(),t.buildPass=c=>{if(c){if(!e.renderable)return;t.prepareNodes(),t.addMissingNodes(e.renderable.getRenderersByReference()),t.removeUnusedNodes(),t.initialize()}else e.initialized&&(e._configured||t.recreateSwapChain(),e.commandEncoder=e.device.createCommandEncoder())},t.initialize=()=>{if(!e.initializing){if(e.initializing=!0,e.deviceLostInfo=null,!navigator.gpu){Fe("WebGPU is not enabled.");return}t.create3DContextAsync().then(()=>{e.initialized=!0,!e.deleted&&t.invokeInitialized()})}},t.setContainer=c=>{e.el&&e.el!==c&&(e.canvas.parentNode!==e.el&&Fe("Error: canvas parent node does not match container"),e.el.removeChild(e.canvas),e.el.contains(e.bgImage)&&e.el.removeChild(e.bgImage)),e.el!==c&&(e.el=c,e.el&&(e.el.appendChild(e.canvas),e.useBackgroundImage&&e.el.appendChild(e.bgImage)),t.modified())},t.getContainer=()=>e.el,t.getContainerSize=()=>{if(!e.containerSize&&e.el){const{width:c,height:l}=e.el.getBoundingClientRect();e.containerSize=[c,l]}return e.containerSize||e.size},t.getFramebufferSize=()=>e.size,t.create3DContextAsync=async()=>{if(e.adapter=await navigator.gpu.requestAdapter({powerPreference:"high-performance"}),!e.deleted){if(e.device=Yn.newInstance(),e.device.initialize(await e.adapter.requestDevice({requiredLimits:{maxBufferSize:e.adapter.limits.maxBufferSize,maxStorageBufferBindingSize:e.adapter.limits.maxStorageBufferBindingSize,maxUniformBufferBindingSize:e.adapter.limits.maxUniformBufferBindingSize}})),e.deleted){e.device=null;return}e.deviceGeneration+=1,r(e.device.getHandle(),e.deviceGeneration),e.context=e.canvas.getContext("webgpu")}},t.releaseGraphicsResources=()=>{if(e.renderPasses)for(let l=0;l<e.renderPasses.length;l++)e.renderPasses[l]?.releaseGraphicsResources?.();a(t);const c=Q.newInstance();c.setCurrentOperation("Release"),c.traverse(t,null),e.context&&e.context.unconfigure(),e.adapter=null,e.device=null,e.context=null,e.commandEncoder=null,e._configured=!1,e.initialized=!1,e.initializing=!1},t.setBackgroundImage=c=>{e.bgImage.src=c.src},t.setUseBackgroundImage=c=>{e.useBackgroundImage=c,e.useBackgroundImage&&!e.el.contains(e.bgImage)?e.el.appendChild(e.bgImage):!e.useBackgroundImage&&e.el.contains(e.bgImage)&&e.el.removeChild(e.bgImage)};async function u(c=e.imageFormat){const l=document.createElement("canvas"),g=l.getContext("2d");l.width=e.canvas.width,l.height=e.canvas.height;const f=await t.getPixelsAsync(),h=new ImageData(f.colorValues,f.width,f.height);g.putImageData(h,0,0);const S=e.canvas.getBoundingClientRect();e.renderable.getRenderers().forEach(w=>{w.getViewProps().forEach(R=>{if(R.getContainer){const E=R.getContainer().getElementsByTagName("canvas");for(let _=0;_<E.length;_++){const T=E[_],m=T.getBoundingClientRect(),V=m.x-S.x,d=m.y-S.y;g.drawImage(T,V,d)}}})});const y=l.toDataURL(c);l.remove(),t.invokeImageReady(y)}t.captureNextImage=(c="image/png",{resetCamera:l=!1,size:g=null,scale:f=1}={})=>{if(e.deleted)return null;e.imageFormat=c;const h=e.notifyStartCaptureImage;return e.notifyStartCaptureImage=!0,e._screenshot={size:g||f!==1?g||e.size.map(S=>S*f):null},new Promise((S,y)=>{const w=t.onImageReady(R=>{if(e._screenshot.size===null)e.notifyStartCaptureImage=h,w.unsubscribe(),e._screenshot.placeHolder&&(e.size=e._screenshot.originalSize,t.modified(),e._screenshot.cameras&&e._screenshot.cameras.forEach(({restoreParamsFn:E,arg:_})=>E(_)),t.traverseAllPasses(),e.el.removeChild(e._screenshot.placeHolder),e._screenshot.placeHolder.remove(),e._screenshot=null),S(R);else{const E=document.createElement("img");if(E.style=ca,E.src=R,e._screenshot.placeHolder=e.el.appendChild(E),e.canvas.style.display="none",e._screenshot.originalSize=e.size,e.size=e._screenshot.size,e._screenshot.size=null,t.modified(),l){const _=l!==!0;e._screenshot.cameras=e.renderable.getRenderers().map(T=>{const m=T.getActiveCamera(),V=m.get("focalPoint","position","parallelScale");return{resetCameraArgs:_?{renderer:T}:void 0,resetCameraFn:_?l:T.resetCamera,restoreParamsFn:m.set,arg:JSON.parse(JSON.stringify(V))}}),e._screenshot.cameras.forEach(({resetCameraFn:T,resetCameraArgs:m})=>T(m))}t.traverseAllPasses()}})})},t.traverseAllPasses=()=>{if(!e.deleted)if(e.initialized){if(e.renderPasses)for(let c=0;c<e.renderPasses.length;++c)e.renderPasses[c].traverse(t,null);e.commandEncoder&&(e.device.submitCommandEncoder(e.commandEncoder),e.commandEncoder=null,e.notifyStartCaptureImage&&e.device.onSubmittedWorkDone().then(()=>{u()}))}else{t.initialize();const c=t.onInitialized(()=>{c.unsubscribe(),t.traverseAllPasses()})}},t.setViewStream=c=>{if(e.viewStream===c)return!1;if(e.subscription&&(e.subscription.unsubscribe(),e.subscription=null),e.viewStream=c,e.viewStream){const l=e.renderable.getRenderers()[0];l.getBackgroundByReference()[3]=0,t.setUseBackgroundImage(!0),e.subscription=e.viewStream.onImageReady(g=>t.setBackgroundImage(g.image)),e.viewStream.setSize(e.size[0],e.size[1]),e.viewStream.invalidateCache(),e.viewStream.render(),t.modified()}return!0},t.getUniquePropID=()=>e.nextPropID++,t.getPropFromID=c=>{for(let l=0;l<e.children.length;l++){const g=e.children[l].getPropFromID(c);if(g!==null)return g}return null},t.getPixelsAsync=async()=>{const c=e.device,l=e.renderPasses[0].getOpaquePass().getColorTexture(),g={width:l.getWidth(),height:l.getHeight()};g.colorBufferWidth=32*Math.floor((g.width+31)/32),g.colorBufferSizeInBytes=g.colorBufferWidth*g.height*8;const f=Te.newInstance();f.setDevice(c),f.create(g.colorBufferSizeInBytes,GPUBufferUsage.MAP_READ|GPUBufferUsage.COPY_DST);const h=e.device.createCommandEncoder();h.copyTextureToBuffer({texture:l.getHandle()},{buffer:f.getHandle(),bytesPerRow:8*g.colorBufferWidth,rowsPerImage:g.height},{width:g.width,height:g.height,depthOrArrayLayers:1}),c.submitCommandEncoder(h),await f.mapAsync(GPUMapMode.READ),g.colorValues=new Uint16Array(f.getMappedRange().slice()),f.unmap();const S=new Uint8ClampedArray(g.height*g.width*4);for(let y=0;y<g.height;y++)for(let w=0;w<g.width;w++){const R=(y*g.width+w)*4,E=(y*g.colorBufferWidth+w)*4;S[R]=255*re.fromHalf(g.colorValues[E]),S[R+1]=255*re.fromHalf(g.colorValues[E+1]),S[R+2]=255*re.fromHalf(g.colorValues[E+2]),S[R+3]=255*re.fromHalf(g.colorValues[E+3])}return g.colorValues=S,g},t.createSelector=()=>{const c=rt.newInstance();return c.setWebGPURenderWindow(t),c};const p=t.setSize;t.setSize=(c,l)=>{const g=p(c,l);return g&&t.invokeWindowResizeEvent({width:c,height:l}),g},t.delete=v.chain(t.delete,t.setViewStream)}var la={initialized:!1,initializing:!1,handlingDeviceLost:!1,deviceGeneration:0,deviceLostInfo:null,context:null,adapter:null,device:null,canvas:null,cursorVisibility:!0,cursor:"pointer",containerSize:null,renderPasses:[],notifyStartCaptureImage:!1,imageFormat:"image/png",useOffScreen:!1,useBackgroundImage:!1,nextPropID:1,xrSupported:!1,presentationFormat:null};function pa(t,e,a={}){Object.assign(e,la,a),e.canvas=document.createElement("canvas"),e.canvas.style.width="100%",e.bgImage=new Image,e.bgImage.style.position="absolute",e.bgImage.style.left="0",e.bgImage.style.top="0",e.bgImage.style.width="100%",e.bgImage.style.height="100%",e.bgImage.style.zIndex="-1",Ut.extend(t,e,a),e.myFactory=Ft.newInstance(),e.renderPasses[0]=zn.newInstance(),e.selector||(e.selector=rt.newInstance(),e.selector.setWebGPURenderWindow(t)),v.event(t,e,"imageReady"),v.event(t,e,"initialized"),v.event(t,e,"deviceLost"),v.get(t,e,["commandEncoder","deviceLostInfo","device","presentationFormat","useBackgroundImage","xrSupported"]),v.setGet(t,e,["initialized","context","canvas","device","renderPasses","notifyStartCaptureImage","cursor","useOffScreen"]),v.setGetArray(t,e,["size"],2),v.event(t,e,"windowResizeEvent"),ua(t,e)}var st=v.newInstance(pa,"vtkWebGPURenderWindow");mt("WebGPU",st);Ot("vtkRenderWindow",st);var ga=bt.extractURLParameters();function fa(t,e){const a=t.invokeResize;delete t.invokeResize,e.renderWindow=Pt.newInstance(),e.renderer=Gt.newInstance(),e.renderWindow.addRenderer(e.renderer),e._apiSpecificRenderWindow=e.renderWindow.newAPISpecificView(ga.viewAPI??e.defaultViewAPI),e.renderWindow.addView(e._apiSpecificRenderWindow),e.interactor=ze.newInstance(),e.interactor.setInteractorStyle(cn.newInstance()),e.interactor.setView(e._apiSpecificRenderWindow),e.interactor.initialize(),t.setBackground=e.renderer.setBackground,t.setBackground(...e.background),t.resize=()=>{if(e.container){const s=e.container.getBoundingClientRect(),n=window.devicePixelRatio||1;e._apiSpecificRenderWindow.setSize(Math.floor(s.width*n),Math.floor(s.height*n)),a(),e.renderWindow.render()}},t.setContainer=s=>{e.container&&e.interactor.unbindEvents(e.container),e.container=s,e._apiSpecificRenderWindow.setContainer(e.container),e.container&&e.interactor.bindEvents(e.container)},t.delete=v.chain(t.setContainer,e._apiSpecificRenderWindow.delete,()=>{window.removeEventListener("resize",t.resize)},t.delete),e.listenWindowResize&&window.addEventListener("resize",t.resize),t.resize()}var va={background:[.32,.34,.43],listenWindowResize:!0,container:null};function ot(t,e,a={}){Object.assign(e,va,a),v.obj(t,e),v.get(t,e,["renderWindow","renderer","_apiSpecificRenderWindow","interactor","container"]),v.moveToProtected(t,e,["_apiSpecificRenderWindow"]),v.event(t,e,"resize"),fa(t,e)}var ha=v.newInstance(ot),Sa={newInstance:ha,extend:ot},{vtkDebugMacro:Se}=v,{States:da}=xe,A={type:"StartInteractionEvent"},$={type:"InteractionEvent"},ee={type:"EndInteractionEvent"};function we(t,e,a,s,n,r){const o=t.getActiveCamera();let i=o.getFocalPoint();i=e.getInteractorStyle().computeWorldToDisplay(t,i[0],i[1],i[2]);const u=i[2],p=e.getInteractorStyle().computeDisplayToWorld(t,a,s,u),c=e.getInteractorStyle().computeDisplayToWorld(t,n,r,u),l=[c[0]-p[0],c[1]-p[1],c[2]-p[2]];i=o.getFocalPoint();const g=o.getPosition();o.setFocalPoint(l[0]+i[0],l[1]+i[1],l[2]+i[2]),o.setPosition(l[0]+g[0],l[1]+g[1],l[2]+g[2])}function Ta(t,e,a,s){const n=a.getActiveCamera();if(n.getParallelProjection()){const r=s.getView(),o=r.getViewportSize(a),i=a.getViewport(),u=r.getSize(),p=o[0],c=o[1],l=p/2,g=c/2,f=e.x-i[0]*u[0],h=e.y-i[1]*u[1];we(a,s,l,g,f,h),n.setParallelScale(n.getParallelScale()/t),we(a,s,f,h,l,g)}else{let r=n.getFocalPoint();const o=n.getViewPlaneNormal();r=s.getInteractorStyle().computeWorldToDisplay(a,r[0],r[1],r[2]);const i=s.getInteractorStyle().computeDisplayToWorld(a,e.x,e.y,r[2]);n.setFocalPoint(i[0],i[1],i[2]),n.dolly(t),a.resetCameraClippingRange();const u=n.getPosition();r=n.getFocalPoint();const p=[0,0,0];let c=o[0]*(r[0]-u[0])+o[1]*(r[1]-u[1])+o[2]*(r[2]-u[2]);c/=o[0]**2+o[1]**2+o[2]**2,p[0]=u[0]+o[0]*c,p[1]=u[1]+o[1]*c,p[2]=u[2]+o[2]*c,n.setFocalPoint(p[0],p[1],p[2]),a.resetCameraClippingRange()}}function wa(t,e,a){if(Number.isNaN(a))return;const s=e.getActiveCamera();s.getParallelProjection()?s.setParallelScale(s.getParallelScale()/a):(s.dolly(a),e.resetCameraClippingRange()),t.getLightFollowCamera()&&e.updateLightsGeometryToFollowCamera()}var ya={dollyToPosition:Ta,translateCamera:we,dollyByFactor:wa};function Ca(t,e){e.classHierarchy.push("vtkInteractorStyleManipulator"),e.currentVRManipulators=new Map,e.mouseManipulators=[],e.keyboardManipulators=[],e.vrManipulators=[],e.gestureManipulators=[],e.currentManipulator=null,e.currentWheelManipulator=null,e.centerOfRotation=[0,0,0],e.rotationFactor=1,t.removeAllManipulators=()=>{t.removeAllMouseManipulators(),t.removeAllKeyboardManipulators(),t.removeAllVRManipulators(),t.removeAllGestureManipulators()},t.removeAllMouseManipulators=()=>{e.mouseManipulators=[]},t.removeAllKeyboardManipulators=()=>{e.keyboardManipulators=[]},t.removeAllVRManipulators=()=>{e.vrManipulators=[]},t.removeAllGestureManipulators=()=>{e.gestureManipulators=[]};const a=(n,r)=>{const o=r.indexOf(n);return o===-1?!1:(r.splice(o,1),t.modified(),!0)};t.removeMouseManipulator=n=>a(n,e.mouseManipulators),t.removeKeyboardManipulator=n=>a(n,e.keyboardManipulators),t.removeVRManipulator=n=>a(n,e.vrManipulators),t.removeGestureManipulator=n=>a(n,e.gestureManipulators);const s=(n,r)=>r.indexOf(n)!==-1?!1:(r.push(n),t.modified(),!0);t.addMouseManipulator=n=>s(n,e.mouseManipulators),t.addKeyboardManipulator=n=>s(n,e.keyboardManipulators),t.addVRManipulator=n=>s(n,e.vrManipulators),t.addGestureManipulator=n=>s(n,e.gestureManipulators),t.getNumberOfMouseManipulators=()=>e.mouseManipulators.length,t.getNumberOfKeyboardManipulators=()=>e.keyboardManipulators.length,t.getNumberOfVRManipulators=()=>e.vrManipulators.length,t.getNumberOfGestureManipulators=()=>e.gestureManipulators.length,t.resetCurrentManipulator=()=>{e.currentManipulator=null,e.currentWheelManipulator=null},t.handleLeftButtonPress=n=>{e.previousPosition=n.position,t.onButtonDown(I.LeftButton,n)},t.handleMiddleButtonPress=n=>{e.previousPosition=n.position,t.onButtonDown(I.MiddleButton,n)},t.handleRightButtonPress=n=>{e.previousPosition=n.position,t.onButtonDown(I.RightButton,n)},t.handleButton3D=n=>{if(!n)return;const r=t.findVRManipulator(n.device,n.input,n.pressed);r?(e.currentVRManipulators.set(n.device,r),r.onButton3D(t,e.getRenderer(n),e.state,n),n.pressed?t.startCameraPose():(e.currentVRManipulators.delete(n.device),e.currentVRManipulators.size===0&&t.endCameraPose())):Se("No manipulator found")},t.handleMove3D=n=>{const r=e.currentVRManipulators.get(n.device);r&&e.state===da.IS_CAMERA_POSE&&r.onMove3D(t,e.getRenderer(n),e.state,n)},t.onButtonDown=(n,r)=>{e.currentManipulator||(e.currentManipulator=t.findMouseManipulator(n,r.shiftKey,r.controlKey,r.altKey),e.currentManipulator?(e.currentManipulator.setCenter&&e.currentManipulator.setCenter(e.centerOfRotation),e.currentManipulator.setRotationFactor&&e.currentManipulator.setRotationFactor(e.rotationFactor),e.currentManipulator.startInteraction(),e.currentManipulator.onButtonDown(e._interactor,e.getRenderer(r),r.position),e._interactor.requestAnimation(t.onButtonDown),t.invokeStartInteractionEvent(A)):Se("No manipulator found"))},t.findMouseManipulator=(n,r,o,i)=>{let u=null,p=e.mouseManipulators.length;for(;p--;){const c=e.mouseManipulators[p];c&&c.getButton()===n&&c.getShift()===r&&c.getControl()===o&&c.getAlt()===i&&c.isDragEnabled()&&(u=c)}return u},t.findVRManipulator=(n,r)=>{let o=null,i=e.vrManipulators.length;for(;i--;){const u=e.vrManipulators[i];u&&u.getDevice()===n&&u.getInput()===r&&(o=u)}return o},t.handleLeftButtonRelease=()=>{t.onButtonUp(I.LeftButton)},t.handleMiddleButtonRelease=()=>{t.onButtonUp(I.MiddleButton)},t.handleRightButtonRelease=()=>{t.onButtonUp(I.RightButton)},t.onButtonUp=n=>{e.currentManipulator&&e.currentManipulator.getButton&&e.currentManipulator.getButton()===n&&(e.currentManipulator.onButtonUp(e._interactor),e.currentManipulator.endInteraction(),e._interactor.isPointerLocked()||(e.currentManipulator=null),e._interactor.cancelAnimation(t.onButtonDown),t.invokeEndInteractionEvent(ee))},t.handleEndPointerLock=()=>{e.currentManipulator=null},t.handleStartMouseWheel=n=>{if(e.currentWheelManipulator)return;let r=null,o=e.mouseManipulators.length;for(;o--;){const i=e.mouseManipulators[o];i&&i.isScrollEnabled()&&i.getShift()===n.shiftKey&&i.getControl()===n.controlKey&&i.getAlt()===n.altKey&&(r=i)}r?(e.currentWheelManipulator=r,e.currentWheelManipulator.onStartScroll(e._interactor,e.getRenderer(n),n.spinY),e.currentWheelManipulator.startInteraction(),e._interactor.requestAnimation(t.handleStartMouseWheel),t.invokeStartInteractionEvent(A)):Se("No manipulator found")},t.handleEndMouseWheel=()=>{e.currentWheelManipulator&&e.currentWheelManipulator.onEndScroll&&(e.currentWheelManipulator.onEndScroll(e._interactor),e.currentWheelManipulator.endInteraction(),e.currentWheelManipulator=null,e._interactor.cancelAnimation(t.handleStartMouseWheel),t.invokeEndInteractionEvent(ee))},t.handleMouseWheel=n=>{e.currentWheelManipulator&&e.currentWheelManipulator.onScroll&&(e.currentWheelManipulator.onScroll(e._interactor,e.getRenderer(n),n.spinY,e.cachedMousePosition),t.invokeInteractionEvent($))},t.handleMouseMove=n=>{e.cachedMousePosition=n.position,e.currentManipulator&&e.currentManipulator.onMouseMove&&(e.currentManipulator.onMouseMove(e._interactor,e.getRenderer(n),n.position),t.invokeInteractionEvent($))},t.handleKeyPress=n=>{e.keyboardManipulators.filter(r=>r.onKeyPress).forEach(r=>{r.onKeyPress(e._interactor,e.getRenderer(n),n.key),t.invokeInteractionEvent($)})},t.handleKeyDown=n=>{e.keyboardManipulators.filter(r=>r.onKeyDown).forEach(r=>{r.onKeyDown(e._interactor,e.getRenderer(n),n.key),t.invokeInteractionEvent($)})},t.handleKeyUp=n=>{e.keyboardManipulators.filter(r=>r.onKeyUp).forEach(r=>{r.onKeyUp(e._interactor,e.getRenderer(n),n.key),t.invokeInteractionEvent($)})},t.handleStartPinch=n=>{t.startDolly();let r=e.gestureManipulators.length;for(;r--;){const o=e.gestureManipulators[r];o&&o.isPinchEnabled()&&(o.onStartPinch(e._interactor,n.scale),o.startInteraction())}e._interactor.requestAnimation(t.handleStartPinch),t.invokeStartInteractionEvent(A)},t.handleEndPinch=()=>{t.endDolly();let n=e.gestureManipulators.length;for(;n--;){const r=e.gestureManipulators[n];r&&r.isPinchEnabled()&&(r.onEndPinch(e._interactor),r.endInteraction())}e._interactor.cancelAnimation(t.handleStartPinch),t.invokeEndInteractionEvent(ee)},t.handleStartRotate=n=>{t.startRotate();let r=e.gestureManipulators.length;for(;r--;){const o=e.gestureManipulators[r];o&&o.isRotateEnabled()&&(o.onStartRotate(e._interactor,n.rotation),o.startInteraction())}e._interactor.requestAnimation(t.handleStartRotate),t.invokeStartInteractionEvent(A)},t.handleEndRotate=()=>{t.endRotate();let n=e.gestureManipulators.length;for(;n--;){const r=e.gestureManipulators[n];r&&r.isRotateEnabled()&&(r.onEndRotate(e._interactor),r.endInteraction())}e._interactor.cancelAnimation(t.handleStartRotate),t.invokeEndInteractionEvent(ee)},t.handleStartPan=n=>{t.startPan();let r=e.gestureManipulators.length;for(;r--;){const o=e.gestureManipulators[r];o&&o.isPanEnabled()&&(o.onStartPan(e._interactor,n.translation),o.startInteraction())}e._interactor.requestAnimation(t.handleStartPan),t.invokeStartInteractionEvent(A)},t.handleEndPan=()=>{t.endPan();let n=e.gestureManipulators.length;for(;n--;){const r=e.gestureManipulators[n];r&&r.isPanEnabled()&&(r.onEndPan(e._interactor),r.endInteraction())}e._interactor.cancelAnimation(t.handleStartPan),t.invokeEndInteractionEvent(ee)},t.handlePinch=n=>{let r=e.gestureManipulators.length,o=0;for(;r--;){const i=e.gestureManipulators[r];i&&i.isPinchEnabled()&&(i.onPinch(e._interactor,e.getRenderer(n),n.scale),o++)}o&&t.invokeInteractionEvent($)},t.handlePan=n=>{const r=e.getRenderer(n);let o=e.gestureManipulators.length,i=0;for(;o--;){const u=e.gestureManipulators[o];u&&u.isPanEnabled()&&(u.onPan(e._interactor,r,n.translation),i++)}i&&t.invokeInteractionEvent($)},t.handleRotate=n=>{let r=e.gestureManipulators.length,o=0;for(;r--;){const i=e.gestureManipulators[r];i&&i.isRotateEnabled()&&(i.onRotate(e._interactor,e.getRenderer(n),n.rotation),o++)}o&&t.invokeInteractionEvent($)}}var xa=t=>({cachedMousePosition:null,currentManipulator:null,currentWheelManipulator:null,centerOfRotation:[0,0,0],rotationFactor:1,...t});function it(t,e,a={}){Object.assign(e,xa(a)),xe.extend(t,e,a),v.setGet(t,e,["rotationFactor"]),v.get(t,e,["mouseManipulators","keyboardManipulators","vrManipulators","gestureManipulators"]),v.setGetArray(t,e,["centerOfRotation"],3),Ca(t,e)}var Ea=v.newInstance(it,"vtkInteractorStyleManipulator"),Ra={newInstance:Ea,extend:it,...ya};function _a(t,e){e.classHierarchy.push("vtkCompositeCameraManipulator"),t.computeDisplayCenter=(a,s)=>{const n=a.computeWorldToDisplay(s,e.center[0],e.center[1],e.center[2]);e.displayCenter[0]=n[0],e.displayCenter[1]=n[1]}}var Ma={center:[0,0,0],rotationFactor:1,displayCenter:[0,0]};function Va(t,e,a={}){Object.assign(e,Ma,a),v.setGet(t,e,["rotationFactor"]),v.setGetArray(t,e,["displayCenter"],2),v.setGetArray(t,e,["center"],3),_a(t,e)}var Ee={extend:Va};function Da(t,e){e.classHierarchy.push("vtkCompositeMouseManipulator"),t.startInteraction=()=>{},t.endInteraction=()=>{},t.onButtonDown=(a,s,n)=>{},t.onButtonUp=a=>{},t.onMouseMove=(a,s,n)=>{},t.onStartScroll=(a,s,n)=>{},t.onScroll=(a,s,n)=>{},t.onEndScroll=a=>{},t.isDragEnabled=()=>e.dragEnabled,t.isScrollEnabled=()=>e.scrollEnabled}var Ba={button:1,shift:!1,control:!1,alt:!1,dragEnabled:!0,scrollEnabled:!1};function ma(t,e,a={}){Object.assign(e,Ba,a),v.setGet(t,e,["button","shift","control","alt"]),v.set(t,e,["dragEnabled","scrollEnabled"]),Da(t,e)}var Re={extend:ma};function Oa(t,e){e.classHierarchy.push("vtkMouseCameraTrackballRotateManipulator");const a=new Float64Array(3),s=new Float64Array(3),n=new Float64Array(3),r=new Float64Array(16),o=new Float64Array(3),i=new Float64Array(3),u=new Float64Array(3);t.onButtonDown=(p,c,l)=>{e.previousPosition=l},t.onMouseMove=(p,c,l)=>{if(!l)return;const g=c.getActiveCamera(),f=g.getPosition(),h=g.getFocalPoint();de(r);const{center:S,rotationFactor:y}=e;e.useFocalPointAsCenterOfRotation&&(S[0]=h[0],S[1]=h[1],S[2]=h[2]);const w=e.previousPosition.x-l.x,R=e.previousPosition.y-l.y,E=p.getView().getViewportSize(c),_=g.getViewUp();if(e.useWorldUpVec){const T=new Float64Array(3);wt(T,e.worldUpVec),yt(T,Ve(f,e.worldUpVec)/Ve(e.worldUpVec,e.worldUpVec)),Ct(S,T,T),j(r,r,T),ue(r,r,le(360*w/E[0]*y),e.worldUpVec),T[0]=-T[0],T[1]=-T[1],T[2]=-T[2],j(r,r,T),j(r,r,S)}else j(r,r,S),ue(r,r,le(360*w/E[0]*y),_);We(g.getDirectionOfProjection(),_,o),ue(r,r,le(-360*R/E[1]*y),o),i[0]=-S[0],i[1]=-S[1],i[2]=-S[2],j(r,r,i),pe(a,f,r),pe(s,h,r),u[0]=_[0]+f[0],u[1]=_[1]+f[1],u[2]=_[2]+f[2],pe(n,u,r),g.setPosition(a[0],a[1],a[2]),g.setFocalPoint(s[0],s[1],s[2]),g.setViewUp(n[0]-a[0],n[1]-a[1],n[2]-a[2]),g.orthogonalizeViewUp(),c.resetCameraClippingRange(),p.getLightFollowCamera()&&c.updateLightsGeometryToFollowCamera(),e.previousPosition=l}}var Ua={useWorldUpVec:!1,worldUpVec:[0,1,0],useFocalPointAsCenterOfRotation:!1};function ct(t,e,a={}){Object.assign(e,Ua,a),v.obj(t,e),Re.extend(t,e,a),Ee.extend(t,e,a),v.setGet(t,e,["useWorldUpVec"]),v.setGetArray(t,e,["worldUpVec"],3),v.setGet(t,e,["useFocalPointAsCenterOfRotation"]),Oa(t,e)}var Fa=v.newInstance(ct,"vtkMouseCameraTrackballRotateManipulator"),Pa={newInstance:Fa,extend:ct};function Ga(t,e){e.classHierarchy.push("vtkMouseCameraTrackballZoomManipulator"),t.onButtonDown=(a,s,n)=>{e.previousPosition=n;const r=a.getView().getViewportSize(s),o=s.getActiveCamera(),i=e.flipDirection?-1:1;o.getParallelProjection()?e.zoomScale=1.5/r[1]*i:e.zoomScale=1.5*(o.getClippingRange()[1]/r[1])*i},t.onMouseMove=(a,s,n)=>{if(!n)return;const r=e.previousPosition.y-n.y,o=s.getActiveCamera();if(o.getParallelProjection()){const i=r*e.zoomScale;o.setParallelScale((1-i)*o.getParallelScale())}else{const i=o.getPosition(),u=o.getFocalPoint(),p=o.getDirectionOfProjection(),c=r*e.zoomScale;let l=c*p[0];i[0]+=l,u[0]+=l,l=c*p[1],i[1]+=l,u[1]+=l,l=c*p[2],i[2]+=l,u[2]+=l,o.getFreezeFocalPoint()||o.setFocalPoint(u[0],u[1],u[2]),o.setPosition(i[0],i[1],i[2]),s.resetCameraClippingRange()}a.getLightFollowCamera()&&s.updateLightsGeometryToFollowCamera(),e.previousPosition=n},t.onScroll=(a,s,n)=>{if(!n)return;const r=s.getActiveCamera(),o=1-n/10;r.getParallelProjection()?r.setParallelScale(r.getParallelScale()/o):(r.dolly(o),s.resetCameraClippingRange()),a.getLightFollowCamera()&&s.updateLightsGeometryToFollowCamera()}}var ka={zoomScale:0,flipDirection:!1};function ut(t,e,a={}){Object.assign(e,ka,a),v.obj(t,e),Re.extend(t,e,a),Ee.extend(t,e,a),v.setGet(t,e,["flipDirection"]),Ga(t,e)}var La=v.newInstance(ut,"vtkMouseCameraTrackballZoomManipulator"),Wa={newInstance:La,extend:ut};function za(t,e){e.classHierarchy.push("vtkMouseCameraTrackballPanManipulator"),t.onButtonDown=(a,s,n)=>{e.previousPosition=n},t.onMouseMove=(a,s,n)=>{if(!n)return;const r=n,o=e.previousPosition;e.previousPosition=n;const i=s.getActiveCamera(),u=i.getPosition(),p=i.getFocalPoint();if(i.getParallelProjection()){i.orthogonalizeViewUp();const c=i.getViewUp(),l=i.getViewPlaneNormal(),g=[0,0,0];We(l,c,g);const f=a.getView().getViewportSize(s)[1];let h=(r.x-o.x)/f,S=(o.y-r.y)/f;const y=i.getParallelScale();h*=y*2,S*=y*2;let w=g[0]*h+c[0]*S;u[0]+=w,p[0]+=w,w=g[1]*h+c[1]*S,u[1]+=w,p[1]+=w,w=g[2]*h+c[2]*S,u[2]+=w,p[2]+=w,i.setPosition(u[0],u[1],u[2]),i.setFocalPoint(p[0],p[1],p[2])}else{const{center:c}=e,l=a.getInteractorStyle(),g=l.computeWorldToDisplay(s,c[0],c[1],c[2])[2],f=l.computeDisplayToWorld(s,r.x,r.y,g),h=l.computeDisplayToWorld(s,o.x,o.y,g),S=[u[0]+(h[0]-f[0]),u[1]+(h[1]-f[1]),u[2]+(h[2]-f[2])],y=[p[0]+(h[0]-f[0]),p[1]+(h[1]-f[1]),p[2]+(h[2]-f[2])];i.setPosition(S[0],S[1],S[2]),i.setFocalPoint(y[0],y[1],y[2])}s.resetCameraClippingRange(),a.getLightFollowCamera()&&s.updateLightsGeometryToFollowCamera()}}var Na={};function lt(t,e,a={}){Object.assign(e,Na,a),v.obj(t,e),Ee.extend(t,e,a),Re.extend(t,e,a),za(t,e)}var $a=v.newInstance(lt,"vtkMouseCameraTrackballPanManipulator"),Ka={newInstance:$a,extend:lt};function Qa(t,e){const a=Sa.newInstance({background:[0,0,0]});a.setContainer(t),a.resize();const s=a.getRenderer(),n=a.getRenderWindow();let r=e.ghost,o=Math.max(0,Math.min(e.startK,e.slices-1));const[i,u]=e.range,p=kt.newInstance();p.setInputData(e.imageData),p.setSampleDistance?.(1.2);const c=Lt.newInstance();c.setMapper(p);const l=Wt.newInstance();l.addRGBPoint(i,.6,.6,.6),l.addRGBPoint(u,1,1,1);const g=zt.newInstance(),f=c.getProperty();f.setRGBTransferFunction(0,l),f.setScalarOpacity(0,g),f.setScalarOpacityUnitDistance(0,3),f.setInterpolationTypeToLinear();const h=()=>{g.removeAllPoints(),r===null||r<=0?(g.addPoint(i,0),g.addPoint(u,0)):(g.addPoint(i,0),g.addPoint(i+(u-i)*.4,r*.25),g.addPoint(u,r))};h(),s.addVolume(c);const S=Nt.newInstance();S.setInputData(e.imageData),S.setKSlice(o);const y=$t.newInstance();y.setMapper(S);const w=y.getProperty(),R=e.voi?e.voi.upper-e.voi.lower:u-i,E=e.voi?(e.voi.upper+e.voi.lower)/2:(u+i)/2;w.setColorWindow(R),w.setColorLevel(E),s.addActor(y),(()=>{s.resetCamera();const M=s.getActiveCamera();M.getFocalPoint();const F=M.getDistance();M.azimuth(30),M.elevation(12),M.setDistance(F*1.05),M.zoom(1.4),s.resetCameraClippingRange()})();const T=Ra.newInstance(),m=Pa.newInstance({button:1}),V=Wa.newInstance({button:3}),d=Ka.newInstance({button:2});T.addMouseManipulator(m),T.addMouseManipulator(V),T.addMouseManipulator(d),a.getInteractor().setInteractorStyle(T),n.render();const O=M=>{const F=Math.max(0,Math.min(M,e.slices-1));F!==o&&(o=F,S.setKSlice(F),n.render())},B=M=>{M.preventDefault();const F=o+(M.deltaY>0?1:-1);O(F),e.onSweep(o)};return t.addEventListener("wheel",B,{passive:!1}),{sweep:O,ghost_set:M=>{r=M===null?null:Math.max(0,Math.min(1,M)),h(),n.render()},wl_set:(M,F)=>{w.setColorWindow(F-M),w.setColorLevel((F+M)/2),n.render()},resize:()=>{a.resize(),n.render()},slice_get:()=>o,dispose:()=>{t.removeEventListener("wheel",B);try{s.removeVolume(c),s.removeActor(y)}catch{}try{a.delete()}catch{}}}}export{Qa as slabScene_open};
|