You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
51 lines
24 KiB
51 lines
24 KiB
// All material copyright Esri, All Rights Reserved, unless otherwise specified. |
|
// See https://js.arcgis.com/4.30/esri/copyright.txt for details. |
|
//>>built |
|
define("../chunks/tslib.es6 ../Graphic ../request ../core/has ../core/Logger ../core/promiseUtils ../core/reactiveUtils ../core/timeUtils ../core/accessorSupport/decorators/property ../core/RandomLCG ../core/accessorSupport/decorators/subclass ../chunks/vec32 ../core/libs/gl-matrix-2/factories/vec3f64 ../geometry/support/coordinateSystem ../geometry/support/frustum ../libs/vxl/enums ../libs/vxl/VxlModule ../views/ViewingMode ../views/3d/layers/i3s/Intersector ../views/3d/state/Frustum ../views/3d/support/RenderCoordsHelper ../views/3d/webgl-engine/effects/RenderPlugin ../views/3d/webgl-engine/lib/Intersector ../views/3d/webgl-engine/lib/IntersectorInterfaces ../views/3d/webgl-engine/lib/RenderFeature ../views/3d/webgl-engine/lib/RenderSlot ../views/webgl/enums".split(" "), |
|
function(B,E,F,A,w,G,x,C,H,z,I,J,K,L,t,r,M,N,O,P,Q,R,S,D,T,U,v){var f;(function(a){a[a.Lifetime=1]="Lifetime";a[a.RequestResponse=2]="RequestResponse";a[a.Rendering=3]="Rendering";a[a.Error=4]="Error"})(f||={});z=class extends R.SyncRenderPlugin{constructor(a){super(a);this._havePreparedWithAllLayers=this._textureFloatLinearAvailable=this._halfIntTexturesAvailable=!1;this._vxl=this._vxlPromise=this._renderPluginContext=null;this._moreToLoad=this._pluginIsActive=!1;this._viewportHeight=this._viewportWidth= |
|
-1;this._newLayers=[];this._layers=new Map;this._renderTargetToRestore=this._rctx=null;this._lastFrameWasStationary=!1;this._wasmMemBlockSizes=[512,1024,2048,4096,8192,16384,32768,65536];this._wasmMemBlocks=new Map;this._dbgFlags=new Set;this._captureFrustum=!1;this._frustum=null;this._frustumRenderableId=-1;this._renderCoordsHelper=null;this.produces=new Map([[U.RenderSlot.VOXEL,()=>!!this._vxl&&"local"===this.view.viewingMode]]);this.type=D.IntersectorType.VOXEL;this.slicePlaneEnabled=!0;this.isGround= |
|
!1;this.layerUid=[]}_dbg(a,b){this._dbgFlags.has(a)&&(a===f.Error?w.getLogger(this).error(b):w.getLogger(this).warn(b))}_removeRenderPlugin(){this._pluginIsActive&&this.view._stage&&(this._dbg(f.Lifetime,"--removeRenderPlugin--"),this.view._stage.removeRenderPlugin(this));this._pluginIsActive=!1}initialize(){this._dbg(f.Lifetime,"--initialize--");for(const a of this._wasmMemBlockSizes)this._wasmMemBlocks.set(a,0);this.addHandles([x.watch(()=>this.view.ready,a=>{a&&"local"===this.view.viewingMode? |
|
(this._dbg(f.Lifetime,"view ready status changed to ready on a local view, calling addRenderPlugin"),this.view._stage.addRenderPlugin(this),this._pluginIsActive=!0):(this._dbg(f.Lifetime,"view ready status changed, not ready or not a local view!"),this._removeRenderPlugin())},x.initial),x.watch(()=>this.view?.qualityProfile,a=>{this._dbg(f.Rendering,"qualityProfile changed to "+a);this._vxl&&this._vxl.set_quality(this._toWasmQuality(a))},x.initial),x.watch(()=>this.view?.timeExtent,()=>{if(this._vxl){const a= |
|
this._getTimeArgs(this.view?.timeExtent);this._dbg(f.Rendering,"sceneView timeExtent changed to useTime\x3d"+a.hasTime+" st\x3d"+a.startTime+" et\x3d"+a.endTime);this._vxl.set_scene_time_extent(a.startTime,a.endTime,a.hasTime);this._renderPluginContext.requestRender()}},x.initial),x.watch(()=>this.view?.stationary,a=>{this._vxl&&a&&!this._lastFrameWasStationary&&this._renderPluginContext.requestRender()})])}initializeRenderContext(a){this._dbg(f.Lifetime,"--initializeRenderContext--");const b=a.renderContext.rctx; |
|
this._renderPluginContext=a;this._rctx=a.renderContext.rctx;this._halfIntTexturesAvailable=!!this._rctx.capabilities.textureNorm16;this._textureFloatLinearAvailable=this._rctx.capabilities.textureFloatLinear;this._initializeWasm(b.gl)}uninitializeRenderContext(){this._rctx=this._renderPluginContext=null;this._dbg(f.Lifetime,"--uninitializeRenderContext--")}_restoreFramebuffer(){if(this._renderTargetToRestore){var a=this._renderTargetToRestore.fbo;this._rctx?(this._rctx.bindFramebuffer(a,!0),a=this._renderTargetToRestore.viewport, |
|
this._rctx.setViewport(a.x,a.y,a.width,a.height)):this._dbg(f.Error,"no context in restoreFramebuffer!")}}_bindPreviousDepthToSlot(a,b){var c=!!this._renderTargetToRestore;if(!this._rctx||!c)return 0;c=this._renderTargetToRestore.fbo.depthStencilTexture;if(!c)return this._dbg(f.Error,"no depth/stencil texture exists!"),0;0===b?this._rctx.bindTexture(null,a,!0):this._rctx.bindTexture(c,a,!0);return 1}_modifyResourceCount(a,b,c){this._rctx?1===c?this._rctx.instanceCounter.increment(a,b):this._rctx.instanceCounter.decrement(a, |
|
b):this._dbg(f.Error,"modifyAllocation callback has no rendering context!")}_setBlendState(a,b,c,d){this._rctx?(this._rctx.setBlendingEnabled(1===a),this._rctx.setBlendFunction(b,c),this._rctx.setBlendEquation(d)):this._dbg(f.Error,"setBlendState callback has no rendering context!")}_setFrontFace(a){this._rctx?this._rctx.setFrontFace(a):this._dbg(f.Error,"setFrontFace callback has no rendering context!")}_setDepthStencilStateFunction(a,b,c){this._rctx?(this._rctx.setDepthFunction(c),this._rctx.setDepthTestEnabled(1=== |
|
a),this._rctx.setDepthWriteEnabled(1===b),this._rctx.setStencilTestEnabled(!1),this._rctx.setStencilFunction(v.CompareFunction.ALWAYS,0,255),this._rctx.setStencilOpSeparate(v.Face.FRONT,v.StencilOperation.KEEP,v.StencilOperation.INCR,v.StencilOperation.KEEP),this._rctx.setStencilOpSeparate(v.Face.BACK,v.StencilOperation.KEEP,v.StencilOperation.DECR,v.StencilOperation.KEEP)):this._dbg(f.Error,"setDepthStencilStateFunction callback has no rendering context!")}_setRasterizerState(a){if(this._rctx)switch(a){case r.WasmCullMode.None:this._rctx.setFaceCullingEnabled(!1); |
|
break;case r.WasmCullMode.Back:this._rctx.setCullFace(v.Face.BACK);this._rctx.setFaceCullingEnabled(!0);break;case r.WasmCullMode.Front:this._rctx.setCullFace(v.Face.FRONT),this._rctx.setFaceCullingEnabled(!0)}else this._dbg(f.Error,"setRasterizerState callback has no rendering context!")}_setViewport(a,b,c,d){this._rctx?this._rctx.setViewport(a,b,c,d):this._dbg(f.Error,"setViewport callback has no rendering context!")}_updateMemoryUsage(){this._layers.forEach((a,b)=>{a.needMemoryUsageUpdate&&(b= |
|
this._vxl.estimate_memory_usage(b),0<=b&&(a.needMemoryUsageUpdate=!1,a.layerView.setUsedMemory(b)))})}_syncRequestsResponses(){this._layers.forEach((a,b)=>{const c=[];a.responses.forEach((g,h)=>{c.push(h);this._dbg(f.RequestResponse,"responding for requestID:"+h+" size:"+g.size);this._vxl.respond(b,h,g);if(g.requestType===r.VoxelRequestType.TreeIndex||g.requestType===r.VoxelRequestType.Section)a.needMemoryUsageUpdate=!0});const d=a.responses;for(var e of c)d.delete(e);e=this._vxl.get_new_requests(b); |
|
const q=a.abortController.signal;for(const g in e){a.outstandingRequestCount+=1;1===a.outstandingRequestCount&&a.layerView.updatingFlagChanged();const h=e[g],u={responseType:"array-buffer",signal:q,query:{...a.layerView.layer.customParameters,token:a.layerView.layer.apiKey}};this._dbg(f.RequestResponse,"making requestID:"+g+" url:"+h.url);F(h.url,u).then(l=>{--a.outstandingRequestCount;0===a.outstandingRequestCount&&a.layerView.updatingFlagChanged();this._dbg(f.RequestResponse,"have response for requestID:"+ |
|
g);let m=0;if(0<l.data.byteLength){m=this._vxl._malloc(l.data.byteLength);const y=new Uint8Array(this._vxl.HEAPU8.buffer,m,l.data.byteLength),k=new Uint8Array(l.data);for(let p=0;p<l.data.byteLength;++p)y[p]=k[p]}d.set(+g,{responseType:h.responseType,ptr:m,size:l.data.byteLength,success:!0,requestType:h.requestType})}).catch(l=>{--a.outstandingRequestCount;0===a.outstandingRequestCount&&a.layerView.updatingFlagChanged();G.isAbortError(l)||(this._dbg(f.Error,`requestID:${g} failed, error=${l.toString()}`), |
|
d.set(+g,{responseType:h.responseType,ptr:0,size:0,success:!1,requestType:h.requestType}))})}})}updateWasmCamera(a){this._vxl.set_projection_matrix.apply(this._vxl,a.projectionMatrix);this._vxl.set_view_matrix.apply(this._vxl,a.viewMatrix);this._vxl.set_near_far(a.near,a.far)}isUpdating(a){return!this._vxl&&this._vxlPromise?!0:(a=this._layers.get(a))?0<a.outstandingRequestCount:!1}getLayerTimes(a){const b=[];this._layers.forEach((c,d)=>{if(c.layerView.wasmLayerId===a.wasmLayerId)for(c=this._vxl.get_layer_epoch_times(d, |
|
a.layer.currentVariableId),d=0;d<c.length;++d)b.push(c[d])});return b}getCurrentLayerTimeIndex(a){let b=0;this._layers.forEach((c,d)=>{c.layerView.wasmLayerId===a.wasmLayerId&&(b=this._vxl.get_layer_current_time_id(d))});return b}setEnabled(a,b){this._layers.forEach((c,d)=>{c.layerView.wasmLayerId===a.wasmLayerId&&(this._vxl.set_enabled(d,b),c.needMemoryUsageUpdate=!0,this._renderPluginContext.requestRender())})}setIsInScaleRange(a,b){const c=this._layers.get(a.wasmLayerId);c&&b!==c.isInScaleRange&& |
|
(c.isInScaleRange=b,this._vxl.set_is_in_scale_range(a.wasmLayerId,b),c.needMemoryUsageUpdate=!b,this._renderPluginContext.requestRender())}setStaticSections(a,b){return this._doMaskedUIUpdate(a,{mask:r.UpdateFlags.StaticSections,staticSections:b},!0)}setCurrentVariable(a,b){return this._doMaskedUIUpdate(a,{mask:r.UpdateFlags.CurrentVariable,currentVariable:b},!0)}setRenderMode(a,b){return this._doMaskedUIUpdate(a,{mask:r.UpdateFlags.RenderMode,renderMode:b},!0)}setVerticalExaggerationAndOffset(a, |
|
b,c,d){return this._doMaskedUIUpdate(a,{mask:r.UpdateFlags.ExaggerationAndOffset,volStyleDesc:{volumeId:b,verticalExaggeration:c,verticalOffset:d}},!0)}setVariableStyles(a,b){return this._doMaskedUIUpdate(a,{mask:r.UpdateFlags.VariableStyles,variableStyles:b},!0)}setVolumeStyles(a,b){return this._doMaskedUIUpdate(a,{mask:r.UpdateFlags.VolumeStyles,volumeStyles:b},!0)}setEnableDynamicSections(a,b){return this._doMaskedUIUpdate(a,{mask:r.UpdateFlags.ContainerVisibility,containerIsVisible:b,container:r.ContainerType.DynamicSections}, |
|
!0)}setEnableIsosurfaces(a,b){return this._doMaskedUIUpdate(a,{mask:r.UpdateFlags.ContainerVisibility,containerIsVisible:b,container:r.ContainerType.Isosurfaces},!0)}setEnableSections(a,b){return this._doMaskedUIUpdate(a,{mask:r.UpdateFlags.ContainerVisibility,containerIsVisible:b,container:r.ContainerType.StaticSections},!0)}setAnalysisSlice(a,b,c,d){return this._doMaskedUIUpdate(a,{mask:r.UpdateFlags.AnalysisSlice,analysisSlice:{point:c,normal:d,enabled:b}},!0)}updateLayerTimeProperties(a){if(this._vxl){var b= |
|
this._layers.get(a.wasmLayerId);if(b){b=b.layerView.layer;let c=0;b.timeOffset&&(c=C.convertTime(b.timeOffset.value,b.timeOffset.unit,"seconds"));const d=this._getTimeArgs(b.timeExtent);this._vxl.set_layer_time_properties(a.wasmLayerId,d.startTime,d.endTime,d.hasTime,b.useViewTime,c);this._renderPluginContext.requestRender()}}}_doMaskedUIUpdate(a,b,c){if(!this._vxl)return!1;let d=!1;this._layers.forEach((e,q)=>{e.layerView.wasmLayerId===a.wasmLayerId&&(e={str:JSON.stringify(b),byteCount:0,ptr:0,isReusable:!1}, |
|
this._allocateBlock(e)&&(d=1===this._vxl.handle_masked_ui_update(q,e.ptr,e.byteCount),e.isReusable||this._vxl._free(e.ptr)))});d&&c&&this._renderPluginContext.requestRender();return d}_addTriangleToWasmBuffer(a,b,c,d,e){a[3*b]=c[0];a[3*b+1]=c[1];a[3*b+2]=c[2];b+=1;a[3*b]=d[0];a[3*b+1]=d[1];a[3*b+2]=d[2];b+=1;a[3*b]=e[0];a[3*b+1]=e[1];a[3*b+2]=e[2];return b+1}_addNormalToWasmBuffer(a,b,c){a[3*b]=c[0];a[3*b+1]=c[1];a[3*b+2]=c[2];return b+1}_doCaptureFrustum(){if(this._vxl){var a=this._vxl._malloc(108* |
|
Float32Array.BYTES_PER_ELEMENT),b=new Float32Array(this._vxl.HEAPF32.buffer,a,108),c=this._vxl._malloc(36*Float32Array.BYTES_PER_ELEMENT),d=new Float32Array(this._vxl.HEAPF32.buffer,c,36),e=this._frustum.points[t.PointIndex.NEAR_BOTTOM_LEFT],q=this._frustum.points[t.PointIndex.NEAR_BOTTOM_RIGHT],g=this._frustum.points[t.PointIndex.NEAR_TOP_RIGHT],h=this._frustum.points[t.PointIndex.NEAR_TOP_LEFT],u=this._frustum.points[t.PointIndex.FAR_BOTTOM_LEFT],l=this._frustum.points[t.PointIndex.FAR_BOTTOM_RIGHT], |
|
m=this._frustum.points[t.PointIndex.FAR_TOP_RIGHT],y=this._frustum.points[t.PointIndex.FAR_TOP_LEFT],k=0,p=this._frustum.planes[t.PlaneIndex.NEAR];var n=this._addTriangleToWasmBuffer(b,0,g,q,e);k=this._addNormalToWasmBuffer(d,k,p);n=this._addTriangleToWasmBuffer(b,n,e,h,g);k=this._addNormalToWasmBuffer(d,k,p);p=this._frustum.planes[t.PlaneIndex.FAR];n=this._addTriangleToWasmBuffer(b,n,u,l,m);k=this._addNormalToWasmBuffer(d,k,p);n=this._addTriangleToWasmBuffer(b,n,m,y,u);k=this._addNormalToWasmBuffer(d, |
|
k,p);p=this._frustum.planes[t.PlaneIndex.TOP];n=this._addTriangleToWasmBuffer(b,n,m,g,h);k=this._addNormalToWasmBuffer(d,k,p);n=this._addTriangleToWasmBuffer(b,n,h,y,m);k=this._addNormalToWasmBuffer(d,k,p);p=this._frustum.planes[t.PlaneIndex.BOTTOM];n=this._addTriangleToWasmBuffer(b,n,e,q,l);k=this._addNormalToWasmBuffer(d,k,p);n=this._addTriangleToWasmBuffer(b,n,l,u,e);k=this._addNormalToWasmBuffer(d,k,p);p=this._frustum.planes[t.PlaneIndex.LEFT];n=this._addTriangleToWasmBuffer(b,n,h,e,u);k=this._addNormalToWasmBuffer(d, |
|
k,p);n=this._addTriangleToWasmBuffer(b,n,u,y,h);k=this._addNormalToWasmBuffer(d,k,p);e=this._frustum.planes[t.PlaneIndex.RIGHT];n=this._addTriangleToWasmBuffer(b,n,g,m,l);k=this._addNormalToWasmBuffer(d,k,e);n=this._addTriangleToWasmBuffer(b,n,l,q,g);k=this._addNormalToWasmBuffer(d,k,e);-1!==this._frustumRenderableId&&this._vxl.remove_generic_mesh(this._frustumRenderableId);this._frustumRenderableId=this._vxl.add_generic_mesh(a,108,c,36,255,0,0,64);this._vxl._free(a);this._vxl._free(c);this._captureFrustum= |
|
!1;this._renderPluginContext.requestRender()}}captureFrustum(){null===this._renderCoordsHelper&&(this._renderCoordsHelper=Q.RenderCoordsHelper.create(N.ViewingMode.Local,L.renderSRFromViewSR(!1,this.view.spatialReference)));null===this._frustum&&(this._frustum=new P.Frustum(this._renderCoordsHelper));this._captureFrustum=!0;null!==this._renderPluginContext&&this._renderPluginContext.requestRender()}toggleFullVolumeExtentDraw(a){this._vxl&&this._layers.forEach((b,c)=>{b.layerView.wasmLayerId===a.wasmLayerId&& |
|
(this._vxl.toggle_full_volume_extent_draw(c),this._renderPluginContext.requestRender())})}addVoxelLayer(a){if(!this._vxl){const b={layerView:a,resolveCallback:null,rejectCallback:null};a=new Promise((c,d)=>{b.resolveCallback=c;b.rejectCallback=d});this._newLayers.push(b);return a}a=this._addVoxelLayer(a);return 0>a?Promise.reject(-1):Promise.resolve(a)}removeVoxelLayer(a){if(!this._vxl){var b=this._newLayers.findIndex(d=>a.uid===d.layerView.uid);0<=b&&(this._newLayers[b].resolveCallback(-1),this._newLayers.splice(b, |
|
1));b=this._newLayers.length;0===b&&(this._dbg(f.Lifetime," no voxel layers left after removing a layer, removing RenderPlugin and destroying"),this.destroy());return b}let c=-1;this._layers.forEach((d,e)=>{d.layerView.wasmLayerId===a.wasmLayerId&&(c=e,d.abortController.abort(),this._vxl.remove_layer(c),d=this.layerUid.indexOf(a.layer.uid),-1!==d&&this.layerUid.splice(d,1))});0<=c&&this._layers.delete(c);b=this._layers.size;0===b&&(this._dbg(f.Lifetime," no voxel layers left after removing a layer, removing RenderPlugin and destroying"), |
|
this.destroy());return b}_getBlockSize(a){for(const b of this._wasmMemBlockSizes)if(a<b)return b;return-1}_allocateBlock(a){a.byteCount=this._vxl.lengthBytesUTF8(a.str)+1;const b=this._getBlockSize(a.byteCount);0>b?(a.isReusable=!1,a.ptr=this._vxl._malloc(a.byteCount)):(a.isReusable=!0,a.ptr=this._wasmMemBlocks.get(b),0===a.ptr&&(a.ptr=this._vxl._malloc(b),this._wasmMemBlocks.set(b,a.ptr)));return 0!==a.ptr?(this._vxl.stringToUTF8(a.str,a.ptr,a.byteCount),!0):!1}_getTimeArgs(a){let b=-Number.MAX_VALUE, |
|
c=Number.MAX_VALUE,d=!1;null!=a&&(a.isAllTime?d=!0:(null!=a.start&&(d=!0,b=a.start.getTime()/1E3),null!=a.end&&(d=!0,c=a.end.getTime()/1E3)));return{startTime:b,endTime:c,hasTime:d}}_addVoxelLayer(a){var b=a.layer,c=-1;c=b.getConfiguration();if(1>c.length)return-1;var d={str:c,byteCount:0,ptr:0,isReusable:!1};if(!this._allocateBlock(d))return-1;c=this._getTimeArgs(b.timeExtent);const e=this.view.spatialReference.isWGS84&&b.spatialReference.isWGS84?111319.49079327357:1;let q=0;b.timeOffset&&(q=C.convertTime(b.timeOffset.value, |
|
b.timeOffset.unit,"seconds"));c=this._vxl.add_layer(b.serviceRoot,d.ptr,d.byteCount,e,e,c.startTime,c.endTime,c.hasTime,b.useViewTime,q,this._toWasmQuality(this.view.qualityProfile));d.isReusable||this._vxl._free(d.ptr);if(0<=c){b.test?.constantUpscaling&&(this._setUpscalingLimits(0,.25,.25),this._setUpscalingLimits(1,.5,.5),this._setUpscalingLimits(2,.75,.75));b=new AbortController;this._layers.set(c,{layerView:a,responses:new Map,outstandingRequestCount:0,abortController:b,needMemoryUsageUpdate:!1, |
|
isInScaleRange:!0});this.layerUid.push(a.layer.uid);if(!this._halfIntTexturesAvailable||A("mac")){b=[];d="";for(var g of a.layer.variables)if("Int16"===g.renderingFormat.type||"UInt16"===g.renderingFormat.type)b.push(g.name),g.id===a.layer.currentVariableId&&(d=g.name);""!==d&&w.getLogger(this).error("#addVoxelLayer_error()",a.layer,`The voxel layer '${a.layer.title}' cannot render the current variable '${d}' in this browser`);0<b.length&&w.getLogger(this).warn("#addVoxelLayer_warning()",a.layer, |
|
`The voxel layer '${a.layer.title}' cannot render the variables '${b.toString()}' in this browser`)}if(!this._textureFloatLinearAvailable){g=[];b="";for(const h of a.layer.variables)"Float32"===h.renderingFormat.type&&(g.push(h.name),h.id===a.layer.currentVariableId&&(b=h.name));""!==b&&w.getLogger(this).error("#addVoxelLayer_error()",a.layer,`The voxel layer '${a.layer.title}' cannot render the current variable '${b}' in this browser`);0<g.length&&w.getLogger(this).warn("#addVoxelLayer_warning()", |
|
a.layer,`The voxel layer '${a.layer.title}' cannot render the variables '${g.toString()}' in this browser`)}A("esri-mobile")&&w.getLogger(this).warnOnce("Mobile support differs across devices. Voxel layer might not display as expected.");return c}return-1}prepareRender(a){if(this._vxl){var b=a.bindParameters.camera.viewForward;a=a.bindParameters.camera.eye;this._vxl.update_camera_pos_and_direction(a[0],a[1],a[2],b[0],b[1],b[2]);b=this._vxl.cull();this._dbg(f.RequestResponse,"missingResourceCount\x3d"+ |
|
b);this._moreToLoad=0<b;this._havePreparedWithAllLayers=0===this._newLayers.length;this._updateMemoryUsage()}}renderNode(a){if(this._vxl){for(var b of this._newLayers){const c=this._addVoxelLayer(b.layerView);-1===c?b.rejectCallback(-1):b.resolveCallback(c)}this._newLayers=[];if(0===this._layers.size)this._dbg(f.Error,"No voxel layers but RenderPlugin instance is being asked to render!");else{this._lastFrameWasStationary=this.view.stationary;this._syncRequestsResponses();this._beforeDraw();this._vxl.begin_color_frame(!this.view._stage.renderer.isFeatureEnabled(T.RenderFeature.HighResolutionVoxel), |
|
a.bindParameters.lighting.mainLight.direction[0],a.bindParameters.lighting.mainLight.direction[1],a.bindParameters.lighting.mainLight.direction[2]);b=this._renderTargetToRestore.viewport;if(b.width!==this._viewportWidth||b.height!==this._viewportHeight)this._viewportWidth=b.width,this._viewportHeight=b.height,this._vxl.set_viewport(b.width,b.height),this._layers.forEach(c=>{c.needMemoryUsageUpdate=!0});0===b.x&&0===b.y||this._dbg(f.Error,"Unsupported viewport parameters detected!");this.updateWasmCamera(a.bindParameters.camera); |
|
this._captureFrustum&&(this._frustum.update(a.bindParameters.camera),this._doCaptureFrustum());this._vxl.draw();this._afterDraw();(this._moreToLoad||!this._havePreparedWithAllLayers&&0<this._layers.size)&&this._renderPluginContext.requestRender()}}}destroy(){this._dbg(f.Lifetime,"--destroy--");this._removeRenderPlugin();this._vxl&&(this._layers.forEach(a=>{a.abortController.abort()}),this._wasmMemBlocks.forEach(a=>{0!==a&&this._vxl._free(a)}),this._vxl.uninitialize_voxel_wasm(),this._vxl=null)}_initializeWasm(a){if(this._vxl)return Promise.resolve(); |
|
this._vxlPromise||(this._vxlPromise=M.loadVoxelWASM(a).then(b=>{this._vxl=b;this._vxlPromise=null;if(0>=this._newLayers.length)this._dbg(f.Lifetime," no voxel layers left after WASM downloaded, removing RenderPlugin and destroying"),this.destroy();else{b=this._getTimeArgs(this.view?.timeExtent);var c=this._vxl.addFunction(this._restoreFramebuffer.bind(this),"v"),d=this._vxl.addFunction(this._setBlendState.bind(this),"viiii"),e=this._vxl.addFunction(this._setFrontFace.bind(this),"vi"),q=this._vxl.addFunction(this._setRasterizerState.bind(this), |
|
"vi"),g=this._vxl.addFunction(this._setDepthStencilStateFunction.bind(this),"viii"),h=this._vxl.addFunction(this._setViewport.bind(this),"viiii"),u=this._vxl.addFunction(this._bindPreviousDepthToSlot.bind(this),"iii"),l=this._vxl.addFunction(this._modifyResourceCount.bind(this),"viii"),m=this._halfIntTexturesAvailable&&!A("mac");this._vxl.initialize_voxel_wasm(c,d,e,q,g,h,u,l,b.startTime,b.endTime,b.hasTime,m,this._textureFloatLinearAvailable);this._renderPluginContext&&this._renderPluginContext.requestRender()}}).catch(()=> |
|
{for(const b of this._newLayers)b.rejectCallback(-2);this._dbg(f.Error," WASM failed to download, removing RenderPlugin and destroying");this.destroy()}));return this._vxlPromise}pickDepth(a,b,c){if(!this._vxl||!this._rctx||0===this._layers.size)return null;const d=c.viewport[3]-b;if(0>a||a>c.viewport[2]||0>b||b>c.viewport[3])return this._dbg(f.Error,`[js] pickDepth: outOfRange, screenXY=[${a.toFixed(0)}, ${d.toFixed(0)}]]`),null;this._beforeDraw();b=c.viewForward;const e=c.eye;this._vxl.update_camera_pos_and_direction(e[0], |
|
e[1],e[2],b[0],b[1],b[2]);this.updateWasmCamera(c);this._vxl.begin_frame();a=this._vxl.pick_depth(a,d);this._afterDraw();return a.success?a.distanceToCamera:null}pickObject(a,b,c,d){if(!this._vxl||!this._rctx||0===this._layers.size)return null;a=Math.round(a);b=Math.round(b);if(0>a||a>c.viewport[2]||0>b||b>c.viewport[3])return this._dbg(f.Error,`[js] pickObject: outOfRange, screenXY=[${a}, ${b}], vp=[${c.viewport.toString()}]`),null;this._beforeDraw();const e=c.viewForward,q=c.eye;this._vxl.update_camera_pos_and_direction(q[0], |
|
q[1],q[2],e[0],e[1],e[2]);this.updateWasmCamera(c);this._vxl.begin_frame();c=null;0===d.length?c=this._vxl.pick_object(a,b,0,0):(d={str:JSON.stringify({layerIds:d}),byteCount:0,ptr:0,isReusable:!1},this._allocateBlock(d)&&(c=this._vxl.pick_object(a,b,d.ptr,d.byteCount),d.isReusable||this._vxl._free(d.ptr)));this._afterDraw();return c}_beforeDraw(){this._renderTargetToRestore={fbo:this._rctx.getBoundFramebufferObject(),viewport:this._rctx.getViewport()};this._rctx.setPolygonOffsetFillEnabled(!1);this._rctx.setScissorTestEnabled(!1); |
|
this._rctx.setColorMask(!0,!0,!0,!0)}_afterDraw(){this._renderTargetToRestore.fbo=null;this._rctx.externalTextureUnitUpdate(this._vxl.get_texture_units_bound_in_frame(),this._vxl.get_active_texture_unit());this._rctx.externalVertexArrayObjectUpdate();this._rctx.externalVertexBufferUpdate();this._rctx.externalProgramUpdate()}intersect(a,b,c,d,e){if(this._vxl&&this._rctx&&0!==this._layers.size&&a.options.selectionMode&&!a.options.isFiltered){if(null==e||0>e[0]||e[0]>a.camera.viewport[2]||0>e[1]||e[1]> |
|
a.camera.viewport[3])return this._dbg(f.Error,`[js] VoxelWasmPerScene.intersect: outOfRange, screenXY=[${e[0].toFixed(0)}, ${e[1].toFixed(0)}]`),null;var q=[];this._layers.forEach(h=>{a.options.filteredLayerUids.includes(h.layerView.layer.uid)&&q.push(h.layerView.wasmLayerId)});b=this.pickObject(e[0],e[1],a.camera,q);if(null!=b&&-1!==b.layerId){var g=this._layers.get(b.layerId);if(g){const h=g.layerView.layer.uid;e=b.distanceToCamera;c=J.distance(c,d);const u=e/c,l=K.create();l[0]=b.worldX;l[1]=b.worldY; |
|
l[2]=b.worldZ;const m={};null!=b.continuousValue&&null!=b.continuousValueUnits?m["Voxel.ServiceValue"]=`${b.continuousValue.toLocaleString()} ${b.continuousValueUnits}`:null!=b.uniqueValueLabel&&null!=b.uniqueValue?m["Voxel.ServiceValue"]=`${b.uniqueValueLabel} (${b.uniqueValue})`:null!=b.uniqueValue&&(m["Voxel.ServiceValue"]=`${b.uniqueValue}`);m["Voxel.ServiceVariableLabel"]=b.variableLabel;m["Voxel.Position"]=b.voxelSpacePosition;null!=b.epochTime&&null!=b.nativeTime&&null!=b.nativeTimeUnits&& |
|
(m["Voxel.ServiceLocalTime"]=(new Date(b.epochTime)).toString(),m["Voxel.ServiceNativeTime"]=`${b.nativeTime.toLocaleString()} ${b.nativeTimeUnits}`);null!=b.depth&&null!=b.depthUnits&&(m["Voxel.ServiceDepth"]=`${b.depth.toLocaleString()} ${b.depthUnits}`);const y=b.faceNormal;m["Voxel.WorldPosition"]=`[${l[0]}, ${l[1]}, ${l[2]}]`;c=k=>{const p=new O.VoxelTarget(l,h,()=>this._createVoxelGraphic(g.layerView.layer,m));k.set(this.type,p,u,y)};d=a.results;b=a.options.store===D.StoreResults.ALL;(null== |
|
d.min.dist||u<d.min.dist)&&c(d.min);(null==d.max.dist||u>d.max.dist)&&c(d.max);b&&(d=S.newIntersectorResult(a.ray),c(d),a.results.all.push(d))}}}}_createVoxelGraphic(a,b){return new E({layer:a,sourceLayer:a,attributes:b})}_toWasmQuality(a){switch(a){case "low":return 0;case "medium":return 1;case "high":return 2}}_setUpscalingLimits(a,b,c){this._vxl&&this._vxl.set_upscaling_limits(a,b,c)}};B.__decorate([H.property({constructOnly:!0})],z.prototype,"view",void 0);return z=B.__decorate([I.subclass("esri.layers.VoxelWasmPerSceneView")], |
|
z)}); |