@xeokit/xeokit-sdk 2.4.0-alpha-27 → 2.4.0-alpha-28

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.
@@ -4098,34 +4098,7 @@ this._getInverseProjectMat=function(){var projMatDirty=true;_this25._scene.camer
4098
4098
  gl.uniform2fv(this._uSampleOffsets,sampleOffsetsHor);}else{// Vertical
4099
4099
  gl.uniform2fv(this._uSampleOffsets,sampleOffsetsVert);}gl.uniform1fv(this._uSampleWeights,sampleWeights);var depthTexture=depthRenderBuffer.getDepthTexture();var occlusionTexture=occlusionRenderBuffer.getTexture();program.bindTexture(this._uDepthTexture,depthTexture,0);// TODO: use FrameCtx.textureUnit
4100
4100
  program.bindTexture(this._uOcclusionTexture,occlusionTexture,1);this._aUV.bindArrayBuffer(this._uvBuf);this._aPosition.bindArrayBuffer(this._positionsBuf);this._indicesBuf.bind();gl.drawElements(gl.TRIANGLES,this._indicesBuf.numItems,this._indicesBuf.itemType,0);}},{key:"destroy",value:function destroy(){this._program.destroy();}}]);return SAODepthLimitedBlurRenderer;}();function createSampleWeights(kernelRadius,stdDev){var weights=[];for(var _i52=0;_i52<=kernelRadius;_i52++){weights.push(gaussian(_i52,stdDev));}return weights;// TODO: Optimize
4101
- }function gaussian(x,stdDev){return Math.exp(-(x*x)/(2.0*(stdDev*stdDev)))/(Math.sqrt(2.0*Math.PI)*stdDev);}function createSampleOffsets(kernelRadius,uvIncrement){var offsets=[];for(var _i53=0;_i53<=kernelRadius;_i53++){offsets.push(uvIncrement[0]*_i53);offsets.push(uvIncrement[1]*_i53);}return offsets;}/*
4102
- * Canvas2Image v0.1
4103
- * Copyright (c) 2008 Jacob Seidelin, cupboy@gmail.com
4104
- * MIT License [http://www.opensource.org/licenses/mit-license.php]
4105
- *
4106
- * Modified by @xeolabs to permit vertical flipping, so that snapshot can be taken from WebGL frame buffers,
4107
- * which vertically flip image data as part of the way that WebGL renders textures.
4108
- */ /**
4109
- * @private
4110
- */var Canvas2Image=function(){// check if we have canvas support
4111
- var oCanvas=document.createElement("canvas"),sc=String.fromCharCode;// no canvas, bail out.
4112
- if(!oCanvas.getContext){return{saveAsBMP:function saveAsBMP(){},saveAsPNG:function saveAsPNG(){},saveAsJPEG:function saveAsJPEG(){}};}var bHasImageData=!!oCanvas.getContext("2d").getImageData,bHasDataURL=!!oCanvas.toDataURL,bHasBase64=!!window.btoa;// ok, we're good
4113
- var readCanvasData=function readCanvasData(oCanvas){var iWidth=parseInt(oCanvas.width),iHeight=parseInt(oCanvas.height);return oCanvas.getContext("2d").getImageData(0,0,iWidth,iHeight);};// base64 encodes either a string or an array of charcodes
4114
- var encodeData=function encodeData(data){var i,aData,strData="";if(typeof data=="string"){strData=data;}else{aData=data;for(i=0;i<aData.length;i++){strData+=sc(aData[i]);}}return btoa(strData);};// creates a base64 encoded string containing BMP data takes an imagedata object as argument
4115
- var createBMP=function createBMP(oData){var strHeader='';var iWidth=oData.width;var iHeight=oData.height;strHeader+='BM';var iFileSize=iWidth*iHeight*4+54;// total header size = 54 bytes
4116
- strHeader+=sc(iFileSize%256);iFileSize=Math.floor(iFileSize/256);strHeader+=sc(iFileSize%256);iFileSize=Math.floor(iFileSize/256);strHeader+=sc(iFileSize%256);iFileSize=Math.floor(iFileSize/256);strHeader+=sc(iFileSize%256);strHeader+=sc(0,0,0,0,54,0,0,0);// data offset
4117
- strHeader+=sc(40,0,0,0);// info header size
4118
- var iImageWidth=iWidth;strHeader+=sc(iImageWidth%256);iImageWidth=Math.floor(iImageWidth/256);strHeader+=sc(iImageWidth%256);iImageWidth=Math.floor(iImageWidth/256);strHeader+=sc(iImageWidth%256);iImageWidth=Math.floor(iImageWidth/256);strHeader+=sc(iImageWidth%256);var iImageHeight=iHeight;strHeader+=sc(iImageHeight%256);iImageHeight=Math.floor(iImageHeight/256);strHeader+=sc(iImageHeight%256);iImageHeight=Math.floor(iImageHeight/256);strHeader+=sc(iImageHeight%256);iImageHeight=Math.floor(iImageHeight/256);strHeader+=sc(iImageHeight%256);strHeader+=sc(1,0,32,0);// num of planes & num of bits per pixel
4119
- strHeader+=sc(0,0,0,0);// compression = none
4120
- var iDataSize=iWidth*iHeight*4;strHeader+=sc(iDataSize%256);iDataSize=Math.floor(iDataSize/256);strHeader+=sc(iDataSize%256);iDataSize=Math.floor(iDataSize/256);strHeader+=sc(iDataSize%256);iDataSize=Math.floor(iDataSize/256);strHeader+=sc(iDataSize%256);strHeader+=sc(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);// these bytes are not used
4121
- var aImgData=oData.data;var strPixelData="";var x;var y=iHeight;var iOffsetX;var iOffsetY;var strPixelRow;do{iOffsetY=iWidth*(y-1)*4;strPixelRow="";for(x=0;x<iWidth;x++){iOffsetX=4*x;strPixelRow+=sc(aImgData[iOffsetY+iOffsetX+2],// B
4122
- aImgData[iOffsetY+iOffsetX+1],// G
4123
- aImgData[iOffsetY+iOffsetX],// R
4124
- aImgData[iOffsetY+iOffsetX+3]// A
4125
- );}strPixelData+=strPixelRow;}while(--y);return encodeData(strHeader+strPixelData);};// sends the generated file to the client
4126
- var saveFile=function saveFile(strData){if(!window.open(strData)){document.location.href=strData;}};var makeDataURI=function makeDataURI(strData,strMime){return"data:"+strMime+";base64,"+strData;};// generates a <img> object containing the imagedata
4127
- var makeImageObject=function makeImageObject(strSource){var oImgElement=document.createElement("img");oImgElement.src=strSource;return oImgElement;};var scaleCanvas=function scaleCanvas(oCanvas,iWidth,iHeight,flipy){if(iWidth&&iHeight){var oSaveCanvas=document.createElement("canvas");oSaveCanvas.width=iWidth;oSaveCanvas.height=iHeight;oSaveCanvas.style.width=iWidth+"px";oSaveCanvas.style.height=iHeight+"px";var oSaveCtx=oSaveCanvas.getContext("2d");if(flipy){oSaveCtx.save();oSaveCtx.scale(1.0,-1.0);oSaveCtx.imageSmoothingEnabled=true;oSaveCtx.drawImage(oCanvas,0,0,oCanvas.width,oCanvas.height,0,0,iWidth,-iHeight);oSaveCtx.restore();}else{oSaveCtx.imageSmoothingEnabled=true;oSaveCtx.drawImage(oCanvas,0,0,oCanvas.width,oCanvas.height,0,0,iWidth,iHeight);}return oSaveCanvas;}return oCanvas;};return{saveAsPNG:function saveAsPNG(oCanvas,bReturnImg,iWidth,iHeight,flipy){if(!bHasDataURL)return false;var oScaledCanvas=scaleCanvas(oCanvas,iWidth,iHeight,flipy);var strMime="image/png";var strData=oScaledCanvas.toDataURL(strMime);if(bReturnImg){return makeImageObject(strData);}else{saveFile(strData);}return true;},saveAsJPEG:function saveAsJPEG(oCanvas,bReturnImg,iWidth,iHeight,flipy){if(!bHasDataURL)return false;var oScaledCanvas=scaleCanvas(oCanvas,iWidth,iHeight,flipy);var strMime="image/jpeg";var strData=oScaledCanvas.toDataURL(strMime);// check if browser actually supports jpeg by looking for the mime type in the data uri. if not, return false
4128
- if(strData.indexOf(strMime)!=5)return false;if(bReturnImg){return makeImageObject(strData);}else{saveFile(strData);}return true;},saveAsBMP:function saveAsBMP(oCanvas,bReturnImg,iWidth,iHeight,flipy){if(!(bHasDataURL&&bHasImageData&&bHasBase64))return false;var oScaledCanvas=scaleCanvas(oCanvas,iWidth,iHeight,flipy);var strMime="image/bmp";var oData=readCanvasData(oScaledCanvas),strImgData=createBMP(oData);if(bReturnImg){return makeImageObject(makeDataURI(strImgData,strMime));}else{saveFile(makeDataURI(strImgData,strMime));}return true;}};}();/**
4101
+ }function gaussian(x,stdDev){return Math.exp(-(x*x)/(2.0*(stdDev*stdDev)))/(Math.sqrt(2.0*Math.PI)*stdDev);}function createSampleOffsets(kernelRadius,uvIncrement){var offsets=[];for(var _i53=0;_i53<=kernelRadius;_i53++){offsets.push(uvIncrement[0]*_i53);offsets.push(uvIncrement[1]*_i53);}return offsets;}/**
4129
4102
  * @desc Represents a WebGL render buffer.
4130
4103
  * @private
4131
4104
  */var RenderBuffer=/*#__PURE__*/function(){function RenderBuffer(canvas,gl,options){_classCallCheck(this,RenderBuffer);options=options||{};this.gl=gl;this.allocated=false;this.canvas=canvas;this.buffer=null;this.bound=false;this.size=options.size;this._hasDepthTexture=!!options.depthTexture;}_createClass(RenderBuffer,[{key:"setSize",value:function setSize(size){this.size=size;}},{key:"webglContextRestored",value:function webglContextRestored(gl){this.gl=gl;this.buffer=null;this.allocated=false;this.bound=false;}},{key:"bind",value:function bind(){this._touch();if(this.bound){return;}var gl=this.gl;gl.bindFramebuffer(gl.FRAMEBUFFER,this.buffer.framebuf);this.bound=true;}},{key:"_touch",value:function _touch(){var width;var height;var gl=this.gl;if(this.size){width=this.size[0];height=this.size[1];}else{width=gl.drawingBufferWidth;height=gl.drawingBufferHeight;}if(this.buffer){if(this.buffer.width===width&&this.buffer.height===height){return;}else{gl.deleteTexture(this.buffer.texture);gl.deleteFramebuffer(this.buffer.framebuf);gl.deleteRenderbuffer(this.buffer.renderbuf);}}var colorTexture=gl.createTexture();gl.bindTexture(gl.TEXTURE_2D,colorTexture);gl.texParameteri(gl.TEXTURE_2D,gl.TEXTURE_MIN_FILTER,gl.NEAREST);gl.texParameteri(gl.TEXTURE_2D,gl.TEXTURE_MAG_FILTER,gl.NEAREST);gl.texParameteri(gl.TEXTURE_2D,gl.TEXTURE_WRAP_S,gl.CLAMP_TO_EDGE);gl.texParameteri(gl.TEXTURE_2D,gl.TEXTURE_WRAP_T,gl.CLAMP_TO_EDGE);gl.texImage2D(gl.TEXTURE_2D,0,gl.RGBA,width,height,0,gl.RGBA,gl.UNSIGNED_BYTE,null);var depthTexture;if(this._hasDepthTexture){depthTexture=gl.createTexture();gl.bindTexture(gl.TEXTURE_2D,depthTexture);gl.texParameteri(gl.TEXTURE_2D,gl.TEXTURE_MAG_FILTER,gl.NEAREST);gl.texParameteri(gl.TEXTURE_2D,gl.TEXTURE_MIN_FILTER,gl.NEAREST);gl.texParameteri(gl.TEXTURE_2D,gl.TEXTURE_WRAP_S,gl.CLAMP_TO_EDGE);gl.texParameteri(gl.TEXTURE_2D,gl.TEXTURE_WRAP_T,gl.CLAMP_TO_EDGE);gl.texImage2D(gl.TEXTURE_2D,0,gl.DEPTH_COMPONENT32F,width,height,0,gl.DEPTH_COMPONENT,gl.FLOAT,null);}var renderbuf=gl.createRenderbuffer();gl.bindRenderbuffer(gl.RENDERBUFFER,renderbuf);gl.renderbufferStorage(gl.RENDERBUFFER,gl.DEPTH_COMPONENT32F,width,height);var framebuf=gl.createFramebuffer();gl.bindFramebuffer(gl.FRAMEBUFFER,framebuf);gl.framebufferTexture2D(gl.FRAMEBUFFER,gl.COLOR_ATTACHMENT0,gl.TEXTURE_2D,colorTexture,0);if(this._hasDepthTexture){gl.framebufferTexture2D(gl.FRAMEBUFFER,gl.DEPTH_ATTACHMENT,gl.TEXTURE_2D,depthTexture,0);}else{gl.framebufferRenderbuffer(gl.FRAMEBUFFER,gl.DEPTH_ATTACHMENT,gl.RENDERBUFFER,renderbuf);}gl.bindTexture(gl.TEXTURE_2D,null);gl.bindRenderbuffer(gl.RENDERBUFFER,null);gl.bindFramebuffer(gl.FRAMEBUFFER,null);// Verify framebuffer is OK
@@ -4137,8 +4110,7 @@ gl.bindFramebuffer(gl.FRAMEBUFFER,framebuf);if(!gl.isFramebuffer(framebuf)){thro
4137
4110
  *
4138
4111
  * @returns {HTMLCanvasElement}
4139
4112
  */},{key:"readImageAsCanvas",value:function readImageAsCanvas(){var gl=this.gl;var imageDataCache=this._getImageDataCache();var pixelData=imageDataCache.pixelData;var canvas=imageDataCache.canvas;var imageData=imageDataCache.imageData;var context=imageDataCache.context;gl.readPixels(0,0,this.buffer.width,this.buffer.height,gl.RGBA,gl.UNSIGNED_BYTE,pixelData);var width=this.buffer.width;var height=this.buffer.height;var halfHeight=height/2|0;// the | 0 keeps the result an int
4140
- var bytesPerRow=width*4;var temp=new Uint8Array(width*4);for(var y=0;y<halfHeight;++y){var topOffset=y*bytesPerRow;var bottomOffset=(height-y-1)*bytesPerRow;temp.set(pixelData.subarray(topOffset,topOffset+bytesPerRow));pixelData.copyWithin(topOffset,bottomOffset,bottomOffset+bytesPerRow);pixelData.set(temp,bottomOffset);}imageData.data.set(pixelData);context.putImageData(imageData,0,0);return canvas;}},{key:"readImage",value:function readImage(params){var gl=this.gl;var imageDataCache=this._getImageDataCache();var pixelData=imageDataCache.pixelData;var canvas=imageDataCache.canvas;var imageData=imageDataCache.imageData;var context=imageDataCache.context;gl.readPixels(0,0,this.buffer.width,this.buffer.height,gl.RGBA,gl.UNSIGNED_BYTE,pixelData);imageData.data.set(pixelData);context.putImageData(imageData,0,0);var imageWidth=params.width||canvas.width;var imageHeight=params.height||canvas.height;var format=params.format||"jpeg";var flipy=true;// Account for WebGL texture flipping
4141
- var image;switch(format){case"jpeg":image=Canvas2Image.saveAsJPEG(canvas,true,imageWidth,imageHeight,flipy);break;case"png":image=Canvas2Image.saveAsPNG(canvas,true,imageWidth,imageHeight,flipy);break;case"bmp":image=Canvas2Image.saveAsBMP(canvas,true,imageWidth,imageHeight,flipy);break;default:console.error("Unsupported image format: '"+format+"' - supported types are 'jpeg', 'bmp' and 'png' - defaulting to 'jpeg'");image=Canvas2Image.saveAsJPEG(canvas,true,imageWidth,imageHeight,flipy);}return image.src;}},{key:"_getImageDataCache",value:function _getImageDataCache(){var bufferWidth=this.buffer.width;var bufferHeight=this.buffer.height;var imageDataCache=this._imageDataCache;if(imageDataCache){if(imageDataCache.width!==bufferWidth||imageDataCache.height!==bufferHeight){this._imageDataCache=null;imageDataCache=null;}}if(!imageDataCache){var _canvas=document.createElement('canvas');_canvas.width=bufferWidth;_canvas.height=bufferHeight;var context=_canvas.getContext('2d');imageDataCache={pixelData:new Uint8Array(bufferWidth*bufferHeight*4),canvas:_canvas,context:context,imageData:context.createImageData(bufferWidth,bufferHeight),width:bufferWidth,height:bufferHeight};this._imageDataCache=imageDataCache;}imageDataCache.context.resetTransform();// Prevents strange scale-accumulation effect with html2canvas
4113
+ var bytesPerRow=width*4;var temp=new Uint8Array(width*4);for(var y=0;y<halfHeight;++y){var topOffset=y*bytesPerRow;var bottomOffset=(height-y-1)*bytesPerRow;temp.set(pixelData.subarray(topOffset,topOffset+bytesPerRow));pixelData.copyWithin(topOffset,bottomOffset,bottomOffset+bytesPerRow);pixelData.set(temp,bottomOffset);}imageData.data.set(pixelData);context.putImageData(imageData,0,0);return canvas;}},{key:"readImage",value:function readImage(params){var gl=this.gl;var imageDataCache=this._getImageDataCache();var pixelData=imageDataCache.pixelData;var canvas=imageDataCache.canvas;var imageData=imageDataCache.imageData;var context=imageDataCache.context;gl.readPixels(0,0,this.buffer.width,this.buffer.height,gl.RGBA,gl.UNSIGNED_BYTE,pixelData);imageData.data.set(pixelData);context.putImageData(imageData,0,0);var format=params.format||"png";if(format!=="jpeg"&&format!=="png"&&format!=="bmp"){console.error("Unsupported image format: '"+format+"' - supported types are 'jpeg', 'bmp' and 'png' - defaulting to 'png'");format="png";}return canvas.toDataURL("image/".concat(format));}},{key:"_getImageDataCache",value:function _getImageDataCache(){var bufferWidth=this.buffer.width;var bufferHeight=this.buffer.height;var imageDataCache=this._imageDataCache;if(imageDataCache){if(imageDataCache.width!==bufferWidth||imageDataCache.height!==bufferHeight){this._imageDataCache=null;imageDataCache=null;}}if(!imageDataCache){var _canvas=document.createElement('canvas');_canvas.width=bufferWidth;_canvas.height=bufferHeight;var context=_canvas.getContext('2d');imageDataCache={pixelData:new Uint8Array(bufferWidth*bufferHeight*4),canvas:_canvas,context:context,imageData:context.createImageData(bufferWidth,bufferHeight),width:bufferWidth,height:bufferHeight};this._imageDataCache=imageDataCache;}imageDataCache.context.resetTransform();// Prevents strange scale-accumulation effect with html2canvas
4142
4114
  return imageDataCache;}},{key:"unbind",value:function unbind(){var gl=this.gl;gl.bindFramebuffer(gl.FRAMEBUFFER,null);this.bound=false;}},{key:"getTexture",value:function getTexture(){var self=this;return this._texture||(this._texture={renderBuffer:this,bind:function bind(unit){if(self.buffer&&self.buffer.texture){self.gl.activeTexture(self.gl["TEXTURE"+unit]);self.gl.bindTexture(self.gl.TEXTURE_2D,self.buffer.texture);return true;}return false;},unbind:function unbind(unit){if(self.buffer&&self.buffer.texture){self.gl.activeTexture(self.gl["TEXTURE"+unit]);self.gl.bindTexture(self.gl.TEXTURE_2D,null);}}});}},{key:"hasDepthTexture",value:function hasDepthTexture(){return this._hasDepthTexture;}},{key:"getDepthTexture",value:function getDepthTexture(){if(!this._hasDepthTexture){return null;}var self=this;return this._depthTexture||(this._dethTexture={renderBuffer:this,bind:function bind(unit){if(self.buffer&&self.buffer.depthTexture){self.gl.activeTexture(self.gl["TEXTURE"+unit]);self.gl.bindTexture(self.gl.TEXTURE_2D,self.buffer.depthTexture);return true;}return false;},unbind:function unbind(unit){if(self.buffer&&self.buffer.depthTexture){self.gl.activeTexture(self.gl["TEXTURE"+unit]);self.gl.bindTexture(self.gl.TEXTURE_2D,null);}}});}},{key:"destroy",value:function destroy(){if(this.allocated){var _gl2=this.gl;_gl2.deleteTexture(this.buffer.texture);_gl2.deleteTexture(this.buffer.depthTexture);_gl2.deleteFramebuffer(this.buffer.framebuf);_gl2.deleteRenderbuffer(this.buffer.renderbuf);this.allocated=false;this.buffer=null;this.bound=false;}this._imageDataCache=null;this._texture=null;this._depthTexture=null;}}]);return RenderBuffer;}();/**
4143
4115
  * @private
4144
4116
  */var RenderBufferManager=/*#__PURE__*/function(){function RenderBufferManager(scene){_classCallCheck(this,RenderBufferManager);this.scene=scene;this._renderBuffersBasic={};this._renderBuffersScaled={};}_createClass(RenderBufferManager,[{key:"getRenderBuffer",value:function getRenderBuffer(id,options){var renderBuffers=this.scene.canvas.resolutionScale===1.0?this._renderBuffersBasic:this._renderBuffersScaled;var renderBuffer=renderBuffers[id];if(!renderBuffer){renderBuffer=new RenderBuffer(this.scene.canvas.canvas,this.scene.canvas.gl,options);renderBuffers[id]=renderBuffer;}return renderBuffer;}},{key:"destroy",value:function destroy(){for(var id in this._renderBuffersBasic){this._renderBuffersBasic[id].destroy();}for(var _id in this._renderBuffersScaled){this._renderBuffersScaled[_id].destroy();}}}]);return RenderBufferManager;}();/**
@@ -7521,10 +7493,7 @@ for(var _ii=0;_ii<numVertexAttribs;_ii++){gl.disableVertexAttribArray(_ii);}// }
7521
7493
  // Align camera along ray and fire ray through center of canvas
7522
7494
  var pickFrustumMatrix=math.frustumMat4(-1,1,-1,1,0.01,scene.camera.project.far,tempMat4a);if(params.matrix){pickViewMatrix=params.matrix;pickProjMatrix=pickFrustumMatrix;}else{worldRayOrigin.set(params.origin||[0,0,0]);worldRayDir.set(params.direction||[0,0,1]);look=math.addVec3(worldRayOrigin,worldRayDir,tempVec3a);randomVec3[0]=Math.random();randomVec3[1]=Math.random();randomVec3[2]=Math.random();math.normalizeVec3(randomVec3);math.cross3Vec3(worldRayDir,randomVec3,up);pickViewMatrix=math.lookAtMat4v(worldRayOrigin,look,up,tempMat4b);pickProjMatrix=pickFrustumMatrix;pickResult.origin=worldRayOrigin;pickResult.direction=worldRayDir;}canvasPos[0]=canvas.clientWidth*0.5;canvasPos[1]=canvas.clientHeight*0.5;}if(null!==pickViewMatrix){// data-textures: update the pick-camera-matrices of all DataTextureSceneModel's
7523
7495
  for(var type in drawableTypeInfo){if(drawableTypeInfo.hasOwnProperty(type)){var drawableList=drawableTypeInfo[type].drawableList;for(var _i193=0,len=drawableList.length;_i193<len;_i193++){var drawable=drawableList[_i193];if(drawable instanceof DataTextureSceneModel){if(drawable.pickCameraTexture){drawable.pickCameraTexture._updateViewMatrix(pickViewMatrix,pickProjMatrix);}}}}}}var pickBuffer=renderBufferManager.getRenderBuffer("pick");pickBuffer.bind();var pickable=gpuPickPickable(pickBuffer,canvasPos,pickViewMatrix,pickProjMatrix,params,pickResult);if(!pickable){pickBuffer.unbind();return null;}var pickedEntity=pickable.delegatePickedEntity?pickable.delegatePickedEntity():pickable;if(!pickedEntity){pickBuffer.unbind();return null;}if(params.pickSurface){if(params.pickSurfacePrecision&&scene.pickSurfacePrecisionEnabled){// JavaScript-based ray-picking - slow and precise
7524
- if(params.canvasPos){math.canvasPosToWorldRay(scene.canvas.canvas,pickViewMatrix,pickProjMatrix,canvasPos,worldRayOrigin,worldRayDir);}if(pickable.precisionRayPickSurface(worldRayOrigin,worldRayDir,worldSurfacePos,worldSurfaceNormal)){pickResult.worldPos=worldSurfacePos;if(params.pickSurfaceNormal!==false){pickResult.worldNormal=worldSurfaceNormal;}// if (params.pickSurfaceNormal !== false) {
7525
- // gpuPickWorldNormal(pickBuffer, pickable, canvasPos, pickViewMatrix, pickProjMatrix, pickResult);
7526
- // }
7527
- pickResult.pickSurfacePrecision=true;}}else{// GPU-based ray-picking - fast and imprecise
7496
+ if(params.canvasPos){math.canvasPosToWorldRay(scene.canvas.canvas,pickViewMatrix,pickProjMatrix,canvasPos,worldRayOrigin,worldRayDir);}if(pickable.precisionRayPickSurface(worldRayOrigin,worldRayDir,worldSurfacePos,worldSurfaceNormal)){pickResult.worldPos=worldSurfacePos;if(params.pickSurfaceNormal!==false){pickResult.worldNormal=worldSurfaceNormal;}pickResult.pickSurfacePrecision=true;}}else{// GPU-based ray-picking - fast and imprecise
7528
7497
  if(pickable.canPickTriangle&&pickable.canPickTriangle()){gpuPickTriangle(pickBuffer,pickable,canvasPos,pickViewMatrix,pickProjMatrix,pickResult);pickable.pickTriangleSurface(pickViewMatrix,pickProjMatrix,pickResult);pickResult.pickSurfacePrecision=false;}else{if(pickable.canPickWorldPos&&pickable.canPickWorldPos()){nearAndFar[0]=scene.camera.project.near;nearAndFar[1]=scene.camera.project.far;gpuPickWorldPos(pickBuffer,pickable,canvasPos,pickViewMatrix,pickProjMatrix,nearAndFar,pickResult);if(params.pickSurfaceNormal!==false){gpuPickWorldNormal(pickBuffer,pickable,canvasPos,pickViewMatrix,pickProjMatrix,pickResult);}pickResult.pickSurfacePrecision=false;}}}}pickBuffer.unbind();pickResult.entity=pickedEntity;return pickResult;};}();function gpuPickPickable(pickBuffer,canvasPos,pickViewMatrix,pickProjMatrix,params,pickResult){frameCtx.reset();frameCtx.backfaces=true;frameCtx.frontface=true;// "ccw"
7529
7498
  frameCtx.pickOrigin=pickResult.origin;frameCtx.pickViewMatrix=pickViewMatrix;frameCtx.pickProjMatrix=pickProjMatrix;frameCtx.pickInvisible=!!params.pickInvisible;gl.viewport(0,0,gl.drawingBufferWidth,gl.drawingBufferHeight);gl.clearColor(0,0,0,0);gl.enable(gl.DEPTH_TEST);gl.disable(gl.CULL_FACE);gl.disable(gl.BLEND);gl.clear(gl.COLOR_BUFFER_BIT|gl.DEPTH_BUFFER_BIT);var includeEntityIds=params.includeEntityIds;var excludeEntityIds=params.excludeEntityIds;for(var type in drawableTypeInfo){if(drawableTypeInfo.hasOwnProperty(type)){var drawableInfo=drawableTypeInfo[type];var drawableList=drawableInfo.drawableList;for(var _i194=0,len=drawableList.length;_i194<len;_i194++){var drawable=drawableList[_i194];if(!drawable.drawPickMesh||drawable.culled===true||params.pickInvisible!==true&&drawable.visible===false||drawable.pickable===false){continue;}if(includeEntityIds&&!includeEntityIds[drawable.id]){// TODO: push this logic into drawable
7530
7499
  continue;}if(excludeEntityIds&&excludeEntityIds[drawable.id]){continue;}drawable.drawPickMesh(frameCtx);}}}var resolutionScale=scene.canvas.resolutionScale;var pix=pickBuffer.read(Math.round(canvasPos[0]*resolutionScale),Math.round(canvasPos[1]*resolutionScale));var pickID=pix[0]+pix[1]*256+pix[2]*256*256+pix[3]*256*256*256;if(pickID<0){return;}var pickable=pickIDs.items[pickID];return pickable;}function gpuPickTriangle(pickBuffer,pickable,canvasPos,pickViewMatrix,pickProjMatrix,pickResult){if(!pickable.drawPickTriangles){return;}frameCtx.reset();frameCtx.backfaces=true;frameCtx.frontface=true;// "ccw"
@@ -7573,7 +7542,7 @@ this._occlusionTester.unbindRenderBuf();}};/**
7573
7542
  *
7574
7543
  * @private
7575
7544
  * @returns {String} The image data URI.
7576
- */this.readSnapshot=function(params){var snapshotBuffer=renderBufferManager.getRenderBuffer("snapshot");var imageDataURI=snapshotBuffer.readImage(params);return imageDataURI;};/**
7545
+ */this.readSnapshot=function(params){var snapshotBuffer=renderBufferManager.getRenderBuffer("snapshot");return snapshotBuffer.readImage(params);};/**
7577
7546
  * Returns an HTMLCanvas containing an image of the snapshot canvas.
7578
7547
  *
7579
7548
  * - The HTMLCanvas has a CanvasRenderingContext2D.
@@ -19338,7 +19307,7 @@ this._instancingRenderers.occlusionRenderer.drawLayer(frameCtx,this,RENDER_PASSE
19338
19307
  },{key:"drawShadow",value:function drawShadow(renderFlags,frameCtx){if(this._numCulledLayerPortions===this._numPortions||this._numVisibleLayerPortions===0){return;}this._updateBackfaceCull(renderFlags,frameCtx);if(this._instancingRenderers.shadowRenderer){this._instancingRenderers.shadowRenderer.drawLayer(frameCtx,this,RENDER_PASSES.COLOR_OPAQUE);}}//---- PICKING ----------------------------------------------------------------------------------------------------
19339
19308
  },{key:"drawPickMesh",value:function drawPickMesh(renderFlags,frameCtx){if(this._numCulledLayerPortions===this._numPortions||this._numVisibleLayerPortions===0){return;}this._updateBackfaceCull(renderFlags,frameCtx);if(this._instancingRenderers.pickMeshRenderer){this._instancingRenderers.pickMeshRenderer.drawLayer(frameCtx,this,RENDER_PASSES.PICK);}}},{key:"drawPickDepths",value:function drawPickDepths(renderFlags,frameCtx){if(this._numCulledLayerPortions===this._numPortions||this._numVisibleLayerPortions===0){return;}this._updateBackfaceCull(renderFlags,frameCtx);if(this._instancingRenderers.pickDepthRenderer){this._instancingRenderers.pickDepthRenderer.drawLayer(frameCtx,this,RENDER_PASSES.PICK);}}},{key:"drawPickNormals",value:function drawPickNormals(renderFlags,frameCtx){if(this._numCulledLayerPortions===this._numPortions||this._numVisibleLayerPortions===0){return;}this._updateBackfaceCull(renderFlags,frameCtx);if(this._instancingRenderers.pickNormalsRenderer){this._instancingRenderers.pickNormalsRenderer.drawLayer(frameCtx,this,RENDER_PASSES.PICK);}}//-----------------------------------------------------------------------------------------
19340
19309
  },{key:"precisionRayPickSurface",value:function precisionRayPickSurface(portionId,worldRayOrigin,worldRayDir,worldSurfacePos,worldNormal){if(!this.model.scene.pickSurfacePrecisionEnabled){return false;}var geometry=this._state.geometry;var state=this._state;var portion=this._portions[portionId];if(!portion){this.model.error("portion not found: "+portionId);return false;}if(!portion.inverseMatrix){portion.inverseMatrix=math.inverseMat4(portion.matrix,math.mat4());}if(worldNormal&&!portion.normalMatrix){portion.normalMatrix=math.transposeMat4(portion.inverseMatrix,math.mat4());}var quantizedPositions=geometry.quantizedPositions;var indices=geometry.indices;var origin=state.origin;var offset=portion.offset;var rtcRayOrigin=tempVec3a$q;var rtcRayDir=tempVec3b$6;rtcRayOrigin.set(origin?math.subVec3(worldRayOrigin,origin,tempVec3c$4):worldRayOrigin);// World -> RTC
19341
- rtcRayDir.set(worldRayDir);if(offset){math.subVec3(rtcRayOrigin,offset);}math.transformRay(this.model.worldNormalMatrix,rtcRayOrigin,rtcRayDir,rtcRayOrigin,rtcRayDir);math.transformRay(portion.inverseMatrix,rtcRayOrigin,rtcRayDir,rtcRayOrigin,rtcRayDir);var a=tempVec3d$1;var b=tempVec3e;var c=tempVec3f;var gotIntersect=false;var closestDist=0;var closestIntersectPos=tempVec3g;for(var _i407=0,len=indices.length;_i407<len;_i407+=3){var ia=indices[_i407+0]*3;var ib=indices[_i407+1]*3;var ic=indices[_i407+2]*3;a[0]=quantizedPositions[ia];a[1]=quantizedPositions[ia+1];a[2]=quantizedPositions[ia+2];b[0]=quantizedPositions[ib];b[1]=quantizedPositions[ib+1];b[2]=quantizedPositions[ib+2];c[0]=quantizedPositions[ic];c[1]=quantizedPositions[ic+1];c[2]=quantizedPositions[ic+2];math.decompressPosition(a,state.positionsDecodeMatrix);math.decompressPosition(b,state.positionsDecodeMatrix);math.decompressPosition(c,state.positionsDecodeMatrix);if(math.rayTriangleIntersect(rtcRayOrigin,rtcRayDir,a,b,c,closestIntersectPos)){math.transformPoint3(portion.matrix,closestIntersectPos,closestIntersectPos);math.transformPoint3(this.model.worldMatrix,closestIntersectPos,closestIntersectPos);if(offset){math.addVec3(closestIntersectPos,offset);}if(origin){math.addVec3(closestIntersectPos,origin);}var dist=Math.abs(math.lenVec3(math.subVec3(closestIntersectPos,worldRayOrigin,[])));if(!gotIntersect||dist>closestDist){closestDist=dist;worldSurfacePos.set(closestIntersectPos);if(worldNormal){// Not that wasteful to eagerly compute - unlikely to hit >2 surfaces on most geometry
19310
+ rtcRayDir.set(worldRayDir);if(offset){math.subVec3(rtcRayOrigin,offset);}math.transformRay(this.model.worldNormalMatrix,rtcRayOrigin,rtcRayDir,rtcRayOrigin,rtcRayDir);math.transformRay(portion.inverseMatrix,rtcRayOrigin,rtcRayDir,rtcRayOrigin,rtcRayDir);var a=tempVec3d$1;var b=tempVec3e;var c=tempVec3f;var gotIntersect=false;var closestDist=0;var closestIntersectPos=tempVec3g;for(var _i407=0,len=indices.length;_i407<len;_i407+=3){var ia=indices[_i407+0]*3;var ib=indices[_i407+1]*3;var ic=indices[_i407+2]*3;a[0]=quantizedPositions[ia];a[1]=quantizedPositions[ia+1];a[2]=quantizedPositions[ia+2];b[0]=quantizedPositions[ib];b[1]=quantizedPositions[ib+1];b[2]=quantizedPositions[ib+2];c[0]=quantizedPositions[ic];c[1]=quantizedPositions[ic+1];c[2]=quantizedPositions[ic+2];var positionsDecodeMatrix=state.geometry.positionsDecodeMatrix;math.decompressPosition(a,positionsDecodeMatrix);math.decompressPosition(b,positionsDecodeMatrix);math.decompressPosition(c,positionsDecodeMatrix);if(math.rayTriangleIntersect(rtcRayOrigin,rtcRayDir,a,b,c,closestIntersectPos)){math.transformPoint3(portion.matrix,closestIntersectPos,closestIntersectPos);math.transformPoint3(this.model.worldMatrix,closestIntersectPos,closestIntersectPos);if(offset){math.addVec3(closestIntersectPos,offset);}if(origin){math.addVec3(closestIntersectPos,origin);}var dist=Math.abs(math.lenVec3(math.subVec3(closestIntersectPos,worldRayOrigin,[])));if(!gotIntersect||dist>closestDist){closestDist=dist;worldSurfacePos.set(closestIntersectPos);if(worldNormal){// Not that wasteful to eagerly compute - unlikely to hit >2 surfaces on most geometry
19342
19311
  math.triangleNormal(a,b,c,worldNormal);}gotIntersect=true;}}}if(gotIntersect&&worldNormal){math.transformVec3(portion.normalMatrix,worldNormal,worldNormal);math.transformVec3(this.model.worldNormalMatrix,worldNormal,worldNormal);math.normalizeVec3(worldNormal);}return gotIntersect;}},{key:"destroy",value:function destroy(){var state=this._state;if(state.colorsBuf){state.colorsBuf.destroy();state.colorsBuf=null;}if(state.metallicRoughnessBuf){state.metallicRoughnessBuf.destroy();state.metallicRoughnessBuf=null;}if(state.flagsBuf){state.flagsBuf.destroy();state.flagsBuf=null;}if(state.offsetsBuf){state.offsetsBuf.destroy();state.offsetsBuf=null;}if(state.modelMatrixCol0Buf){state.modelMatrixCol0Buf.destroy();state.modelMatrixCol0Buf=null;}if(state.modelMatrixCol1Buf){state.modelMatrixCol1Buf.destroy();state.modelMatrixCol1Buf=null;}if(state.modelMatrixCol2Buf){state.modelMatrixCol2Buf.destroy();state.modelMatrixCol2Buf=null;}if(state.modelNormalMatrixCol0Buf){state.modelNormalMatrixCol0Buf.destroy();state.modelNormalMatrixCol0Buf=null;}if(state.modelNormalMatrixCol1Buf){state.modelNormalMatrixCol1Buf.destroy();state.modelNormalMatrixCol1Buf=null;}if(state.modelNormalMatrixCol2Buf){state.modelNormalMatrixCol2Buf.destroy();state.modelNormalMatrixCol2Buf=null;}if(state.pickColorsBuf){state.pickColorsBuf.destroy();state.pickColorsBuf=null;}state.destroy();}}]);return TrianglesInstancingLayer;}();var tempVec3a$p=math.vec3();/**
19343
19312
  * @private
19344
19313
  */var LinesBatchingColorRenderer=/*#__PURE__*/function(){function LinesBatchingColorRenderer(scene){_classCallCheck(this,LinesBatchingColorRenderer);this._scene=scene;this._hash=this._getHash();this._allocate();}_createClass(LinesBatchingColorRenderer,[{key:"getValid",value:function getValid(){return this._hash===this._getHash();}},{key:"_getHash",value:function _getHash(){return this._scene._sectionPlanesState.getHash();}},{key:"drawLayer",value:function drawLayer(frameCtx,batchingLayer,renderPass){var scene=this._scene;var camera=scene.camera;var model=batchingLayer.model;var gl=scene.canvas.gl;var state=batchingLayer._state;var origin=batchingLayer._state.origin;batchingLayer.geometry;if(!this._program){this._allocate();if(this.errors){return;}}if(frameCtx.lastProgramId!==this._program.id){frameCtx.lastProgramId=this._program.id;this._bindProgram(frameCtx);}gl.uniform1i(this._uRenderPass,renderPass);gl.uniformMatrix4fv(this._uViewMatrix,false,origin?createRTCViewMat(camera.viewMatrix,origin):camera.viewMatrix);gl.uniformMatrix4fv(this._uWorldMatrix,false,model.worldMatrix);gl.lineWidth(scene.linesMaterial.lineWidth);var numSectionPlanes=scene._sectionPlanesState.sectionPlanes.length;if(numSectionPlanes>0){var sectionPlanes=scene._sectionPlanesState.sectionPlanes;var baseIndex=batchingLayer.layerIndex*numSectionPlanes;var renderFlags=model.renderFlags;for(var sectionPlaneIndex=0;sectionPlaneIndex<numSectionPlanes;sectionPlaneIndex++){var sectionPlaneUniforms=this._uSectionPlanes[sectionPlaneIndex];if(sectionPlaneUniforms){var active=renderFlags.sectionPlanesActivePerLayer[baseIndex+sectionPlaneIndex];gl.uniform1i(sectionPlaneUniforms.active,active?1:0);if(active){var sectionPlane=sectionPlanes[sectionPlaneIndex];if(origin){var rtcSectionPlanePos=getPlaneRTCPos(sectionPlane.dist,sectionPlane.dir,origin,tempVec3a$p);gl.uniform3fv(sectionPlaneUniforms.pos,rtcSectionPlanePos);}else{gl.uniform3fv(sectionPlaneUniforms.pos,sectionPlane.pos);}gl.uniform3fv(sectionPlaneUniforms.dir,sectionPlane.dir);}}}}gl.uniformMatrix4fv(this._uPositionsDecodeMatrix,false,batchingLayer._state.positionsDecodeMatrix);this._aPosition.bindArrayBuffer(state.positionsBuf);if(this._aColor){this._aColor.bindArrayBuffer(state.colorsBuf);}if(this._aFlags){this._aFlags.bindArrayBuffer(state.flagsBuf);}if(this._aOffset){this._aOffset.bindArrayBuffer(state.offsetsBuf);}state.indicesBuf.bind();gl.drawElements(gl.LINES,state.indicesBuf.numItems,state.indicesBuf.itemType,0);frameCtx.drawElements++;}},{key:"_allocate",value:function _allocate(){var scene=this._scene;var gl=scene.canvas.gl;this._program=new Program(gl,this._buildShader());if(this._program.errors){this.errors=this._program.errors;return;}var program=this._program;this._uRenderPass=program.getLocation("renderPass");this._uPositionsDecodeMatrix=program.getLocation("positionsDecodeMatrix");this._uWorldMatrix=program.getLocation("worldMatrix");this._uViewMatrix=program.getLocation("viewMatrix");this._uProjMatrix=program.getLocation("projMatrix");this._uSectionPlanes=[];for(var _i408=0,len=scene._sectionPlanesState.sectionPlanes.length;_i408<len;_i408++){this._uSectionPlanes.push({active:program.getLocation("sectionPlaneActive"+_i408),pos:program.getLocation("sectionPlanePos"+_i408),dir:program.getLocation("sectionPlaneDir"+_i408)});}this._aPosition=program.getAttribute("position");this._aOffset=program.getAttribute("offset");this._aColor=program.getAttribute("color");this._aFlags=program.getAttribute("flags");if(scene.logarithmicDepthBufferEnabled){this._uLogDepthBufFC=program.getLocation("logDepthBufFC");}}},{key:"_bindProgram",value:function _bindProgram(frameCtx){var scene=this._scene;var gl=scene.canvas.gl;var program=this._program;var project=scene.camera.project;program.bind();gl.uniformMatrix4fv(this._uProjMatrix,false,project.matrix);if(scene.logarithmicDepthBufferEnabled){var logDepthBufFC=2.0/(Math.log(project.far+1.0)/Math.LN2);gl.uniform1f(this._uLogDepthBufFC,logDepthBufFC);}}},{key:"_buildShader",value:function _buildShader(){return{vertex:this._buildVertexShader(),fragment:this._buildFragmentShader()};}},{key:"_buildVertexShader",value:function _buildVertexShader(){var scene=this._scene;var sectionPlanesState=scene._sectionPlanesState;var clipping=sectionPlanesState.sectionPlanes.length>0;var src=[];src.push('#version 300 es');src.push("// Lines batching color vertex shader");src.push("uniform int renderPass;");src.push("in vec3 position;");src.push("in vec4 color;");src.push("in float flags;");if(scene.entityOffsetsEnabled){src.push("in vec3 offset;");}src.push("uniform mat4 worldMatrix;");src.push("uniform mat4 viewMatrix;");src.push("uniform mat4 projMatrix;");src.push("uniform mat4 positionsDecodeMatrix;");if(scene.logarithmicDepthBufferEnabled){src.push("uniform float logDepthBufFC;");src.push("out float vFragDepth;");}if(clipping){src.push("out vec4 vWorldPosition;");src.push("out float vFlags;");}src.push("out vec4 vColor;");src.push("void main(void) {");// colorFlag = NOT_RENDERED | COLOR_OPAQUE | COLOR_TRANSPARENT
@@ -23867,7 +23836,7 @@ doublePickFlyTo:true});this._plugins=[];/**
23867
23836
  // canvas ourselves, in order to allow the Viewer to render the
23868
23837
  // right amount of pixels, for a sharper image.
23869
23838
  return new Promise(function(resolve,reject){var needFinishSnapshot=!_this97._snapshotBegun;var resize=params.width!==undefined&&params.height!==undefined;var canvas=_this97.scene.canvas.canvas;var saveWidth=canvas.clientWidth;var saveHeight=canvas.clientHeight;var snapshotWidth=params.width?Math.floor(params.width):canvas.width;var snapshotHeight=params.height?Math.floor(params.height):canvas.height;if(resize){canvas.width=snapshotWidth;canvas.height=snapshotHeight;}if(!_this97._snapshotBegun){_this97.beginSnapshot();}if(!params.includeGizmos){_this97.sendToPlugins("snapshotStarting");// Tells plugins to hide things that shouldn't be in snapshot
23870
- }_this97.scene._renderer.renderSnapshot();var snapshotCanvas=_this97.scene._renderer.readSnapshotAsCanvas();if(resize){canvas.width=saveWidth;canvas.height=saveHeight;_this97.scene.glRedraw();}var pluginToCapture={};var pluginContainerElements=[];var finishSnapshot=function finishSnapshot(){if(!params.includeGizmos){_this97.sendToPlugins("snapshotFinished");}if(needFinishSnapshot){_this97.endSnapshot();}var imageWidth=snapshotCanvas.width;var imageHeight=snapshotCanvas.height;var format=params.format||"jpeg";var flipy=false;var image;switch(format){case"jpeg":image=Canvas2Image.saveAsJPEG(snapshotCanvas,true,imageWidth,imageHeight,flipy);break;case"png":image=Canvas2Image.saveAsPNG(snapshotCanvas,true,imageWidth,imageHeight,flipy);break;case"bmp":image=Canvas2Image.saveAsBMP(snapshotCanvas,true,imageWidth,imageHeight,flipy);break;default:_this97.error("[Viewer.getSnapshotWithPlugins] Unsupported image format: '"+format+"' - supported types are 'jpeg', 'bmp' and 'png' - defaulting to 'jpeg'");image=Canvas2Image.saveAsJPEG(snapshotCanvas,true,imageWidth,imageHeight,flipy);}if(!params.includeGizmos){_this97.sendToPlugins("snapshotFinished");}if(needFinishSnapshot){_this97.endSnapshot();}resolve(image.src);};for(var _i538=0,len=_this97._plugins.length;_i538<len;_i538++){// Find plugin container elements
23839
+ }_this97.scene._renderer.renderSnapshot();var snapshotCanvas=_this97.scene._renderer.readSnapshotAsCanvas();if(resize){canvas.width=saveWidth;canvas.height=saveHeight;_this97.scene.glRedraw();}var pluginToCapture={};var pluginContainerElements=[];var finishSnapshot=function finishSnapshot(){if(!params.includeGizmos){_this97.sendToPlugins("snapshotFinished");}if(needFinishSnapshot){_this97.endSnapshot();}var format=params.format||"png";if(format!=="jpeg"&&format!=="png"&&format!=="bmp"){console.error("Unsupported image format: '"+format+"' - supported types are 'jpeg', 'bmp' and 'png' - defaulting to 'png'");format="png";}if(!params.includeGizmos){_this97.sendToPlugins("snapshotFinished");}if(needFinishSnapshot){_this97.endSnapshot();}resolve(snapshotCanvas.toDataURL("image/".concat(format)));};for(var _i538=0,len=_this97._plugins.length;_i538<len;_i538++){// Find plugin container elements
23871
23840
  var plugin=_this97._plugins[_i538];if(plugin.getContainerElement){var containerElement=plugin.getContainerElement();if(containerElement!==document.body){if(!pluginToCapture[containerElement.id]){pluginToCapture[containerElement.id]=true;pluginContainerElements.push(containerElement);}}}}if(pluginContainerElements.length>0){// Render plugin container elements to the snapshot canvas
23872
23841
  for(var _i539=0,_len120=pluginContainerElements.length;_i539<_len120;_i539++){var _containerElement=pluginContainerElements[_i539];html2canvas(_containerElement,{canvas:snapshotCanvas,backgroundColor:null,scale:snapshotCanvas.width/_containerElement.clientWidth}).then(function(){pluginContainerElements.pop();if(pluginContainerElements.length===0){finishSnapshot();}});}}else{finishSnapshot();}});}/**
23873
23842
  * Exits snapshot mode.