dy3dmap
Version:
14 lines • 81.9 kB
JavaScript
/**
* Mars3D平台插件,支持气象 风向图 功能插件 mars3d-wind
*
* 版本信息:v3.7.8
* 编译日期:2024-03-25 20:25:02
* 版权所有:Copyright by 火星科技 http://mars3d.cn
* 使用单位:免费公开版 ,2024-01-15
*/
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, (window.mars3d || require('mars3d'))) :
typeof define === 'function' && define.amd ? define(['exports', 'mars3d'], factory) :
(global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global["mars3d-wind"] = {}, global.mars3d));
})(this, (function (exports, mars3d) {
'use strict';const _0x39bbfa=_0xbdb2;(function(_0x57980a,_0x1019d2){const _0x1a324e=_0xbdb2,_0x3df07e=_0x57980a();while(!![]){try{const _0x5f298f=-parseInt(_0x1a324e(0x22a))/0x1*(parseInt(_0x1a324e(0x244))/0x2)+parseInt(_0x1a324e(0x223))/0x3*(-parseInt(_0x1a324e(0x21b))/0x4)+parseInt(_0x1a324e(0x203))/0x5*(parseInt(_0x1a324e(0x1c3))/0x6)+parseInt(_0x1a324e(0x247))/0x7*(parseInt(_0x1a324e(0x251))/0x8)+-parseInt(_0x1a324e(0x2a6))/0x9+-parseInt(_0x1a324e(0x1eb))/0xa+parseInt(_0x1a324e(0x27f))/0xb*(parseInt(_0x1a324e(0x25d))/0xc);if(_0x5f298f===_0x1019d2)break;else _0x3df07e['push'](_0x3df07e['shift']());}catch(_0x93c48b){_0x3df07e['push'](_0x3df07e['shift']());}}}(_0x49d4,0x6852c));function _interopNamespace(_0x2376f6){const _0x547c22=_0xbdb2;if(_0x2376f6&&_0x2376f6[_0x547c22(0x270)])return _0x2376f6;var _0x42a5fb=Object[_0x547c22(0x217)](null);return _0x2376f6&&Object['keys'](_0x2376f6)[_0x547c22(0x28e)](function(_0x5d147d){const _0x13f762=_0x547c22;if(_0x5d147d!==_0x13f762(0x24e)){var _0x21708c=Object['getOwnPropertyDescriptor'](_0x2376f6,_0x5d147d);Object[_0x13f762(0x2af)](_0x42a5fb,_0x5d147d,_0x21708c['get']?_0x21708c:{'enumerable':!![],'get':function(){return _0x2376f6[_0x5d147d];}});}}),_0x42a5fb[_0x547c22(0x24e)]=_0x2376f6,_0x42a5fb;}var mars3d__namespace=_interopNamespace(mars3d);const Cesium$7=mars3d__namespace['Cesium'];function getU(_0x137bce,_0x289289){const _0x699338=_0x137bce*Math['cos'](Cesium$7['Math']['toRadians'](_0x289289));return _0x699338;}function getV(_0x2db3dd,_0x15a4f9){const _0x1bf8a0=_0x2db3dd*Math['sin'](Cesium$7['Math']['toRadians'](_0x15a4f9));return _0x1bf8a0;}function getSpeed(_0x2476be,_0x1df749){const _0x2799f5=Math['sqrt'](Math['pow'](_0x2476be,0x2)+Math['pow'](_0x1df749,0x2));return _0x2799f5;}function getDirection(_0x598a2b,_0x4c56d8){const _0x2cdbba=_0xbdb2;let _0x6fa39c=Cesium$7[_0x2cdbba(0x2ac)]['toDegrees'](Math[_0x2cdbba(0x1f8)](_0x4c56d8,_0x598a2b));return _0x6fa39c+=_0x6fa39c<0x0?0x168:0x0,_0x6fa39c;}function _0xbdb2(_0x541772,_0x3448a5){const _0x49d478=_0x49d4();return _0xbdb2=function(_0xbdb27b,_0x3c7830){_0xbdb27b=_0xbdb27b-0x1c3;let _0x31f024=_0x49d478[_0xbdb27b];return _0x31f024;},_0xbdb2(_0x541772,_0x3448a5);}var WindUtil={'__proto__':null,'getU':getU,'getV':getV,'getSpeed':getSpeed,'getDirection':getDirection};const Cesium$6=mars3d__namespace['Cesium'];class CustomPrimitive{constructor(_0x32cbbd){const _0x40bb2c=_0xbdb2;this['commandType']=_0x32cbbd[_0x40bb2c(0x266)],this['geometry']=_0x32cbbd['geometry'],this['attributeLocations']=_0x32cbbd['attributeLocations'],this[_0x40bb2c(0x25c)]=_0x32cbbd['primitiveType'],this['uniformMap']=_0x32cbbd['uniformMap'],this['vertexShaderSource']=_0x32cbbd[_0x40bb2c(0x243)],this['fragmentShaderSource']=_0x32cbbd[_0x40bb2c(0x28c)],this['rawRenderState']=_0x32cbbd[_0x40bb2c(0x1d1)],this[_0x40bb2c(0x29d)]=_0x32cbbd[_0x40bb2c(0x29d)],this['outputTexture']=_0x32cbbd['outputTexture'],this[_0x40bb2c(0x260)]=_0x32cbbd[_0x40bb2c(0x260)]??![],this['preExecute']=_0x32cbbd[_0x40bb2c(0x1ca)],this[_0x40bb2c(0x1e7)]=!![],this[_0x40bb2c(0x224)]=undefined,this[_0x40bb2c(0x205)]=undefined,this['autoClear']&&(this[_0x40bb2c(0x205)]=new Cesium$6['ClearCommand']({'color':new Cesium$6['Color'](0x0,0x0,0x0,0x0),'depth':0x1,'framebuffer':this['framebuffer'],'pass':Cesium$6['Pass']['OPAQUE']}));}['createCommand'](_0x180078){const _0x32b4c1=_0xbdb2;switch(this['commandType']){case _0x32b4c1(0x268):{const _0x386c5e=Cesium$6[_0x32b4c1(0x21d)][_0x32b4c1(0x1ea)]({'context':_0x180078,'geometry':this['geometry'],'attributeLocations':this[_0x32b4c1(0x28f)],'bufferUsage':Cesium$6[_0x32b4c1(0x262)][_0x32b4c1(0x219)]}),_0x4bfb14=Cesium$6['ShaderProgram']['fromCache']({'context':_0x180078,'attributeLocations':this['attributeLocations'],'vertexShaderSource':this['vertexShaderSource'],'fragmentShaderSource':this['fragmentShaderSource']}),_0x15f5f4=Cesium$6['RenderState']['fromCache'](this['rawRenderState']);return new Cesium$6['DrawCommand']({'primitiveType':this['primitiveType'],'shaderProgram':_0x4bfb14,'vertexArray':_0x386c5e,'modelMatrix':Cesium$6[_0x32b4c1(0x296)]['IDENTITY'],'renderState':_0x15f5f4,'uniformMap':this['uniformMap'],'castShadows':![],'receiveShadows':![],'framebuffer':this['framebuffer'],'pass':Cesium$6['Pass']['OPAQUE'],'pickOnly':!![],'owner':this});}case _0x32b4c1(0x25a):{return new Cesium$6['ComputeCommand']({'owner':this,'fragmentShaderSource':this['fragmentShaderSource'],'uniformMap':this['uniformMap'],'outputTexture':this['outputTexture'],'persists':!![]});}}}[_0x39bbfa(0x231)](_0x492cb1,_0x3bca68){const _0x11297c=_0x39bbfa;this['geometry']=_0x3bca68;const _0x3e0601=Cesium$6[_0x11297c(0x21d)][_0x11297c(0x1ea)]({'context':_0x492cb1,'geometry':this['geometry'],'attributeLocations':this[_0x11297c(0x28f)],'bufferUsage':Cesium$6['BufferUsage']['STATIC_DRAW']});this[_0x11297c(0x224)]['vertexArray']=_0x3e0601;}['update'](_0x3c5692){const _0x5d1818=_0x39bbfa;if(!this['show'])return;if(_0x3c5692[_0x5d1818(0x26d)]!==Cesium$6['SceneMode']['SCENE3D'])return;!Cesium$6['defined'](this['commandToExecute'])&&(this[_0x5d1818(0x224)]=this[_0x5d1818(0x289)](_0x3c5692['context'])),Cesium$6[_0x5d1818(0x237)](this['preExecute'])&&this['preExecute'](),Cesium$6[_0x5d1818(0x237)](this[_0x5d1818(0x205)])&&_0x3c5692[_0x5d1818(0x282)]['push'](this['clearCommand']),_0x3c5692['commandList']['push'](this['commandToExecute']);}[_0x39bbfa(0x21e)](){return![];}['destroy'](){const _0x2ef93f=_0x39bbfa;if(this['clearCommand']){var _0x4640c6,_0x3f8e56;(_0x4640c6=this[_0x2ef93f(0x205)])!==null&&_0x4640c6!==void 0x0&&_0x4640c6['vertexArray']&&this['clearCommand']['vertexArray']['destroy'](),(_0x3f8e56=this['clearCommand'])!==null&&_0x3f8e56!==void 0x0&&_0x3f8e56[_0x2ef93f(0x29f)]&&this['clearCommand']['shaderProgram']['destroy'](),delete this['clearCommand'];}return this['commandToExecute']&&(this['commandToExecute'][_0x2ef93f(0x2a5)]&&this[_0x2ef93f(0x224)]['vertexArray']['destroy'](),this['commandToExecute']['shaderProgram']&&this['commandToExecute']['shaderProgram']['destroy'](),delete this['commandToExecute']),Cesium$6[_0x2ef93f(0x228)](this);}}const Cesium$5=mars3d__namespace['Cesium'],Util=(function(){const _0x130acb=function(){const _0x4ce4d1=_0xbdb2,_0x8230bb=new Cesium$5[(_0x4ce4d1(0x2b6))]({'attributes':new Cesium$5['GeometryAttributes']({'position':new Cesium$5['GeometryAttribute']({'componentDatatype':Cesium$5['ComponentDatatype']['FLOAT'],'componentsPerAttribute':0x3,'values':new Float32Array([-0x1,-0x1,0x0,0x1,-0x1,0x0,0x1,0x1,0x0,-0x1,0x1,0x0])}),'st':new Cesium$5['GeometryAttribute']({'componentDatatype':Cesium$5['ComponentDatatype']['FLOAT'],'componentsPerAttribute':0x2,'values':new Float32Array([0x0,0x0,0x1,0x0,0x1,0x1,0x0,0x1])})}),'indices':new Uint32Array([0x3,0x2,0x0,0x0,0x2,0x1])});return _0x8230bb;},_0x388098=function(_0x5dbb5c,_0x1a7934){const _0x37ce17=_0xbdb2;if(Cesium$5[_0x37ce17(0x237)](_0x1a7934)){const _0x45a48c={};_0x45a48c['arrayBufferView']=_0x1a7934,_0x5dbb5c[_0x37ce17(0x235)]=_0x45a48c;}const _0x4bc1fc=new Cesium$5['Texture'](_0x5dbb5c);return _0x4bc1fc;},_0x2d9965=function(_0x2e144c,_0x37c098,_0x577f14){const _0x5400fa=new Cesium$5['Framebuffer']({'context':_0x2e144c,'colorTextures':[_0x37c098],'depthTexture':_0x577f14});return _0x5400fa;},_0x548e39=function(_0x117d49){const _0x1d33e0=!![],_0x43d4e3=![],_0x30d855={'viewport':_0x117d49['viewport'],'depthTest':_0x117d49['depthTest'],'depthMask':_0x117d49['depthMask'],'blending':_0x117d49['blending']},_0x4f95fe=Cesium$5['Appearance']['getDefaultRenderState'](_0x1d33e0,_0x43d4e3,_0x30d855);return _0x4f95fe;},_0x3883a9=function(_0x5db100){const _0x148e03=_0xbdb2,_0x109f55={},_0x3729a7=Cesium$5['Math']['mod'](_0x5db100['west'],Cesium$5['Math']['TWO_PI']),_0x181dd6=Cesium$5['Math']['mod'](_0x5db100['east'],Cesium$5['Math']['TWO_PI']),_0xb0efd1=_0x5db100[_0x148e03(0x20e)];let _0x4427a2,_0x3123df;_0xb0efd1>Cesium$5[_0x148e03(0x2ac)]['THREE_PI_OVER_TWO']?(_0x4427a2=0x0,_0x3123df=Cesium$5[_0x148e03(0x2ac)][_0x148e03(0x209)]):_0x181dd6-_0x3729a7<_0xb0efd1?(_0x4427a2=_0x3729a7,_0x3123df=_0x3729a7+_0xb0efd1):(_0x4427a2=_0x3729a7,_0x3123df=_0x181dd6);_0x109f55[_0x148e03(0x1f9)]={'min':Cesium$5[_0x148e03(0x2ac)]['toDegrees'](_0x4427a2),'max':Cesium$5[_0x148e03(0x2ac)]['toDegrees'](_0x3123df)};const _0x2644c0=_0x5db100['south'],_0x1450bb=_0x5db100[_0x148e03(0x28a)],_0xc49579=_0x5db100['height'],_0x1e7027=_0xc49579>Cesium$5['Math']['PI']/0xc?_0xc49579/0x2:0x0;let _0x14ee7e=Cesium$5[_0x148e03(0x2ac)]['clampToLatitudeRange'](_0x2644c0-_0x1e7027),_0x187289=Cesium$5['Math'][_0x148e03(0x257)](_0x1450bb+_0x1e7027);return _0x14ee7e<-Cesium$5['Math'][_0x148e03(0x234)]&&(_0x14ee7e=-Cesium$5['Math']['PI_OVER_TWO']),_0x187289>Cesium$5['Math'][_0x148e03(0x234)]&&(_0x187289=Cesium$5[_0x148e03(0x2ac)][_0x148e03(0x22c)]),_0x109f55[_0x148e03(0x24f)]={'min':Cesium$5['Math']['toDegrees'](_0x14ee7e),'max':Cesium$5[_0x148e03(0x2ac)][_0x148e03(0x202)](_0x187289)},_0x109f55;};return{'getFullscreenQuad':_0x130acb,'createTexture':_0x388098,'createFramebuffer':_0x2d9965,'createRawRenderState':_0x548e39,'viewRectangleToLonLatRange':_0x3883a9};}());var segmentDraw_vert='in\x20vec2\x20st;\x0a//\x20it\x20is\x20not\x20normal\x20itself,\x20but\x20used\x20to\x20control\x20normal\x0ain\x20vec3\x20normal;\x20//\x20(point\x20to\x20use,\x20offset\x20sign,\x20not\x20used\x20component)\x0a\x0auniform\x20sampler2D\x20currentParticlesPosition;\x0auniform\x20sampler2D\x20postProcessingPosition;\x0auniform\x20sampler2D\x20postProcessingSpeed;\x0a\x0auniform\x20float\x20particleHeight;\x0a\x0auniform\x20float\x20aspect;\x0auniform\x20float\x20pixelSize;\x0auniform\x20float\x20lineWidth;\x0a\x0aout\x20float\x20speedNormalization;\x0a\x0avec3\x20convertCoordinate(vec3\x20lonLatLev)\x20{\x0a\x20\x20\x20\x20//\x20WGS84\x20(lon,\x20lat,\x20lev)\x20->\x20ECEF\x20(x,\x20y,\x20z)\x0a\x20\x20\x20\x20//\x20see\x20https://en.wikipedia.org/wiki/Geographic_coordinate_conversion#From_geodetic_to_ECEF_coordinates\x20for\x20detail\x0a\x0a\x20\x20\x20\x20//\x20WGS\x2084\x20geometric\x20constants\x0a\x20\x20\x20\x20float\x20a\x20=\x206378137.0;\x20//\x20Semi-major\x20axis\x0a\x20\x20\x20\x20float\x20b\x20=\x206356752.3142;\x20//\x20Semi-minor\x20axis\x0a\x20\x20\x20\x20float\x20e2\x20=\x206.69437999014e-3;\x20//\x20First\x20eccentricity\x20squared\x0a\x0a\x20\x20\x20\x20float\x20latitude\x20=\x20radians(lonLatLev.y);\x0a\x20\x20\x20\x20float\x20longitude\x20=\x20radians(lonLatLev.x);\x0a\x0a\x20\x20\x20\x20float\x20cosLat\x20=\x20cos(latitude);\x0a\x20\x20\x20\x20float\x20sinLat\x20=\x20sin(latitude);\x0a\x20\x20\x20\x20float\x20cosLon\x20=\x20cos(longitude);\x0a\x20\x20\x20\x20float\x20sinLon\x20=\x20sin(longitude);\x0a\x0a\x20\x20\x20\x20float\x20N_Phi\x20=\x20a\x20/\x20sqrt(1.0\x20-\x20e2\x20*\x20sinLat\x20*\x20sinLat);\x0a\x20\x20\x20\x20float\x20h\x20=\x20particleHeight;\x20//\x20it\x20should\x20be\x20high\x20enough\x20otherwise\x20the\x20particle\x20may\x20not\x20pass\x20the\x20terrain\x20depth\x20test\x0a\x0a\x20\x20\x20\x20vec3\x20cartesian\x20=\x20vec3(0.0);\x0a\x20\x20\x20\x20cartesian.x\x20=\x20(N_Phi\x20+\x20h)\x20*\x20cosLat\x20*\x20cosLon;\x0a\x20\x20\x20\x20cartesian.y\x20=\x20(N_Phi\x20+\x20h)\x20*\x20cosLat\x20*\x20sinLon;\x0a\x20\x20\x20\x20cartesian.z\x20=\x20((b\x20*\x20b)\x20/\x20(a\x20*\x20a)\x20*\x20N_Phi\x20+\x20h)\x20*\x20sinLat;\x0a\x20\x20\x20\x20return\x20cartesian;\x0a}\x0a\x0avec4\x20calcProjectedCoordinate(vec3\x20lonLatLev)\x20{\x0a\x20\x20\x20\x20//\x20the\x20range\x20of\x20longitude\x20in\x20Cesium\x20is\x20[-180,\x20180]\x20but\x20the\x20range\x20of\x20longitude\x20in\x20the\x20NetCDF\x20file\x20is\x20[0,\x20360]\x0a\x20\x20\x20\x20//\x20[0,\x20180]\x20is\x20corresponding\x20to\x20[0,\x20180]\x20and\x20[180,\x20360]\x20is\x20corresponding\x20to\x20[-180,\x200]\x0a\x20\x20\x20\x20lonLatLev.x\x20=\x20mod(lonLatLev.x\x20+\x20180.0,\x20360.0)\x20-\x20180.0;\x0a\x20\x20\x20\x20vec3\x20particlePosition\x20=\x20convertCoordinate(lonLatLev);\x0a\x20\x20\x20\x20vec4\x20projectedCoordinate\x20=\x20czm_modelViewProjection\x20*\x20vec4(particlePosition,\x201.0);\x0a\x20\x20\x20\x20return\x20projectedCoordinate;\x0a}\x0a\x0avec4\x20calcOffset(vec4\x20currentProjectedCoordinate,\x20vec4\x20nextProjectedCoordinate,\x20float\x20offsetSign)\x20{\x0a\x20\x20\x20\x20vec2\x20aspectVec2\x20=\x20vec2(aspect,\x201.0);\x0a\x20\x20\x20\x20vec2\x20currentXY\x20=\x20(currentProjectedCoordinate.xy\x20/\x20currentProjectedCoordinate.w)\x20*\x20aspectVec2;\x0a\x20\x20\x20\x20vec2\x20nextXY\x20=\x20(nextProjectedCoordinate.xy\x20/\x20nextProjectedCoordinate.w)\x20*\x20aspectVec2;\x0a\x0a\x20\x20\x20\x20float\x20offsetLength\x20=\x20lineWidth\x20/\x202.0;\x0a\x20\x20\x20\x20vec2\x20direction\x20=\x20normalize(nextXY\x20-\x20currentXY);\x0a\x20\x20\x20\x20vec2\x20normalVector\x20=\x20vec2(-direction.y,\x20direction.x);\x0a\x20\x20\x20\x20normalVector.x\x20=\x20normalVector.x\x20/\x20aspect;\x0a\x20\x20\x20\x20normalVector\x20=\x20offsetLength\x20*\x20normalVector;\x0a\x0a\x20\x20\x20\x20vec4\x20offset\x20=\x20vec4(offsetSign\x20*\x20normalVector,\x200.0,\x200.0);\x0a\x20\x20\x20\x20return\x20offset;\x0a}\x0a\x0avoid\x20main()\x20{\x0a\x20\x20\x20\x20vec2\x20particleIndex\x20=\x20st;\x0a\x0a\x20\x20\x20\x20vec3\x20currentPosition\x20=\x20texture(currentParticlesPosition,\x20particleIndex).rgb;\x0a\x20\x20\x20\x20vec4\x20nextPosition\x20=\x20texture(postProcessingPosition,\x20particleIndex);\x0a\x0a\x20\x20\x20\x20vec4\x20currentProjectedCoordinate\x20=\x20vec4(0.0);\x0a\x20\x20\x20\x20vec4\x20nextProjectedCoordinate\x20=\x20vec4(0.0);\x0a\x20\x20\x20\x20if\x20(nextPosition.w\x20>\x200.0)\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20currentProjectedCoordinate\x20=\x20calcProjectedCoordinate(currentPosition);\x0a\x20\x20\x20\x20\x20\x20\x20\x20nextProjectedCoordinate\x20=\x20calcProjectedCoordinate(currentPosition);\x0a\x20\x20\x20\x20}\x20else\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20currentProjectedCoordinate\x20=\x20calcProjectedCoordinate(currentPosition);\x0a\x20\x20\x20\x20\x20\x20\x20\x20nextProjectedCoordinate\x20=\x20calcProjectedCoordinate(nextPosition.xyz);\x0a\x20\x20\x20\x20}\x0a\x0a\x20\x20\x20\x20float\x20pointToUse\x20=\x20normal.x;\x20//\x20-1\x20is\x20currentProjectedCoordinate\x20and\x20+1\x20is\x20nextProjectedCoordinate\x0a\x20\x20\x20\x20float\x20offsetSign\x20=\x20normal.y;\x0a\x0a\x20\x20\x20\x20vec4\x20offset\x20=\x20pixelSize\x20*\x20calcOffset(currentProjectedCoordinate,\x20nextProjectedCoordinate,\x20offsetSign);\x0a\x20\x20\x20\x20if\x20(pointToUse\x20<\x200.0)\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20gl_Position\x20=\x20currentProjectedCoordinate\x20+\x20offset;\x0a\x20\x20\x20\x20}\x20else\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20gl_Position\x20=\x20nextProjectedCoordinate\x20+\x20offset;\x0a\x20\x20\x20\x20}\x0a\x0a\x20\x20\x20\x20speedNormalization\x20=\x20texture(postProcessingSpeed,\x20particleIndex).a;\x0a}\x0a',segmentDraw_frag='uniform\x20sampler2D\x20colorTable;\x0a\x0ain\x20float\x20speedNormalization;\x0a\x0avoid\x20main()\x20{\x0a\x20\x20\x20\x20out_FragColor\x20=\x20texture(colorTable,\x20vec2(speedNormalization,\x200.0));\x0a}\x0a',fullscreen_vert=_0x39bbfa(0x275),trailDraw_frag='uniform\x20sampler2D\x20segmentsColorTexture;\x0auniform\x20sampler2D\x20segmentsDepthTexture;\x0a\x0auniform\x20sampler2D\x20currentTrailsColor;\x0auniform\x20sampler2D\x20trailsDepthTexture;\x0a\x0auniform\x20float\x20fadeOpacity;\x0a\x0ain\x20vec2\x20textureCoordinate;\x0a\x0avoid\x20main()\x20{\x0a\x20\x20\x20\x20vec4\x20pointsColor\x20=\x20texture(segmentsColorTexture,\x20textureCoordinate);\x0a\x20\x20\x20\x20vec4\x20trailsColor\x20=\x20texture(currentTrailsColor,\x20textureCoordinate);\x0a\x0a\x20\x20\x20\x20trailsColor\x20=\x20floor(fadeOpacity\x20*\x20255.0\x20*\x20trailsColor)\x20/\x20255.0;\x20//\x20make\x20sure\x20the\x20trailsColor\x20will\x20be\x20strictly\x20decreased\x0a\x0a\x20\x20\x20\x20float\x20pointsDepth\x20=\x20texture(segmentsDepthTexture,\x20textureCoordinate).r;\x0a\x20\x20\x20\x20float\x20trailsDepth\x20=\x20texture(trailsDepthTexture,\x20textureCoordinate).r;\x0a\x20\x20\x20\x20float\x20globeDepth\x20=\x20czm_unpackDepth(texture(czm_globeDepthTexture,\x20textureCoordinate));\x0a\x0a\x20\x20\x20\x20out_FragColor\x20=\x20vec4(0.0);\x0a\x20\x20\x20\x20if\x20(pointsDepth\x20<\x20globeDepth)\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20out_FragColor\x20=\x20out_FragColor\x20+\x20pointsColor;\x0a\x20\x20\x20\x20}\x0a\x20\x20\x20\x20if\x20(trailsDepth\x20<\x20globeDepth)\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20out_FragColor\x20=\x20out_FragColor\x20+\x20trailsColor;\x0a\x20\x20\x20\x20}\x0a\x20\x20\x20\x20gl_FragDepth\x20=\x20min(pointsDepth,\x20trailsDepth);\x0a}\x0a',screenDraw_frag='uniform\x20sampler2D\x20trailsColorTexture;\x0auniform\x20sampler2D\x20trailsDepthTexture;\x0a\x0ain\x20vec2\x20textureCoordinate;\x0a\x0avoid\x20main()\x20{\x0a\x20\x20\x20\x20vec4\x20trailsColor\x20=\x20texture(trailsColorTexture,\x20textureCoordinate);\x0a\x20\x20\x20\x20float\x20trailsDepth\x20=\x20texture(trailsDepthTexture,\x20textureCoordinate).r;\x0a\x20\x20\x20\x20float\x20globeDepth\x20=\x20czm_unpackDepth(texture(czm_globeDepthTexture,\x20textureCoordinate));\x0a\x0a\x20\x20\x20\x20if\x20(trailsDepth\x20<\x20globeDepth)\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20out_FragColor\x20=\x20trailsColor;\x0a\x20\x20\x20\x20}\x20else\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20out_FragColor\x20=\x20vec4(0.0);\x0a\x20\x20\x20\x20}\x0a}\x0a';const Cesium$4=mars3d__namespace['Cesium'];class ParticlesRendering{constructor(_0x409718,_0x58af30,_0x4cbe70,_0x9d81b5,_0x120000){const _0x438811=_0x39bbfa;this['createRenderingTextures'](_0x409718,_0x58af30,_0x4cbe70['colors']),this['createRenderingFramebuffers'](_0x409718),this[_0x438811(0x212)](_0x409718,_0x4cbe70,_0x9d81b5,_0x120000);}['createRenderingTextures'](_0x3d3533,_0x338728,_0x21f1a1){const _0x3447a7=_0x39bbfa,_0x10b345={'context':_0x3d3533,'width':_0x3d3533['drawingBufferWidth'],'height':_0x3d3533['drawingBufferHeight'],'pixelFormat':Cesium$4['PixelFormat']['RGBA'],'pixelDatatype':Cesium$4['PixelDatatype']['UNSIGNED_BYTE']},_0x20c30f={'context':_0x3d3533,'width':_0x3d3533['drawingBufferWidth'],'height':_0x3d3533['drawingBufferHeight'],'pixelFormat':Cesium$4['PixelFormat'][_0x3447a7(0x1d8)],'pixelDatatype':Cesium$4['PixelDatatype']['UNSIGNED_INT']},_0x44b8dc=_0x21f1a1[_0x3447a7(0x27d)],_0x4b99c0=new Float32Array(_0x44b8dc*0x3);for(let _0x21ea9a=0x0;_0x21ea9a<_0x44b8dc;_0x21ea9a++){const _0x2abb39=Cesium$4['Color']['fromCssColorString'](_0x21f1a1[_0x21ea9a]);_0x4b99c0[0x3*_0x21ea9a]=_0x2abb39['red'],_0x4b99c0[0x3*_0x21ea9a+0x1]=_0x2abb39[_0x3447a7(0x236)],_0x4b99c0[0x3*_0x21ea9a+0x2]=_0x2abb39['blue'];}const _0x5bfab7={'context':_0x3d3533,'width':_0x44b8dc,'height':0x1,'pixelFormat':Cesium$4['PixelFormat']['RGB'],'pixelDatatype':Cesium$4['PixelDatatype']['FLOAT'],'sampler':new Cesium$4['Sampler']({'minificationFilter':Cesium$4['TextureMinificationFilter']['LINEAR'],'magnificationFilter':Cesium$4[_0x3447a7(0x25f)][_0x3447a7(0x1e4)]})};this['textures']={'segmentsColor':Util[_0x3447a7(0x272)](_0x10b345),'segmentsDepth':Util[_0x3447a7(0x272)](_0x20c30f),'currentTrailsColor':Util['createTexture'](_0x10b345),'currentTrailsDepth':Util['createTexture'](_0x20c30f),'nextTrailsColor':Util['createTexture'](_0x10b345),'nextTrailsDepth':Util[_0x3447a7(0x272)](_0x20c30f),'colorTable':Util[_0x3447a7(0x272)](_0x5bfab7,_0x4b99c0)};}['createRenderingFramebuffers'](_0xeb20be){const _0x19de2a=_0x39bbfa;this[_0x19de2a(0x20a)]={'segments':Util['createFramebuffer'](_0xeb20be,this[_0x19de2a(0x2a4)]['segmentsColor'],this['textures'][_0x19de2a(0x1c9)]),'currentTrails':Util['createFramebuffer'](_0xeb20be,this[_0x19de2a(0x2a4)]['currentTrailsColor'],this[_0x19de2a(0x2a4)][_0x19de2a(0x293)]),'nextTrails':Util[_0x19de2a(0x246)](_0xeb20be,this['textures']['nextTrailsColor'],this['textures'][_0x19de2a(0x26e)])};}[_0x39bbfa(0x20f)](_0x340202){const _0x393480=_0x39bbfa,_0x303123=0x4;let _0x3f50ef=[];for(let _0x2ccb51=0x0;_0x2ccb51<_0x340202[_0x393480(0x291)];_0x2ccb51++){for(let _0x4b0e98=0x0;_0x4b0e98<_0x340202['particlesTextureSize'];_0x4b0e98++){for(let _0x4f9b08=0x0;_0x4f9b08<_0x303123;_0x4f9b08++){_0x3f50ef['push'](_0x2ccb51/_0x340202[_0x393480(0x291)]),_0x3f50ef['push'](_0x4b0e98/_0x340202['particlesTextureSize']);}}}_0x3f50ef=new Float32Array(_0x3f50ef);let _0x4dd177=[];const _0x3662b3=[-0x1,0x1],_0x25de7a=[-0x1,0x1];for(let _0x1ef1fc=0x0;_0x1ef1fc<_0x340202['maxParticles'];_0x1ef1fc++){for(let _0x1c6150=0x0;_0x1c6150<_0x303123/0x2;_0x1c6150++){for(let _0x1d5ca3=0x0;_0x1d5ca3<_0x303123/0x2;_0x1d5ca3++){_0x4dd177['push'](_0x3662b3[_0x1c6150]),_0x4dd177[_0x393480(0x215)](_0x25de7a[_0x1d5ca3]),_0x4dd177[_0x393480(0x215)](0x0);}}}_0x4dd177=new Float32Array(_0x4dd177);const _0x24a653=0x6*_0x340202[_0x393480(0x24a)],_0xa354b1=new Uint32Array(_0x24a653);for(let _0x3c3f3e=0x0,_0x1f3998=0x0,_0x3b593e=0x0;_0x3c3f3e<_0x340202[_0x393480(0x24a)];_0x3c3f3e++){_0xa354b1[_0x1f3998++]=_0x3b593e+0x0,_0xa354b1[_0x1f3998++]=_0x3b593e+0x1,_0xa354b1[_0x1f3998++]=_0x3b593e+0x2,_0xa354b1[_0x1f3998++]=_0x3b593e+0x2,_0xa354b1[_0x1f3998++]=_0x3b593e+0x1,_0xa354b1[_0x1f3998++]=_0x3b593e+0x3,_0x3b593e+=0x4;}const _0xe8a661=new Cesium$4[(_0x393480(0x2b6))]({'attributes':new Cesium$4['GeometryAttributes']({'st':new Cesium$4['GeometryAttribute']({'componentDatatype':Cesium$4[_0x393480(0x28b)]['FLOAT'],'componentsPerAttribute':0x2,'values':_0x3f50ef}),'normal':new Cesium$4[(_0x393480(0x252))]({'componentDatatype':Cesium$4['ComponentDatatype']['FLOAT'],'componentsPerAttribute':0x3,'values':_0x4dd177})}),'indices':_0xa354b1});return _0xe8a661;}[_0x39bbfa(0x212)](_0x5eced7,_0x2c698e,_0x31684b,_0x983ff6){const _0x128988=_0x39bbfa,_0xe23041=this;this[_0x128988(0x1db)]={'segments':new CustomPrimitive({'commandType':'Draw','attributeLocations':{'st':0x0,'normal':0x1},'geometry':this['createSegmentsGeometry'](_0x2c698e),'primitiveType':Cesium$4['PrimitiveType'][_0x128988(0x227)],'uniformMap':{'currentParticlesPosition':function(){return _0x983ff6['particlesTextures']['currentParticlesPosition'];},'postProcessingPosition':function(){const _0x32ca3f=_0x128988;return _0x983ff6['particlesTextures'][_0x32ca3f(0x201)];},'postProcessingSpeed':function(){const _0x581843=_0x128988;return _0x983ff6['particlesTextures'][_0x581843(0x240)];},'colorTable':function(){return _0xe23041['textures']['colorTable'];},'aspect':function(){return _0x5eced7['drawingBufferWidth']/_0x5eced7['drawingBufferHeight'];},'pixelSize':function(){return _0x31684b['pixelSize'];},'lineWidth':function(){return _0x2c698e['lineWidth'];},'particleHeight':function(){const _0x232387=_0x128988;return _0x2c698e[_0x232387(0x278)];}},'vertexShaderSource':new Cesium$4[(_0x128988(0x1d5))]({'sources':[segmentDraw_vert]}),'fragmentShaderSource':new Cesium$4['ShaderSource']({'sources':[segmentDraw_frag]}),'rawRenderState':Util[_0x128988(0x283)]({'viewport':undefined,'depthTest':{'enabled':!![]},'depthMask':!![]}),'framebuffer':this['framebuffers']['segments'],'autoClear':!![]}),'trails':new CustomPrimitive({'commandType':_0x128988(0x268),'attributeLocations':{'position':0x0,'st':0x1},'geometry':Util['getFullscreenQuad'](),'primitiveType':Cesium$4[_0x128988(0x27a)]['TRIANGLES'],'uniformMap':{'segmentsColorTexture':function(){const _0x18a233=_0x128988;return _0xe23041[_0x18a233(0x2a4)]['segmentsColor'];},'segmentsDepthTexture':function(){const _0x255c0e=_0x128988;return _0xe23041[_0x255c0e(0x2a4)][_0x255c0e(0x1c9)];},'currentTrailsColor':function(){const _0x3b7824=_0x128988;return _0xe23041['framebuffers'][_0x3b7824(0x1d2)][_0x3b7824(0x20c)](0x0);},'trailsDepthTexture':function(){return _0xe23041['framebuffers']['currentTrails']['depthTexture'];},'fadeOpacity':function(){return _0x2c698e['fadeOpacity'];}},'vertexShaderSource':new Cesium$4[(_0x128988(0x1d5))]({'defines':['DISABLE_GL_POSITION_LOG_DEPTH'],'sources':[fullscreen_vert]}),'fragmentShaderSource':new Cesium$4['ShaderSource']({'defines':['DISABLE_LOG_DEPTH_FRAGMENT_WRITE'],'sources':[trailDraw_frag]}),'rawRenderState':Util['createRawRenderState']({'viewport':undefined,'depthTest':{'enabled':!![],'func':Cesium$4['DepthFunction'][_0x128988(0x1e6)]},'depthMask':!![]}),'framebuffer':this['framebuffers']['nextTrails'],'autoClear':!![],'preExecute':function(){const _0x1a52ad=_0x128988,_0xb979fd=_0xe23041['framebuffers']['currentTrails'];_0xe23041['framebuffers']['currentTrails']=_0xe23041['framebuffers']['nextTrails'],_0xe23041['framebuffers']['nextTrails']=_0xb979fd,_0xe23041[_0x1a52ad(0x1db)]['trails']['commandToExecute'][_0x1a52ad(0x29d)]=_0xe23041['framebuffers']['nextTrails'],_0xe23041['primitives'][_0x1a52ad(0x1c5)][_0x1a52ad(0x205)]['framebuffer']=_0xe23041['framebuffers']['nextTrails'];}}),'screen':new CustomPrimitive({'commandType':_0x128988(0x268),'attributeLocations':{'position':0x0,'st':0x1},'geometry':Util[_0x128988(0x2a1)](),'primitiveType':Cesium$4[_0x128988(0x27a)][_0x128988(0x227)],'uniformMap':{'trailsColorTexture':function(){const _0x14659d=_0x128988;return _0xe23041['framebuffers']['nextTrails'][_0x14659d(0x20c)](0x0);},'trailsDepthTexture':function(){return _0xe23041['framebuffers']['nextTrails']['depthTexture'];}},'vertexShaderSource':new Cesium$4['ShaderSource']({'defines':[_0x128988(0x1de)],'sources':[fullscreen_vert]}),'fragmentShaderSource':new Cesium$4['ShaderSource']({'defines':['DISABLE_LOG_DEPTH_FRAGMENT_WRITE'],'sources':[screenDraw_frag]}),'rawRenderState':Util['createRawRenderState']({'viewport':undefined,'depthTest':{'enabled':![]},'depthMask':!![],'blending':{'enabled':!![]}}),'framebuffer':undefined})};}}var getWind_frag='//\x20the\x20size\x20of\x20UV\x20textures:\x20width\x20=\x20lon,\x20height\x20=\x20lat*lev\x0auniform\x20sampler2D\x20U;\x20//\x20eastward\x20wind\x0auniform\x20sampler2D\x20V;\x20//\x20northward\x20wind\x0a\x0auniform\x20sampler2D\x20currentParticlesPosition;\x20//\x20(lon,\x20lat,\x20lev)\x0a\x0auniform\x20vec3\x20dimension;\x20//\x20(lon,\x20lat,\x20lev)\x0auniform\x20vec3\x20minimum;\x20//\x20minimum\x20of\x20each\x20dimension\x0auniform\x20vec3\x20maximum;\x20//\x20maximum\x20of\x20each\x20dimension\x0auniform\x20vec3\x20interval;\x20//\x20interval\x20of\x20each\x20dimension\x0a\x0ain\x20vec2\x20v_textureCoordinates;\x0a\x0avec2\x20mapPositionToNormalizedIndex2D(vec3\x20lonLatLev)\x20{\x0a\x20\x20\x20\x20//\x20ensure\x20the\x20range\x20of\x20longitude\x20and\x20latitude\x0a\x20\x20\x20\x20lonLatLev.x\x20=\x20mod(lonLatLev.x,\x20360.0);\x0a\x20\x20\x20\x20lonLatLev.y\x20=\x20clamp(lonLatLev.y,\x20-90.0,\x2090.0);\x0a\x0a\x20\x20\x20\x20vec3\x20index3D\x20=\x20vec3(0.0);\x0a\x20\x20\x20\x20index3D.x\x20=\x20(lonLatLev.x\x20-\x20minimum.x)\x20/\x20interval.x;\x0a\x20\x20\x20\x20index3D.y\x20=\x20(lonLatLev.y\x20-\x20minimum.y)\x20/\x20interval.y;\x0a\x20\x20\x20\x20index3D.z\x20=\x20(lonLatLev.z\x20-\x20minimum.z)\x20/\x20interval.z;\x0a\x0a\x20\x20\x20\x20//\x20the\x20st\x20texture\x20coordinate\x20corresponding\x20to\x20(col,\x20row)\x20index\x0a\x20\x20\x20\x20//\x20example\x0a\x20\x20\x20\x20//\x20data\x20array\x20is\x20[0,\x201,\x202,\x203,\x204,\x205],\x20width\x20=\x203,\x20height\x20=\x202\x0a\x20\x20\x20\x20//\x20the\x20content\x20of\x20texture\x20will\x20be\x0a\x20\x20\x20\x20//\x20t\x201.0\x0a\x20\x20\x20\x20//\x20\x20\x20\x20|\x20\x203\x204\x205\x0a\x20\x20\x20\x20//\x20\x20\x20\x20|\x0a\x20\x20\x20\x20//\x20\x20\x20\x20|\x20\x200\x201\x202\x0a\x20\x20\x20\x20//\x20\x20\x200.0------1.0\x20s\x0a\x0a\x20\x20\x20\x20vec2\x20index2D\x20=\x20vec2(index3D.x,\x20index3D.z\x20*\x20dimension.y\x20+\x20index3D.y);\x0a\x20\x20\x20\x20vec2\x20normalizedIndex2D\x20=\x20vec2(index2D.x\x20/\x20dimension.x,\x20index2D.y\x20/\x20(dimension.y\x20*\x20dimension.z));\x0a\x20\x20\x20\x20return\x20normalizedIndex2D;\x0a}\x0a\x0afloat\x20getWind(sampler2D\x20windTexture,\x20vec3\x20lonLatLev)\x20{\x0a\x20\x20\x20\x20vec2\x20normalizedIndex2D\x20=\x20mapPositionToNormalizedIndex2D(lonLatLev);\x0a\x20\x20\x20\x20float\x20result\x20=\x20texture(windTexture,\x20normalizedIndex2D).r;\x0a\x20\x20\x20\x20return\x20result;\x0a}\x0a\x0aconst\x20mat4\x20kernelMatrix\x20=\x20mat4(\x0a\x20\x20\x20\x200.0,\x20-1.0,\x202.0,\x20-1.0,\x20//\x20first\x20column\x0a\x20\x20\x20\x202.0,\x200.0,\x20-5.0,\x203.0,\x20//\x20second\x20column\x0a\x20\x20\x20\x200.0,\x201.0,\x204.0,\x20-3.0,\x20//\x20third\x20column\x0a\x20\x20\x20\x200.0,\x200.0,\x20-1.0,\x201.0\x20//\x20fourth\x20column\x0a);\x0afloat\x20oneDimensionInterpolation(float\x20t,\x20float\x20p0,\x20float\x20p1,\x20float\x20p2,\x20float\x20p3)\x20{\x0a\x20\x20\x20\x20vec4\x20tVec4\x20=\x20vec4(1.0,\x20t,\x20t\x20*\x20t,\x20t\x20*\x20t\x20*\x20t);\x0a\x20\x20\x20\x20tVec4\x20=\x20tVec4\x20/\x202.0;\x0a\x20\x20\x20\x20vec4\x20pVec4\x20=\x20vec4(p0,\x20p1,\x20p2,\x20p3);\x0a\x20\x20\x20\x20return\x20dot((tVec4\x20*\x20kernelMatrix),\x20pVec4);\x0a}\x0a\x0afloat\x20calculateB(sampler2D\x20windTexture,\x20float\x20t,\x20float\x20lon,\x20float\x20lat,\x20float\x20lev)\x20{\x0a\x20\x20\x20\x20float\x20lon0\x20=\x20floor(lon)\x20-\x201.0\x20*\x20interval.x;\x0a\x20\x20\x20\x20float\x20lon1\x20=\x20floor(lon);\x0a\x20\x20\x20\x20float\x20lon2\x20=\x20floor(lon)\x20+\x201.0\x20*\x20interval.x;\x0a\x20\x20\x20\x20float\x20lon3\x20=\x20floor(lon)\x20+\x202.0\x20*\x20interval.x;\x0a\x0a\x20\x20\x20\x20float\x20p0\x20=\x20getWind(windTexture,\x20vec3(lon0,\x20lat,\x20lev));\x0a\x20\x20\x20\x20float\x20p1\x20=\x20getWind(windTexture,\x20vec3(lon1,\x20lat,\x20lev));\x0a\x20\x20\x20\x20float\x20p2\x20=\x20getWind(windTexture,\x20vec3(lon2,\x20lat,\x20lev));\x0a\x20\x20\x20\x20float\x20p3\x20=\x20getWind(windTexture,\x20vec3(lon3,\x20lat,\x20lev));\x0a\x0a\x20\x20\x20\x20return\x20oneDimensionInterpolation(t,\x20p0,\x20p1,\x20p2,\x20p3);\x0a}\x0a\x0afloat\x20interpolateOneTexture(sampler2D\x20windTexture,\x20vec3\x20lonLatLev)\x20{\x0a\x20\x20\x20\x20float\x20lon\x20=\x20lonLatLev.x;\x0a\x20\x20\x20\x20float\x20lat\x20=\x20lonLatLev.y;\x0a\x20\x20\x20\x20float\x20lev\x20=\x20lonLatLev.z;\x0a\x0a\x20\x20\x20\x20float\x20lat0\x20=\x20floor(lat)\x20-\x201.0\x20*\x20interval.y;\x0a\x20\x20\x20\x20float\x20lat1\x20=\x20floor(lat);\x0a\x20\x20\x20\x20float\x20lat2\x20=\x20floor(lat)\x20+\x201.0\x20*\x20interval.y;\x0a\x20\x20\x20\x20float\x20lat3\x20=\x20floor(lat)\x20+\x202.0\x20*\x20interval.y;\x0a\x0a\x20\x20\x20\x20vec2\x20coefficient\x20=\x20lonLatLev.xy\x20-\x20floor(lonLatLev.xy);\x0a\x20\x20\x20\x20float\x20b0\x20=\x20calculateB(windTexture,\x20coefficient.x,\x20lon,\x20lat0,\x20lev);\x0a\x20\x20\x20\x20float\x20b1\x20=\x20calculateB(windTexture,\x20coefficient.x,\x20lon,\x20lat1,\x20lev);\x0a\x20\x20\x20\x20float\x20b2\x20=\x20calculateB(windTexture,\x20coefficient.x,\x20lon,\x20lat2,\x20lev);\x0a\x20\x20\x20\x20float\x20b3\x20=\x20calculateB(windTexture,\x20coefficient.x,\x20lon,\x20lat3,\x20lev);\x0a\x0a\x20\x20\x20\x20return\x20oneDimensionInterpolation(coefficient.y,\x20b0,\x20b1,\x20b2,\x20b3);\x0a}\x0a\x0avec3\x20bicubic(vec3\x20lonLatLev)\x20{\x0a\x20\x20\x20\x20//\x20https://en.wikipedia.org/wiki/Bicubic_interpolation#Bicubic_convolution_algorithm\x0a\x20\x20\x20\x20float\x20u\x20=\x20interpolateOneTexture(U,\x20lonLatLev);\x0a\x20\x20\x20\x20float\x20v\x20=\x20interpolateOneTexture(V,\x20lonLatLev);\x0a\x20\x20\x20\x20float\x20w\x20=\x200.0;\x0a\x20\x20\x20\x20return\x20vec3(u,\x20v,\x20w);\x0a}\x0a\x0avoid\x20main()\x20{\x0a\x20\x20\x20\x20//\x20texture\x20coordinate\x20must\x20be\x20normalized\x0a\x20\x20\x20\x20vec3\x20lonLatLev\x20=\x20texture(currentParticlesPosition,\x20v_textureCoordinates).rgb;\x0a\x20\x20\x20\x20vec3\x20windVector\x20=\x20bicubic(lonLatLev);\x0a\x20\x20\x20\x20out_FragColor\x20=\x20vec4(windVector,\x200.0);\x0a}\x0a',updateSpeed_frag='uniform\x20sampler2D\x20currentParticlesSpeed;\x20//\x20(u,\x20v,\x20w,\x20normalization)\x0auniform\x20sampler2D\x20particlesWind;\x0a\x0a//\x20used\x20to\x20calculate\x20the\x20wind\x20norm\x0auniform\x20vec2\x20uSpeedRange;\x20//\x20(min,\x20max);\x0auniform\x20vec2\x20vSpeedRange;\x0auniform\x20float\x20pixelSize;\x0auniform\x20float\x20speedFactor;\x0a\x0ain\x20vec2\x20v_textureCoordinates;\x0a\x0afloat\x20calculateWindNorm(vec3\x20speed)\x20{\x0a\x20\x20\x20\x20vec3\x20percent\x20=\x20vec3(0.0);\x0a\x20\x20\x20\x20percent.x\x20=\x20(speed.x\x20-\x20uSpeedRange.x)\x20/\x20(uSpeedRange.y\x20-\x20uSpeedRange.x);\x0a\x20\x20\x20\x20percent.y\x20=\x20(speed.y\x20-\x20vSpeedRange.x)\x20/\x20(vSpeedRange.y\x20-\x20vSpeedRange.x);\x0a\x20\x20\x20\x20float\x20normalization\x20=\x20length(percent);\x0a\x0a\x20\x20\x20\x20return\x20normalization;\x0a}\x0a\x0avoid\x20main()\x20{\x0a\x20\x20\x20\x20//\x20texture\x20coordinate\x20must\x20be\x20normalized\x0a\x20\x20\x20\x20//\x20vec3\x20currentSpeed\x20=\x20texture(currentParticlesSpeed,\x20v_textureCoordinates).rgb;\x0a\x20\x20\x20\x20vec3\x20windVector\x20=\x20texture(particlesWind,\x20v_textureCoordinates).rgb;\x0a\x0a\x20\x20\x20\x20vec4\x20nextSpeed\x20=\x20vec4(speedFactor\x20*\x20pixelSize\x20*\x20windVector,\x20calculateWindNorm(windVector));\x0a\x20\x20\x20\x20out_FragColor\x20=\x20nextSpeed;\x0a}\x0a',updatePosition_frag=_0x39bbfa(0x1fa),postProcessingPosition_frag='uniform\x20sampler2D\x20nextParticlesPosition;\x0auniform\x20sampler2D\x20nextParticlesSpeed;\x20//\x20(u,\x20v,\x20w,\x20normalization)\x0a\x0a//\x20range\x20(min,\x20max)\x0auniform\x20vec2\x20lonRange;\x0auniform\x20vec2\x20latRange;\x0a\x0auniform\x20float\x20randomCoefficient;\x20//\x20use\x20to\x20improve\x20the\x20pseudo-random\x20generator\x0auniform\x20float\x20dropRate;\x20//\x20drop\x20rate\x20is\x20a\x20chance\x20a\x20particle\x20will\x20restart\x20at\x20random\x20position\x20to\x20avoid\x20degeneration\x0auniform\x20float\x20dropRateBump;\x0a\x0ain\x20vec2\x20v_textureCoordinates;\x0a\x0a//\x20pseudo-random\x20generator\x0aconst\x20vec3\x20randomConstants\x20=\x20vec3(12.9898,\x2078.233,\x204375.85453);\x0aconst\x20vec2\x20normalRange\x20=\x20vec2(0.0,\x201.0);\x0afloat\x20rand(vec2\x20seed,\x20vec2\x20range)\x20{\x0a\x20\x20\x20\x20vec2\x20randomSeed\x20=\x20randomCoefficient\x20*\x20seed;\x0a\x20\x20\x20\x20float\x20temp\x20=\x20dot(randomConstants.xy,\x20randomSeed);\x0a\x20\x20\x20\x20temp\x20=\x20fract(sin(temp)\x20*\x20(randomConstants.z\x20+\x20temp));\x0a\x20\x20\x20\x20return\x20temp\x20*\x20(range.y\x20-\x20range.x)\x20+\x20range.x;\x0a}\x0a\x0avec3\x20generateRandomParticle(vec2\x20seed,\x20float\x20lev)\x20{\x0a\x20\x20\x20\x20//\x20ensure\x20the\x20longitude\x20is\x20in\x20[0,\x20360]\x0a\x20\x20\x20\x20float\x20randomLon\x20=\x20mod(rand(seed,\x20lonRange),\x20360.0);\x0a\x20\x20\x20\x20float\x20randomLat\x20=\x20rand(-seed,\x20latRange);\x0a\x0a\x20\x20\x20\x20return\x20vec3(randomLon,\x20randomLat,\x20lev);\x0a}\x0a\x0abool\x20particleOutbound(vec3\x20particle)\x20{\x0a\x20\x20\x20\x20return\x20particle.y\x20<\x20-90.0\x20||\x20particle.y\x20>\x2090.0;\x0a}\x0a\x0avoid\x20main()\x20{\x0a\x20\x20\x20\x20vec3\x20nextParticle\x20=\x20texture(nextParticlesPosition,\x20v_textureCoordinates).rgb;\x0a\x20\x20\x20\x20vec4\x20nextSpeed\x20=\x20texture(nextParticlesSpeed,\x20v_textureCoordinates);\x0a\x20\x20\x20\x20float\x20particleDropRate\x20=\x20dropRate\x20+\x20dropRateBump\x20*\x20nextSpeed.a;\x0a\x0a\x20\x20\x20\x20vec2\x20seed1\x20=\x20nextParticle.xy\x20+\x20v_textureCoordinates;\x0a\x20\x20\x20\x20vec2\x20seed2\x20=\x20nextSpeed.xy\x20+\x20v_textureCoordinates;\x0a\x20\x20\x20\x20vec3\x20randomParticle\x20=\x20generateRandomParticle(seed1,\x20nextParticle.z);\x0a\x20\x20\x20\x20float\x20randomNumber\x20=\x20rand(seed2,\x20normalRange);\x0a\x0a\x20\x20\x20\x20if\x20(randomNumber\x20<\x20particleDropRate\x20||\x20particleOutbound(nextParticle))\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20out_FragColor\x20=\x20vec4(randomParticle,\x201.0);\x20//\x201.0\x20means\x20this\x20is\x20a\x20random\x20particle\x0a\x20\x20\x20\x20}\x20else\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20out_FragColor\x20=\x20vec4(nextParticle,\x200.0);\x0a\x20\x20\x20\x20}\x0a}\x0a',postProcessingSpeed_frag='uniform\x20sampler2D\x20postProcessingPosition;\x0auniform\x20sampler2D\x20nextParticlesSpeed;\x0a\x0ain\x20vec2\x20v_textureCoordinates;\x0a\x0avoid\x20main()\x20{\x0a\x20\x20\x20\x20vec4\x20randomParticle\x20=\x20texture(postProcessingPosition,\x20v_textureCoordinates);\x0a\x20\x20\x20\x20vec4\x20particleSpeed\x20=\x20texture(nextParticlesSpeed,\x20v_textureCoordinates);\x0a\x0a\x20\x20\x20\x20if\x20(randomParticle.a\x20>\x200.0)\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20out_FragColor\x20=\x20vec4(0.0);\x0a\x20\x20\x20\x20}\x20else\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20out_FragColor\x20=\x20particleSpeed;\x0a\x20\x20\x20\x20}\x0a}\x0a';const Cesium$3=mars3d__namespace['Cesium'];class ParticlesComputing{constructor(_0x2e935d,_0x2297c5,_0x32ad8e,_0x204e09){const _0x26f529=_0x39bbfa;this[_0x26f529(0x222)]=_0x2297c5,this['createWindTextures'](_0x2e935d,_0x2297c5),this['createParticlesTextures'](_0x2e935d,_0x32ad8e,_0x204e09),this['createComputingPrimitives'](_0x2297c5,_0x32ad8e,_0x204e09);}[_0x39bbfa(0x1e0)](_0x3db4b2,_0x41584e){const _0x4e71e6=_0x39bbfa,_0x32f408={'context':_0x3db4b2,'width':_0x41584e['dimensions']['lon'],'height':_0x41584e['dimensions']['lat']*(_0x41584e[_0x4e71e6(0x249)]['lev']||0x1),'pixelFormat':Cesium$3['PixelFormat'][_0x4e71e6(0x295)],'pixelDatatype':Cesium$3['PixelDatatype']['FLOAT'],'flipY':![],'sampler':new Cesium$3[(_0x4e71e6(0x23c))]({'minificationFilter':Cesium$3['TextureMinificationFilter'][_0x4e71e6(0x206)],'magnificationFilter':Cesium$3[_0x4e71e6(0x25f)]['NEAREST']})};this['windTextures']={'U':Util['createTexture'](_0x32f408,_0x41584e['U']['array']),'V':Util['createTexture'](_0x32f408,_0x41584e['V'][_0x4e71e6(0x265)])};}[_0x39bbfa(0x1f7)](_0x52f7db,_0x58f3d1,_0x26af3a){const _0x5a22c7=_0x39bbfa,_0x56da06={'context':_0x52f7db,'width':_0x58f3d1[_0x5a22c7(0x291)],'height':_0x58f3d1['particlesTextureSize'],'pixelFormat':Cesium$3['PixelFormat'][_0x5a22c7(0x221)],'pixelDatatype':Cesium$3['PixelDatatype']['FLOAT'],'flipY':![],'sampler':new Cesium$3['Sampler']({'minificationFilter':Cesium$3['TextureMinificationFilter'][_0x5a22c7(0x206)],'magnificationFilter':Cesium$3[_0x5a22c7(0x25f)]['NEAREST']})},_0xb33b5f=this['randomizeParticles'](_0x58f3d1[_0x5a22c7(0x24a)],_0x26af3a),_0x4b2a12=new Float32Array(0x4*_0x58f3d1[_0x5a22c7(0x24a)])['fill'](0x0);this['particlesTextures']={'particlesWind':Util[_0x5a22c7(0x272)](_0x56da06),'currentParticlesPosition':Util['createTexture'](_0x56da06,_0xb33b5f),'nextParticlesPosition':Util['createTexture'](_0x56da06,_0xb33b5f),'currentParticlesSpeed':Util['createTexture'](_0x56da06,_0x4b2a12),'nextParticlesSpeed':Util['createTexture'](_0x56da06,_0x4b2a12),'postProcessingPosition':Util['createTexture'](_0x56da06,_0xb33b5f),'postProcessingSpeed':Util['createTexture'](_0x56da06,_0x4b2a12)};}['randomizeParticles'](_0x3f99ba,_0x2dcb4d){const _0x1bf6e6=_0x39bbfa,_0x3cfd9c=new Float32Array(0x4*_0x3f99ba);for(let _0x1b3bb7=0x0;_0x1b3bb7<_0x3f99ba;_0x1b3bb7++){_0x3cfd9c[0x4*_0x1b3bb7]=Cesium$3['Math'][_0x1bf6e6(0x214)](_0x2dcb4d['lonRange']['x'],_0x2dcb4d['lonRange']['y']),_0x3cfd9c[0x4*_0x1b3bb7+0x1]=Cesium$3['Math']['randomBetween'](_0x2dcb4d[_0x1bf6e6(0x2aa)]['x'],_0x2dcb4d['latRange']['y']),_0x3cfd9c[0x4*_0x1b3bb7+0x2]=Cesium$3['Math']['randomBetween'](this['data']['lev'][_0x1bf6e6(0x1ed)],this['data']['lev']['max']),_0x3cfd9c[0x4*_0x1b3bb7+0x3]=0x0;}return _0x3cfd9c;}['destroyParticlesTextures'](){const _0x33fd6e=_0x39bbfa;Object[_0x33fd6e(0x267)](this['particlesTextures'])['forEach'](_0x27799d=>{const _0x34e4d3=_0x33fd6e;this['particlesTextures'][_0x27799d][_0x34e4d3(0x1dc)]();});}['createComputingPrimitives'](_0x3b7061,_0x1fb86c,_0x15e90d){const _0x50bd3d=_0x39bbfa,_0x449180=new Cesium$3['Cartesian3'](_0x3b7061['dimensions'][_0x50bd3d(0x1f9)],_0x3b7061['dimensions']['lat'],_0x3b7061['dimensions']['lev']),_0x4a8678=new Cesium$3['Cartesian3'](_0x3b7061['lon']['min'],_0x3b7061['lat'][_0x50bd3d(0x1ed)],_0x3b7061[_0x50bd3d(0x253)][_0x50bd3d(0x1ed)]),_0x1d2e76=new Cesium$3['Cartesian3'](_0x3b7061['lon']['max'],_0x3b7061[_0x50bd3d(0x24f)]['max'],_0x3b7061['lev']['max']),_0x51d36e=new Cesium$3[(_0x50bd3d(0x1ff))]((_0x1d2e76['x']-_0x4a8678['x'])/(_0x449180['x']-0x1),(_0x1d2e76['y']-_0x4a8678['y'])/(_0x449180['y']-0x1),_0x449180['z']>0x1?(_0x1d2e76['z']-_0x4a8678['z'])/(_0x449180['z']-0x1):0x1),_0x43d97a=new Cesium$3['Cartesian2'](_0x3b7061['U']['min'],_0x3b7061['U']['max']),_0x3410c0=new Cesium$3['Cartesian2'](_0x3b7061['V']['min'],_0x3b7061['V']['max']),_0x59531a=this;this['primitives']={'getWind':new CustomPrimitive({'commandType':'Compute','uniformMap':{'U':function(){return _0x59531a['windTextures']['U'];},'V':function(){return _0x59531a['windTextures']['V'];},'currentParticlesPosition':function(){return _0x59531a['particlesTextures']['currentParticlesPosition'];},'dimension':function(){return _0x449180;},'minimum':function(){return _0x4a8678;},'maximum':function(){return _0x1d2e76;},'interval':function(){return _0x51d36e;}},'fragmentShaderSource':new Cesium$3[(_0x50bd3d(0x1d5))]({'sources':[getWind_frag]}),'outputTexture':this[_0x50bd3d(0x22f)][_0x50bd3d(0x26a)],'preExecute':function(){const _0x1d79a9=_0x50bd3d;_0x59531a[_0x1d79a9(0x1db)]['getWind']['commandToExecute']['outputTexture']=_0x59531a['particlesTextures']['particlesWind'];}}),'updateSpeed':new CustomPrimitive({'commandType':'Compute','uniformMap':{'currentParticlesSpeed':function(){return _0x59531a['particlesTextures']['currentParticlesSpeed'];},'particlesWind':function(){return _0x59531a['particlesTextures']['particlesWind'];},'uSpeedRange':function(){return _0x43d97a;},'vSpeedRange':function(){return _0x3410c0;},'pixelSize':function(){return _0x15e90d['pixelSize'];},'speedFactor':function(){const _0xc892eb=_0x50bd3d;return _0x1fb86c[_0xc892eb(0x225)];}},'fragmentShaderSource':new Cesium$3[(_0x50bd3d(0x1d5))]({'sources':[updateSpeed_frag]}),'outputTexture':this['particlesTextures'][_0x50bd3d(0x207)],'preExecute':function(){const _0xd3df72=_0x50bd3d,_0x21fde7=_0x59531a['particlesTextures']['currentParticlesSpeed'];_0x59531a['particlesTextures']['currentParticlesSpeed']=_0x59531a['particlesTextures']['postProcessingSpeed'],_0x59531a['particlesTextures']['postProcessingSpeed']=_0x21fde7,_0x59531a['primitives'][_0xd3df72(0x1f0)]['commandToExecute']['outputTexture']=_0x59531a['particlesTextures'][_0xd3df72(0x207)];}}),'updatePosition':new CustomPrimitive({'commandType':'Compute','uniformMap':{'currentParticlesPosition':function(){return _0x59531a['particlesTextures']['currentParticlesPosition'];},'currentParticlesSpeed':function(){return _0x59531a['particlesTextures']['currentParticlesSpeed'];}},'fragmentShaderSource':new Cesium$3['ShaderSource']({'sources':[updatePosition_frag]}),'outputTexture':this['particlesTextures']['nextParticlesPosition'],'preExecute':function(){const _0x36ed44=_0x50bd3d,_0x2430fc=_0x59531a['particlesTextures'][_0x36ed44(0x264)];_0x59531a['particlesTextures']['currentParticlesPosition']=_0x59531a[_0x36ed44(0x22f)]['postProcessingPosition'],_0x59531a[_0x36ed44(0x22f)]['postProcessingPosition']=_0x2430fc,_0x59531a['primitives']['updatePosition']['commandToExecute']['outputTexture']=_0x59531a[_0x36ed44(0x22f)][_0x36ed44(0x1f5)];}}),'postProcessingPosition':new CustomPrimitive({'commandType':'Compute','uniformMap':{'nextParticlesPosition':function(){return _0x59531a['particlesTextures']['nextParticlesPosition'];},'nextParticlesSpeed':function(){return _0x59531a['particlesTextures']['nextParticlesSpeed'];},'lonRange':function(){const _0x2ddcab=_0x50bd3d;return _0x15e90d[_0x2ddcab(0x280)];},'latRange':function(){return _0x15e90d['latRange'];},'randomCoefficient':function(){const _0x3831df=Math['random']();return _0x3831df;},'dropRate':function(){return _0x1fb86c['dropRate'];},'dropRateBump':function(){return _0x1fb86c['dropRateBump'];}},'fragmentShaderSource':new Cesium$3[(_0x50bd3d(0x1d5))]({'sources':[postProcessingPosition_frag]}),'outputTexture':this['particlesTextures']['postProcessingPosition'],'preExecute':function(){const _0x35f517=_0x50bd3d;_0x59531a['primitives']['postProcessingPosition']['commandToExecute']['outputTexture']=_0x59531a['particlesTextures'][_0x35f517(0x201)];}}),'postProcessingSpeed':new CustomPrimitive({'commandType':_0x50bd3d(0x25a),'uniformMap':{'postProcessingPosition':function(){const _0x5c8924=_0x50bd3d;return _0x59531a[_0x5c8924(0x22f)][_0x5c8924(0x201)];},'nextParticlesSpeed':function(){const _0x45a417=_0x50bd3d;return _0x59531a[_0x45a417(0x22f)]['nextParticlesSpeed'];}},'fragmentShaderSource':new Cesium$3['ShaderSource']({'sources':[postProcessingSpeed_frag]}),'outputTexture':this[_0x50bd3d(0x22f)]['postProcessingSpeed'],'preExecute':function(){const _0x4f0165=_0x50bd3d;_0x59531a['primitives'][_0x4f0165(0x240)]['commandToExecute'][_0x4f0165(0x28d)]=_0x59531a['particlesTextures']['postProcessingSpeed'];}})};}}const Cesium$2=mars3d__namespace[_0x39bbfa(0x297)];class ParticleSystem{constructor(_0x9b198e,_0x3397be,_0x226939,_0x34df1d){const _0x1286d9=_0x39bbfa;this['context']=_0x9b198e,_0x3397be={..._0x3397be},_0x3397be['udata']&&_0x3397be['vdata']&&(_0x3397be[_0x1286d9(0x249)]={},_0x3397be['dimensions'][_0x1286d9(0x1f9)]=_0x3397be['cols'],_0x3397be[_0x1286d9(0x249)][_0x1286d9(0x24f)]=_0x3397be['rows'],_0x3397be[_0x1286d9(0x249)]['lev']=_0x3397be['lev']||0x1,_0x3397be['lon']={},_0x3397be['lon']['min']=_0x3397be[_0x1286d9(0x1d0)],_0x3397be[_0x1286d9(0x1f9)]['max']=_0x3397be['xmax'],_0x3397be[_0x1286d9(0x24f)]={},_0x3397be['lat']['min']=_0x3397be['ymin'],_0x3397be['lat']['max']=_0x3397be['ymax'],_0x3397be['lev']={},_0x3397be['lev']['min']=_0x3397be['levmin']??0x1,_0x3397be['lev']['max']=_0x3397be['levmax']??0x1,_0x3397be['U']={},_0x3397be['U'][_0x1286d9(0x265)]=new Float32Array(_0x3397be['udata']),_0x3397be['U']['min']=_0x3397be['umin']??Math['min'](..._0x3397be['udata']),_0x3397be['U']['max']=_0x3397be['umax']??Math[_0x1286d9(0x2b2)](..._0x3397be['udata']),_0x3397be['V']={},_0x3397be['V']['array']=new Float32Array(_0x3397be[_0x1286d9(0x25e)]),_0x3397be['V']['min']=_0x3397be['vmin']??Math['min'](..._0x3397be['vdata']),_0x3397be['V']['max']=_0x3397be['vmax']??Math[_0x1286d9(0x2b2)](..._0x3397be['vdata'])),this['data']=_0x3397be,this[_0x1286d9(0x281)]=_0x226939,this['viewerParameters']=_0x34df1d,this['particlesComputing']=new ParticlesComputing(this['context'],this['data'],this['options'],this['viewerParameters']),this['particlesRendering']=new ParticlesRendering(this['context'],this['data'],this[_0x1286d9(0x281)],this['viewerParameters'],this['particlesComputing']);}['canvasResize'](_0xbb30f3){const _0x1b0eaa=_0x39bbfa;this[_0x1b0eaa(0x20d)]['destroyParticlesTextures'](),Object['keys'](this['particlesComputing']['windTextures'])['forEach'](_0x2baaf8=>{const _0x3497a4=_0x1b0eaa;this['particlesComputing']['windTextures'][_0x2baaf8][_0x3497a4(0x1dc)]();}),this['particlesRendering']['textures'][_0x1b0eaa(0x24c)][_0x1b0eaa(0x1dc)](),Object[_0x1b0eaa(0x267)](this[_0x1b0eaa(0x2a2)]['framebuffers'])['forEach'](_0x401c1b=>{const _0xd00f2e=_0x1b0eaa;this[_0xd00f2e(0x2a2)][_0xd00f2e(0x20a)][_0x401c1b]['destroy']();}),this['context']=_0xbb30f3,this['particlesComputing']=new ParticlesComputing(this['context'],this[_0x1b0eaa(0x222)],this['options'],this[_0x1b0eaa(0x29b)]),this['particlesRendering']=new ParticlesRendering(this[_0x1b0eaa(0x1fb)],this['data'],this['options'],this['viewerParameters'],this[_0x1b0eaa(0x20d)]);}[_0x39bbfa(0x1cd)](){const _0x24bea1=_0x39bbfa,_0x315e77=new Cesium$2['ClearCommand']({'color':new Cesium$2['Color'](0x0,0x0,0x0,0x0),'depth':0x1,'framebuffer':undefined,'pass':Cesium$2['Pass']['OPAQUE']});Object[_0x24bea1(0x267)](this['particlesRendering'][_0x24bea1(0x20a)])[_0x24bea1(0x28e)](_0x18efe1=>{_0x315e77['framebuffer']=this['particlesRendering']['framebuffers'][_0x18efe1],_0x315e77['execute'](this['context']);});}['refreshParticles'](_0x11f107){const _0x471e35=_0x39bbfa;this[_0x471e35(0x1cd)](),this['particlesComputing']['destroyParticlesTextures'](),this['particlesComputing']['createParticlesTextures'](this['context'],this['options'],this[_0x471e35(0x29b)]);if(_0x11f107){var _0x3f772e;const _0x19ec6b=this[_0x471e35(0x2a2)]['createSegmentsGeometry'](this['options']);this['particlesRendering']['primitives'][_0x471e35(0x238)]['geometry']=_0x19ec6b;const _0x5d4a3a=Cesium$2['VertexArray'][_0x471e35(0x1ea)]({'context':this['context'],'geometry':_0x19ec6b,'attributeLocations':this[_0x471e35(0x2a2)]['primitives'][_0x471e35(0x238)]['attributeLocations'],'bufferUsage':Cesium$2['BufferUsage'][_0x471e35(0x219)]});(_0x3f772e=this['particlesRendering']['primitives'])!==null&&_0x3f772e!==void 0x0&&(_0x3f772e=_0x3f772e['segments'])!==null&&_0x3f772e!==void 0x0&&_0x3f772e['commandToExecute']&&(this['particlesRendering']['primitives'][_0x471e35(0x238)]['commandToExecute']['vertexArray']=_0x5d4a3a);}}[_0x39bbfa(0x261)](_0x2ece65){let _0x55263e=![];this['options']['maxParticles']!==_0x2ece65['maxParticles']&&(_0x55263e=!![]),Object['keys'](_0x2ece65)['forEach'](_0x45cc53=>{const _0x3919ed=_0xbdb2;this[_0x3919ed(0x281)][_0x45cc53]=_0x2ece65[_0x45cc53];}),this['refreshParticles'](_0x55263e);}[_0x39bbfa(0x20b)](_0x360f3f){const _0x31d90a=_0x39bbfa;Object['keys'](_0x360f3f)['forEach'](_0x597e03=>{this['viewerParameters'][_0x597e03]=_0x360f3f[_0x597e03];}),this[_0x31d90a(0x26b)](![]);}[_0x39bbfa(0x1dc)](){const _0x3fc337=_0x39bbfa;clearTimeout(this['canrefresh']),this[_0x3fc337(0x20d)][_0x3fc337(0x23b)](),Object['keys'](this['particlesComputing']['windTextures'])[_0x3fc33