deeptwins-engine-3d 0.1.76 → 0.2.1

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.
Files changed (237) hide show
  1. package/dist/assets/Build/DeepTwins/Image/noise.png +0 -0
  2. package/dist/assets/Build/DeepTwins/Workers/CustomRasterClip.worker.js +1 -2
  3. package/dist/assets/Build/DeepTwins/Workers/MvtVector.worker.js +1 -1
  4. package/dist/assets/Build/Map3d/ThirdParty/Workers/zip-web-worker.js +640 -0
  5. package/dist/assets/Build/Map3d/ThirdParty/wasm_splats_bg.wasm +0 -0
  6. package/dist/assets/Build/Map3d/ThirdParty/zip-module.wasm +0 -0
  7. package/dist/assets/Build/Map3d/Workers/chunk-27NG6PQR.js +456 -0
  8. package/dist/assets/Build/Map3d/Workers/chunk-2JVMMMWT.js +353 -0
  9. package/dist/assets/Build/Map3d/Workers/chunk-2Y2XYQCS.js +1481 -0
  10. package/dist/assets/Build/Map3d/Workers/chunk-34RF3V5G.js +220 -0
  11. package/dist/assets/Build/Map3d/Workers/chunk-35H7BYLJ.js +1800 -0
  12. package/dist/assets/Build/Map3d/Workers/chunk-57OGEF5V.js +435 -0
  13. package/dist/assets/Build/Map3d/Workers/chunk-5PX3DYJA.js +196 -0
  14. package/dist/assets/Build/Map3d/Workers/chunk-7B5XGQRN.js +171 -0
  15. package/dist/assets/Build/Map3d/Workers/chunk-ATLWOZFF.js +39 -0
  16. package/dist/assets/Build/Map3d/Workers/chunk-BMSUECTA.js +1055 -0
  17. package/dist/assets/Build/Map3d/Workers/chunk-C6IA4TKW.js +476 -0
  18. package/dist/assets/Build/Map3d/Workers/chunk-CZ44I32U.js +157 -0
  19. package/dist/assets/Build/Map3d/Workers/chunk-DE6UV44R.js +122 -0
  20. package/dist/assets/Build/Map3d/Workers/chunk-DUCCKVOG.js +834 -0
  21. package/dist/assets/Build/Map3d/Workers/chunk-EBJBPIYX.js +239 -0
  22. package/dist/assets/Build/Map3d/Workers/chunk-EYSYQ2R6.js +138 -0
  23. package/dist/assets/Build/Map3d/Workers/chunk-FMCAAUQI.js +368 -0
  24. package/dist/assets/Build/Map3d/Workers/chunk-GMYZNRRQ.js +2717 -0
  25. package/dist/assets/Build/Map3d/Workers/chunk-GWPNZZV4.js +781 -0
  26. package/dist/assets/Build/Map3d/Workers/chunk-HLP2U4KW.js +758 -0
  27. package/dist/assets/Build/Map3d/Workers/chunk-HSJSUPQV.js +500 -0
  28. package/dist/assets/Build/Map3d/Workers/chunk-I73Q3AG7.js +58 -0
  29. package/dist/assets/Build/Map3d/Workers/chunk-IMZ4YIMV.js +511 -0
  30. package/dist/assets/Build/Map3d/Workers/chunk-IZSK4DVF.js +421 -0
  31. package/dist/assets/Build/Map3d/Workers/chunk-JKLMRPKK.js +75 -0
  32. package/dist/assets/Build/Map3d/Workers/chunk-KGM345JM.js +691 -0
  33. package/dist/assets/Build/Map3d/Workers/chunk-L4IR5U4G.js +102 -0
  34. package/dist/assets/Build/Map3d/Workers/chunk-MG4EVQH2.js +44 -0
  35. package/dist/assets/Build/Map3d/Workers/chunk-NXWEFAZJ.js +300 -0
  36. package/dist/assets/Build/Map3d/Workers/chunk-PDFAJISJ.js +59 -0
  37. package/dist/assets/Build/Map3d/Workers/chunk-PHWZFJR5.js +100 -0
  38. package/dist/assets/Build/Map3d/Workers/chunk-PLE7CHBE.js +101 -0
  39. package/dist/assets/Build/Map3d/Workers/chunk-PN3GIZ5Q.js +163 -0
  40. package/dist/assets/Build/Map3d/Workers/chunk-PXL5XLHV.js +1073 -0
  41. package/dist/assets/Build/Map3d/Workers/chunk-QYXOF5JC.js +959 -0
  42. package/dist/assets/Build/Map3d/Workers/chunk-R2LIFXV3.js +115 -0
  43. package/dist/assets/Build/Map3d/Workers/chunk-R4W6IRJZ.js +10357 -0
  44. package/dist/assets/Build/Map3d/Workers/chunk-R5PZXG56.js +1258 -0
  45. package/dist/assets/Build/Map3d/Workers/chunk-RZQLZIUI.js +629 -0
  46. package/dist/assets/Build/Map3d/Workers/chunk-SIBDD6Y4.js +390 -0
  47. package/dist/assets/Build/Map3d/Workers/chunk-U5NN6JTQ.js +398 -0
  48. package/dist/assets/Build/Map3d/Workers/chunk-UA5RPPP3.js +73 -0
  49. package/dist/assets/Build/Map3d/Workers/chunk-UXLKFS3C.js +305 -0
  50. package/dist/assets/Build/Map3d/Workers/chunk-VUX4BQIM.js +37 -0
  51. package/dist/assets/Build/Map3d/Workers/chunk-WJDUUUJS.js +684 -0
  52. package/dist/assets/Build/Map3d/Workers/chunk-XBJOJHWX.js +139 -0
  53. package/dist/assets/Build/Map3d/Workers/chunk-XJDMTNKD.js +634 -0
  54. package/dist/assets/Build/Map3d/Workers/chunk-XUCXZZE5.js +963 -0
  55. package/dist/assets/Build/Map3d/Workers/chunk-YIKGVMJ5.js +287 -0
  56. package/dist/assets/Build/Map3d/Workers/chunk-YTNCIBPQ.js +262 -0
  57. package/dist/assets/Build/Map3d/Workers/chunk-ZMDUYETO.js +55 -0
  58. package/dist/assets/Build/Map3d/Workers/chunk-ZW52HXFN.js +2857 -0
  59. package/dist/esm/analyze/LineOfSightAnalysis.js +1 -326
  60. package/dist/esm/analyze/SubmergenceAnalysis.js +1 -137
  61. package/dist/esm/analyze/SunLightAnalysis.js +1 -91
  62. package/dist/esm/analyze/TerrainExcavationAnalysis.js +1 -612
  63. package/dist/esm/analyze/ViewshedAnalysis.js +1 -292
  64. package/dist/esm/cameraControl/ModelRoamHistory.js +1 -639
  65. package/dist/esm/cameraControl/ModelRoamRealTime.js +1 -874
  66. package/dist/esm/cameraControl/Roam.js +1 -418
  67. package/dist/esm/cameraControl/Rotate.js +1 -134
  68. package/dist/esm/cameraControl/RotateInPlace.js +1 -99
  69. package/dist/esm/constant.d.ts +90 -0
  70. package/dist/esm/constant.js +1 -1287
  71. package/dist/esm/deepTwins/index.js +1 -121
  72. package/dist/esm/drawCommand/index.js +1 -3
  73. package/dist/esm/drawCommand/viewShed/Event.js +1 -142
  74. package/dist/esm/drawCommand/viewShed/RectangularSensorPrimitive.js +1 -1306
  75. package/dist/esm/drawCommand/viewShed/ViewShadowPrimitive.js +1 -66
  76. package/dist/esm/drawCommand/viewShed/ViewShedAnalyserLayer.js +1 -466
  77. package/dist/esm/drawCommand/viewShed/ViewShedMap.js +1 -1238
  78. package/dist/esm/drawCommand/viewShed/config.js +1 -21
  79. package/dist/esm/drawCommand/volumeCloud/GeometryPrimitive.js +1 -89
  80. package/dist/esm/drawCommand/volumeCloud/ImprovedNoise.js +1 -112
  81. package/dist/esm/drawCommand/volumeCloud/VolumeClouds.js +1 -91
  82. package/dist/esm/drawer/algorithm.js +1 -314
  83. package/dist/esm/drawer/common.js +1 -965
  84. package/dist/esm/drawer/coordinate.js +1 -184
  85. package/dist/esm/drawer/index.js +1 -688
  86. package/dist/esm/drawer/plotUtil.js +1 -266
  87. package/dist/esm/drawer/shape/Assemble.js +1 -415
  88. package/dist/esm/drawer/shape/AttackArrow.js +1 -442
  89. package/dist/esm/drawer/shape/BaseShape.js +1 -383
  90. package/dist/esm/drawer/shape/Bow.js +1 -375
  91. package/dist/esm/drawer/shape/Circle.js +1 -461
  92. package/dist/esm/drawer/shape/Curve.js +1 -386
  93. package/dist/esm/drawer/shape/DragPoint.js +1 -211
  94. package/dist/esm/drawer/shape/Elliptic.js +1 -491
  95. package/dist/esm/drawer/shape/Formation.js +1 -395
  96. package/dist/esm/drawer/shape/PincerArrow.js +1 -445
  97. package/dist/esm/drawer/shape/Point.js +1 -131
  98. package/dist/esm/drawer/shape/Polygon.js +1 -368
  99. package/dist/esm/drawer/shape/Polyline.js +1 -325
  100. package/dist/esm/drawer/shape/RegularPolygon.js +1 -468
  101. package/dist/esm/drawer/shape/RightAngleArrow.js +1 -423
  102. package/dist/esm/drawer/shape/Sector.js +1 -568
  103. package/dist/esm/drawer/shape/StraightArrow.js +1 -422
  104. package/dist/esm/drawer/shape/SwallowtailArrow.js +1 -438
  105. package/dist/esm/drawer/types.js +1 -11
  106. package/dist/esm/drawer/utils.js +1 -381
  107. package/dist/esm/global.css +22 -1
  108. package/dist/esm/graphicLayer/BaseEntity.js +1 -51
  109. package/dist/esm/graphicLayer/BaseLayer.js +1 -730
  110. package/dist/esm/graphicLayer/BasePointPrimitive.js +1 -45
  111. package/dist/esm/graphicLayer/BasePrimitive.js +1 -36
  112. package/dist/esm/graphicLayer/BasePrimitiveInstance.js +1 -37
  113. package/dist/esm/graphicLayer/BaseSource.d.ts +1 -1
  114. package/dist/esm/graphicLayer/BaseSource.js +1 -630
  115. package/dist/esm/graphicLayer/BillboardEntity.js +1 -106
  116. package/dist/esm/graphicLayer/BillboardPrimitive.js +1 -119
  117. package/dist/esm/graphicLayer/BoxEntity.js +1 -99
  118. package/dist/esm/graphicLayer/BoxPrimitive.js +1 -48
  119. package/dist/esm/graphicLayer/BoxPrimitiveInstance.js +1 -91
  120. package/dist/esm/graphicLayer/EllipseEntity.js +1 -110
  121. package/dist/esm/graphicLayer/EllipsePrimitive.js +1 -47
  122. package/dist/esm/graphicLayer/EllipsePrimitiveInstance.js +1 -98
  123. package/dist/esm/graphicLayer/EllipsoidEntity.js +1 -118
  124. package/dist/esm/graphicLayer/EllipsoidPrimitive.js +1 -48
  125. package/dist/esm/graphicLayer/EllipsoidPrimitiveInstance.js +1 -113
  126. package/dist/esm/graphicLayer/GraphicLayerCollection.js +1 -491
  127. package/dist/esm/graphicLayer/HtmlEntity.d.ts +4 -0
  128. package/dist/esm/graphicLayer/HtmlEntity.js +1 -189
  129. package/dist/esm/graphicLayer/LabelEntity.js +1 -110
  130. package/dist/esm/graphicLayer/LabelPrimitive.js +1 -127
  131. package/dist/esm/graphicLayer/ModelEntity.js +1 -122
  132. package/dist/esm/graphicLayer/ModelPrimitive.js +1 -59
  133. package/dist/esm/graphicLayer/ModelPrimitiveInstance.js +1 -86
  134. package/dist/esm/graphicLayer/PointEntity.js +1 -94
  135. package/dist/esm/graphicLayer/PointPrimitive.js +1 -107
  136. package/dist/esm/graphicLayer/PolygonEntity.js +1 -103
  137. package/dist/esm/graphicLayer/PolygonGroundPrimitive.js +1 -49
  138. package/dist/esm/graphicLayer/PolygonGroundPrimitiveImageMaterialInstance.js +1 -87
  139. package/dist/esm/graphicLayer/PolygonPrimitive.js +1 -60
  140. package/dist/esm/graphicLayer/PolygonPrimitiveImageMaterialInstance.js +1 -84
  141. package/dist/esm/graphicLayer/PolygonPrimitiveInstance.js +1 -101
  142. package/dist/esm/graphicLayer/PolylineEntity.js +1 -96
  143. package/dist/esm/graphicLayer/PolylineGroundPrimitive.js +1 -55
  144. package/dist/esm/graphicLayer/PolylineGroundPrimitiveInstance.js +1 -85
  145. package/dist/esm/graphicLayer/PolylinePrimitive.js +1 -53
  146. package/dist/esm/graphicLayer/PolylinePrimitiveInstance.js +1 -85
  147. package/dist/esm/graphicLayer/PolylineVolumeEntity.js +1 -105
  148. package/dist/esm/graphicLayer/PolylineVolumePrimitive.js +1 -47
  149. package/dist/esm/graphicLayer/PolylineVolumePrimitiveInstance.js +1 -94
  150. package/dist/esm/graphicLayer/WallEntity.js +1 -96
  151. package/dist/esm/graphicLayer/WallPrimitive.js +1 -47
  152. package/dist/esm/graphicLayer/WallPrimitiveInstance.js +1 -88
  153. package/dist/esm/index.d.ts +4 -0
  154. package/dist/esm/index.js +1 -175
  155. package/dist/esm/lowAltitude/BarrierLayer.js +1 -172
  156. package/dist/esm/lowAltitude/BaseGridMvtLayer.js +1 -122
  157. package/dist/esm/lowAltitude/FactorLayer.js +1 -199
  158. package/dist/esm/lowAltitude/FlightPlanning.js +1 -411
  159. package/dist/esm/lowAltitude/FlightRiskEvaluation.js +1 -543
  160. package/dist/esm/lowAltitude/GridDraw.js +1 -137
  161. package/dist/esm/lowAltitude/PoiLayer.js +1 -74
  162. package/dist/esm/lowAltitude/RoutePlanning.js +1 -318
  163. package/dist/esm/lowAltitude/VisitLayer.js +1 -180
  164. package/dist/esm/map/Event.js +1 -377
  165. package/dist/esm/map/GroundSkyBox.js +1 -166
  166. package/dist/esm/map/Map.js +1 -881
  167. package/dist/esm/map/Property.js +1 -35
  168. package/dist/esm/material/AtmosphericDispersion.js +1 -569
  169. package/dist/esm/material/GlobalVolumetricCloud.js +1 -377
  170. package/dist/esm/material/VolumeCloud.js +1 -115
  171. package/dist/esm/material/WeatherEffects.js +1 -351
  172. package/dist/esm/material/entity/BaseMaterialProperty.js +1 -51
  173. package/dist/esm/material/entity/CircleWaveMaterialProperty.js +1 -101
  174. package/dist/esm/material/entity/DynamicWallMaterialProperty.js +1 -101
  175. package/dist/esm/material/entity/ImageGlowingMaterialProperty.js +1 -89
  176. package/dist/esm/material/entity/ImageMaterialProperty.js +1 -34
  177. package/dist/esm/material/entity/PolylineTrailLinkMaterialProperty.js +1 -132
  178. package/dist/esm/material/primitive/BaseMaterialAppearance.js +1 -28
  179. package/dist/esm/material/primitive/ImageGlowingMaterialAppearance.js +1 -77
  180. package/dist/esm/material/primitive/ImageMaterialAppearance.js +1 -77
  181. package/dist/esm/measure/Area.js +1 -220
  182. package/dist/esm/measure/BaseDraw.js +1 -105
  183. package/dist/esm/measure/Distance.js +1 -223
  184. package/dist/esm/measure/index.js +1 -266
  185. package/dist/esm/measure/types.js +1 -17
  186. package/dist/esm/measure/utils.js +1 -319
  187. package/dist/esm/particle/BaseParticle.js +1 -196
  188. package/dist/esm/particle/FireParticle.js +1 -65
  189. package/dist/esm/particle/FountainParticle.js +1 -80
  190. package/dist/esm/particle/SmokeParticle.js +1 -65
  191. package/dist/esm/particle/common.js +1 -23
  192. package/dist/esm/particle/index.js +1 -5
  193. package/dist/esm/property/PositionProperty.js +1 -56
  194. package/dist/esm/tileLayer/ArcGisLayer.js +1 -41
  195. package/dist/esm/tileLayer/CustomRasterClipWorkerClient.js +1 -147
  196. package/dist/esm/tileLayer/CustomRasterLayer.js +1 -1136
  197. package/dist/esm/tileLayer/ImageryLayer.js +1 -44
  198. package/dist/esm/tileLayer/MvtVectorLoad.js +1 -1549
  199. package/dist/esm/tileLayer/MvtVectorWorkerClient.js +1 -126
  200. package/dist/esm/tileLayer/RasterLayer.js +1 -23
  201. package/dist/esm/tileLayer/WmsLayer.js +1 -26
  202. package/dist/esm/tileLayer/WmtsLayer.js +1 -23
  203. package/dist/esm/tool/BuildClampedPolygonGrid.js +1 -278
  204. package/dist/esm/tool/Compass.js +1 -282
  205. package/dist/esm/tool/PrimitiveCluster.js +1 -706
  206. package/dist/esm/tool/TimerInterval.js +1 -58
  207. package/dist/esm/tool/common.js +1 -405
  208. package/dist/esm/tool/fetch.js +1 -222
  209. package/dist/esm/tool/heatmap.js +1 -631
  210. package/dist/esm/tool/utils.d.ts +1 -0
  211. package/dist/esm/tool/utils.js +1 -501
  212. package/dist/esm/toolTip/index.js +1 -79
  213. package/dist/esm/videoFusion/BaseVideo.d.ts +7 -0
  214. package/dist/esm/videoFusion/BaseVideo.js +1 -330
  215. package/dist/esm/videoFusion/VideoProject.js +1 -230
  216. package/dist/esm/videoFusion/VideoTexture.js +1 -163
  217. package/dist/esm/visualization/BaseHeatmap.js +1 -271
  218. package/dist/esm/visualization/BoundaryHighlight.d.ts +135 -0
  219. package/dist/esm/visualization/BoundaryHighlight.js +1 -0
  220. package/dist/esm/visualization/DynamicWater.js +1 -289
  221. package/dist/esm/visualization/Frustum.js +1 -248
  222. package/dist/esm/visualization/Heatmap2d.js +1 -97
  223. package/dist/esm/visualization/Heatmap3d.js +1 -281
  224. package/dist/esm/visualization/MigrationEffect.js +1 -397
  225. package/dist/esm/visualization/PointCluster.js +1 -220
  226. package/dist/esm/visualization/RadarScan.js +1 -333
  227. package/dist/esm/visualization/SampledTerrainRiver.d.ts +180 -0
  228. package/dist/esm/visualization/SampledTerrainRiver.js +1 -0
  229. package/dist/esm/visualization/SampledTerrainWater.d.ts +170 -0
  230. package/dist/esm/visualization/SampledTerrainWater.js +1 -0
  231. package/dist/esm/visualization/WindField.d.ts +72 -0
  232. package/dist/esm/visualization/WindField.js +1 -0
  233. package/dist/esm/visualization/windCore.d.ts +161 -0
  234. package/dist/esm/visualization/windCore.js +8 -0
  235. package/dist/umd/deeptwins-engine-3d.min.css +1 -1
  236. package/dist/umd/deeptwins-engine-3d.min.js +1 -1
  237. package/package.json +6 -4
@@ -1,377 +1 @@
1
- function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
2
- function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
3
- function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
4
- function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
5
- function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor); } }
6
- function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; }
7
- function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
8
- function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : String(i); }
9
- function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
10
- import * as Cesium from 'deeptwins-cesium';
11
- var DEFAULT_SKY_AMBIENT_COLOR = '#B4D9F3';
12
- var DEFAULT_GROUND_AMBIENT_COLOR = '#d6d6d8';
13
- var DEFAULT_WIND_VECTOR = new Cesium.Cartesian3(100, 0, 0);
14
- var createDefaultCloudParams = function createDefaultCloudParams() {
15
- return {
16
- densityMultiplier: 1.5,
17
- detailStrength: 0.69,
18
- cloudSharpness: 1.032,
19
- rainClouds: 0.45,
20
- currentWindVectorWC: Cesium.Cartesian3.clone(DEFAULT_WIND_VECTOR),
21
- cloudCover: 0.039,
22
- cloudHeight: 8000.0,
23
- cloudThickness: 1000.0,
24
- absoluteMaxDistance: 50000000,
25
- absorption: 0.004,
26
- windSpeedRatio: 0.3,
27
- scatteringCoefficient: 0.01,
28
- illuminationCoefficient: 0.01,
29
- cloudSeed: Math.random() * 100.0,
30
- cloudType: 0,
31
- cloudTurbulence: 0.5,
32
- cloudClumping: 0.75,
33
- cloudAnvil: 0,
34
- skyAmbientColor: DEFAULT_SKY_AMBIENT_COLOR,
35
- groundAmbientColor: DEFAULT_GROUND_AMBIENT_COLOR,
36
- maxVisibleHeight: 30000
37
- };
38
- };
39
-
40
- // 全球体积云
41
- var GlobalVolumetricCloud = /*#__PURE__*/function () {
42
- function GlobalVolumetricCloud(map) {
43
- var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
44
- _classCallCheck(this, GlobalVolumetricCloud);
45
- // 地图上下文
46
- _defineProperty(this, "_mapContext", void 0);
47
- // 当前生效的云参数
48
- _defineProperty(this, "uniforms", void 0);
49
- // 构造时的初始参数
50
- _defineProperty(this, "originalOptions", void 0);
51
- // 后处理阶段对象
52
- _defineProperty(this, "postProcessStage", void 0);
53
- // 天空环境光颜色
54
- _defineProperty(this, "skyAmbientColor3", void 0);
55
- // 地面环境光颜色
56
- _defineProperty(this, "groundAmbientColor3", void 0);
57
- this._mapContext = map._mapContext;
58
- var viewer = this.getMap();
59
- if (!viewer || _typeof(viewer) !== 'object') {
60
- throw new Error('Invalid Cesium Viewer instance provided');
61
- }
62
- if (!viewer.scene || !viewer.scene.postProcessStages) {
63
- throw new Error('Viewer instance must have valid scene and postProcessStages');
64
- }
65
- this.uniforms = this._buildUniforms(options);
66
- this.originalOptions = this._cloneUniforms(this.uniforms);
67
- this.postProcessStage = null;
68
- this.skyAmbientColor3 = {
69
- r: 0,
70
- g: 0,
71
- b: 0
72
- };
73
- this.groundAmbientColor3 = {
74
- r: 0,
75
- g: 0,
76
- b: 0
77
- };
78
- this._syncAmbientColors();
79
-
80
- // 初始化云
81
- this.initialize();
82
- }
83
-
84
- // 获取地图实例
85
- _createClass(GlobalVolumetricCloud, [{
86
- key: "getMap",
87
- value: function getMap() {
88
- return this._mapContext && this._mapContext.getMap();
89
- }
90
-
91
- // 克隆云参数,避免引用共享导致外部状态污染
92
- }, {
93
- key: "_cloneUniforms",
94
- value: function _cloneUniforms(params) {
95
- return _objectSpread(_objectSpread({}, params), {}, {
96
- currentWindVectorWC: Cesium.Cartesian3.clone(params.currentWindVectorWC)
97
- });
98
- }
99
-
100
- // 统一构建参数,支持保留0值并维持随机种子稳定
101
- }, {
102
- key: "_buildUniforms",
103
- value: function _buildUniforms() {
104
- var _options$densityMulti, _options$detailStreng, _options$cloudSharpne, _options$rainClouds, _options$cloudCover, _options$cloudHeight, _options$cloudThickne, _options$absoluteMaxD, _options$absorption, _options$windSpeedRat, _options$scatteringCo, _options$illumination, _options$cloudSeed, _options$cloudType, _options$cloudTurbule, _options$cloudClumpin, _options$cloudAnvil, _options$skyAmbientCo, _options$groundAmbien, _options$maxVisibleHe;
105
- var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
106
- var baseParams = arguments.length > 1 ? arguments[1] : undefined;
107
- var fallbackParams = baseParams ? this._cloneUniforms(baseParams) : createDefaultCloudParams();
108
- var params = {
109
- densityMultiplier: (_options$densityMulti = options.densityMultiplier) !== null && _options$densityMulti !== void 0 ? _options$densityMulti : fallbackParams.densityMultiplier,
110
- detailStrength: (_options$detailStreng = options.detailStrength) !== null && _options$detailStreng !== void 0 ? _options$detailStreng : fallbackParams.detailStrength,
111
- cloudSharpness: (_options$cloudSharpne = options.cloudSharpness) !== null && _options$cloudSharpne !== void 0 ? _options$cloudSharpne : fallbackParams.cloudSharpness,
112
- rainClouds: (_options$rainClouds = options.rainClouds) !== null && _options$rainClouds !== void 0 ? _options$rainClouds : fallbackParams.rainClouds,
113
- currentWindVectorWC: options.currentWindVectorWC ? Cesium.Cartesian3.clone(options.currentWindVectorWC) : Cesium.Cartesian3.clone(fallbackParams.currentWindVectorWC),
114
- cloudCover: (_options$cloudCover = options.cloudCover) !== null && _options$cloudCover !== void 0 ? _options$cloudCover : fallbackParams.cloudCover,
115
- cloudHeight: (_options$cloudHeight = options.cloudHeight) !== null && _options$cloudHeight !== void 0 ? _options$cloudHeight : fallbackParams.cloudHeight,
116
- cloudThickness: (_options$cloudThickne = options.cloudThickness) !== null && _options$cloudThickne !== void 0 ? _options$cloudThickne : fallbackParams.cloudThickness,
117
- absoluteMaxDistance: (_options$absoluteMaxD = options.absoluteMaxDistance) !== null && _options$absoluteMaxD !== void 0 ? _options$absoluteMaxD : fallbackParams.absoluteMaxDistance,
118
- absorption: (_options$absorption = options.absorption) !== null && _options$absorption !== void 0 ? _options$absorption : fallbackParams.absorption,
119
- windSpeedRatio: (_options$windSpeedRat = options.windSpeedRatio) !== null && _options$windSpeedRat !== void 0 ? _options$windSpeedRat : fallbackParams.windSpeedRatio,
120
- scatteringCoefficient: (_options$scatteringCo = options.scatteringCoefficient) !== null && _options$scatteringCo !== void 0 ? _options$scatteringCo : fallbackParams.scatteringCoefficient,
121
- illuminationCoefficient: (_options$illumination = options.illuminationCoefficient) !== null && _options$illumination !== void 0 ? _options$illumination : fallbackParams.illuminationCoefficient,
122
- cloudSeed: (_options$cloudSeed = options.cloudSeed) !== null && _options$cloudSeed !== void 0 ? _options$cloudSeed : fallbackParams.cloudSeed,
123
- cloudType: (_options$cloudType = options.cloudType) !== null && _options$cloudType !== void 0 ? _options$cloudType : fallbackParams.cloudType,
124
- cloudTurbulence: (_options$cloudTurbule = options.cloudTurbulence) !== null && _options$cloudTurbule !== void 0 ? _options$cloudTurbule : fallbackParams.cloudTurbulence,
125
- cloudClumping: (_options$cloudClumpin = options.cloudClumping) !== null && _options$cloudClumpin !== void 0 ? _options$cloudClumpin : fallbackParams.cloudClumping,
126
- cloudAnvil: (_options$cloudAnvil = options.cloudAnvil) !== null && _options$cloudAnvil !== void 0 ? _options$cloudAnvil : fallbackParams.cloudAnvil,
127
- skyAmbientColor: (_options$skyAmbientCo = options.skyAmbientColor) !== null && _options$skyAmbientCo !== void 0 ? _options$skyAmbientCo : fallbackParams.skyAmbientColor,
128
- groundAmbientColor: (_options$groundAmbien = options.groundAmbientColor) !== null && _options$groundAmbien !== void 0 ? _options$groundAmbien : fallbackParams.groundAmbientColor,
129
- maxVisibleHeight: (_options$maxVisibleHe = options.maxVisibleHeight) !== null && _options$maxVisibleHe !== void 0 ? _options$maxVisibleHe : fallbackParams.maxVisibleHeight
130
- };
131
-
132
- // 确保 maxVisibleHeight 大于 cloudHeight
133
- return params.maxVisibleHeight > params.cloudHeight ? params : _objectSpread(_objectSpread({}, params), {}, {
134
- maxVisibleHeight: params.cloudHeight + 10000
135
- });
136
- }
137
-
138
- // 同步环境光颜色缓存,供shader uniforms实时读取
139
- }, {
140
- key: "_syncAmbientColors",
141
- value: function _syncAmbientColors() {
142
- this.skyAmbientColor3 = this._hexToRgb(this.uniforms.skyAmbientColor, DEFAULT_SKY_AMBIENT_COLOR);
143
- this.groundAmbientColor3 = this._hexToRgb(this.uniforms.groundAmbientColor, DEFAULT_GROUND_AMBIENT_COLOR);
144
- }
145
-
146
- /**
147
- * 初始化体积云系统
148
- *
149
- * 创建并配置体积云后处理阶段,设置所有着色器和uniforms参数。
150
- * 这是内部方法,通常由构造函数自动调用。
151
- *
152
- * @private
153
- */
154
- }, {
155
- key: "initialize",
156
- value: function initialize() {
157
- var _this = this;
158
- var map = this.getMap();
159
- if (!map) return;
160
- var shader = this._createShader();
161
- this.postProcessStage = new Cesium.PostProcessStage({
162
- uniforms: {
163
- realPlanetRadius: function realPlanetRadius() {
164
- return _this._getRealPlanetRadius();
165
- },
166
- windVector: function windVector() {
167
- return _this.uniforms.currentWindVectorWC;
168
- },
169
- cloudCover: function cloudCover() {
170
- return _this.uniforms.cloudCover;
171
- },
172
- cloudHeight: function cloudHeight() {
173
- return _this.uniforms.cloudHeight;
174
- },
175
- cloudThickness: function cloudThickness() {
176
- return _this.uniforms.cloudThickness;
177
- },
178
- absoluteMaxDistance: function absoluteMaxDistance() {
179
- return _this.uniforms.absoluteMaxDistance;
180
- },
181
- absorption: function absorption() {
182
- return _this.uniforms.absorption;
183
- },
184
- windSpeedRatio: function windSpeedRatio() {
185
- return _this.uniforms.windSpeedRatio;
186
- },
187
- scatteringCoefficient: function scatteringCoefficient() {
188
- return _this.uniforms.scatteringCoefficient;
189
- },
190
- illuminationCoefficient: function illuminationCoefficient() {
191
- return _this.uniforms.illuminationCoefficient;
192
- },
193
- cloudSeed: function cloudSeed() {
194
- return _this.uniforms.cloudSeed;
195
- },
196
- cloudType: function cloudType() {
197
- return _this.uniforms.cloudType;
198
- },
199
- cloudTurbulence: function cloudTurbulence() {
200
- return _this.uniforms.cloudTurbulence;
201
- },
202
- cloudClumping: function cloudClumping() {
203
- return _this.uniforms.cloudClumping;
204
- },
205
- cloudAnvil: function cloudAnvil() {
206
- return _this.uniforms.cloudAnvil;
207
- },
208
- maxVisibleHeight: function maxVisibleHeight() {
209
- return _this.uniforms.maxVisibleHeight;
210
- },
211
- densityMultiplier: function densityMultiplier() {
212
- return _this.uniforms.densityMultiplier;
213
- },
214
- detailStrength: function detailStrength() {
215
- return _this.uniforms.detailStrength;
216
- },
217
- cloudSharpness: function cloudSharpness() {
218
- return _this.uniforms.cloudSharpness;
219
- },
220
- rainClouds: function rainClouds() {
221
- return _this.uniforms.rainClouds;
222
- },
223
- skyAmbientColor: function skyAmbientColor() {
224
- return new Cesium.Cartesian3(_this.skyAmbientColor3.r, _this.skyAmbientColor3.g, _this.skyAmbientColor3.b);
225
- },
226
- groundAmbientColor: function groundAmbientColor() {
227
- return new Cesium.Cartesian3(_this.groundAmbientColor3.r, _this.groundAmbientColor3.g, _this.groundAmbientColor3.b);
228
- }
229
- },
230
- forcePowerOfTwo: true,
231
- fragmentShader: shader
232
- });
233
- map.scene.postProcessStages.add(this.postProcessStage);
234
- }
235
-
236
- /**
237
- * 创建体积云的着色器代码
238
- *
239
- * 生成包含体积云渲染算法的完整GLSL着色器代码。
240
- * 包括云密度计算、光照模型、阴影计算、相位函数等关键算法。
241
- *
242
- * @private
243
- * @returns {string} 包含完整体积云渲染算法的GLSL着色器代码
244
- */
245
- }, {
246
- key: "_createShader",
247
- value: function _createShader() {
248
- return "\n precision highp float;\n uniform float realPlanetRadius;\n uniform vec3 windVector;\n uniform float cloudCover;\n uniform float cloudHeight;\n uniform float cloudThickness;\n uniform float absoluteMaxDistance;\n uniform float absorption;\n uniform float windSpeedRatio;\n uniform float scatteringCoefficient;\n uniform float illuminationCoefficient;\n\n const float PI = 3.14159265359;\n const float TWO_PI = 6.28318530718;\n const float FOUR_PI = 12.5663706144;\n float cloudTop;\n\n #define CLOUDS_MAX_LOD 1\n #define CLOUDS_MARCH_STEP 120.0\n #define CLOUDS_DENS_MARCH_STEP 60.0\n #define MAXIMUM_CLOUDS_STEPS 256\n\n // \u4F53\u79EF\u4ECB\u8D28\u6838\u5FC3\u53C2\u6570\n uniform float cloudSeed;\n uniform float cloudType; // 0-1: \u5C42\u4E91\u5230\u79EF\u4E91\n uniform float cloudTurbulence; // \u6E4D\u6D41\u5F3A\u5EA6\n uniform float cloudClumping; // \u56E2\u5757\u7A0B\u5EA6\n uniform float cloudAnvil; // \u7827\u72B6\u4E91\u7279\u5F81\n uniform float maxVisibleHeight; // \u6700\u5927\u53EF\u89C6\u9AD8\u5EA6\n uniform vec3 skyAmbientColor;\n uniform vec3 groundAmbientColor;\n\n // ===== \u65B0\u589E\u7684\u4F53\u79EF\u4ECB\u8D28\u53C2\u6570 =====\n uniform float densityMultiplier; // \u5BC6\u5EA6\u500D\u589E\u5668\n uniform float detailStrength; // \u7EC6\u8282\u5F3A\u5EA6\n uniform float cloudSharpness; // \u4E91\u8FB9\u754C\u9510\u5EA6\n uniform float rainClouds; // \u96E8\u4E91\u7279\u5F81\n\n // \u5C04\u7EBF\u4E0E\u7403\u4F53\u76F8\u4EA4\n vec2 raySphereIntersect(vec3 r0, vec3 rd, float sr) {\n float a = dot(rd, rd);\n float b = 2.0 * dot(rd, r0);\n float c = dot(r0, r0) - (sr * sr);\n float d = (b * b) - 4.0 * a * c;\n\n if (d < 0.0) return vec2(-1.0, -1.0);\n float squaredD = sqrt(d);\n\n return vec2((-b - squaredD) / (2.0 * a), (-b + squaredD) / (2.0 * a));\n }\n\n float hash12(vec2 p) {\n vec3 p3 = fract(vec3(p.xyx) * .1031);\n p3 += dot(p3, p3.yzx + 33.33);\n return fract((p3.x + p3.y) * p3.z);\n }\n\n float saturate(float value) {\n return clamp(value, 0.0, 1.0);\n }\n\n float isotropic() {\n return 0.07957747154594767;\n }\n\n // HG\u76F8\u4F4D\u51FD\u6570\n float HenyeyGreenstein(float cosTheta, float g) {\n float g2 = g * g;\n float denominator = 4.0 * PI * pow(1.0 + g2 - 2.0 * g * cosTheta, 1.5);\n return (1.0 - g2) / max(denominator, 0.0001);\n }\n\n // \u6539\u8FDB\u7684\u76F8\u4F4D\u51FD\u6570 - \u66F4\u597D\u7684\u80CC\u5149\u6563\u5C04\n float improvedPhase(float cosTheta) {\n // \u4E3B\u524D\u5411\u6563\u5C04\u74E3 - \u9002\u5EA6\u6291\u5236\n float forwardLobe = HenyeyGreenstein(cosTheta, 0.4) * 0.4;\n\n // \u589E\u5F3A\u7684\u80CC\u5149\u6563\u5C04\u74E3 - \u63D0\u5347\u80CC\u5149\u4EAE\u5EA6\n float backwardLobe = HenyeyGreenstein(cosTheta, -0.3) * 0.4;\n\n // \u5404\u5411\u540C\u6027\u57FA\u7840\u6563\u5C04\n float isotropicPart = isotropic() * 0.2;\n\n return forwardLobe + backwardLobe + isotropicPart;\n }\n // ===== \u8865\u5168\u7684\u4F53\u79EF\u4ECB\u8D28\u5BC6\u5EA6\u51FD\u6570 =====\n // \u67CF\u6797\u566A\u58F0\u51FD\u6570\n vec4 permute(vec4 x) { return mod(((x*34.0)+1.0)*x, 289.0); }\n vec4 taylorInvSqrt(vec4 r) { return 1.79284291400159 - 0.85373472095314 * r; }\n\n float perlinNoise(vec3 P) {\n vec3 i0 = floor(P);\n vec3 f0 = fract(P);\n vec3 f = f0 * f0 * (3.0 - 2.0 * f0);\n vec4 ix = vec4(i0.x, i0.x + 1.0, i0.x, i0.x + 1.0);\n vec4 iy = vec4(i0.y, i0.y, i0.y + 1.0, i0.y + 1.0);\n vec4 iz0 = vec4(i0.z);\n vec4 iz1 = iz0 + 1.0;\n\n vec4 ixy = permute(permute(ix) + iy);\n vec4 ixy0 = permute(ixy + iz0);\n vec4 ixy1 = permute(ixy + iz1);\n\n vec4 gx0 = ixy0 / 7.0;\n vec4 gy0 = fract(floor(gx0) / 7.0) - 0.5;\n gx0 = fract(gx0) - 0.5;\n vec4 gz0 = vec4(0.5) - abs(gx0) - abs(gy0);\n vec4 sz0 = step(gz0, vec4(0.0));\n gx0 -= sz0 * (step(0.0, gx0) - 0.5);\n gy0 -= sz0 * (step(0.0, gy0) - 0.5);\n\n vec4 gx1 = ixy1 / 7.0;\n vec4 gy1 = fract(floor(gx1) / 7.0) - 0.5;\n gx1 = fract(gx1) - 0.5;\n vec4 gz1 = vec4(0.5) - abs(gx1) - abs(gy1);\n vec4 sz1 = step(gz1, vec4(0.0));\n gx1 -= sz1 * (step(0.0, gx1) - 0.5);\n gy1 -= sz1 * (step(0.0, gy1) - 0.5);\n\n vec3 g000 = vec3(gx0.x, gy0.x, gz0.x);\n vec3 g100 = vec3(gx0.y, gy0.y, gz0.y);\n vec3 g010 = vec3(gx0.z, gy0.z, gz0.z);\n vec3 g110 = vec3(gx0.w, gy0.w, gz0.w);\n vec3 g001 = vec3(gx1.x, gy1.x, gz1.x);\n vec3 g101 = vec3(gx1.y, gy1.y, gz1.y);\n vec3 g011 = vec3(gx1.z, gy1.z, gz1.z);\n vec3 g111 = vec3(gx1.w, gy1.w, gz1.w);\n\n vec4 norm0 = taylorInvSqrt(vec4(dot(g000, g000), dot(g010, g010), dot(g100, g100), dot(g110, g110)));\n g000 *= norm0.x; g010 *= norm0.y;\n g100 *= norm0.z; g110 *= norm0.w;\n vec4 norm1 = taylorInvSqrt(vec4(dot(g001, g001), dot(g011, g011), dot(g101, g101), dot(g111, g111)));\n g001 *= norm1.x; g011 *= norm1.y;\n g101 *= norm1.z; g111 *= norm1.w;\n\n float n000 = dot(g000, f0);\n float n100 = dot(g100, f0 - vec3(1.0, 0.0, 0.0));\n float n010 = dot(g010, f0 - vec3(0.0, 1.0, 0.0));\n float n110 = dot(g110, f0 - vec3(1.0, 1.0, 0.0));\n float n001 = dot(g001, f0 - vec3(0.0, 0.0, 1.0));\n float n101 = dot(g101, f0 - vec3(1.0, 0.0, 1.0));\n float n011 = dot(g011, f0 - vec3(0.0, 1.0, 1.0));\n float n111 = dot(g111, f0 - vec3(1.0, 1.0, 1.0));\n\n vec4 n_z0 = mix(vec4(n000, n100, n010, n110),\n vec4(n001, n101, n011, n111), f.z);\n vec2 n_z1 = mix(n_z0.xy, n_z0.zw, f.y);\n float n = mix(n_z1.x, n_z1.y, f.x);\n\n return 2.2 * n;\n }\n // FBM\u51FD\u6570\n float fBm(vec3 p, int octaves, float persistence, float lacunarity) {\n float value = 0.0;\n float amplitude = 1.0;\n float frequency = 1.0;\n float maxValue = 0.0;\n\n for (int i = 0; i < octaves; i++) {\n value += amplitude * perlinNoise(p * frequency);\n maxValue += amplitude;\n amplitude *= persistence;\n frequency *= lacunarity;\n }\n\n return value / maxValue;\n }\n // \u57DF\u626D\u66F2\u566A\u58F0\n float domainWarpedNoise(vec3 p, float intensity) {\n vec3 q = vec3(\n perlinNoise(p),\n perlinNoise(p + vec3(123.4, 234.5, 345.6)),\n perlinNoise(p + vec3(234.5, 345.6, 456.7))\n );\n vec3 r = vec3(\n perlinNoise(p + 1.0 * q + vec3(123.4, 234.5, 345.6)),\n perlinNoise(p + 1.0 * q + vec3(234.5, 345.6, 456.7)),\n perlinNoise(p + 1.0 * q + vec3(345.6, 456.7, 567.8))\n );\n return perlinNoise(p + intensity * r);\n }\n\n // Worley\u566A\u58F0\n float worleyNoise(vec3 p, float scale) {\n vec3 i = floor(p * scale);\n vec3 f = fract(p * scale);\n\n float minDist1 = 1.0;\n float minDist2 = 1.0;\n\n for (int x = -1; x <= 1; x++) {\n for (int y = -1; y <= 1; y++) {\n for (int z = -1; z <= 1; z++) {\n vec3 neighbor = vec3(float(x), float(y), float(z));\n vec3 random = fract(sin(dot(i + neighbor, vec3(127.1, 311.7, 74.7))) *\n vec3(43758.5453, 22578.1459, 19632.7411));\n vec3 point = neighbor + random - f;\n float dist = length(point);\n\n if (dist < minDist1) {\n minDist2 = minDist1;\n minDist1 = dist;\n } else if (dist < minDist2) {\n minDist2 = dist;\n }\n }\n }\n }\n\n return minDist2 - minDist1;\n }\n // \u4E91\u5C42\u9AD8\u5EA6\u5206\u5E03\u51FD\u6570\n float cloudHeightProfile(float heightRatio, float cloudType) {\n // \u5C42\u4E91 - \u5747\u5300\u5206\u5E03\n if (cloudType < 0.3) {\n return 1.0;\n }\n // \u79EF\u4E91 - \u4E2D\u95F4\u539A\uFF0C\u4E0A\u4E0B\u8584\n else if (cloudType < 0.7) {\n float profile = 1.0 - 4.0 * pow(heightRatio - 0.5, 2.0);\n return max(profile, 0.1);\n }\n // \u7827\u72B6\u4E91 - \u4E0A\u90E8\u6269\u5C55\n else {\n float anvilProfile = 1.0 - pow(heightRatio, 2.0);\n return max(anvilProfile, 0.2);\n }\n }\n\n // \u96E8\u4E91\u5BC6\u5EA6\u7279\u5F81\n float rainCloudDensity(float baseDensity, float heightRatio, float rainFactor) {\n if (rainFactor < 0.1) return baseDensity;\n\n // \u96E8\u4E91\u5E95\u90E8\u66F4\u5BC6\u96C6\n float rainProfile = 1.0 + rainFactor * (1.0 - heightRatio) * 2.0;\n return baseDensity * rainProfile;\n }\n // ===== \u8865\u5168\u7684\u4F53\u79EF\u4ECB\u8D28\u5149\u7167\u6A21\u578B =====\n\n const float preBaseScale = 0.0003;\n const float preFineScale = 0.0003 * 16.0;\n float baseScale = 0.0003;\n // ===== \u8865\u5168\u7684\u4E91\u6735\u5BC6\u5EA6\u51FD\u6570 =====\n float cloudDensity(vec3 p, vec3 windVector, inout float heightRatio) {\n float finalCoverage = cloudCover;\n if (finalCoverage <= 0.001) {\n return 0.0;\n }\n\n float height = length(p) - realPlanetRadius;\n heightRatio = clamp((height - cloudHeight) / cloudThickness, 0.0, 1.0);\n\n // \u57FA\u7840\u9AD8\u5EA6\u56E0\u5B50\n float hLower = cloudHeight;\n float hUpper = cloudHeight + cloudThickness;\n float heightFactor = smoothstep(hLower, hLower + 0.2 * cloudThickness, height) *\n (1.0 - smoothstep(hUpper - 0.2 * cloudThickness, hUpper, height));\n\n vec3 seedOffset = vec3(cloudSeed * 100.0, 0.0, cloudSeed * 50.0);\n vec3 animatedPos = p + windVector * windSpeedRatio + seedOffset;\n\n // \u57FA\u7840\u5F62\u72B6\u566A\u58F0\n float baseShape = fBm(animatedPos * preBaseScale, 4, 0.5, 2.0);\n\n // \u57DF\u626D\u66F2\u589E\u52A0\u7EC6\u8282\n float warpIntensity = mix(0.1, 0.8, cloudTurbulence);\n float baseShape0 = fBm(animatedPos * preBaseScale, 3, 0.5, 2.0);\n float warped = domainWarpedNoise(animatedPos * (preBaseScale * 0.5), warpIntensity * 0.7);\n baseShape = mix(baseShape0, warped, 0.25);\n\n // Worley\u566A\u58F0\u521B\u5EFA\u56E2\u5757\u7ED3\u6784\n float worleyScale = mix(0.0002, 0.0008, cloudClumping);\n float worleyPattern = worleyNoise(animatedPos, worleyScale);\n worleyPattern = saturate(worleyPattern * 1.2 + 0.7);\n\n // \u6839\u636E\u4E91\u7C7B\u578B\u6DF7\u5408\n float cumulusFactor = cloudType;\n float stratusFactor = 1.0 - cloudType;\n\n float cumulusShape = baseShape * worleyPattern;\n cumulusShape = mix(cumulusShape, baseShape, 0.3);\n\n float stratusShape = baseShape * 0.8;\n\n float cloudPattern = mix(stratusShape, cumulusShape, cumulusFactor);\n\n // \u7827\u72B6\u4E91\u7279\u5F81\n float anvilFactor = cloudAnvil * pow(heightRatio, 2.0);\n if (anvilFactor > 0.01) {\n float anvilNoise = fBm(animatedPos * baseScale * 0.3, 3, 0.6, 2.0);\n cloudPattern = mix(cloudPattern, anvilNoise, anvilFactor * 0.5);\n }\n\n // \u7EC6\u8282\u4FB5\u8680\n float fineScale = baseScale * 16.0;\n float fineDetail = fBm(animatedPos * fineScale, 2, 0.7, 2.5);\n float erosionIntensity = mix(0.1, 0.4, cumulusFactor) * detailStrength;\n float erosion = fineDetail * erosionIntensity;\n\n // \u57FA\u7840\u5BC6\u5EA6\u8BA1\u7B97\n float baseDensity = cloudPattern - erosion;\n float coverageThreshold = mix(0.1, -0.3, cloudCover * (0.5 + cumulusFactor * 0.5));\n float dens = saturate(baseDensity - coverageThreshold);\n\n // \u9510\u5316\u8FB9\u754C\n float sharpness = mix(1.2, 2.0, cumulusFactor) * cloudSharpness;\n dens = pow(dens, sharpness);\n\n // \u5E94\u7528\u9AD8\u5EA6\u5206\u5E03\n float verticalProfile = cloudHeightProfile(heightRatio, cloudType);\n dens *= heightFactor * cloudCover * verticalProfile;\n\n // \u5E94\u7528\u96E8\u4E91\u7279\u5F81\n dens = rainCloudDensity(dens, heightRatio, rainClouds);\n\n // \u6700\u7EC8\u5BC6\u5EA6\u8C03\u6574\n dens *= densityMultiplier;\n dens = max(dens, 0.0);\n\n return dens;\n }\n float cloudDensityFast(vec3 p)\n {\n float h = length(p) - realPlanetRadius;\n float heightRatio = clamp((h - cloudHeight) / cloudThickness, 0.0, 1.0);\n\n // \u53EA\u505A\u6700\u57FA\u7840\u7684 shape\uFF0C\u4E0D\u505A Worley\u3001\u4E0D\u505A domain warp\uFF0C\u4E0D\u505A erosion\n float n = perlinNoise(p * 0.00035);\n n = n * n * 1.2; // \u7B80\u5355\u5F3A\u5316\n\n // \u9AD8\u5EA6\u5206\u5E03\n float profile = cloudHeightProfile(heightRatio, cloudType);\n\n return saturate(n * profile * cloudCover * densityMultiplier * 0.8);\n }\n // \u4F53\u79EF\u9634\u5F71\u51FD\u6570 - \u6A21\u62DF\u5149\u7EBF\u5728\u4E91\u5185\u7684\u8870\u51CF\n float volumetricShadow(vec3 p, vec3 lightDir, float stepSize, int steps) {\n float shadow = 1.0;\n vec3 currentPos = p;\n\n for (int i = 0; i < steps; i++) {\n currentPos += lightDir * stepSize;\n float heightRatioDummy;\n float shadowDensity = cloudDensityFast(currentPos);\n\n // \u6307\u6570\u8870\u51CF\u6A21\u62DF\u5149\u7EBF\u5728\u4E91\u5185\u7684\u5438\u6536\n shadow *= exp(-shadowDensity * stepSize * absorption * 2.0);\n\n if (shadow < 0.01) break;\n }\n\n return shadow;\n }\n\n // \u6539\u8FDB\u7684\u73AF\u5883\u5149\u7167\u51FD\u6570\n vec3 calculateAmbientLight(float heightRatio, float dens, float dotLightRay) {\n // \u57FA\u7840\u73AF\u5883\u5149 - \u6839\u636E\u9AD8\u5EA6\u6DF7\u5408\u5730\u9762\u548C\u5929\u7A7A\u989C\u8272\n vec3 baseAmbient = mix(groundAmbientColor, skyAmbientColor, heightRatio);\n\n // \u5BC6\u5EA6\u76F8\u5173\u73AF\u5883\u5149 - \u8584\u4E91\u533A\u57DF\u66F4\u4EAE\n float densityFactor = 1.0 - exp(-dens * 2.0);\n baseAmbient *= (1.0 + densityFactor * 0.5);\n\n // \u80CC\u5149\u589E\u5F3A - \u5F53\u89C6\u7EBF\u4E0E\u5149\u6E90\u65B9\u5411\u63A5\u8FD1\u53CD\u5411\u65F6\n float backLightFactor = smoothstep(-0.8, -0.2, dotLightRay);\n vec3 backLightBoost = skyAmbientColor * backLightFactor * 0.8;\n\n return baseAmbient + backLightBoost;\n }\n\n // \u6539\u8FDB\u7684\u591A\u6563\u5C04\u6A21\u62DF\n float calculateMultiScatter(float dens, float heightRatio, float dotLightRay) {\n // \u57FA\u7840\u591A\u6563\u5C04\n float baseMultiScatter = pow(1.0 - exp(-dens * 1.5), 1.5) * 0.4;\n\n // \u80CC\u5149\u533A\u57DF\u989D\u5916\u591A\u6563\u5C04\n float backScatterBoost = smoothstep(-0.6, 0.0, dotLightRay) * 0.3;\n\n // \u9AD8\u7A7A\u533A\u57DF\u6563\u5C04\u589E\u5F3A\n float heightScatter = heightRatio * 0.2;\n\n return baseMultiScatter + backScatterBoost + heightScatter;\n }\n\n float distanceQualityR = 0.00005;\n float minDistance = 10.0;\n\n // ===== \u8865\u5168\u7684\u4F53\u79EF\u6E32\u67D3\u6838\u5FC3\u51FD\u6570 =====\n vec4 calculate_clouds(vec3 start, vec3 dir, float maxDistance, vec3 light_dir, vec3 wind) {\n vec4 cloud = vec4(0.0, 0.0, 0.0, 1.0);\n float cloudTopRadius = realPlanetRadius + cloudHeight + cloudThickness;\n vec2 toTop = raySphereIntersect(start, dir, cloudTopRadius);\n float cloudBaseRadius = realPlanetRadius + cloudHeight;\n vec2 toCloudBase = raySphereIntersect(start, dir, cloudBaseRadius);\n float startHeight = length(start) - realPlanetRadius;\n\n float tmin = 0.0;\n float tmax = maxDistance;\n cloudTop = cloudHeight + cloudThickness;\n\n // \u8BA1\u7B97\u5C04\u7EBF\u4E0E\u4E91\u5C42\u7684\u4EA4\u70B9\n if (startHeight > cloudTop) {\n if (toTop.x < 0.0) return vec4(0.0);\n tmin = toTop.x;\n if (toCloudBase.x > 0.0) {\n tmax = min(toCloudBase.x, maxDistance);\n } else {\n tmax = min(toTop.y, maxDistance);\n }\n } else if (startHeight < cloudHeight) {\n tmin = toCloudBase.y;\n tmax = min(toTop.y, maxDistance);\n } else {\n if (toCloudBase.x > 0.0) {\n tmax = min(toCloudBase.x, maxDistance);\n } else {\n tmax = min(toTop.y, maxDistance);\n }\n }\n\n tmin = max(tmin, minDistance);\n tmax = min(tmax, absoluteMaxDistance);\n\n if (tmax < tmin) return vec4(0.0);\n\n float rayLength = tmax - tmin;\n float thicknessFactor = cloudThickness / 500.0;\n float baseStepSize = mix(CLOUDS_MARCH_STEP, CLOUDS_MARCH_STEP * 1.5, saturate(thicknessFactor - 1.0));\n\n float maxEffectiveSteps = min(float(MAXIMUM_CLOUDS_STEPS), 200.0 + cloudThickness * 0.2);\n float adaptiveSteps = min(maxEffectiveSteps, rayLength / baseStepSize);\n\n float longMarchStep = rayLength / adaptiveSteps;\n longMarchStep = max(longMarchStep, baseStepSize);\n\n float shortMarchStep = CLOUDS_DENS_MARCH_STEP;\n float numberApproachSteps = (longMarchStep / shortMarchStep) * 1.5;\n\n float distance = tmin;\n\n float jitter = hash12(gl_FragCoord.xy) * 1.2;\n distance += jitter * longMarchStep;\n\n bool inCloud = false;\n float stepsBeforeExitingCloud = 0.0;\n int actualSteps = 0;\n\n // \u9884\u8BA1\u7B97\u5149\u7167\u53C2\u6570\n vec3 sunColor = normalize(czm_lightColor);\n // ===== \u8865\u5168\u7684\u4F53\u79EF\u4ECB\u8D28\u5149\u7167\u8BA1\u7B97 =====\n float dotLightRay = dot(dir, light_dir);\n for (int i = 0; i < MAXIMUM_CLOUDS_STEPS; i++) {\n if (distance > tmax) break;\n if (actualSteps > int(adaptiveSteps)) break;\n\n vec3 position = start + dir * distance;\n float heightRatio;\n float marchStep = inCloud ? shortMarchStep : longMarchStep;\n float dens = cloudDensity(position, wind, heightRatio);\n\n // \u7A7A\u7A7A\u95F4\u8DF3\u8FC7\u4F18\u5316\n if (dens < 0.005) {\n if (inCloud) {\n if (stepsBeforeExitingCloud > 0.0) {\n stepsBeforeExitingCloud -= 1.0;\n } else {\n inCloud = false;\n marchStep = longMarchStep * 2.0;\n }\n }\n distance += marchStep;\n actualSteps++;\n continue;\n }\n\n // \u8FDB\u5165\u4E91\u5C42\u68C0\u6D4B\n if (!inCloud) {\n inCloud = true;\n stepsBeforeExitingCloud = numberApproachSteps;\n distance = max(tmin, distance - longMarchStep);\n continue;\n }\n\n // \u4F53\u79EF\u9634\u5F71\n float shadow = volumetricShadow(position, light_dir, shortMarchStep * 2.0, 8);\n\n // \u4F7F\u7528\u6539\u8FDB\u7684\u76F8\u4F4D\u51FD\u6570\n float sunPhase = improvedPhase(dotLightRay);\n float ambientPhase = isotropic();\n\n // \u9633\u5149\u5F3A\u5EA6\n float sunIntensity = smoothstep(0.0, 0.4, 1.0 - dens) * 0.6 * shadow;\n\n // \u73AF\u5883\u5149\u7167\n vec3 ambientLight = calculateAmbientLight(heightRatio, dens, dotLightRay);\n float ambientIntensity = 2.5;\n\n // \u591A\u6563\u5C04\n float multiScatter = calculateMultiScatter(dens, heightRatio, dotLightRay);\n\n // \u76F4\u63A5\u5149\u7167\n vec3 directLight = sunPhase * sunColor * sunIntensity * 0.5;\n\n // \u73AF\u5883\u5149\u7167\u6563\u5C04\n vec3 ambientScattering = ambientPhase * ambientLight * ambientIntensity * (1.0 + multiScatter);\n\n // \u4FA7\u5149\u548C\u80CC\u5149\u589E\u5F3A\n float sideBackLight = smoothstep(-0.5, 0.3, dotLightRay) * 0.4;\n ambientScattering += ambientLight * sideBackLight * multiScatter;\n\n // \u7EC4\u5408\u5149\u7167\n vec3 stepScattering = cloud.a * scatteringCoefficient * marchStep *\n (directLight + ambientScattering);\n\n // \u80FD\u91CF\u9650\u5236\n float maxStepBrightness = 0.25;\n stepScattering = min(stepScattering, vec3(maxStepBrightness));\n\n cloud.rgb += stepScattering;\n\n // \u900F\u660E\u5EA6\u8BA1\u7B97 - \u4F53\u79EF\u4ECB\u8D28\u7684\u6D88\u5149\n float extinctionCoeff = absorption * (0.8 + 0.2 * dens) * (0.6 + dens*0.4);\n cloud.a *= exp(-extinctionCoeff * marchStep);\n\n // \u63D0\u524D\u7EC8\u6B62\n if (cloud.a < 0.01) {\n cloud.a = 0.0;\n break;\n }\n\n distance += marchStep;\n actualSteps++;\n }\n\n // \u8272\u8C03\u6620\u5C04\n cloud.rgb = cloud.rgb / (cloud.rgb + vec3(0.8));\n\n // \u4EAE\u5EA6\u9650\u5236\n float maxChannel = max(cloud.rgb.r, max(cloud.rgb.g, cloud.rgb.b));\n if (maxChannel > 0.7) {\n float compression = smoothstep(0.7, 1.0, maxChannel) * 0.3;\n cloud.rgb = mix(cloud.rgb, cloud.rgb * (1.0 - compression), compression);\n }\n\n return vec4(cloud.rgb, 1.0 - cloud.a);\n }\n\n uniform sampler2D colorTexture;\n in vec2 v_textureCoordinates;\n\n void main() {\n vec4 color = texture(colorTexture, v_textureCoordinates);\n\n // \u8D85\u8FC7\u6700\u5927\u53EF\u89C6\u9AD8\u5EA6\u5219\u8DF3\u8FC7\u4E91\u6E32\u67D3\n float viewerHeight = length(czm_viewerPositionWC) - realPlanetRadius;\n if (viewerHeight > maxVisibleHeight) {\n out_FragColor = color;\n return;\n }\n // \u63A5\u8FD1\u6700\u5927\u53EF\u89C6\u9AD8\u5EA6\u65F6\u5E73\u6ED1\u6DE1\u51FA\n float heightFade = 1.0 - smoothstep(maxVisibleHeight - 1000.0, maxVisibleHeight, viewerHeight);\n\n vec4 rawDepthColor = texture(czm_globeDepthTexture, v_textureCoordinates);\n\n float depth = czm_unpackDepth(rawDepthColor);\n if (depth == 0.0) {\n depth = 1.0;\n }\n\n vec4 positionEC = czm_windowToEyeCoordinates(gl_FragCoord.xy, depth);\n vec4 worldCoordinate = czm_inverseView * positionEC;\n vec3 vWorldPosition = worldCoordinate.xyz / worldCoordinate.w;\n vec3 posToEye = vWorldPosition - czm_viewerPositionWC;\n vec3 direction = normalize(posToEye);\n vec3 lightDirection = normalize(czm_sunPositionWC);\n float distance = length(posToEye);\n\n if (depth == 1.0) {\n distance = absoluteMaxDistance;\n }\n\n vec3 wind = windVector * czm_frameNumber * windSpeedRatio;\n vec4 clouds = calculate_clouds(\n czm_viewerPositionWC,\n direction,\n distance,\n lightDirection,\n wind\n );\n\n color = mix(color, clouds, clouds.a * heightFade);\n out_FragColor = color;\n }\n ";
249
- }
250
-
251
- /**
252
- * 获取真实星球半径 - 与原函数逻辑一致
253
- * @private
254
- * @returns {number} 星球半径
255
- */
256
- }, {
257
- key: "_getRealPlanetRadius",
258
- value: function _getRealPlanetRadius() {
259
- var _map$scene;
260
- var map = this.getMap();
261
- if (map !== null && map !== void 0 && (_map$scene = map.scene) !== null && _map$scene !== void 0 && _map$scene.globe) {
262
- return map.scene.globe.ellipsoid.maximumRadius;
263
- }
264
- return 6378137.0; // 默认地球赤道半径
265
- }
266
-
267
- /**
268
- * 更新体积云参数 - 确保所有原函数中的参数都能正确更新
269
- * @param {Object} params - 要更新的参数对象
270
- */
271
- }, {
272
- key: "updateParameters",
273
- value: function updateParameters(params) {
274
- if (!params || _typeof(params) !== 'object') return this;
275
- this.uniforms = this._buildUniforms(params, this.uniforms);
276
- this._syncAmbientColors();
277
- return this;
278
- }
279
-
280
- /**
281
- * 将十六进制颜色转换为RGB对象
282
- * @private
283
- * @param {string} hex - 十六进制颜色字符串
284
- * @returns {Object} RGB对象
285
- */
286
- }, {
287
- key: "_hexToRgb",
288
- value: function _hexToRgb(hex, fallbackHex) {
289
- var normalizedHex = hex.replace('#', '').trim();
290
- var safeHex = /^[0-9a-fA-F]{6}$/.test(normalizedHex) ? normalizedHex : fallbackHex.replace('#', '');
291
-
292
- // 解析RGB值
293
- var r = parseInt(safeHex.substring(0, 2), 16) / 255;
294
- var g = parseInt(safeHex.substring(2, 4), 16) / 255;
295
- var b = parseInt(safeHex.substring(4, 6), 16) / 255;
296
- return {
297
- r: r,
298
- g: g,
299
- b: b
300
- };
301
- }
302
-
303
- /**
304
- * 重置体积云参数到初始状态
305
- */
306
- }, {
307
- key: "resetParameters",
308
- value: function resetParameters() {
309
- this.uniforms = this._cloneUniforms(this.originalOptions);
310
- this._syncAmbientColors();
311
- return this;
312
- }
313
-
314
- /**
315
- * 显示体积云
316
- *
317
- * 启用后处理阶段,使体积云在场景中可见。
318
- * 这是一个轻量级操作,只是启用现有的后处理效果。
319
- */
320
- }, {
321
- key: "show",
322
- value: function show() {
323
- if (this.postProcessStage) {
324
- this.postProcessStage.enabled = true;
325
- }
326
- return this;
327
- }
328
-
329
- /**
330
- * 隐藏体积云
331
- *
332
- * 禁用后处理阶段,从场景中移除体积云效果。
333
- * 这是一个轻量级操作,不会销毁资源,可以随时通过show()重新启用。
334
- */
335
- }, {
336
- key: "hide",
337
- value: function hide() {
338
- if (this.postProcessStage) {
339
- this.postProcessStage.enabled = false;
340
- }
341
- return this;
342
- }
343
-
344
- /**
345
- * 移除体积云并清理资源
346
- *
347
- * 从场景中完全移除体积云后处理阶段并释放相关资源。
348
- * 调用此方法后,必须重新创建新的实例才能再次使用体积云功能。
349
- */
350
- }, {
351
- key: "destroy",
352
- value: function destroy() {
353
- var _map$scene2;
354
- var map = this.getMap();
355
- if (this.postProcessStage && map !== null && map !== void 0 && (_map$scene2 = map.scene) !== null && _map$scene2 !== void 0 && _map$scene2.postProcessStages.contains(this.postProcessStage)) {
356
- map.scene.postProcessStages.remove(this.postProcessStage);
357
- this.postProcessStage = null;
358
- }
359
- }
360
-
361
- /**
362
- * 获取当前云参数
363
- *
364
- * 返回当前体积云系统的所有配置参数的副本。
365
- * 可以用于检查当前设置或保存配置以便稍后恢复。
366
- *
367
- * @returns {Object} 当前云参数对象的副本,包含所有19个可配置参数
368
- */
369
- }, {
370
- key: "getParameters",
371
- value: function getParameters() {
372
- return this._cloneUniforms(this.uniforms);
373
- }
374
- }]);
375
- return GlobalVolumetricCloud;
376
- }();
377
- export default GlobalVolumetricCloud;
1
+ var _0x470970=_0x4492;(function(_0x372032,_0x455019){var _0x5c1976=_0x4492,_0x1b48cc=_0x372032();while(!![]){try{var _0x23ad0f=parseInt(_0x5c1976(0xde))/0x1*(parseInt(_0x5c1976(0x109))/0x2)+parseInt(_0x5c1976(0xd9))/0x3+-parseInt(_0x5c1976(0xfd))/0x4*(-parseInt(_0x5c1976(0xdd))/0x5)+parseInt(_0x5c1976(0xe5))/0x6*(-parseInt(_0x5c1976(0xf7))/0x7)+parseInt(_0x5c1976(0xeb))/0x8+-parseInt(_0x5c1976(0xc9))/0x9*(-parseInt(_0x5c1976(0xd4))/0xa)+-parseInt(_0x5c1976(0xd0))/0xb;if(_0x23ad0f===_0x455019)break;else _0x1b48cc['push'](_0x1b48cc['shift']());}catch(_0x285bb2){_0x1b48cc['push'](_0x1b48cc['shift']());}}}(_0x229c,0xcf139));function ownKeys(_0x4b9a1f,_0x470df2){var _0x3aa32f=_0x4492,_0x550ee5=Object['keys'](_0x4b9a1f);if(Object['getOwnPropertySymbols']){var _0x38a6be=Object['getOwnPropertySymbols'](_0x4b9a1f);_0x470df2&&(_0x38a6be=_0x38a6be['filter'](function(_0x3f1e2f){var _0x12b83b=_0x4492;return Object[_0x12b83b(0xef)](_0x4b9a1f,_0x3f1e2f)['enumerable'];})),_0x550ee5[_0x3aa32f(0xcb)]['apply'](_0x550ee5,_0x38a6be);}return _0x550ee5;}function _objectSpread(_0x37fcd2){var _0xe11367=_0x4492;for(var _0x1d35bb=0x1;_0x1d35bb<arguments['length'];_0x1d35bb++){var _0x16341a=null!=arguments[_0x1d35bb]?arguments[_0x1d35bb]:{};_0x1d35bb%0x2?ownKeys(Object(_0x16341a),!0x0)['forEach'](function(_0x24da1c){_defineProperty(_0x37fcd2,_0x24da1c,_0x16341a[_0x24da1c]);}):Object['getOwnPropertyDescriptors']?Object[_0xe11367(0x106)](_0x37fcd2,Object['getOwnPropertyDescriptors'](_0x16341a)):ownKeys(Object(_0x16341a))[_0xe11367(0xe1)](function(_0x170bba){var _0x53105f=_0xe11367;Object['defineProperty'](_0x37fcd2,_0x170bba,Object[_0x53105f(0xef)](_0x16341a,_0x170bba));});}return _0x37fcd2;}function _typeof(_0x1e2f41){'@babel/helpers - typeof';var _0x532da0=_0x4492;return _typeof=_0x532da0(0xf2)==typeof Symbol&&_0x532da0(0x100)==typeof Symbol[_0x532da0(0xca)]?function(_0x107703){return typeof _0x107703;}:function(_0x343a38){var _0x2dd2ad=_0x532da0;return _0x343a38&&'function'==typeof Symbol&&_0x343a38[_0x2dd2ad(0xcc)]===Symbol&&_0x343a38!==Symbol[_0x2dd2ad(0xdb)]?'symbol':typeof _0x343a38;},_typeof(_0x1e2f41);}function _classCallCheck(_0x4795d5,_0x1239c8){var _0x4bb617=_0x4492;if(!(_0x4795d5 instanceof _0x1239c8))throw new TypeError(_0x4bb617(0xd7));}function _defineProperties(_0x56079f,_0x239481){var _0x563ea4=_0x4492;for(var _0x5bb9a4=0x0;_0x5bb9a4<_0x239481[_0x563ea4(0xfb)];_0x5bb9a4++){var _0x5bd746=_0x239481[_0x5bb9a4];_0x5bd746[_0x563ea4(0xd5)]=_0x5bd746[_0x563ea4(0xd5)]||![],_0x5bd746['configurable']=!![];if(_0x563ea4(0xf0)in _0x5bd746)_0x5bd746[_0x563ea4(0xe9)]=!![];Object[_0x563ea4(0xc6)](_0x56079f,_toPropertyKey(_0x5bd746[_0x563ea4(0xee)]),_0x5bd746);}}function _createClass(_0x2772a7,_0x473ba8,_0x50dd1e){if(_0x473ba8)_defineProperties(_0x2772a7['prototype'],_0x473ba8);if(_0x50dd1e)_defineProperties(_0x2772a7,_0x50dd1e);return Object['defineProperty'](_0x2772a7,'prototype',{'writable':![]}),_0x2772a7;}function _defineProperty(_0x394d59,_0x3a07b6,_0x407472){return _0x3a07b6=_toPropertyKey(_0x3a07b6),_0x3a07b6 in _0x394d59?Object['defineProperty'](_0x394d59,_0x3a07b6,{'value':_0x407472,'enumerable':!![],'configurable':!![],'writable':!![]}):_0x394d59[_0x3a07b6]=_0x407472,_0x394d59;}function _0x229c(){var _0x216e15=['ywjZB3jWDgLVBG','mZi3ntHwD21eyKy','z3jVDw5Kqw1IAwvUDenVBg9YmW','y2XVDwrdB3zLCG','Dw5PzM9YBxm','y2XVDwruExbL','zgvMAw5LuhjVCgvYDhK','zgvUC2L0Eu11BhrPCgXPzxi','B3jPz2LUywXpChrPB25Z','mtyWmLHmDhjova','AxrLCMf0B3i','ChvZAa','y29UC3rYDwn0B3i','C2nLBMu','y2XVDwrizwLNAhq','ywjZB2X1DgvnyxHeAxn0yw5Jzq','ntmXode3mZnhzwPyA2y','q2fYDgvZAwfUmW','C2nHDhrLCMLUz0nVzwzMAwnPzw50','zgvMyxvSDa','nJCXntbssLfjAfi','zw51BwvYywjSzq','Cg9ZDfbYB2nLC3ntDgfNzxm','q2fUBM90ignHBgWGysbJBgfZCYbHCYbHigz1BMn0Aw9U','AwXSDw1PBMf0Aw9Uq29LzMzPy2LLBNq','mZq5odyZm2rKyvzgEq','x2HLEfrVuMDI','ChjVDg90ExbL','B2jQzwn0','mZG5mdy1Cg12r1Dk','ntver016sva','i0i0rdLgmW','x3n5BMnbBwjPzw50q29SB3jZ','zM9YrwfJAa','Cg9ZDfbYB2nLC3ntDgfNzq','x2nSB25Lvw5PzM9YBxm','Bwf4vMLZAwjSzuHLAwDODa','ndjtyM5Yr1O','D2LUzfnWzwvKuMf0Aw8','x21HCenVBNrLEhq','sw52ywXPzcbdzxnPDw0GvMLLD2vYigLUC3rHBMnLihbYB3zPzgvK','D3jPDgfIBgu','DhjPBq','mte4mJq0ndbtsuHbANy','qeb0B1bYAw1PDgL2zsbTDxn0ihjLDhvYBIbHihbYAw1PDgL2zsb2ywX1zs4','DxbKyxrLugfYyw1LDgvYCW','A2v5','z2v0t3DUuhjVCgvYDhLezxnJCMLWDg9Y','DMfSDwu','y3vYCMvUDfDPBMrwzwn0B3jxqW','zNvUy3rPB24','y2XVBMu','vMLLD2vYigLUC3rHBMnLig11C3qGAgf2zsb2ywXPzcbZy2vUzsbHBMqGCg9ZDfbYB2nLC3ntDgfNzxm','y2XVDwrtAgfYCg5LC3m','y2XVDwrdBhvTCgLUzW','nJKWnJjSv2rivgK','y2XVDwrtzwvK','AgLKzq','zwXSAxbZB2LK','BgvUz3rO','C3vIC3rYAw5N','ntj2EMr0s0y','z2v0twfW','CMfPBKnSB3vKCW','C3LTyM9S','y2XVDwruDxjIDwXLBMnL','zw5HyMXLza','z2XVyMu','y2fSBa','x2j1AwXKvw5PzM9YBxm','zgvMAw5LuhjVCgvYDgLLCW','C2T5qw1IAwvUDenVBg9YmW'];_0x229c=function(){return _0x216e15;};return _0x229c();}function _toPropertyKey(_0x287b52){var _0x195c0f=_toPrimitive(_0x287b52,'string');return'symbol'==_typeof(_0x195c0f)?_0x195c0f:String(_0x195c0f);}function _0x4492(_0x38cf32,_0x44034c){_0x38cf32=_0x38cf32-0xc4;var _0x229c43=_0x229c();var _0x44923a=_0x229c43[_0x38cf32];if(_0x4492['fiGWkl']===undefined){var _0x344510=function(_0x1d6b89){var _0x3fdadb='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';var _0x4dda74='',_0x4b9a1f='';for(var _0x470df2=0x0,_0x550ee5,_0x38a6be,_0x3f1e2f=0x0;_0x38a6be=_0x1d6b89['charAt'](_0x3f1e2f++);~_0x38a6be&&(_0x550ee5=_0x470df2%0x4?_0x550ee5*0x40+_0x38a6be:_0x38a6be,_0x470df2++%0x4)?_0x4dda74+=String['fromCharCode'](0xff&_0x550ee5>>(-0x2*_0x470df2&0x6)):0x0){_0x38a6be=_0x3fdadb['indexOf'](_0x38a6be);}for(var _0x37fcd2=0x0,_0x1d35bb=_0x4dda74['length'];_0x37fcd2<_0x1d35bb;_0x37fcd2++){_0x4b9a1f+='%'+('00'+_0x4dda74['charCodeAt'](_0x37fcd2)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x4b9a1f);};_0x4492['xiNAMM']=_0x344510,_0x4492['XHJeiq']={},_0x4492['fiGWkl']=!![];}var _0x550064=_0x229c43[0x0],_0xe6bf95=_0x38cf32+_0x550064,_0x5ca1ed=_0x4492['XHJeiq'][_0xe6bf95];return!_0x5ca1ed?(_0x44923a=_0x4492['xiNAMM'](_0x44923a),_0x4492['XHJeiq'][_0xe6bf95]=_0x44923a):_0x44923a=_0x5ca1ed,_0x44923a;}function _toPrimitive(_0x226064,_0x485e55){var _0x104c8e=_0x4492;if(_0x104c8e(0xdc)!=_typeof(_0x226064)||!_0x226064)return _0x226064;var _0x3d1642=_0x226064[Symbol['toPrimitive']];if(void 0x0!==_0x3d1642){var _0x5dc94d=_0x3d1642[_0x104c8e(0x104)](_0x226064,_0x485e55||_0x104c8e(0xd3));if('object'!=_typeof(_0x5dc94d))return _0x5dc94d;throw new TypeError(_0x104c8e(0xec));}return('string'===_0x485e55?String:Number)(_0x226064);}import*as _0x4dda74 from'deeptwins-cesium';var DEFAULT_SKY_AMBIENT_COLOR=_0x470970(0xdf),DEFAULT_GROUND_AMBIENT_COLOR='#d6d6d8',DEFAULT_WIND_VECTOR=new _0x4dda74['Cartesian3'](0x64,0x0,0x0),createDefaultCloudParams=function createDefaultCloudParams(){var _0x52eaa1=_0x470970;return{'densityMultiplier':1.5,'detailStrength':0.69,'cloudSharpness':1.032,'rainClouds':0.45,'currentWindVectorWC':_0x4dda74[_0x52eaa1(0xd1)]['clone'](DEFAULT_WIND_VECTOR),'cloudCover':0.039,'cloudHeight':0x1f40,'cloudThickness':0x3e8,'absoluteMaxDistance':0x2faf080,'absorption':0.004,'windSpeedRatio':0.3,'scatteringCoefficient':0.01,'illuminationCoefficient':0.01,'cloudSeed':Math['random']()*0x64,'cloudType':0x0,'cloudTurbulence':0.5,'cloudClumping':0.75,'cloudAnvil':0x0,'skyAmbientColor':DEFAULT_SKY_AMBIENT_COLOR,'groundAmbientColor':DEFAULT_GROUND_AMBIENT_COLOR,'maxVisibleHeight':0x7530};},GlobalVolumetricCloud=(function(){var _0x489f2f=_0x470970;function _0x20cca2(_0x4adf3f){var _0x5895cb=_0x4492,_0xbf4745=arguments[_0x5895cb(0xfb)]>0x1&&arguments[0x1]!==undefined?arguments[0x1]:{};_classCallCheck(this,_0x20cca2),_defineProperty(this,'_mapContext',void 0x0),_defineProperty(this,_0x5895cb(0xc4),void 0x0),_defineProperty(this,'originalOptions',void 0x0),_defineProperty(this,_0x5895cb(0xe2),void 0x0),_defineProperty(this,_0x5895cb(0x107),void 0x0),_defineProperty(this,'groundAmbientColor3',void 0x0),this[_0x5895cb(0xe7)]=_0x4adf3f[_0x5895cb(0xe7)];var _0x35b8ce=this['getMap']();if(!_0x35b8ce||_typeof(_0x35b8ce)!==_0x5895cb(0xdc))throw new Error(_0x5895cb(0xe8));if(!_0x35b8ce[_0x5895cb(0xcd)]||!_0x35b8ce[_0x5895cb(0xcd)]['postProcessStages'])throw new Error(_0x5895cb(0xf4));this['uniforms']=this[_0x5895cb(0x105)](_0xbf4745),this[_0x5895cb(0xc8)]=this[_0x5895cb(0xe3)](this['uniforms']),this[_0x5895cb(0xe2)]=null,this['skyAmbientColor3']={'r':0x0,'g':0x0,'b':0x0},this['groundAmbientColor3']={'r':0x0,'g':0x0,'b':0x0},this[_0x5895cb(0xe0)](),this['initialize']();}return _createClass(_0x20cca2,[{'key':_0x489f2f(0xfe),'value':function _0x430756(){var _0x8050ab=_0x489f2f;return this[_0x8050ab(0xe7)]&&this['_mapContext'][_0x8050ab(0xfe)]();}},{'key':'_cloneUniforms','value':function _0x5a11aa(_0x24a724){var _0x2c6460=_0x489f2f;return _objectSpread(_objectSpread({},_0x24a724),{},{'currentWindVectorWC':_0x4dda74['Cartesian3'][_0x2c6460(0xf3)](_0x24a724['currentWindVectorWC'])});}},{'key':_0x489f2f(0x105),'value':function _0x116ad5(){var _0x3b6d58=_0x489f2f,_0x5e6f6a,_0x289ed2,_0x90906a,_0x2f3ca7,_0x177bc8,_0x35ba0e,_0x578868,_0x5e6ec4,_0x37d586,_0x5e1f53,_0x1b8b3f,_0x126008,_0x2278cc,_0x8f4d26,_0x3e5e62,_0x1c87fa,_0x37db4e,_0x5a54b2,_0x4b06d6,_0x1fad5b,_0x50de0c=arguments[_0x3b6d58(0xfb)]>0x0&&arguments[0x0]!==undefined?arguments[0x0]:{},_0x4d9aba=arguments['length']>0x1?arguments[0x1]:undefined,_0x54f240=_0x4d9aba?this['_cloneUniforms'](_0x4d9aba):createDefaultCloudParams(),_0x4b27d0={'densityMultiplier':(_0x5e6f6a=_0x50de0c['densityMultiplier'])!==null&&_0x5e6f6a!==void 0x0?_0x5e6f6a:_0x54f240[_0x3b6d58(0xc7)],'detailStrength':(_0x289ed2=_0x50de0c['detailStrength'])!==null&&_0x289ed2!==void 0x0?_0x289ed2:_0x54f240['detailStrength'],'cloudSharpness':(_0x90906a=_0x50de0c[_0x3b6d58(0xf5)])!==null&&_0x90906a!==void 0x0?_0x90906a:_0x54f240['cloudSharpness'],'rainClouds':(_0x2f3ca7=_0x50de0c[_0x3b6d58(0xff)])!==null&&_0x2f3ca7!==void 0x0?_0x2f3ca7:_0x54f240['rainClouds'],'currentWindVectorWC':_0x50de0c['currentWindVectorWC']?_0x4dda74[_0x3b6d58(0xd1)]['clone'](_0x50de0c[_0x3b6d58(0xf1)]):_0x4dda74[_0x3b6d58(0xd1)][_0x3b6d58(0xf3)](_0x54f240['currentWindVectorWC']),'cloudCover':(_0x177bc8=_0x50de0c[_0x3b6d58(0x10b)])!==null&&_0x177bc8!==void 0x0?_0x177bc8:_0x54f240['cloudCover'],'cloudHeight':(_0x35ba0e=_0x50de0c[_0x3b6d58(0xce)])!==null&&_0x35ba0e!==void 0x0?_0x35ba0e:_0x54f240[_0x3b6d58(0xce)],'cloudThickness':(_0x578868=_0x50de0c['cloudThickness'])!==null&&_0x578868!==void 0x0?_0x578868:_0x54f240['cloudThickness'],'absoluteMaxDistance':(_0x5e6ec4=_0x50de0c[_0x3b6d58(0xcf)])!==null&&_0x5e6ec4!==void 0x0?_0x5e6ec4:_0x54f240[_0x3b6d58(0xcf)],'absorption':(_0x37d586=_0x50de0c[_0x3b6d58(0x108)])!==null&&_0x37d586!==void 0x0?_0x37d586:_0x54f240[_0x3b6d58(0x108)],'windSpeedRatio':(_0x5e1f53=_0x50de0c[_0x3b6d58(0xe6)])!==null&&_0x5e1f53!==void 0x0?_0x5e1f53:_0x54f240[_0x3b6d58(0xe6)],'scatteringCoefficient':(_0x1b8b3f=_0x50de0c[_0x3b6d58(0xd2)])!==null&&_0x1b8b3f!==void 0x0?_0x1b8b3f:_0x54f240[_0x3b6d58(0xd2)],'illuminationCoefficient':(_0x126008=_0x50de0c['illuminationCoefficient'])!==null&&_0x126008!==void 0x0?_0x126008:_0x54f240[_0x3b6d58(0xd8)],'cloudSeed':(_0x2278cc=_0x50de0c[_0x3b6d58(0xf8)])!==null&&_0x2278cc!==void 0x0?_0x2278cc:_0x54f240['cloudSeed'],'cloudType':(_0x8f4d26=_0x50de0c[_0x3b6d58(0xc5)])!==null&&_0x8f4d26!==void 0x0?_0x8f4d26:_0x54f240[_0x3b6d58(0xc5)],'cloudTurbulence':(_0x3e5e62=_0x50de0c[_0x3b6d58(0x101)])!==null&&_0x3e5e62!==void 0x0?_0x3e5e62:_0x54f240[_0x3b6d58(0x101)],'cloudClumping':(_0x1c87fa=_0x50de0c[_0x3b6d58(0xf6)])!==null&&_0x1c87fa!==void 0x0?_0x1c87fa:_0x54f240[_0x3b6d58(0xf6)],'cloudAnvil':(_0x37db4e=_0x50de0c['cloudAnvil'])!==null&&_0x37db4e!==void 0x0?_0x37db4e:_0x54f240['cloudAnvil'],'skyAmbientColor':(_0x5a54b2=_0x50de0c['skyAmbientColor'])!==null&&_0x5a54b2!==void 0x0?_0x5a54b2:_0x54f240['skyAmbientColor'],'groundAmbientColor':(_0x4b06d6=_0x50de0c['groundAmbientColor'])!==null&&_0x4b06d6!==void 0x0?_0x4b06d6:_0x54f240['groundAmbientColor'],'maxVisibleHeight':(_0x1fad5b=_0x50de0c['maxVisibleHeight'])!==null&&_0x1fad5b!==void 0x0?_0x1fad5b:_0x54f240['maxVisibleHeight']};return _0x4b27d0['maxVisibleHeight']>_0x4b27d0['cloudHeight']?_0x4b27d0:_objectSpread(_objectSpread({},_0x4b27d0),{},{'maxVisibleHeight':_0x4b27d0[_0x3b6d58(0xce)]+0x2710});}},{'key':_0x489f2f(0xe0),'value':function _0x1cbcac(){var _0x55d306=_0x489f2f;this[_0x55d306(0x107)]=this['_hexToRgb'](this['uniforms']['skyAmbientColor'],DEFAULT_SKY_AMBIENT_COLOR),this[_0x55d306(0x10a)]=this[_0x55d306(0xda)](this['uniforms']['groundAmbientColor'],DEFAULT_GROUND_AMBIENT_COLOR);}},{'key':'initialize','value':function _0x558b2a(){var _0x3785bb=_0x489f2f,_0x55d2b2=this,_0x1e6342=this['getMap']();if(!_0x1e6342)return;var _0x4b3b65=this['_createShader']();this['postProcessStage']=new _0x4dda74['PostProcessStage']({'uniforms':{'realPlanetRadius':function _0x481b8f(){return _0x55d2b2['_getRealPlanetRadius']();},'windVector':function _0x5de82c(){var _0x131549=_0x4492;return _0x55d2b2[_0x131549(0xc4)]['currentWindVectorWC'];},'cloudCover':function _0x4452e1(){var _0x5d738f=_0x4492;return _0x55d2b2['uniforms'][_0x5d738f(0x10b)];},'cloudHeight':function _0x401ef0(){var _0x57f33b=_0x4492;return _0x55d2b2[_0x57f33b(0xc4)][_0x57f33b(0xce)];},'cloudThickness':function _0x2d2424(){var _0x829f3c=_0x4492;return _0x55d2b2[_0x829f3c(0xc4)]['cloudThickness'];},'absoluteMaxDistance':function _0x5e2ed6(){var _0x54bde1=_0x4492;return _0x55d2b2[_0x54bde1(0xc4)][_0x54bde1(0xcf)];},'absorption':function _0x2b5231(){var _0x3529e2=_0x4492;return _0x55d2b2[_0x3529e2(0xc4)]['absorption'];},'windSpeedRatio':function _0x198577(){var _0x1526f2=_0x4492;return _0x55d2b2['uniforms'][_0x1526f2(0xe6)];},'scatteringCoefficient':function _0x2664c7(){var _0x5d78ee=_0x4492;return _0x55d2b2['uniforms'][_0x5d78ee(0xd2)];},'illuminationCoefficient':function _0x37fe30(){var _0x39b473=_0x4492;return _0x55d2b2[_0x39b473(0xc4)][_0x39b473(0xd8)];},'cloudSeed':function _0xfa6c6b(){return _0x55d2b2['uniforms']['cloudSeed'];},'cloudType':function _0x401d9a(){return _0x55d2b2['uniforms']['cloudType'];},'cloudTurbulence':function _0x427af5(){var _0x49901e=_0x4492;return _0x55d2b2['uniforms'][_0x49901e(0x101)];},'cloudClumping':function _0x463862(){return _0x55d2b2['uniforms']['cloudClumping'];},'cloudAnvil':function _0xb7788(){var _0x2eb091=_0x4492;return _0x55d2b2[_0x2eb091(0xc4)]['cloudAnvil'];},'maxVisibleHeight':function _0x214f4b(){var _0x3414da=_0x4492;return _0x55d2b2[_0x3414da(0xc4)][_0x3414da(0xe4)];},'densityMultiplier':function _0x24411f(){var _0xef3c6f=_0x4492;return _0x55d2b2[_0xef3c6f(0xc4)]['densityMultiplier'];},'detailStrength':function _0x274fc8(){return _0x55d2b2['uniforms']['detailStrength'];},'cloudSharpness':function _0x266e6b(){var _0x384985=_0x4492;return _0x55d2b2[_0x384985(0xc4)]['cloudSharpness'];},'rainClouds':function _0x50438f(){var _0x217df1=_0x4492;return _0x55d2b2[_0x217df1(0xc4)][_0x217df1(0xff)];},'skyAmbientColor':function _0x383e2d(){var _0x5ea4c4=_0x4492;return new _0x4dda74['Cartesian3'](_0x55d2b2[_0x5ea4c4(0x107)]['r'],_0x55d2b2['skyAmbientColor3']['g'],_0x55d2b2['skyAmbientColor3']['b']);},'groundAmbientColor':function _0x4ead84(){var _0x1c18b5=_0x4492;return new _0x4dda74[(_0x1c18b5(0xd1))](_0x55d2b2[_0x1c18b5(0x10a)]['r'],_0x55d2b2[_0x1c18b5(0x10a)]['g'],_0x55d2b2[_0x1c18b5(0x10a)]['b']);}},'forcePowerOfTwo':!![],'fragmentShader':_0x4b3b65}),_0x1e6342[_0x3785bb(0xcd)]['postProcessStages']['add'](this[_0x3785bb(0xe2)]);}},{'key':'_createShader','value':function _0x3a6cc8(){return'\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20precision\x20highp\x20float;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20uniform\x20float\x20realPlanetRadius;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20uniform\x20vec3\x20windVector;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20uniform\x20float\x20cloudCover;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20uniform\x20float\x20cloudHeight;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20uniform\x20float\x20cloudThickness;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20uniform\x20float\x20absoluteMaxDistance;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20uniform\x20float\x20absorption;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20uniform\x20float\x20windSpeedRatio;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20uniform\x20float\x20scatteringCoefficient;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20uniform\x20float\x20illuminationCoefficient;\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20const\x20float\x20PI\x20=\x203.14159265359;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20const\x20float\x20TWO_PI\x20=\x206.28318530718;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20const\x20float\x20FOUR_PI\x20=\x2012.5663706144;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20float\x20cloudTop;\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20#define\x20CLOUDS_MAX_LOD\x201\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20#define\x20CLOUDS_MARCH_STEP\x20120.0\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20#define\x20CLOUDS_DENS_MARCH_STEP\x2060.0\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20#define\x20MAXIMUM_CLOUDS_STEPS\x20256\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20//\x20\u4F53\u79EF\u4ECB\u8D28\u6838\u5FC3\u53C2\u6570\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20uniform\x20float\x20cloudSeed;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20uniform\x20float\x20cloudType;\x20\x20\x20\x20\x20\x20\x20\x20//\x200-1:\x20\u5C42\u4E91\u5230\u79EF\u4E91\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20uniform\x20float\x20cloudTurbulence;\x20\x20//\x20\u6E4D\u6D41\u5F3A\u5EA6\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20uniform\x20float\x20cloudClumping;\x20\x20\x20\x20//\x20\u56E2\u5757\u7A0B\u5EA6\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20uniform\x20float\x20cloudAnvil;\x20\x20\x20\x20\x20\x20\x20//\x20\u7827\u72B6\u4E91\u7279\u5F81\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20uniform\x20float\x20maxVisibleHeight;\x20//\x20\u6700\u5927\u53EF\u89C6\u9AD8\u5EA6\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20uniform\x20vec3\x20skyAmbientColor;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20uniform\x20vec3\x20groundAmbientColor;\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20//\x20=====\x20\u65B0\u589E\u7684\u4F53\u79EF\u4ECB\u8D28\u53C2\u6570\x20=====\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20uniform\x20float\x20densityMultiplier;\x20\x20\x20\x20//\x20\u5BC6\u5EA6\u500D\u589E\u5668\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20uniform\x20float\x20detailStrength;\x20\x20\x20\x20\x20\x20\x20//\x20\u7EC6\u8282\u5F3A\u5EA6\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20uniform\x20float\x20cloudSharpness;\x20\x20\x20\x20\x20\x20\x20//\x20\u4E91\u8FB9\u754C\u9510\u5EA6\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20uniform\x20float\x20rainClouds;\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20//\x20\u96E8\u4E91\u7279\u5F81\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20//\x20\u5C04\u7EBF\u4E0E\u7403\u4F53\u76F8\u4EA4\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20vec2\x20raySphereIntersect(vec3\x20r0,\x20vec3\x20rd,\x20float\x20sr)\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20float\x20a\x20=\x20dot(rd,\x20rd);\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20float\x20b\x20=\x202.0\x20*\x20dot(rd,\x20r0);\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20float\x20c\x20=\x20dot(r0,\x20r0)\x20-\x20(sr\x20*\x20sr);\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20float\x20d\x20=\x20(b\x20*\x20b)\x20-\x204.0\x20*\x20a\x20*\x20c;\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20if\x20(d\x20<\x200.0)\x20return\x20vec2(-1.0,\x20-1.0);\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20float\x20squaredD\x20=\x20sqrt(d);\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20return\x20vec2((-b\x20-\x20squaredD)\x20/\x20(2.0\x20*\x20a),\x20(-b\x20+\x20squaredD)\x20/\x20(2.0\x20*\x20a));\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20}\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20float\x20hash12(vec2\x20p)\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20vec3\x20p3\x20\x20=\x20fract(vec3(p.xyx)\x20*\x20.1031);\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20p3\x20+=\x20dot(p3,\x20p3.yzx\x20+\x2033.33);\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20return\x20fract((p3.x\x20+\x20p3.y)\x20*\x20p3.z);\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20}\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20float\x20saturate(float\x20value)\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20return\x20clamp(value,\x200.0,\x201.0);\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20}\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20float\x20isotropic()\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20return\x200.07957747154594767;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20}\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20//\x20HG\u76F8\u4F4D\u51FD\u6570\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20float\x20HenyeyGreenstein(float\x20cosTheta,\x20float\x20g)\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20float\x20g2\x20=\x20g\x20*\x20g;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20float\x20denominator\x20=\x204.0\x20*\x20PI\x20*\x20pow(1.0\x20+\x20g2\x20-\x202.0\x20*\x20g\x20*\x20cosTheta,\x201.5);\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20return\x20(1.0\x20-\x20g2)\x20/\x20max(denominator,\x200.0001);\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20}\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20//\x20\u6539\u8FDB\u7684\u76F8\u4F4D\u51FD\u6570\x20-\x20\u66F4\u597D\u7684\u80CC\u5149\u6563\u5C04\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20float\x20improvedPhase(float\x20cosTheta)\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20//\x20\u4E3B\u524D\u5411\u6563\u5C04\u74E3\x20-\x20\u9002\u5EA6\u6291\u5236\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20float\x20forwardLobe\x20=\x20HenyeyGreenstein(cosTheta,\x200.4)\x20*\x200.4;\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20//\x20\u589E\u5F3A\u7684\u80CC\u5149\u6563\u5C04\u74E3\x20-\x20\u63D0\u5347\u80CC\u5149\u4EAE\u5EA6\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20float\x20backwardLobe\x20=\x20HenyeyGreenstein(cosTheta,\x20-0.3)\x20*\x200.4;\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20//\x20\u5404\u5411\u540C\u6027\u57FA\u7840\u6563\u5C04\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20float\x20isotropicPart\x20=\x20isotropic()\x20*\x200.2;\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20return\x20forwardLobe\x20+\x20backwardLobe\x20+\x20isotropicPart;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20}\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20//\x20=====\x20\u8865\u5168\u7684\u4F53\u79EF\u4ECB\u8D28\u5BC6\u5EA6\u51FD\u6570\x20=====\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20//\x20\u67CF\u6797\u566A\u58F0\u51FD\u6570\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20vec4\x20permute(vec4\x20x)\x20{\x20return\x20mod(((x*34.0)+1.0)*x,\x20289.0);\x20}\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20vec4\x20taylorInvSqrt(vec4\x20r)\x20{\x20return\x201.79284291400159\x20-\x200.85373472095314\x20*\x20r;\x20}\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20float\x20perlinNoise(vec3\x20P)\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20vec3\x20i0\x20=\x20floor(P);\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20vec3\x20f0\x20=\x20fract(P);\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20vec3\x20f\x20=\x20f0\x20*\x20f0\x20*\x20(3.0\x20-\x202.0\x20*\x20f0);\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20vec4\x20ix\x20=\x20vec4(i0.x,\x20i0.x\x20+\x201.0,\x20i0.x,\x20i0.x\x20+\x201.0);\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20vec4\x20iy\x20=\x20vec4(i0.y,\x20i0.y,\x20i0.y\x20+\x201.0,\x20i0.y\x20+\x201.0);\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20vec4\x20iz0\x20=\x20vec4(i0.z);\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20vec4\x20iz1\x20=\x20iz0\x20+\x201.0;\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20vec4\x20ixy\x20=\x20permute(permute(ix)\x20+\x20iy);\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20vec4\x20ixy0\x20=\x20permute(ixy\x20+\x20iz0);\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20vec4\x20ixy1\x20=\x20permute(ixy\x20+\x20iz1);\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20vec4\x20gx0\x20=\x20ixy0\x20/\x207.0;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20vec4\x20gy0\x20=\x20fract(floor(gx0)\x20/\x207.0)\x20-\x200.5;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20gx0\x20=\x20fract(gx0)\x20-\x200.5;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20vec4\x20gz0\x20=\x20vec4(0.5)\x20-\x20abs(gx0)\x20-\x20abs(gy0);\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20vec4\x20sz0\x20=\x20step(gz0,\x20vec4(0.0));\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20gx0\x20-=\x20sz0\x20*\x20(step(0.0,\x20gx0)\x20-\x200.5);\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20gy0\x20-=\x20sz0\x20*\x20(step(0.0,\x20gy0)\x20-\x200.5);\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20vec4\x20gx1\x20=\x20ixy1\x20/\x207.0;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20vec4\x20gy1\x20=\x20fract(floor(gx1)\x20/\x207.0)\x20-\x200.5;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20gx1\x20=\x20fract(gx1)\x20-\x200.5;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20vec4\x20gz1\x20=\x20vec4(0.5)\x20-\x20abs(gx1)\x20-\x20abs(gy1);\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20vec4\x20sz1\x20=\x20step(gz1,\x20vec4(0.0));\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20gx1\x20-=\x20sz1\x20*\x20(step(0.0,\x20gx1)\x20-\x200.5);\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20gy1\x20-=\x20sz1\x20*\x20(step(0.0,\x20gy1)\x20-\x200.5);\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20vec3\x20g000\x20=\x20vec3(gx0.x,\x20gy0.x,\x20gz0.x);\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20vec3\x20g100\x20=\x20vec3(gx0.y,\x20gy0.y,\x20gz0.y);\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20vec3\x20g010\x20=\x20vec3(gx0.z,\x20gy0.z,\x20gz0.z);\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20vec3\x20g110\x20=\x20vec3(gx0.w,\x20gy0.w,\x20gz0.w);\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20vec3\x20g001\x20=\x20vec3(gx1.x,\x20gy1.x,\x20gz1.x);\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20vec3\x20g101\x20=\x20vec3(gx1.y,\x20gy1.y,\x20gz1.y);\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20vec3\x20g011\x20=\x20vec3(gx1.z,\x20gy1.z,\x20gz1.z);\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20vec3\x20g111\x20=\x20vec3(gx1.w,\x20gy1.w,\x20gz1.w);\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20vec4\x20norm0\x20=\x20taylorInvSqrt(vec4(dot(g000,\x20g000),\x20dot(g010,\x20g010),\x20dot(g100,\x20g100),\x20dot(g110,\x20g110)));\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20g000\x20*=\x20norm0.x;\x20g010\x20*=\x20norm0.y;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20g100\x20*=\x20norm0.z;\x20g110\x20*=\x20norm0.w;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20vec4\x20norm1\x20=\x20taylorInvSqrt(vec4(dot(g001,\x20g001),\x20dot(g011,\x20g011),\x20dot(g101,\x20g101),\x20dot(g111,\x20g111)));\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20g001\x20*=\x20norm1.x;\x20g011\x20*=\x20norm1.y;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20g101\x20*=\x20norm1.z;\x20g111\x20*=\x20norm1.w;\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20float\x20n000\x20=\x20dot(g000,\x20f0);\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20float\x20n100\x20=\x20dot(g100,\x20f0\x20-\x20vec3(1.0,\x200.0,\x200.0));\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20float\x20n010\x20=\x20dot(g010,\x20f0\x20-\x20vec3(0.0,\x201.0,\x200.0));\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20float\x20n110\x20=\x20dot(g110,\x20f0\x20-\x20vec3(1.0,\x201.0,\x200.0));\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20float\x20n001\x20=\x20dot(g001,\x20f0\x20-\x20vec3(0.0,\x200.0,\x201.0));\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20float\x20n101\x20=\x20dot(g101,\x20f0\x20-\x20vec3(1.0,\x200.0,\x201.0));\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20float\x20n011\x20=\x20dot(g011,\x20f0\x20-\x20vec3(0.0,\x201.0,\x201.0));\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20float\x20n111\x20=\x20dot(g111,\x20f0\x20-\x20vec3(1.0,\x201.0,\x201.0));\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20vec4\x20n_z0\x20=\x20mix(vec4(n000,\x20n100,\x20n010,\x20n110),\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20vec4(n001,\x20n101,\x20n011,\x20n111),\x20f.z);\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20vec2\x20n_z1\x20=\x20mix(n_z0.xy,\x20n_z0.zw,\x20f.y);\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20float\x20n\x20=\x20mix(n_z1.x,\x20n_z1.y,\x20f.x);\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20return\x202.2\x20*\x20n;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20}\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20//\x20FBM\u51FD\u6570\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20float\x20fBm(vec3\x20p,\x20int\x20octaves,\x20float\x20persistence,\x20float\x20lacunarity)\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20float\x20value\x20=\x200.0;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20float\x20amplitude\x20=\x201.0;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20float\x20frequency\x20=\x201.0;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20float\x20maxValue\x20=\x200.0;\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20for\x20(int\x20i\x20=\x200;\x20i\x20<\x20octaves;\x20i++)\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20value\x20+=\x20amplitude\x20*\x20perlinNoise(p\x20*\x20frequency);\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20maxValue\x20+=\x20amplitude;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20amplitude\x20*=\x20persistence;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20frequency\x20*=\x20lacunarity;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20}\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20return\x20value\x20/\x20maxValue;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20}\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20//\x20\u57DF\u626D\u66F2\u566A\u58F0\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20float\x20domainWarpedNoise(vec3\x20p,\x20float\x20intensity)\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20vec3\x20q\x20=\x20vec3(\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20perlinNoise(p),\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20perlinNoise(p\x20+\x20vec3(123.4,\x20234.5,\x20345.6)),\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20perlinNoise(p\x20+\x20vec3(234.5,\x20345.6,\x20456.7))\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20);\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20vec3\x20r\x20=\x20vec3(\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20perlinNoise(p\x20+\x201.0\x20*\x20q\x20+\x20vec3(123.4,\x20234.5,\x20345.6)),\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20perlinNoise(p\x20+\x201.0\x20*\x20q\x20+\x20vec3(234.5,\x20345.6,\x20456.7)),\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20perlinNoise(p\x20+\x201.0\x20*\x20q\x20+\x20vec3(345.6,\x20456.7,\x20567.8))\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20);\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20return\x20perlinNoise(p\x20+\x20intensity\x20*\x20r);\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20}\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20//\x20Worley\u566A\u58F0\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20float\x20worleyNoise(vec3\x20p,\x20float\x20scale)\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20vec3\x20i\x20=\x20floor(p\x20*\x20scale);\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20vec3\x20f\x20=\x20fract(p\x20*\x20scale);\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20float\x20minDist1\x20=\x201.0;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20float\x20minDist2\x20=\x201.0;\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20for\x20(int\x20x\x20=\x20-1;\x20x\x20<=\x201;\x20x++)\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20for\x20(int\x20y\x20=\x20-1;\x20y\x20<=\x201;\x20y++)\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20for\x20(int\x20z\x20=\x20-1;\x20z\x20<=\x201;\x20z++)\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20vec3\x20neighbor\x20=\x20vec3(float(x),\x20float(y),\x20float(z));\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20vec3\x20random\x20=\x20fract(sin(dot(i\x20+\x20neighbor,\x20vec3(127.1,\x20311.7,\x2074.7)))\x20*\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20vec3(43758.5453,\x2022578.1459,\x2019632.7411));\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20vec3\x20point\x20=\x20neighbor\x20+\x20random\x20-\x20f;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20float\x20dist\x20=\x20length(point);\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20if\x20(dist\x20<\x20minDist1)\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20minDist2\x20=\x20minDist1;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20minDist1\x20=\x20dist;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20}\x20else\x20if\x20(dist\x20<\x20minDist2)\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20minDist2\x20=\x20dist;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20}\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20}\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20}\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20}\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20return\x20minDist2\x20-\x20minDist1;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20}\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20//\x20\u4E91\u5C42\u9AD8\u5EA6\u5206\u5E03\u51FD\u6570\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20float\x20cloudHeightProfile(float\x20heightRatio,\x20float\x20cloudType)\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20//\x20\u5C42\u4E91\x20-\x20\u5747\u5300\u5206\u5E03\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20if\x20(cloudType\x20<\x200.3)\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20return\x201.0;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20}\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20//\x20\u79EF\u4E91\x20-\x20\u4E2D\u95F4\u539A\uFF0C\u4E0A\u4E0B\u8584\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20else\x20if\x20(cloudType\x20<\x200.7)\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20float\x20profile\x20=\x201.0\x20-\x204.0\x20*\x20pow(heightRatio\x20-\x200.5,\x202.0);\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20return\x20max(profile,\x200.1);\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20}\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20//\x20\u7827\u72B6\u4E91\x20-\x20\u4E0A\u90E8\u6269\u5C55\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20else\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20float\x20anvilProfile\x20=\x201.0\x20-\x20pow(heightRatio,\x202.0);\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20return\x20max(anvilProfile,\x200.2);\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20}\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20}\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20//\x20\u96E8\u4E91\u5BC6\u5EA6\u7279\u5F81\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20float\x20rainCloudDensity(float\x20baseDensity,\x20float\x20heightRatio,\x20float\x20rainFactor)\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20if\x20(rainFactor\x20<\x200.1)\x20return\x20baseDensity;\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20//\x20\u96E8\u4E91\u5E95\u90E8\u66F4\u5BC6\u96C6\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20float\x20rainProfile\x20=\x201.0\x20+\x20rainFactor\x20*\x20(1.0\x20-\x20heightRatio)\x20*\x202.0;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20return\x20baseDensity\x20*\x20rainProfile;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20}\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20//\x20=====\x20\u8865\u5168\u7684\u4F53\u79EF\u4ECB\u8D28\u5149\u7167\u6A21\u578B\x20=====\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20const\x20float\x20preBaseScale\x20=\x200.0003;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20const\x20float\x20preFineScale\x20=\x200.0003\x20*\x2016.0;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20float\x20baseScale\x20=\x200.0003;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20//\x20=====\x20\u8865\u5168\u7684\u4E91\u6735\u5BC6\u5EA6\u51FD\u6570\x20=====\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20float\x20cloudDensity(vec3\x20p,\x20vec3\x20windVector,\x20inout\x20float\x20heightRatio)\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20float\x20finalCoverage\x20=\x20cloudCover;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20if\x20(finalCoverage\x20<=\x200.001)\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20return\x200.0;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20}\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20float\x20height\x20=\x20length(p)\x20-\x20realPlanetRadius;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20heightRatio\x20=\x20clamp((height\x20-\x20cloudHeight)\x20/\x20cloudThickness,\x200.0,\x201.0);\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20//\x20\u57FA\u7840\u9AD8\u5EA6\u56E0\u5B50\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20float\x20hLower\x20=\x20cloudHeight;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20float\x20hUpper\x20=\x20cloudHeight\x20+\x20cloudThickness;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20float\x20heightFactor\x20=\x20smoothstep(hLower,\x20hLower\x20+\x200.2\x20*\x20cloudThickness,\x20height)\x20*\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20(1.0\x20-\x20smoothstep(hUpper\x20-\x200.2\x20*\x20cloudThickness,\x20hUpper,\x20height));\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20vec3\x20seedOffset\x20=\x20vec3(cloudSeed\x20*\x20100.0,\x200.0,\x20cloudSeed\x20*\x2050.0);\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20vec3\x20animatedPos\x20=\x20p\x20+\x20windVector\x20*\x20windSpeedRatio\x20+\x20seedOffset;\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20//\x20\u57FA\u7840\u5F62\u72B6\u566A\u58F0\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20float\x20baseShape\x20=\x20fBm(animatedPos\x20*\x20preBaseScale,\x204,\x200.5,\x202.0);\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20//\x20\u57DF\u626D\u66F2\u589E\u52A0\u7EC6\u8282\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20float\x20warpIntensity\x20=\x20mix(0.1,\x200.8,\x20cloudTurbulence);\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20float\x20baseShape0\x20=\x20fBm(animatedPos\x20*\x20preBaseScale,\x203,\x200.5,\x202.0);\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20float\x20warped\x20=\x20domainWarpedNoise(animatedPos\x20*\x20(preBaseScale\x20*\x200.5),\x20warpIntensity\x20*\x200.7);\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20baseShape\x20=\x20mix(baseShape0,\x20warped,\x200.25);\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20//\x20Worley\u566A\u58F0\u521B\u5EFA\u56E2\u5757\u7ED3\u6784\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20float\x20worleyScale\x20=\x20mix(0.0002,\x200.0008,\x20cloudClumping);\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20float\x20worleyPattern\x20=\x20worleyNoise(animatedPos,\x20worleyScale);\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20worleyPattern\x20=\x20saturate(worleyPattern\x20*\x201.2\x20+\x200.7);\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20//\x20\u6839\u636E\u4E91\u7C7B\u578B\u6DF7\u5408\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20float\x20cumulusFactor\x20=\x20cloudType;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20float\x20stratusFactor\x20=\x201.0\x20-\x20cloudType;\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20float\x20cumulusShape\x20=\x20baseShape\x20*\x20worleyPattern;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20cumulusShape\x20=\x20mix(cumulusShape,\x20baseShape,\x200.3);\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20float\x20stratusShape\x20=\x20baseShape\x20*\x200.8;\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20float\x20cloudPattern\x20=\x20mix(stratusShape,\x20cumulusShape,\x20cumulusFactor);\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20//\x20\u7827\u72B6\u4E91\u7279\u5F81\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20float\x20anvilFactor\x20=\x20cloudAnvil\x20*\x20pow(heightRatio,\x202.0);\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20if\x20(anvilFactor\x20>\x200.01)\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20float\x20anvilNoise\x20=\x20fBm(animatedPos\x20*\x20baseScale\x20*\x200.3,\x203,\x200.6,\x202.0);\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20cloudPattern\x20=\x20mix(cloudPattern,\x20anvilNoise,\x20anvilFactor\x20*\x200.5);\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20}\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20//\x20\u7EC6\u8282\u4FB5\u8680\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20float\x20fineScale\x20=\x20baseScale\x20*\x2016.0;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20float\x20fineDetail\x20=\x20fBm(animatedPos\x20*\x20fineScale,\x202,\x200.7,\x202.5);\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20float\x20erosionIntensity\x20=\x20mix(0.1,\x200.4,\x20cumulusFactor)\x20*\x20detailStrength;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20float\x20erosion\x20=\x20fineDetail\x20*\x20erosionIntensity;\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20//\x20\u57FA\u7840\u5BC6\u5EA6\u8BA1\u7B97\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20float\x20baseDensity\x20=\x20cloudPattern\x20-\x20erosion;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20float\x20coverageThreshold\x20=\x20mix(0.1,\x20-0.3,\x20cloudCover\x20*\x20(0.5\x20+\x20cumulusFactor\x20*\x200.5));\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20float\x20dens\x20=\x20saturate(baseDensity\x20-\x20coverageThreshold);\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20//\x20\u9510\u5316\u8FB9\u754C\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20float\x20sharpness\x20=\x20mix(1.2,\x202.0,\x20cumulusFactor)\x20*\x20cloudSharpness;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20dens\x20=\x20pow(dens,\x20sharpness);\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20//\x20\u5E94\u7528\u9AD8\u5EA6\u5206\u5E03\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20float\x20verticalProfile\x20=\x20cloudHeightProfile(heightRatio,\x20cloudType);\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20dens\x20*=\x20heightFactor\x20*\x20cloudCover\x20*\x20verticalProfile;\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20//\x20\u5E94\u7528\u96E8\u4E91\u7279\u5F81\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20dens\x20=\x20rainCloudDensity(dens,\x20heightRatio,\x20rainClouds);\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20//\x20\u6700\u7EC8\u5BC6\u5EA6\u8C03\u6574\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20dens\x20*=\x20densityMultiplier;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20dens\x20=\x20max(dens,\x200.0);\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20return\x20dens;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20}\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20float\x20cloudDensityFast(vec3\x20p)\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20float\x20h\x20=\x20length(p)\x20-\x20realPlanetRadius;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20float\x20heightRatio\x20=\x20clamp((h\x20-\x20cloudHeight)\x20/\x20cloudThickness,\x200.0,\x201.0);\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20//\x20\u53EA\u505A\u6700\u57FA\u7840\u7684\x20shape\uFF0C\u4E0D\u505A\x20Worley\u3001\u4E0D\u505A\x20domain\x20warp\uFF0C\u4E0D\u505A\x20erosion\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20float\x20n\x20=\x20perlinNoise(p\x20*\x200.00035);\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20n\x20=\x20n\x20*\x20n\x20*\x201.2;\x20//\x20\u7B80\u5355\u5F3A\u5316\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20//\x20\u9AD8\u5EA6\u5206\u5E03\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20float\x20profile\x20=\x20cloudHeightProfile(heightRatio,\x20cloudType);\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20return\x20saturate(n\x20*\x20profile\x20*\x20cloudCover\x20*\x20densityMultiplier\x20*\x200.8);\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20}\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20//\x20\u4F53\u79EF\u9634\u5F71\u51FD\u6570\x20-\x20\u6A21\u62DF\u5149\u7EBF\u5728\u4E91\u5185\u7684\u8870\u51CF\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20float\x20volumetricShadow(vec3\x20p,\x20vec3\x20lightDir,\x20float\x20stepSize,\x20int\x20steps)\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20float\x20shadow\x20=\x201.0;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20vec3\x20currentPos\x20=\x20p;\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20for\x20(int\x20i\x20=\x200;\x20i\x20<\x20steps;\x20i++)\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20currentPos\x20+=\x20lightDir\x20*\x20stepSize;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20float\x20heightRatioDummy;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20float\x20shadowDensity\x20=\x20cloudDensityFast(currentPos);\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20//\x20\u6307\u6570\u8870\u51CF\u6A21\u62DF\u5149\u7EBF\u5728\u4E91\u5185\u7684\u5438\u6536\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20shadow\x20*=\x20exp(-shadowDensity\x20*\x20stepSize\x20*\x20absorption\x20*\x202.0);\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20if\x20(shadow\x20<\x200.01)\x20break;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20}\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20return\x20shadow;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20}\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20//\x20\u6539\u8FDB\u7684\u73AF\u5883\u5149\u7167\u51FD\u6570\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20vec3\x20calculateAmbientLight(float\x20heightRatio,\x20float\x20dens,\x20float\x20dotLightRay)\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20//\x20\u57FA\u7840\u73AF\u5883\u5149\x20-\x20\u6839\u636E\u9AD8\u5EA6\u6DF7\u5408\u5730\u9762\u548C\u5929\u7A7A\u989C\u8272\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20vec3\x20baseAmbient\x20=\x20mix(groundAmbientColor,\x20skyAmbientColor,\x20heightRatio);\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20//\x20\u5BC6\u5EA6\u76F8\u5173\u73AF\u5883\u5149\x20-\x20\u8584\u4E91\u533A\u57DF\u66F4\u4EAE\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20float\x20densityFactor\x20=\x201.0\x20-\x20exp(-dens\x20*\x202.0);\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20baseAmbient\x20*=\x20(1.0\x20+\x20densityFactor\x20*\x200.5);\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20//\x20\u80CC\u5149\u589E\u5F3A\x20-\x20\u5F53\u89C6\u7EBF\u4E0E\u5149\u6E90\u65B9\u5411\u63A5\u8FD1\u53CD\u5411\u65F6\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20float\x20backLightFactor\x20=\x20smoothstep(-0.8,\x20-0.2,\x20dotLightRay);\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20vec3\x20backLightBoost\x20=\x20skyAmbientColor\x20*\x20backLightFactor\x20*\x200.8;\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20return\x20baseAmbient\x20+\x20backLightBoost;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20}\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20//\x20\u6539\u8FDB\u7684\u591A\u6563\u5C04\u6A21\u62DF\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20float\x20calculateMultiScatter(float\x20dens,\x20float\x20heightRatio,\x20float\x20dotLightRay)\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20//\x20\u57FA\u7840\u591A\u6563\u5C04\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20float\x20baseMultiScatter\x20=\x20pow(1.0\x20-\x20exp(-dens\x20*\x201.5),\x201.5)\x20*\x200.4;\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20//\x20\u80CC\u5149\u533A\u57DF\u989D\u5916\u591A\u6563\u5C04\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20float\x20backScatterBoost\x20=\x20smoothstep(-0.6,\x200.0,\x20dotLightRay)\x20*\x200.3;\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20//\x20\u9AD8\u7A7A\u533A\u57DF\u6563\u5C04\u589E\u5F3A\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20float\x20heightScatter\x20=\x20heightRatio\x20*\x200.2;\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20return\x20baseMultiScatter\x20+\x20backScatterBoost\x20+\x20heightScatter;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20}\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20float\x20distanceQualityR\x20=\x200.00005;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20float\x20minDistance\x20=\x2010.0;\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20//\x20=====\x20\u8865\u5168\u7684\u4F53\u79EF\u6E32\u67D3\u6838\u5FC3\u51FD\u6570\x20=====\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20vec4\x20calculate_clouds(vec3\x20start,\x20vec3\x20dir,\x20float\x20maxDistance,\x20vec3\x20light_dir,\x20vec3\x20wind)\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20vec4\x20cloud\x20=\x20vec4(0.0,\x200.0,\x200.0,\x201.0);\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20float\x20cloudTopRadius\x20=\x20realPlanetRadius\x20+\x20cloudHeight\x20+\x20cloudThickness;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20vec2\x20toTop\x20=\x20raySphereIntersect(start,\x20dir,\x20cloudTopRadius);\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20float\x20cloudBaseRadius\x20=\x20realPlanetRadius\x20+\x20cloudHeight;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20vec2\x20toCloudBase\x20=\x20raySphereIntersect(start,\x20dir,\x20cloudBaseRadius);\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20float\x20startHeight\x20=\x20length(start)\x20-\x20realPlanetRadius;\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20float\x20tmin\x20=\x200.0;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20float\x20tmax\x20=\x20maxDistance;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20cloudTop\x20=\x20cloudHeight\x20+\x20cloudThickness;\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20//\x20\u8BA1\u7B97\u5C04\u7EBF\u4E0E\u4E91\u5C42\u7684\u4EA4\u70B9\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20if\x20(startHeight\x20>\x20cloudTop)\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20if\x20(toTop.x\x20<\x200.0)\x20return\x20vec4(0.0);\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20tmin\x20=\x20toTop.x;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20if\x20(toCloudBase.x\x20>\x200.0)\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20tmax\x20=\x20min(toCloudBase.x,\x20maxDistance);\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20}\x20else\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20tmax\x20=\x20min(toTop.y,\x20maxDistance);\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20}\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20}\x20else\x20if\x20(startHeight\x20<\x20cloudHeight)\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20tmin\x20=\x20toCloudBase.y;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20tmax\x20=\x20min(toTop.y,\x20maxDistance);\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20}\x20else\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20if\x20(toCloudBase.x\x20>\x200.0)\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20tmax\x20=\x20min(toCloudBase.x,\x20maxDistance);\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20}\x20else\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20tmax\x20=\x20min(toTop.y,\x20maxDistance);\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20}\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20}\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20tmin\x20=\x20max(tmin,\x20minDistance);\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20tmax\x20=\x20min(tmax,\x20absoluteMaxDistance);\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20if\x20(tmax\x20<\x20tmin)\x20return\x20vec4(0.0);\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20float\x20rayLength\x20=\x20tmax\x20-\x20tmin;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20float\x20thicknessFactor\x20=\x20cloudThickness\x20/\x20500.0;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20float\x20baseStepSize\x20=\x20mix(CLOUDS_MARCH_STEP,\x20CLOUDS_MARCH_STEP\x20*\x201.5,\x20saturate(thicknessFactor\x20-\x201.0));\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20float\x20maxEffectiveSteps\x20=\x20min(float(MAXIMUM_CLOUDS_STEPS),\x20200.0\x20+\x20cloudThickness\x20*\x200.2);\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20float\x20adaptiveSteps\x20=\x20min(maxEffectiveSteps,\x20rayLength\x20/\x20baseStepSize);\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20float\x20longMarchStep\x20=\x20rayLength\x20/\x20adaptiveSteps;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20longMarchStep\x20=\x20max(longMarchStep,\x20baseStepSize);\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20float\x20shortMarchStep\x20=\x20CLOUDS_DENS_MARCH_STEP;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20float\x20numberApproachSteps\x20=\x20(longMarchStep\x20/\x20shortMarchStep)\x20*\x201.5;\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20float\x20distance\x20=\x20tmin;\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20float\x20jitter\x20=\x20hash12(gl_FragCoord.xy)\x20*\x201.2;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20distance\x20+=\x20jitter\x20*\x20longMarchStep;\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20bool\x20inCloud\x20=\x20false;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20float\x20stepsBeforeExitingCloud\x20=\x200.0;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20int\x20actualSteps\x20=\x200;\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20//\x20\u9884\u8BA1\u7B97\u5149\u7167\u53C2\u6570\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20vec3\x20sunColor\x20=\x20normalize(czm_lightColor);\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20//\x20=====\x20\u8865\u5168\u7684\u4F53\u79EF\u4ECB\u8D28\u5149\u7167\u8BA1\u7B97\x20=====\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20float\x20dotLightRay\x20=\x20dot(dir,\x20light_dir);\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20for\x20(int\x20i\x20=\x200;\x20i\x20<\x20MAXIMUM_CLOUDS_STEPS;\x20i++)\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20if\x20(distance\x20>\x20tmax)\x20break;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20if\x20(actualSteps\x20>\x20int(adaptiveSteps))\x20break;\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20vec3\x20position\x20=\x20start\x20+\x20dir\x20*\x20distance;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20float\x20heightRatio;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20float\x20marchStep\x20=\x20inCloud\x20?\x20shortMarchStep\x20:\x20longMarchStep;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20float\x20dens\x20=\x20cloudDensity(position,\x20wind,\x20heightRatio);\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20//\x20\u7A7A\u7A7A\u95F4\u8DF3\u8FC7\u4F18\u5316\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20if\x20(dens\x20<\x200.005)\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20if\x20(inCloud)\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20if\x20(stepsBeforeExitingCloud\x20>\x200.0)\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20stepsBeforeExitingCloud\x20-=\x201.0;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20}\x20else\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20inCloud\x20=\x20false;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20marchStep\x20=\x20longMarchStep\x20*\x202.0;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20}\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20}\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20distance\x20+=\x20marchStep;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20actualSteps++;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20continue;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20}\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20//\x20\u8FDB\u5165\u4E91\u5C42\u68C0\u6D4B\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20if\x20(!inCloud)\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20inCloud\x20=\x20true;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20stepsBeforeExitingCloud\x20=\x20numberApproachSteps;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20distance\x20=\x20max(tmin,\x20distance\x20-\x20longMarchStep);\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20continue;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20}\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20//\x20\u4F53\u79EF\u9634\u5F71\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20float\x20shadow\x20=\x20volumetricShadow(position,\x20light_dir,\x20shortMarchStep\x20*\x202.0,\x208);\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20//\x20\u4F7F\u7528\u6539\u8FDB\u7684\u76F8\u4F4D\u51FD\u6570\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20float\x20sunPhase\x20=\x20improvedPhase(dotLightRay);\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20float\x20ambientPhase\x20=\x20isotropic();\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20//\x20\u9633\u5149\u5F3A\u5EA6\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20float\x20sunIntensity\x20=\x20smoothstep(0.0,\x200.4,\x201.0\x20-\x20dens)\x20*\x200.6\x20*\x20shadow;\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20//\x20\u73AF\u5883\u5149\u7167\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20vec3\x20ambientLight\x20=\x20calculateAmbientLight(heightRatio,\x20dens,\x20dotLightRay);\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20float\x20ambientIntensity\x20=\x202.5;\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20//\x20\u591A\u6563\u5C04\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20float\x20multiScatter\x20=\x20calculateMultiScatter(dens,\x20heightRatio,\x20dotLightRay);\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20//\x20\u76F4\u63A5\u5149\u7167\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20vec3\x20directLight\x20=\x20sunPhase\x20*\x20sunColor\x20*\x20sunIntensity\x20*\x200.5;\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20//\x20\u73AF\u5883\u5149\u7167\u6563\u5C04\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20vec3\x20ambientScattering\x20=\x20ambientPhase\x20*\x20ambientLight\x20*\x20ambientIntensity\x20*\x20(1.0\x20+\x20multiScatter);\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20//\x20\u4FA7\u5149\u548C\u80CC\u5149\u589E\u5F3A\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20float\x20sideBackLight\x20=\x20smoothstep(-0.5,\x200.3,\x20dotLightRay)\x20*\x200.4;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20ambientScattering\x20+=\x20ambientLight\x20*\x20sideBackLight\x20*\x20multiScatter;\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20//\x20\u7EC4\u5408\u5149\u7167\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20vec3\x20stepScattering\x20=\x20cloud.a\x20*\x20scatteringCoefficient\x20*\x20marchStep\x20*\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20(directLight\x20+\x20ambientScattering);\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20//\x20\u80FD\u91CF\u9650\u5236\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20float\x20maxStepBrightness\x20=\x200.25;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20stepScattering\x20=\x20min(stepScattering,\x20vec3(maxStepBrightness));\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20cloud.rgb\x20+=\x20stepScattering;\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20//\x20\u900F\u660E\u5EA6\u8BA1\u7B97\x20-\x20\u4F53\u79EF\u4ECB\u8D28\u7684\u6D88\u5149\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20float\x20extinctionCoeff\x20=\x20absorption\x20*\x20(0.8\x20+\x200.2\x20*\x20dens)\x20*\x20(0.6\x20+\x20dens*0.4);\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20cloud.a\x20*=\x20exp(-extinctionCoeff\x20*\x20marchStep);\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20//\x20\u63D0\u524D\u7EC8\u6B62\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20if\x20(cloud.a\x20<\x200.01)\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20cloud.a\x20=\x200.0;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20break;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20}\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20distance\x20+=\x20marchStep;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20actualSteps++;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20}\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20//\x20\u8272\u8C03\u6620\u5C04\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20cloud.rgb\x20=\x20cloud.rgb\x20/\x20(cloud.rgb\x20+\x20vec3(0.8));\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20//\x20\u4EAE\u5EA6\u9650\u5236\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20float\x20maxChannel\x20=\x20max(cloud.rgb.r,\x20max(cloud.rgb.g,\x20cloud.rgb.b));\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20if\x20(maxChannel\x20>\x200.7)\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20float\x20compression\x20=\x20smoothstep(0.7,\x201.0,\x20maxChannel)\x20*\x200.3;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20cloud.rgb\x20=\x20mix(cloud.rgb,\x20cloud.rgb\x20*\x20(1.0\x20-\x20compression),\x20compression);\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20}\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20return\x20vec4(cloud.rgb,\x201.0\x20-\x20cloud.a);\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20}\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20uniform\x20sampler2D\x20colorTexture;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20in\x20vec2\x20v_textureCoordinates;\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20void\x20main()\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20vec4\x20color\x20=\x20texture(colorTexture,\x20v_textureCoordinates);\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20//\x20\u8D85\u8FC7\u6700\u5927\u53EF\u89C6\u9AD8\u5EA6\u5219\u8DF3\u8FC7\u4E91\u6E32\u67D3\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20float\x20viewerHeight\x20=\x20length(czm_viewerPositionWC)\x20-\x20realPlanetRadius;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20if\x20(viewerHeight\x20>\x20maxVisibleHeight)\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20out_FragColor\x20=\x20color;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20return;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20}\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20//\x20\u63A5\u8FD1\u6700\u5927\u53EF\u89C6\u9AD8\u5EA6\u65F6\u5E73\u6ED1\u6DE1\u51FA\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20float\x20heightFade\x20=\x201.0\x20-\x20smoothstep(maxVisibleHeight\x20-\x201000.0,\x20maxVisibleHeight,\x20viewerHeight);\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20vec4\x20rawDepthColor\x20=\x20texture(czm_globeDepthTexture,\x20v_textureCoordinates);\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20float\x20depth\x20=\x20czm_unpackDepth(rawDepthColor);\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20if\x20(depth\x20==\x200.0)\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20depth\x20=\x201.0;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20}\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20vec4\x20positionEC\x20=\x20czm_windowToEyeCoordinates(gl_FragCoord.xy,\x20depth);\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20vec4\x20worldCoordinate\x20=\x20czm_inverseView\x20*\x20positionEC;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20vec3\x20vWorldPosition\x20=\x20worldCoordinate.xyz\x20/\x20worldCoordinate.w;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20vec3\x20posToEye\x20=\x20vWorldPosition\x20-\x20czm_viewerPositionWC;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20vec3\x20direction\x20=\x20normalize(posToEye);\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20vec3\x20lightDirection\x20=\x20normalize(czm_sunPositionWC);\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20float\x20distance\x20=\x20length(posToEye);\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20if\x20(depth\x20==\x201.0)\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20distance\x20=\x20absoluteMaxDistance;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20}\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20vec3\x20wind\x20=\x20windVector\x20*\x20czm_frameNumber\x20*\x20windSpeedRatio;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20vec4\x20clouds\x20=\x20calculate_clouds(\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20czm_viewerPositionWC,\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20direction,\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20distance,\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20lightDirection,\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20wind\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20);\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20color\x20=\x20mix(color,\x20clouds,\x20clouds.a\x20*\x20heightFade);\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20out_FragColor\x20=\x20color;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20}\x0a\x20\x20\x20\x20\x20\x20\x20\x20';}},{'key':'_getRealPlanetRadius','value':function _0xcd3bac(){var _0x4cf7d0=_0x489f2f,_0x1f7e95,_0x23aca9=this['getMap']();if(_0x23aca9!==null&&_0x23aca9!==void 0x0&&(_0x1f7e95=_0x23aca9[_0x4cf7d0(0xcd)])!==null&&_0x1f7e95!==void 0x0&&_0x1f7e95[_0x4cf7d0(0x103)])return _0x23aca9[_0x4cf7d0(0xcd)]['globe'][_0x4cf7d0(0xfa)]['maximumRadius'];return 0x615299;}},{'key':_0x489f2f(0xed),'value':function _0x2675c9(_0x1b4c64){var _0x550887=_0x489f2f;if(!_0x1b4c64||_typeof(_0x1b4c64)!=='object')return this;return this[_0x550887(0xc4)]=this[_0x550887(0x105)](_0x1b4c64,this[_0x550887(0xc4)]),this['_syncAmbientColors'](),this;}},{'key':_0x489f2f(0xda),'value':function _0x2daa11(_0x4ab592,_0x1c0236){var _0x4de10f=_0x489f2f,_0x221a5a=_0x4ab592['replace']('#','')[_0x4de10f(0xea)](),_0x354e13=/^[0-9a-fA-F]{6}$/['test'](_0x221a5a)?_0x221a5a:_0x1c0236['replace']('#',''),_0x531d4b=parseInt(_0x354e13[_0x4de10f(0xfc)](0x0,0x2),0x10)/0xff,_0x5775b5=parseInt(_0x354e13[_0x4de10f(0xfc)](0x2,0x4),0x10)/0xff,_0x5ad29e=parseInt(_0x354e13['substring'](0x4,0x6),0x10)/0xff;return{'r':_0x531d4b,'g':_0x5775b5,'b':_0x5ad29e};}},{'key':'resetParameters','value':function _0x352c86(){var _0x1d733b=_0x489f2f;return this[_0x1d733b(0xc4)]=this['_cloneUniforms'](this['originalOptions']),this['_syncAmbientColors'](),this;}},{'key':'show','value':function _0x5c1e6d(){var _0x896e96=_0x489f2f;return this[_0x896e96(0xe2)]&&(this['postProcessStage'][_0x896e96(0x102)]=!![]),this;}},{'key':_0x489f2f(0xf9),'value':function _0x59f5c5(){var _0x5a5283=_0x489f2f;return this['postProcessStage']&&(this['postProcessStage'][_0x5a5283(0x102)]=![]),this;}},{'key':'destroy','value':function _0xeb468(){var _0x338a03=_0x489f2f,_0x49440b,_0x2b529d=this[_0x338a03(0xfe)]();this[_0x338a03(0xe2)]&&_0x2b529d!==null&&_0x2b529d!==void 0x0&&(_0x49440b=_0x2b529d['scene'])!==null&&_0x49440b!==void 0x0&&_0x49440b['postProcessStages']['contains'](this[_0x338a03(0xe2)])&&(_0x2b529d['scene'][_0x338a03(0xd6)]['remove'](this['postProcessStage']),this[_0x338a03(0xe2)]=null);}},{'key':'getParameters','value':function _0x58667a(){var _0x13738b=_0x489f2f;return this['_cloneUniforms'](this[_0x13738b(0xc4)]);}}]),_0x20cca2;}());export default GlobalVolumetricCloud;