UNPKG

@vrspace/babylonjs

Version:

vrspace.org babylonjs client

1 lines 39.1 kB
var BABYLON;(function(BABYLON){var DynamicTerrain=function(){function DynamicTerrain(name,options,scene){var _this=this;this._particleDataStride=9;this._particleColorStride=4;this._particleUVStride=4;this._typeSPS=0;this._typeInstance=1;this._subToleranceX=1|0;this._subToleranceZ=1|0;this._LODLimits=[];this._initialLOD=1|0;this._LODValue=1|0;this._cameraLODCorrection=0|0;this._LODPositiveX=true;this._LODNegativeX=true;this._LODPositiveZ=true;this._LODNegativeZ=true;this._inverted=false;this.shiftFromCamera={x:0,z:0};this._deltaSubX=0|0;this._deltaSubZ=0|0;this._refreshEveryFrame=false;this._useCustomVertexFunction=false;this._computeNormals=false;this._datamap=false;this._uvmap=false;this._colormap=false;this._mapSPData=false;this._colorSPData=false;this._uvSPData=false;this._mapInstanceData=false;this._colorInstanceData=false;this._precomputeInstances=true;this._averageSubSizeX=0;this._averageSubSizeZ=0;this._terrainSizeX=0;this._terrainSizeZ=0;this._terrainHalfSizeX=0;this._terrainHalfSizeZ=0;this._centerWorld=BABYLON.Vector3.Zero();this._centerLocal=BABYLON.Vector3.Zero();this._mapSizeX=0;this._mapSizeZ=0;this._isAlwaysVisible=false;this._precomputeNormalsFromMap=false;this.name=name;this._terrainSub=options.terrainSub||60;this._mapData=options.mapData;this._terrainIdx=this._terrainSub+1;this._mapSubX=options.mapSubX||this._terrainIdx;this._mapSubZ=options.mapSubZ||this._terrainIdx;this._mapUVs=options.mapUVs;this._mapColors=options.mapColors;this._scene=scene;this._terrainCamera=options.camera||scene.activeCamera;this._inverted=options.invertSide;this._SPmapData=options.SPmapData;this._SPcolorData=options.SPcolorData;this._SPuvData=options.SPuvData;this._sps=options.sps;this._instanceMapData=options.instanceMapData;this._instanceColorData=options.instanceColorData;this._sourceMeshes=options.sourceMeshes;this._precomputeInstances=options.precomputeInstances?options.precomputeInstances:true;this._datamap=this._mapData?true:false;this._uvmap=this._mapUVs?true:false;this._colormap=this._mapColors?true:false;this._mapSPData=this._SPmapData?true:false;this._colorSPData=this._mapSPData&&this._SPcolorData?true:false;this._uvSPData=this._mapSPData&&this._SPuvData?true:false;this._mapInstanceData=this._instanceMapData?true:false;this._colorInstanceData=this._mapInstanceData&&this._instanceColorData?true:false;this._mapData=this._datamap?this._mapData:new Float32Array(this._terrainIdx*this._terrainIdx*3);this._mapUVs=this._uvmap?this._mapUVs:new Float32Array(this._terrainIdx*this._terrainIdx*2);if(this._datamap){this._mapNormals=options.mapNormals||new Float32Array(this._mapSubX*this._mapSubZ*3)}else{this._mapNormals=new Float32Array(this._terrainIdx*this._terrainIdx*3)}this._mapQuads=[];var index=0;var posIndex=0;var colIndex=0;var uvIndex=0;var color;var uv;var terIndex=0;var y=0;var terrainPath;var u=0;var v=0;var lg=this._terrainIdx+1;var terrainData=[];var terrainColor=[];var terrainUV=[];var mapData=this._mapData;var mapColors=this._mapColors;var mapUVs=this._mapUVs;var nbAvailableParticlesPerType=[];this._nbAvailableParticlesPerType=nbAvailableParticlesPerType;for(var j=0;j<=this._terrainSub;j++){terrainPath=[];for(var i=0;i<=this._terrainSub;i++){index=this._mod(j*3,this._mapSubZ)*this._mapSubX+this._mod(i*3,this._mapSubX);posIndex=index*3;colIndex=index*3;uvIndex=index*2;terIndex=j*this._terrainIdx+i;if(this._datamap){y=mapData[posIndex+1]}else{y=0;mapData[3*terIndex]=i;mapData[3*terIndex+1]=y;mapData[3*terIndex+2]=j}terrainPath.push(new BABYLON.Vector3(i,y,j));if(this._colormap){color=new BABYLON.Color4(mapColors[colIndex],mapColors[colIndex+1],mapColors[colIndex+2],1)}else{color=new BABYLON.Color4(1,1,1,1)}terrainColor.push(color);if(this._uvmap){uv=new BABYLON.Vector2(mapUVs[uvIndex],mapUVs[uvIndex+1])}else{u=1-Math.abs(1-2*i/lg);v=1-Math.abs(1-2*j/lg);mapUVs[2*terIndex]=u;mapUVs[2*terIndex+1]=v;uv=new BABYLON.Vector2(u,v)}terrainUV.push(uv)}terrainData.push(terrainPath)}this._mapSizeX=Math.abs(mapData[(this._mapSubX-1)*3]-mapData[0]);this._mapSizeZ=Math.abs(mapData[(this._mapSubZ-1)*this._mapSubX*3+2]-mapData[2]);this._averageSubSizeX=this._mapSizeX/this._mapSubX;this._averageSubSizeZ=this._mapSizeZ/this._mapSubZ;var ribbonOptions={pathArray:terrainData,sideOrientation:options.invertSide?BABYLON.Mesh.FRONTSIDE:BABYLON.Mesh.BACKSIDE,colors:terrainColor,uvs:terrainUV,updatable:true};this._terrain=BABYLON.MeshBuilder.CreateRibbon("terrain",ribbonOptions,this._scene);this._indices=this._terrain.getIndices();this._positions=this._terrain.getVerticesData(BABYLON.VertexBuffer.PositionKind);this._normals=this._terrain.getVerticesData(BABYLON.VertexBuffer.NormalKind);this._uvs=this._terrain.getVerticesData(BABYLON.VertexBuffer.UVKind);this._colors=this._terrain.getVerticesData(BABYLON.VertexBuffer.ColorKind);this.computeNormalsFromMap();this.update(true);this._terrain.position.x=this._terrainCamera.globalPosition.x-this._terrainHalfSizeX+this.shiftFromCamera.x;this._terrain.position.z=this._terrainCamera.globalPosition.z-this._terrainHalfSizeZ+this.shiftFromCamera.z;var deltaNbSubX=(this._terrain.position.x-mapData[0])/this._averageSubSizeX;var deltaNbSubZ=(this._terrain.position.z-mapData[2])/this._averageSubSizeZ;this._deltaSubX=deltaNbSubX>0?Math.floor(deltaNbSubX):Math.ceil(deltaNbSubX);this._deltaSubZ=deltaNbSubZ>0?Math.floor(deltaNbSubZ):Math.ceil(deltaNbSubZ);this._scene.onBeforeRenderObservable.add(function(){var refreshEveryFrame=_this._refreshEveryFrame;_this.beforeUpdate(refreshEveryFrame);_this.update(refreshEveryFrame);_this.afterUpdate(refreshEveryFrame)});var SPmapData=this._SPmapData;var instanceMapData=this._instanceMapData;var dataStride=this._particleDataStride;var typeSPS=this._typeSPS;var typeInstance=this._typeInstance;var mapSizeX=this._mapSizeX;var mapSizeZ=this._mapSizeZ;var mapSubX=this._mapSubX;var mapSubZ=this._mapSubZ;var quads=this._mapQuads;if(this._mapSPData){var x0=mapData[0];var z0=mapData[2];for(var t=0;t<SPmapData.length;t++){var data=SPmapData[t];var nb=data.length/dataStride|0;for(var pIdx=0;pIdx<nb;pIdx++){var dIdx=pIdx*dataStride;var x=data[dIdx];var z=data[dIdx+2];x=x-Math.floor((x-x0)/mapSizeX)*mapSizeX;z=z-Math.floor((z-z0)/mapSizeZ)*mapSizeZ;var col=Math.floor((x-x0)*mapSubX/mapSizeX);var row=Math.floor((z-z0)*mapSubZ/mapSizeZ);var quadIdx=row*mapSubX+col;if(quads[quadIdx]===undefined){quads[quadIdx]=[];quads[quadIdx][typeSPS]=[]}if(quads[quadIdx][typeSPS][t]===undefined){quads[quadIdx][typeSPS][t]=[]}var quad=quads[quadIdx][typeSPS][t];quad.push(pIdx)}}var sps=this._sps;sps.computeBoundingBox=true;sps.isAlwaysVisible=true;if(this._colorSPData){sps.computeParticleColor=true}if(this._uvSPData){sps.computeParticleTexture=true}var spsTypeStartIndexes=[];this._spsTypeStartIndexes=spsTypeStartIndexes;var spsNbPerType=[];this._spsNbPerType=spsNbPerType;var nbParticles=sps.nbParticles;var particles=sps.particles;var type=0;spsTypeStartIndexes.push(type);nbAvailableParticlesPerType.push(0);var count=1;for(var p=1;p<nbParticles;p++){particles[p].isVisible=false;if(type!=particles[p].shapeId){type++;spsTypeStartIndexes.push(p);spsNbPerType.push(count);nbAvailableParticlesPerType.push(count);count=0}count++}spsNbPerType.push(count)}if(this._mapInstanceData){var x0=mapData[0];var z0=mapData[2];this._colorBuffers=[];this._instanceWM=[];var posVct=DynamicTerrain._pos;var sclVct=DynamicTerrain._scl;var mat=DynamicTerrain._mat;var quat=DynamicTerrain._quat;var composeToRef=DynamicTerrain._ComposeToRef;for(var t=0;t<instanceMapData.length;t++){var data=instanceMapData[t];var nb=data.length/dataStride|0;if(this._precomputeInstances){this._instanceWM[t]=new Float32Array(nb*16);var instanceWM=this._instanceWM[t]}for(var pIdx=0;pIdx<nb;pIdx++){var dIdx=pIdx*dataStride;var x=data[dIdx];var y_1=data[dIdx+1];var z=data[dIdx+2];if(this._precomputeInstances){posVct.copyFromFloats(x,y_1,z);var rx=data[dIdx+3];var ry=data[dIdx+4];var rz=data[dIdx+5];BABYLON.Quaternion.RotationYawPitchRollToRef(ry,rx,rz,quat);sclVct.copyFromFloats(data[dIdx+6],data[dIdx+7],data[dIdx+8]);composeToRef(sclVct,quat,posVct,mat);var wmIndex=16*pIdx;instanceWM.set(mat,wmIndex)}x=x-Math.floor((x-x0)/mapSizeX)*mapSizeX;z=z-Math.floor((z-z0)/mapSizeZ)*mapSizeZ;var col=Math.floor((x-x0)*mapSubX/mapSizeX);var row=Math.floor((z-z0)*mapSubZ/mapSizeZ);var quadIdx=row*mapSubX+col;if(quads[quadIdx]===undefined){quads[quadIdx]=[];quads[quadIdx][typeInstance]=[]}if(quads[quadIdx][typeInstance]===undefined){quads[quadIdx][typeInstance]=[]}if(quads[quadIdx][typeInstance][t]===undefined){quads[quadIdx][typeInstance][t]=[]}var quad=quads[quadIdx][typeInstance][t];quad.push(pIdx)}}var nbAvailableInstancesPerType=[];this._nbAvailableInstancesPerType=nbAvailableInstancesPerType;var typeNb=this._sourceMeshes.length;var engine=this._scene.getEngine();for(var t=0;t<typeNb;t++){var mesh=this._sourceMeshes[t];mesh.alwaysSelectAsActiveMesh=true;var nb=mesh.instances.length;nbAvailableInstancesPerType[t]=nb;mesh.manualUpdateOfWorldMatrixInstancedBuffer=true;for(var i=0;i<mesh.instances.length;i++){var instance=mesh.instances[i];instance.freezeWorldMatrix();instance.alwaysSelectAsActiveMesh=true;instance.doNotSyncBoundingInfo=true}if(this._colorInstanceData){var colorArray=new Float32Array(4*(mesh.instances.length+1));for(var c=0;c<colorArray.length;c++){colorArray[c]=1}var colorBuffer=new BABYLON.VertexBuffer(engine,colorArray,BABYLON.VertexBuffer.ColorKind,true,false,4,true);mesh.setVerticesBuffer(colorBuffer);this._colorBuffers.push(colorBuffer)}}}this.update(true)}DynamicTerrain.prototype.update=function(force){var needsUpdate=false;var updateLOD=false;var updateForced=force?true:false;var terrainPosition=this._terrain.position;var cameraPosition=this._terrainCamera.globalPosition;var shiftFromCamera=this.shiftFromCamera;var terrainHalfSizeX=this._terrainHalfSizeX;var terrainHalfSizeZ=this._terrainHalfSizeZ;var deltaX=terrainHalfSizeX+terrainPosition.x-cameraPosition.x-shiftFromCamera.x;var deltaZ=terrainHalfSizeZ+terrainPosition.z-cameraPosition.z-shiftFromCamera.z;var subToleranceX=this._subToleranceX;var subToleranceZ=this._subToleranceZ;var mod=this._mod;var oldCorrection=this._cameraLODCorrection;this._cameraLODCorrection=this.updateCameraLOD(this._terrainCamera)|0;updateLOD=oldCorrection==this._cameraLODCorrection?false:true;var LODValue=this._initialLOD+this._cameraLODCorrection;LODValue=LODValue>0?LODValue:1;this._LODValue=LODValue;var mapShiftX=this._averageSubSizeX*subToleranceX*LODValue;var mapShiftZ=this._averageSubSizeZ*subToleranceZ*LODValue;var mapFlgtNb=0|0;var deltaSubX=this._deltaSubX;var deltaSubZ=this._deltaSubZ;if(Math.abs(deltaX)>mapShiftX){var signX=deltaX>0?-1:1;mapFlgtNb=Math.abs(deltaX/mapShiftX)|0;terrainPosition.x+=mapShiftX*signX*mapFlgtNb;deltaSubX+=subToleranceX*signX*LODValue*mapFlgtNb;needsUpdate=true}if(Math.abs(deltaZ)>mapShiftZ){var signZ=deltaZ>0?-1:1;mapFlgtNb=Math.abs(deltaZ/mapShiftZ)|0;terrainPosition.z+=mapShiftZ*signZ*mapFlgtNb;deltaSubZ+=subToleranceZ*signZ*LODValue*mapFlgtNb;needsUpdate=true}var updateSize=updateLOD||updateForced;if(needsUpdate||updateSize){this._deltaSubX=mod(deltaSubX,this._mapSubX);this._deltaSubZ=mod(deltaSubZ,this._mapSubZ);this._updateTerrain(updateSize)}terrainHalfSizeX=this._terrainHalfSizeX;terrainHalfSizeZ=this._terrainHalfSizeZ;this.centerLocal.copyFromFloats(terrainHalfSizeX,0,terrainHalfSizeZ);this._centerWorld.copyFromFloats(terrainPosition.x+terrainHalfSizeX,terrainPosition.y,terrainPosition.z+terrainHalfSizeZ);return this};DynamicTerrain.prototype._updateTerrain=function(updateSize){var stepJ=0|0;var stepI=0|0;var LODLimitDown=0|0;var LODLimitUp=0|0;var LODValue=this._LODValue;var axisLODValue=LODValue;var lodI=LODValue;var lodJ=LODValue;var bbMin=DynamicTerrain._bbMin;var bbMax=DynamicTerrain._bbMax;var terrain=this._terrain;var positions=this._positions;var normals=this._normals;var colors=this._colors;var uvs=this._uvs;var mapColors=this._mapColors;var mapNormals=this._mapNormals;var mapData=this._mapData;var mapUVs=this._mapUVs;var mapSPData=this._mapSPData;var quads=this._mapQuads;var nbPerType=this._spsNbPerType;var SPmapData=this._SPmapData;var SPcolorData=this._SPcolorData;var SPuvData=this._SPuvData;var mapInstanceData=this._mapInstanceData;var instanceMapData=this._instanceMapData;var instanceColorData=this._instanceColorData;var dataStride=this._particleDataStride;var colorStride=this._particleColorStride;var uvStride=this._particleUVStride;var LODLimits=this._LODLimits;var terrainSub=this._terrainSub;var mod=this._mod;var terrainIdx=this._terrainIdx;var mapSubX=this._mapSubX;var mapSubZ=this._mapSubZ;var deltaSubX=this._deltaSubX;var deltaSubZ=this._deltaSubZ;var datamap=this._datamap;var uvmap=this._uvmap;var colormap=this._colormap;var useCustomVertexFunction=this._useCustomVertexFunction;var updateVertex=this.updateVertex;var dontComputeNormals=!this._computeNormals;var LODpstvX=this._LODPositiveX;var LODngtvX=this._LODNegativeX;var LODpstvZ=this._LODPositiveZ;var LODngtvZ=this._LODNegativeZ;var mapSizeX=this._mapSizeX;var mapSizeZ=this._mapSizeZ;var averageSubSizeX=this._averageSubSizeX;var averageSubSizeZ=this._averageSubSizeZ;var particleMap=mapSPData&&quads;var particleColorMap=particleMap&&this._colorSPData;var particleUVMap=particleMap&&this._uvSPData;var typeSPS=this._typeSPS;var typeInstance=this._typeInstance;var instanceMap=mapInstanceData&&quads;var instanceColorMap=instanceMap&&this._colorInstanceData;var precomputeInstances=this._precomputeInstances;var sourceMeshes=this._sourceMeshes;var nbAvailableInstancesPerType=this._nbAvailableInstancesPerType;var composeToRef=DynamicTerrain._ComposeToRef;var copyArrayValuesFromToRef=DynamicTerrain._CopyArrayValuesFromToRef;var instanceWM=this._instanceWM;var sclVct=DynamicTerrain._scl;var posVct=DynamicTerrain._pos;var quat=DynamicTerrain._quat;var matZero=DynamicTerrain._matZero;var l=0|0;var index=0|0;var posIndex1=0|0;var posIndex2=0|0;var posIndex3=0|0;var colIndex=0|0;var uvIndex=0|0;var terIndex=0|0;var ribbonInd=0|0;var ribbonPosInd=0|0;var ribbonUVInd=0|0;var ribbonColInd=0|0;var ribbonColInd1=0|0;var ribbonColInd2=0|0;var ribbonColInd3=0|0;var ribbonColInd4=0|0;var ribbonPosInd1=0|0;var ribbonPosInd2=0|0;var ribbonPosInd3=0|0;if(updateSize){this.updateTerrainSize()}BABYLON.Vector3.FromFloatsToRef(Number.MAX_VALUE,Number.MAX_VALUE,Number.MAX_VALUE,bbMin);BABYLON.Vector3.FromFloatsToRef(-Number.MAX_VALUE,-Number.MAX_VALUE,-Number.MAX_VALUE,bbMax);var x0=mapData[0];var z0=mapData[2];var terrainPos=terrain.position;if(particleMap){var sps=this._sps;var particles=sps.particles;var spsTypeStartIndexes=this._spsTypeStartIndexes;var nbAvailableParticlesPerType=this._nbAvailableParticlesPerType;var nbParticles=sps.nbParticles;for(var p=0;p<nbParticles;p++){particles[p].isVisible=false}}if(instanceMap){var mat=DynamicTerrain._mat;for(var t=0;t<sourceMeshes.length;t++){var sourceMesh=sourceMeshes[t];var instancedBuffer=sourceMesh.worldMatrixInstancedBuffer;if(instancedBuffer){var instances=sourceMesh.instances;var offset=0;for(var i=0;i<instances.length;i++){instancedBuffer.set(matZero,offset);offset+=16}}}}var seamX=false;var seamZ=false;var seamXIndex=0|0;var seamZIndex=0|0;var prevXIndex=mod(deltaSubX,mapSubX);var prevZIndex=mod(deltaSubZ,mapSubZ);var axisZLODValue=0|0;var axisXLODValue=0|0;var curXIndex=0|0;var curZIndex=0|0;var positionsLength=positions.length;var uvsLength=uvs.length;var colorsLength=colors.length;for(var j=1|0;j<=terrainSub;j++){axisZLODValue=LODValue;axisXLODValue=LODValue;for(l=0;l<LODLimits.length;l++){LODLimitDown=LODLimits[l];LODLimitUp=terrainSub-LODLimitDown-1;if(LODngtvZ&&j<LODLimitDown||LODpstvZ&&j>LODLimitUp){axisZLODValue=l+1+LODValue}if(LODngtvX&&j<LODLimitDown||LODpstvX&&j>LODLimitUp){axisXLODValue=l+1+LODValue}lodJ=axisZLODValue;lodI=axisXLODValue}stepJ+=lodJ;stepI+=lodI;if(!seamX){curXIndex=mod(deltaSubX+stepI,mapSubX);if(Math.abs(curXIndex-prevXIndex)>lodI){seamX=true;seamXIndex=stepI}else{prevXIndex=curXIndex}}if(!seamZ){curZIndex=mod(deltaSubZ+stepJ,mapSubZ);if(Math.abs(curZIndex-prevZIndex)>lodJ){seamZ=true;seamZIndex=stepJ}else{prevZIndex=curZIndex}}if(seamZ&&seamX){break}}stepI=0|0;stepJ=0|0;lodI=LODValue;lodJ=LODValue;var zIndex=0|0;var xIndex=0|0;for(var j=0|0;j<=terrainSub;j++){axisLODValue=LODValue;for(l=0;l<LODLimits.length;l++){LODLimitDown=LODLimits[l];LODLimitUp=terrainSub-LODLimitDown-1;if(LODngtvZ&&j<LODLimitDown||LODpstvZ&&j>LODLimitUp){axisLODValue=l+1+LODValue}lodJ=axisLODValue}zIndex=mod(deltaSubZ+stepJ,mapSubZ);for(var i=0|0;i<=terrainSub;i++){axisLODValue=LODValue;for(l=0;l<LODLimits.length;l++){LODLimitDown=LODLimits[l];LODLimitUp=terrainSub-LODLimitDown-1;if(LODngtvX&&i<LODLimitDown||LODpstvX&&i>LODLimitUp){axisLODValue=l+1+LODValue}lodI=axisLODValue}xIndex=mod(deltaSubX+stepI,mapSubX);index=zIndex*mapSubX+xIndex;terIndex=mod(deltaSubZ+stepJ,terrainIdx)*terrainIdx+mod(deltaSubX+stepI,terrainIdx);if(datamap){posIndex1=3*index}else{posIndex1=3*terIndex}if(uvmap){uvIndex=2*index}else{uvIndex=2*terIndex}if(colormap){colIndex=3*index}else{colIndex=3*terIndex}posIndex2=posIndex1+1;posIndex3=posIndex1+2;ribbonPosInd=3*ribbonInd;ribbonColInd=4*ribbonInd;ribbonUVInd=2*ribbonInd;ribbonPosInd1=ribbonPosInd;ribbonPosInd2=ribbonPosInd+1;ribbonPosInd3=ribbonPosInd+2;ribbonColInd1=ribbonColInd;ribbonColInd2=ribbonColInd+1;ribbonColInd3=ribbonColInd+2;ribbonColInd4=ribbonColInd+3;ribbonInd+=1;positions[ribbonPosInd1]=averageSubSizeX*stepI;positions[ribbonPosInd2]=mapData[posIndex2];positions[ribbonPosInd3]=averageSubSizeZ*stepJ;if(dontComputeNormals){normals[ribbonPosInd1]=mapNormals[posIndex1];normals[ribbonPosInd2]=mapNormals[posIndex2];normals[ribbonPosInd3]=mapNormals[posIndex3]}uvs[ribbonUVInd]=mapUVs[uvIndex];uvs[ribbonUVInd+1]=mapUVs[uvIndex+1];if(colormap){colors[ribbonColInd1]=mapColors[colIndex];colors[ribbonColInd2]=mapColors[colIndex+1];colors[ribbonColInd3]=mapColors[colIndex+2]}if(seamZ&&(seamZIndex==stepJ||stepJ==seamZIndex+1)){var back3=3*terrainSub+3;var ind1=mod(ribbonPosInd1-back3,positionsLength);var ind2=ind1+1;var ind3=ind1+2;positions[ribbonPosInd1]=positions[ind1];positions[ribbonPosInd2]=positions[ind2];positions[ribbonPosInd3]=positions[ind3];if(dontComputeNormals){normals[ribbonPosInd1]=normals[ind1];normals[ribbonPosInd2]=normals[ind2];normals[ribbonPosInd3]=normals[ind3]}var back2=2*terrainSub+2;var back4=2*back2;if(stepJ==seamZIndex+1){var induv=mod(ribbonUVInd-back2,uvsLength);uvs[ribbonUVInd]=uvs[induv];uvs[ribbonUVInd+1]=uvs[induv+1];if(colormap){var indcol=mod(ribbonColInd-back4,colorsLength);colors[ribbonColInd1]=colors[indcol];colors[ribbonColInd2]=colors[indcol+1];colors[ribbonColInd3]=colors[indcol+2]}}}if(seamX&&(seamXIndex==stepI||stepI==seamXIndex+1)){var back3=3;var ind1=mod(ribbonPosInd1-back3,positionsLength);var ind2=ind1+1;var ind3=ind1+2;positions[ribbonPosInd1]=positions[ind1];positions[ribbonPosInd2]=positions[ind2];positions[ribbonPosInd3]=positions[ind3];if(dontComputeNormals){normals[ribbonPosInd1]=normals[ind1];normals[ribbonPosInd2]=normals[ind2];normals[ribbonPosInd3]=normals[ind3]}var back2=2;var back4=4;if(stepI==seamXIndex+1){var induv=mod(ribbonUVInd-back2,uvsLength);uvs[ribbonUVInd]=uvs[induv];uvs[ribbonUVInd+1]=uvs[induv+1];if(colormap){var indcol=mod(ribbonColInd-back4,colorsLength);colors[ribbonColInd1]=colors[indcol];colors[ribbonColInd2]=colors[indcol+1];colors[ribbonColInd3]=colors[indcol+2]}}}if(positions[ribbonPosInd1]<bbMin.x){bbMin.x=positions[ribbonPosInd1]}if(positions[ribbonPosInd1]>bbMax.x){bbMax.x=positions[ribbonPosInd1]}if(positions[ribbonPosInd2]<bbMin.y){bbMin.y=positions[ribbonPosInd2]}if(positions[ribbonPosInd2]>bbMax.y){bbMax.y=positions[ribbonPosInd2]}if(positions[ribbonPosInd3]<bbMin.z){bbMin.z=positions[ribbonPosInd3]}if(positions[ribbonPosInd3]>bbMax.z){bbMax.z=positions[ribbonPosInd3]}if(useCustomVertexFunction){var vertex=DynamicTerrain._vertex;var vertexPosition=vertex.position;var vertexWorldPosition=vertex.worldPosition;var vertexColor=vertex.color;var vertexUvs=vertex.uvs;vertexPosition.copyFromFloats(positions[ribbonPosInd1],positions[ribbonPosInd2],positions[ribbonPosInd3]);vertexWorldPosition.copyFromFloats(mapData[posIndex1],vertexPosition.y,mapData[posIndex3]);vertex.lodX=lodI;vertex.lodZ=lodJ;vertexColor.copyFromFloats(colors[ribbonColInd1],colors[ribbonColInd2],colors[ribbonColInd3],colors[ribbonColInd4]);vertexUvs.copyFromFloats(uvs[ribbonUVInd],uvs[ribbonUVInd+1]);vertex.mapIndex=index;updateVertex(vertex,i,j);colors[ribbonColInd1]=vertexColor.r;colors[ribbonColInd2]=vertexColor.g;colors[ribbonColInd3]=vertexColor.b;colors[ribbonColInd4]=vertexColor.a;uvs[ribbonUVInd]=vertexUvs.x;uvs[ribbonUVInd+1]=vertexUvs.y;positions[ribbonPosInd1]=vertexPosition.x;positions[ribbonPosInd2]=vertexPosition.y;positions[ribbonPosInd3]=vertexPosition.z}if(particleMap){if(quads[index]){var quad=quads[index][typeSPS];for(var t=0;t<quad.length;t++){var data=SPmapData[t];var partIndexes=quad[t];if(particleColorMap){var sp_colorData=SPcolorData[t]}if(particleUVMap){var sp_uvData=SPuvData[t]}if(partIndexes){var typeStartIndex=spsTypeStartIndexes[t];var nbQuadParticles=partIndexes.length;var nbInSPS=nbPerType[t];var available=nbAvailableParticlesPerType[t];var rem=nbInSPS-available;var used=rem>0?rem:0;var min=available<nbQuadParticles?available:nbQuadParticles;for(var pIdx=0;pIdx<min;pIdx++){var px=partIndexes[pIdx];var idm=px*dataStride;var particle=particles[typeStartIndex+pIdx+used];var pos=particle.position;var rot=particle.rotation;var scl=particle.scaling;var x=data[idm];pos.x=x+Math.floor((terrainPos.x-x-x0)/mapSizeX)*mapSizeX;pos.y=data[idm+1];var z=data[idm+2];pos.z=z+Math.floor((terrainPos.z-z-z0)/mapSizeZ)*mapSizeZ;rot.x=data[idm+3];rot.y=data[idm+4];rot.z=data[idm+5];scl.x=data[idm+6];scl.y=data[idm+7];scl.z=data[idm+8];if(particleColorMap){var idc=px*colorStride;var col=particle.color;col.r=sp_colorData[idc];col.g=sp_colorData[idc+1];col.b=sp_colorData[idc+2];col.a=sp_colorData[idc+3]}if(particleUVMap){var iduv=px*uvStride;var uvs_1=particle.uvs;uvs_1.x=sp_uvData[iduv];uvs_1.y=sp_uvData[iduv+1];uvs_1.z=sp_uvData[iduv+2];uvs_1.w=sp_uvData[iduv+3]}particle.isVisible=true;available=available-1;used=used+1;min=available<nbQuadParticles?available:nbQuadParticles}available=available>0?available:0;nbAvailableParticlesPerType[t]=available}}}}if(instanceMap){if(quads[index]){var quad=quads[index][typeInstance];var colorBuffers=this._colorBuffers;var tmpCol=DynamicTerrain._col;for(var t=0;t<quad.length;t++){var sourceMesh=this._sourceMeshes[t];var instances=sourceMesh.instances;var instancedBuffer=sourceMesh.worldMatrixInstancedBuffer;var data=instanceMapData[t];var instanceIndexes=quad[t];var instWM=instanceWM[t];if(instanceColorMap){var instance_colorData=instanceColorData[t];var colorBuffer=colorBuffers[t]}if(instanceIndexes&&instancedBuffer){var nbQuadInstances=instanceIndexes.length;var nbInstances=instances.length;var available=nbAvailableInstancesPerType[t];var rem=nbInstances-available;var used=rem>0?rem:0;var min=available<nbQuadInstances?available:nbQuadInstances;for(var iIdx=0;iIdx<min;iIdx++){var ix=instanceIndexes[iIdx];var idm=ix*dataStride;var nextFree=iIdx+used;var bufferIndex=nextFree*16;if(precomputeInstances){copyArrayValuesFromToRef(instWM,ix*16,16,mat)}else{var x=data[idm];var y=data[idm+1];var z=data[idm+2];x=x+Math.floor((terrainPos.x-x-x0)/mapSizeX)*mapSizeX;z=z+Math.floor((terrainPos.z-z-z0)/mapSizeZ)*mapSizeZ;posVct.copyFromFloats(x,y,z);x=data[idm+3];y=data[idm+4];z=data[idm+5];BABYLON.Quaternion.RotationYawPitchRollToRef(y,x,z,quat);sclVct.copyFromFloats(data[idm+6],data[idm+7],data[idm+8]);composeToRef(sclVct,quat,posVct,mat)}instancedBuffer.set(mat,bufferIndex);if(instanceColorData){var idc=ix*colorStride;var colorBufferIndex=nextFree*4;tmpCol[0]=instance_colorData[idc];tmpCol[1]=instance_colorData[idc+1];tmpCol[2]=instance_colorData[idc+2];tmpCol[3]=instance_colorData[idc+3];colorBuffer.updateDirectly(tmpCol,colorBufferIndex)}available=available-1;used=used+1;min=available<nbQuadInstances?available:nbQuadInstances}available=available>0?available:0;this._nbAvailableInstancesPerType[t]=available}}}}stepI+=lodI}if(seamX&&seamXIndex+1==stepI){seamX=false}if(seamZ&&seamZIndex+1==stepJ){seamZ=false}stepJ+=lodJ;stepI=0}if(particleMap){sps.setParticles();for(var c=0;c<nbAvailableParticlesPerType.length;c++){nbAvailableParticlesPerType[c]=nbPerType[c]}}if(instanceMap&&nbAvailableInstancesPerType){for(var c=0;c<nbAvailableInstancesPerType.length;c++){nbAvailableInstancesPerType[c]=this._sourceMeshes[c].instances.length}}terrain.updateVerticesData(BABYLON.VertexBuffer.PositionKind,positions,false,false);if(this._computeNormals){BABYLON.VertexData.ComputeNormals(positions,this._indices,normals)}terrain.updateVerticesData(BABYLON.VertexBuffer.NormalKind,normals,false,false);terrain.updateVerticesData(BABYLON.VertexBuffer.UVKind,uvs,false,false);terrain.updateVerticesData(BABYLON.VertexBuffer.ColorKind,colors,false,false);terrain._boundingInfo.reConstruct(bbMin,bbMax,terrain._worldMatrix)};DynamicTerrain.prototype._mod=function(a,b){return(a%b+b)%b};DynamicTerrain.prototype.updateTerrainSize=function(){var remainder=this._terrainSub;var nb=0|0;var next=0|0;var LODValue=this._LODValue;var lod=LODValue+1;var tsx=0;var tsz=0;var LODLimits=this._LODLimits;var averageSubSizeX=this._averageSubSizeX;var averageSubSizeZ=this._averageSubSizeZ;for(var l=0|0;l<LODLimits.length;l++){lod=LODValue+l+1;next=l>=LODLimits.length-1?0:LODLimits[l+1];nb=2*(LODLimits[l]-next);tsx+=averageSubSizeX*lod*nb;tsz+=averageSubSizeZ*lod*nb;remainder-=nb}tsx+=remainder*averageSubSizeX*LODValue;tsz+=remainder*averageSubSizeZ*LODValue;this._terrainSizeX=tsx;this._terrainSizeZ=tsz;this._terrainHalfSizeX=tsx*.5;this._terrainHalfSizeZ=tsz*.5;return this};DynamicTerrain.prototype.getHeightFromMap=function(x,z,options){return DynamicTerrain._GetHeightFromMap(x,z,this._mapData,this._mapSubX,this._mapSubZ,this._mapSizeX,this._mapSizeZ,options,this._inverted)};DynamicTerrain.GetHeightFromMap=function(x,z,mapData,mapSubX,mapSubZ,options,inverted){var mapSizeX=Math.abs(mapData[(mapSubX-1)*3]-mapData[0]);var mapSizeZ=Math.abs(mapData[(mapSubZ-1)*mapSubX*3+2]-mapData[2]);return DynamicTerrain._GetHeightFromMap(x,z,mapData,mapSubX,mapSubZ,mapSizeX,mapSizeZ,options,inverted)};DynamicTerrain._GetHeightFromMap=function(x,z,mapData,mapSubX,mapSubZ,mapSizeX,mapSizeZ,options,inverted){var x0=mapData[0];var z0=mapData[2];x=x-Math.floor((x-x0)/mapSizeX)*mapSizeX;z=z-Math.floor((z-z0)/mapSizeZ)*mapSizeZ;var col1=Math.floor((x-x0)*mapSubX/mapSizeX);var row1=Math.floor((z-z0)*mapSubZ/mapSizeZ);var col2=(col1+1)%mapSubX;var row2=(row1+1)%mapSubZ;var idx1=3*(row1*mapSubX+col1);var idx2=3*(row1*mapSubX+col2);var idx3=3*(row2*mapSubX+col1);var idx4=3*(row2*mapSubX+col2);var v1=DynamicTerrain._v1;var v2=DynamicTerrain._v2;var v3=DynamicTerrain._v3;var v4=DynamicTerrain._v4;v1.copyFromFloats(mapData[idx1],mapData[idx1+1],mapData[idx1+2]);v2.copyFromFloats(mapData[idx2],mapData[idx2+1],mapData[idx2+2]);v3.copyFromFloats(mapData[idx3],mapData[idx3+1],mapData[idx3+2]);v4.copyFromFloats(mapData[idx4],mapData[idx4+1],mapData[idx4+2]);var vAvB=DynamicTerrain._vAvB;var vAvC=DynamicTerrain._vAvC;var norm=DynamicTerrain._norm;var vA=v1;var vB;var vC;var v;var xv4v1=v4.x-v1.x;var zv4v1=v4.z-v1.z;if(xv4v1==0||zv4v1==0){return v1.y}var cd=zv4v1/xv4v1;var h=v1.z-cd*v1.x;if(z<cd*x+h){vB=v4;vC=v2;v=vA}else{vB=v3;vC=v4;v=vB}vB.subtractToRef(vA,vAvB);vC.subtractToRef(vA,vAvC);BABYLON.Vector3.CrossToRef(vAvB,vAvC,norm);norm.normalize();if(inverted){norm.scaleInPlace(-1)}if(options&&options.normal){options.normal.copyFrom(norm)}var d=-(norm.x*v.x+norm.y*v.y+norm.z*v.z);var y=v.y;if(norm.y!=0){y=-(norm.x*x+norm.z*z+d)/norm.y}return y};DynamicTerrain.ComputeNormalsFromMapToRef=function(mapData,mapSubX,mapSubZ,normals,inverted){var mapIndices=[];var tmp1={normal:BABYLON.Vector3.Zero()};var tmp2={normal:BABYLON.Vector3.Zero()};var normal1=tmp1.normal;var normal2=tmp2.normal;var l=mapSubX*(mapSubZ-1);var i=0;for(i=0;i<l;i++){mapIndices.push(i+1,i+mapSubX,i);mapIndices.push(i+mapSubX,i+1,i+mapSubX+1)}BABYLON.VertexData.ComputeNormals(mapData,mapIndices,normals);var lastIdx=(mapSubX-1)*3;var colStart=0;var colEnd=0;var getHeightFromMap=DynamicTerrain.GetHeightFromMap;for(i=0;i<mapSubZ;i++){colStart=i*mapSubX*3;colEnd=colStart+lastIdx;getHeightFromMap(mapData[colStart],mapData[colStart+2],mapData,mapSubX,mapSubZ,tmp1);getHeightFromMap(mapData[colEnd],mapData[colEnd+2],mapData,mapSubX,mapSubZ,tmp2);normal1.addInPlace(normal2).scaleInPlace(.5);normals[colStart]=normal1.x;normals[colStart+1]=normal1.y;normals[colStart+2]=normal1.z;normals[colEnd]=normal1.x;normals[colEnd+1]=normal1.y;normals[colEnd+2]=normal1.z}if(inverted){for(i=0;i<normals.length;i++){normals[i]=-normals[i]}}};DynamicTerrain.prototype.computeNormalsFromMap=function(){DynamicTerrain.ComputeNormalsFromMapToRef(this._mapData,this._mapSubX,this._mapSubZ,this._mapNormals,this._inverted);return this};DynamicTerrain.prototype.contains=function(x,z){var positions=this._positions;var meshPosition=this.mesh.position;var terrainIdx=this._terrainIdx;if(x<positions[0]+meshPosition.x||x>positions[3*terrainIdx]+meshPosition.x){return false}if(z<positions[2]+meshPosition.z||z>positions[3*terrainIdx*terrainIdx+2]+meshPosition.z){return false}return true};DynamicTerrain.CreateMapFromHeightMap=function(heightmapURL,options,scene){var subX=options.subX||100;var subZ=options.subZ||100;var data=new Float32Array(subX*subZ*3);DynamicTerrain.CreateMapFromHeightMapToRef(heightmapURL,options,data,scene);return data};DynamicTerrain.CreateMapFromHeightMapToRef=function(heightmapURL,options,data,scene){var width=options.width||300;var height=options.height||300;var subX=options.subX||100;var subZ=options.subZ||100;var minHeight=options.minHeight||0;var maxHeight=options.maxHeight||10;var offsetX=options.offsetX||0;var offsetZ=options.offsetZ||0;var filter=options.colorFilter||new BABYLON.Color3(.3,.59,.11);var onReady=options.onReady;var onload=function(img){var canvas=document.createElement("canvas");var context=canvas.getContext("2d");var bufferWidth=img.width;var bufferHeight=img.height;canvas.width=bufferWidth;canvas.height=bufferHeight;context.drawImage(img,0,0);var buffer=context.getImageData(0,0,bufferWidth,bufferHeight).data;var x=0;var y=0;var z=0;for(var row=0;row<subZ;row++){for(var col=0;col<subX;col++){x=col*width/subX-width*.5;z=row*height/subZ-height*.5;var heightmapX=(x+width*.5)/width*(bufferWidth-1)|0;var heightmapY=bufferHeight-1-(z+height*.5)/height*(bufferHeight-1)|0;var pos=(heightmapX+heightmapY*bufferWidth)*4;var gradient=(buffer[pos]*filter.r+buffer[pos+1]*filter.g+buffer[pos+2]*filter.b)/255;y=minHeight+(maxHeight-minHeight)*gradient;var idx=(row*subX+col)*3;data[idx]=x+offsetX;data[idx+1]=y;data[idx+2]=z+offsetZ}}if(onReady){onReady(data,subX,subZ)}};BABYLON.Tools.LoadImage(heightmapURL,onload,function(){},scene.offlineProvider)};DynamicTerrain.CreateUVMapToRef=function(subX,subZ,mapUVs){for(var h=0;h<subZ;h++){for(var w=0;w<subX;w++){mapUVs[(h*subX+w)*2]=w/(subX-1);mapUVs[(h*subX+w)*2+1]=h/(subZ-1)}}};DynamicTerrain.CreateUVMap=function(subX,subZ){var mapUVs=new Float32Array(subX*subZ*2);DynamicTerrain.CreateUVMapToRef(subX,subZ,mapUVs);return mapUVs};DynamicTerrain.prototype.createUVMap=function(){this.mapUVs=DynamicTerrain.CreateUVMap(this._mapSubX,this._mapSubZ);return this};DynamicTerrain._ComposeToRef=function(scale,rotation,translation,m){var x=rotation.x,y=rotation.y,z=rotation.z,w=rotation.w;var x2=x+x,y2=y+y,z2=z+z;var xx=x*x2,xy=x*y2,xz=x*z2;var yy=y*y2,yz=y*z2,zz=z*z2;var wx=w*x2,wy=w*y2,wz=w*z2;var sx=scale.x,sy=scale.y,sz=scale.z;m[0]=(1-(yy+zz))*sx;m[1]=(xy+wz)*sx;m[2]=(xz-wy)*sx;m[3]=0;m[4]=(xy-wz)*sy;m[5]=(1-(xx+zz))*sy;m[6]=(yz+wx)*sy;m[7]=0;m[8]=(xz+wy)*sz;m[9]=(yz-wx)*sz;m[10]=(1-(xx+yy))*sz;m[11]=0;m[12]=translation.x;m[13]=translation.y;m[14]=translation.z;m[15]=1};DynamicTerrain._CopyArrayValuesFromToRef=function(source,start,nb,target){for(var i=0;i<nb;i++){target[i]=source[start+i]}};Object.defineProperty(DynamicTerrain.prototype,"refreshEveryFrame",{get:function(){return this._refreshEveryFrame},set:function(val){this._refreshEveryFrame=val},enumerable:true,configurable:true});Object.defineProperty(DynamicTerrain.prototype,"mesh",{get:function(){return this._terrain},enumerable:true,configurable:true});Object.defineProperty(DynamicTerrain.prototype,"camera",{get:function(){return this._terrainCamera},set:function(val){this._terrainCamera=val},enumerable:true,configurable:true});Object.defineProperty(DynamicTerrain.prototype,"subToleranceX",{get:function(){return this._subToleranceX},set:function(val){this._subToleranceX=val>0?val:1},enumerable:true,configurable:true});Object.defineProperty(DynamicTerrain.prototype,"subToleranceZ",{get:function(){return this._subToleranceZ},set:function(val){this._subToleranceZ=val>0?val:1},enumerable:true,configurable:true});Object.defineProperty(DynamicTerrain.prototype,"initialLOD",{get:function(){return this._initialLOD},set:function(val){this._initialLOD=val>0?val:1},enumerable:true,configurable:true});Object.defineProperty(DynamicTerrain.prototype,"LODValue",{get:function(){return this._LODValue},enumerable:true,configurable:true});Object.defineProperty(DynamicTerrain.prototype,"cameraLODCorrection",{get:function(){return this._cameraLODCorrection},set:function(val){this._cameraLODCorrection=val>=0?val:0},enumerable:true,configurable:true});Object.defineProperty(DynamicTerrain.prototype,"LODPositiveX",{get:function(){return this._LODPositiveX},set:function(val){this._LODPositiveX=val},enumerable:true,configurable:true});Object.defineProperty(DynamicTerrain.prototype,"LODNegativeX",{get:function(){return this._LODNegativeX},set:function(val){this._LODNegativeX=val},enumerable:true,configurable:true});Object.defineProperty(DynamicTerrain.prototype,"LODPositiveZ",{get:function(){return this._LODPositiveZ},set:function(val){this._LODPositiveZ=val},enumerable:true,configurable:true});Object.defineProperty(DynamicTerrain.prototype,"LODNegativeZ",{get:function(){return this._LODNegativeZ},set:function(val){this._LODNegativeZ=val},enumerable:true,configurable:true});Object.defineProperty(DynamicTerrain.prototype,"averageSubSizeX",{get:function(){return this._averageSubSizeX},enumerable:true,configurable:true});Object.defineProperty(DynamicTerrain.prototype,"averageSubSizeZ",{get:function(){return this._averageSubSizeZ},enumerable:true,configurable:true});Object.defineProperty(DynamicTerrain.prototype,"terrainSizeX",{get:function(){return this._terrainSizeX},enumerable:true,configurable:true});Object.defineProperty(DynamicTerrain.prototype,"terrainHalfSizeX",{get:function(){return this._terrainHalfSizeX},enumerable:true,configurable:true});Object.defineProperty(DynamicTerrain.prototype,"terrainSizeZ",{get:function(){return this._terrainSizeZ},enumerable:true,configurable:true});Object.defineProperty(DynamicTerrain.prototype,"terrainHalfSizeZ",{get:function(){return this._terrainHalfSizeZ},enumerable:true,configurable:true});Object.defineProperty(DynamicTerrain.prototype,"centerLocal",{get:function(){return this._centerLocal},enumerable:true,configurable:true});Object.defineProperty(DynamicTerrain.prototype,"centerWorld",{get:function(){return this._centerWorld},enumerable:true,configurable:true});Object.defineProperty(DynamicTerrain.prototype,"LODLimits",{get:function(){return this._LODLimits},set:function(ar){ar.sort(function(a,b){return b-a});this._LODLimits=ar},enumerable:true,configurable:true});Object.defineProperty(DynamicTerrain.prototype,"mapData",{get:function(){return this._mapData},set:function(val){this._mapData=val;this._datamap=true;var mapSubX=this._mapSubX;var mapSubZ=this._mapSubZ;this._mapSizeX=Math.abs(val[(mapSubX-1)*3]-val[0]);this._mapSizeZ=Math.abs(val[(mapSubZ-1)*mapSubX*3+2]-val[2]);this._averageSubSizeX=this._mapSizeX/mapSubX;this._averageSubSizeZ=this._mapSizeZ/mapSubZ;if(this._precomputeNormalsFromMap){this.computeNormalsFromMap()}this.update(true)},enumerable:true,configurable:true});Object.defineProperty(DynamicTerrain.prototype,"mapSubX",{get:function(){return this._mapSubX},set:function(val){this._mapSubX=val},enumerable:true,configurable:true});Object.defineProperty(DynamicTerrain.prototype,"mapSubZ",{get:function(){return this._mapSubZ},set:function(val){this._mapSubZ=val},enumerable:true,configurable:true});Object.defineProperty(DynamicTerrain.prototype,"mapColors",{get:function(){return this._mapColors},set:function(val){this._colormap=true;this._mapColors=val},enumerable:true,configurable:true});Object.defineProperty(DynamicTerrain.prototype,"mapUVs",{get:function(){return this._mapUVs},set:function(val){this._uvmap=true;this._mapUVs=val},enumerable:true,configurable:true});Object.defineProperty(DynamicTerrain.prototype,"mapNormals",{get:function(){return this._mapNormals},set:function(val){this._mapNormals=val},enumerable:true,configurable:true});Object.defineProperty(DynamicTerrain.prototype,"computeNormals",{get:function(){return this._computeNormals},set:function(val){this._computeNormals=val},enumerable:true,configurable:true});Object.defineProperty(DynamicTerrain.prototype,"useCustomVertexFunction",{get:function(){return this._useCustomVertexFunction},set:function(val){this._useCustomVertexFunction=val},enumerable:true,configurable:true});Object.defineProperty(DynamicTerrain.prototype,"isAlwaysVisible",{get:function(){return this._isAlwaysVisible},set:function(val){this.mesh.alwaysSelectAsActiveMesh=val;this._isAlwaysVisible=val},enumerable:true,configurable:true});Object.defineProperty(DynamicTerrain.prototype,"precomputeNormalsFromMap",{get:function(){return this._precomputeNormalsFromMap},set:function(val){this._precomputeNormalsFromMap=val},enumerable:true,configurable:true});DynamicTerrain.prototype.updateVertex=function(vertex,i,j){return};DynamicTerrain.prototype.updateCameraLOD=function(terrainCamera){var camLOD=0;return camLOD};DynamicTerrain.prototype.beforeUpdate=function(refreshEveryFrame){return};DynamicTerrain.prototype.afterUpdate=function(refreshEveryFrame){return};DynamicTerrain._vertex={position:BABYLON.Vector3.Zero(),uvs:BABYLON.Vector2.Zero(),color:new BABYLON.Color4(1,1,1,1),lodX:1|0,lodZ:1|0,worldPosition:BABYLON.Vector3.Zero(),mapIndex:0|0};DynamicTerrain._v1=BABYLON.Vector3.Zero();DynamicTerrain._v2=BABYLON.Vector3.Zero();DynamicTerrain._v3=BABYLON.Vector3.Zero();DynamicTerrain._v4=BABYLON.Vector3.Zero();DynamicTerrain._vAvB=BABYLON.Vector3.Zero();DynamicTerrain._vAvC=BABYLON.Vector3.Zero();DynamicTerrain._norm=BABYLON.Vector3.Zero();DynamicTerrain._bbMin=BABYLON.Vector3.Zero();DynamicTerrain._bbMax=BABYLON.Vector3.Zero();DynamicTerrain._pos=BABYLON.Vector3.Zero();DynamicTerrain._scl=BABYLON.Vector3.Zero();DynamicTerrain._quat=BABYLON.Quaternion.Identity();DynamicTerrain._mat=new Float32Array(16);DynamicTerrain._matZero=new Float32Array([0,0,0,0,0,0,0,0,0,0,0,0,0,0,1]);DynamicTerrain._col=new Float32Array(4);return DynamicTerrain}();BABYLON.DynamicTerrain=DynamicTerrain})(BABYLON||(BABYLON={}));