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,1238 +1 @@
1
- import * as Cesium from 'deeptwins-cesium';
2
-
3
- /**
4
- *
5
- * @alias ViewshedMap
6
- * @param {Object} options An object containing the following properties:
7
- * @param {Cesium.Camera} options.lightCamera A camera representing the light source.
8
- * @param {Boolean} [options.enabled=true] Whether the shadow map is enabled.
9
- * @param {Boolean} [options.isPointLight=false] Whether the light source is a point light. Point light shadows do not use cascades.
10
- * @param {Boolean} [options.pointLightRadius=100.0] Radius of the point light.
11
- * @param {Boolean} [options.cascadesEnabled=true] Use multiple shadow maps to cover different partitions of the view frustum.
12
- * @param {Number} [options.numberOfCascades=4] The number of cascades to use for the shadow map. Supported values are one and four.
13
- * @param {Number} [options.maximumDistance=5000.0] The maximum distance used for generating cascaded shadows. Lower values improve shadow quality.
14
- * @param {Number} [options.size=2048] The width and height, in pixels, of each shadow map.
15
- * @param {Boolean} [options.softShadows=false] Whether percentage-closer-filtering is enabled for producing softer shadows.
16
- * @param {Number} [options.darkness=0.3] The shadow darkness.
17
- * @param {Boolean} [options.normalOffset=true] Whether a normal bias is applied to shadows.
18
- * @demo {@link https://cesiumjs.org/Cesium/Apps/Sandcastle/index.html?src=Shadows.html|Cesium Sandcastle Shadows Demo}
19
- */
20
- function ViewshedMap(options) {
21
- var _options, _options$enabled, _options$softShadows, _options$normalOffset, _options$fromLightSou, _options$maximumDista, _options$boundingSphe, _options$isPointLight, _options$pointLightRa, _options$numberOfCasc, _options$size;
22
- options = (_options = options) !== null && _options !== void 0 ? _options : Cesium.defaultValue.EMPTY_OBJECT;
23
- var context = options.context;
24
- if (!Cesium.defined(context)) {
25
- throw new Cesium.DeveloperError('context is required.');
26
- }
27
- if (!Cesium.defined(options.lightCamera)) {
28
- throw new Cesium.DeveloperError('lightCamera is required.');
29
- }
30
- if (Cesium.defined(options.numberOfCascades) && options.numberOfCascades !== 1 && options.numberOfCascades !== 4) {
31
- throw new Cesium.DeveloperError('Only one or four cascades are supported.');
32
- }
33
- this._enabled = (_options$enabled = options.enabled) !== null && _options$enabled !== void 0 ? _options$enabled : true;
34
- this._softShadows = (_options$softShadows = options.softShadows) !== null && _options$softShadows !== void 0 ? _options$softShadows : false;
35
- this._normalOffset = (_options$normalOffset = options.normalOffset) !== null && _options$normalOffset !== void 0 ? _options$normalOffset : true;
36
- this.dirty = true;
37
- this.fromLightSource = (_options$fromLightSou = options.fromLightSource) !== null && _options$fromLightSou !== void 0 ? _options$fromLightSou : true;
38
- this.darkness = 0.0;
39
- this._darkness = this.darkness;
40
- this.maximumDistance = (_options$maximumDista = options.maximumDistance) !== null && _options$maximumDista !== void 0 ? _options$maximumDista : 5000.0;
41
- this._outOfView = false;
42
- this._outOfViewPrevious = false;
43
- this._needsUpdate = true;
44
- // Re-enable once https://github.com/AnalyticalGraphicsInc/cesium/issues/4560 is resolved.
45
- var polygonOffsetSupported = true;
46
- if (Cesium.FeatureDetection.isInternetExplorer() || Cesium.FeatureDetection.isEdge() || (Cesium.FeatureDetection.isChrome() || Cesium.FeatureDetection.isFirefox()) && Cesium.FeatureDetection.isWindows() && !context.depthTexture) {
47
- polygonOffsetSupported = false;
48
- }
49
- this._polygonOffsetSupported = polygonOffsetSupported;
50
- this._terrainBias = {
51
- polygonOffset: polygonOffsetSupported,
52
- polygonOffsetFactor: 1.1,
53
- polygonOffsetUnits: 4.0,
54
- normalOffset: this._normalOffset,
55
- normalOffsetScale: 0.5,
56
- normalShading: true,
57
- normalShadingSmooth: 0.3,
58
- depthBias: 0.0001
59
- };
60
- this._primitiveBias = {
61
- polygonOffset: polygonOffsetSupported,
62
- polygonOffsetFactor: 1.1,
63
- polygonOffsetUnits: 4.0,
64
- normalOffset: this._normalOffset,
65
- normalOffsetScale: 0.1,
66
- normalShading: true,
67
- normalShadingSmooth: 0.05,
68
- depthBias: 0.00002
69
- };
70
- this._pointBias = {
71
- polygonOffset: false,
72
- polygonOffsetFactor: 1.1,
73
- polygonOffsetUnits: 4.0,
74
- normalOffset: this._normalOffset,
75
- normalOffsetScale: 0.0,
76
- normalShading: true,
77
- normalShadingSmooth: 0.1,
78
- depthBias: 0.0005
79
- };
80
-
81
- // Cesium.Framebuffer resources
82
- this._depthAttachment = undefined;
83
- this._colorAttachment = undefined;
84
-
85
- // Uniforms
86
- this._shadowMapMatrix = new Cesium.Matrix4();
87
- this._shadowMapTexture = undefined;
88
- this._lightDirectionEC = new Cesium.Cartesian3();
89
- this._lightPositionEC = new Cesium.Cartesian4();
90
- this._distance = 0.0;
91
- this._lightCamera = options.lightCamera;
92
- this._shadowMapCamera = new ShadowMapCamera();
93
- this._shadowMapCullingVolume = undefined;
94
- this._sceneCamera = undefined;
95
- // this._boundingSphere = new Cesium.BoundingSphere();
96
- this._boundingSphere = (_options$boundingSphe = options.boundingSphere) !== null && _options$boundingSphe !== void 0 ? _options$boundingSphe : new Cesium.BoundingSphere();
97
- this._isPointLight = (_options$isPointLight = options.isPointLight) !== null && _options$isPointLight !== void 0 ? _options$isPointLight : false;
98
- this._pointLightRadius = (_options$pointLightRa = options.pointLightRadius) !== null && _options$pointLightRa !== void 0 ? _options$pointLightRa : 100.0;
99
- this._cascadesEnabled = false;
100
- this._numberOfCascades = !this._cascadesEnabled ? 0 : (_options$numberOfCasc = options.numberOfCascades) !== null && _options$numberOfCasc !== void 0 ? _options$numberOfCasc : 4;
101
- this._fitNearFar = true;
102
- this._maximumCascadeDistances = [25.0, 150.0, 700.0, Number.MAX_VALUE];
103
- this._textureSize = new Cesium.Cartesian2();
104
- this._isSpotLight = false;
105
- if (this._cascadesEnabled) {
106
- // Cascaded shadows are always orthographic. The frustum dimensions are calculated on the fly.
107
- this._shadowMapCamera.frustum = new Cesium.OrthographicOffCenterFrustum();
108
- } else if (Cesium.defined(this._lightCamera.frustum.fov)) {
109
- // If the light camera uses a perspective frustum, then the light source is a spot light
110
- this._isSpotLight = true;
111
- }
112
-
113
- // Uniforms
114
- this._cascadeSplits = [new Cesium.Cartesian4(), new Cesium.Cartesian4()];
115
- this._cascadeMatrices = [new Cesium.Matrix4(), new Cesium.Matrix4(), new Cesium.Matrix4(), new Cesium.Matrix4()];
116
- this._cascadeDistances = new Cesium.Cartesian4();
117
- var numberOfPasses;
118
- if (this._isPointLight) {
119
- numberOfPasses = 6; // One shadow map for each direction
120
- } else if (!this._cascadesEnabled) {
121
- numberOfPasses = 1;
122
- } else {
123
- numberOfPasses = this._numberOfCascades;
124
- }
125
- this._passes = new Array(numberOfPasses);
126
- for (var i = 0; i < numberOfPasses; ++i) {
127
- this._passes[i] = new ShadowPass(context);
128
- }
129
- this.debugShow = false;
130
- this.debugFreezeFrame = false;
131
- this._debugFreezeFrame = false;
132
- this._debugCascadeColors = false;
133
- this._debugLightFrustum = undefined;
134
- this._debugCameraFrustum = undefined;
135
- this._debugCascadeFrustums = new Array(this._numberOfCascades);
136
- this._debugShadowViewCommand = undefined;
137
- this._usesDepthTexture = context.depthTexture;
138
- if (this._isPointLight) {
139
- this._usesDepthTexture = false;
140
- }
141
-
142
- // Create render states for shadow casters
143
- this._primitiveRenderState = undefined;
144
- this._terrainRenderState = undefined;
145
- this._pointRenderState = undefined;
146
- createRenderStates(this);
147
-
148
- // For clearing the shadow map texture every frame
149
- this._clearCommand = new Cesium.ClearCommand({
150
- depth: 1.0,
151
- color: new Cesium.Color()
152
- });
153
- this._clearPassState = new Cesium.PassState(context);
154
- this._size = (_options$size = options.size) !== null && _options$size !== void 0 ? _options$size : 2048;
155
- this.size = this._size;
156
- }
157
-
158
- /**
159
- * Global maximum shadow distance used to prevent far off receivers from extending
160
- * the shadow far plane. This helps set a tighter near/far when viewing objects from space.
161
- *
162
- * @private
163
- */
164
- ViewshedMap.MAXIMUM_DISTANCE = 20000.0;
165
- function ShadowPass(context) {
166
- this.camera = new ShadowMapCamera();
167
- this.passState = new Cesium.PassState(context);
168
- this.framebuffer = undefined;
169
- this.textureOffsets = undefined;
170
- this.commandList = [];
171
- this.cullingVolume = undefined;
172
- }
173
- function createRenderState(colorMask, bias) {
174
- return Cesium.RenderState.fromCache({
175
- cull: {
176
- enabled: true,
177
- face: Cesium.CullFace.BACK
178
- },
179
- depthTest: {
180
- enabled: true
181
- },
182
- colorMask: {
183
- red: colorMask,
184
- green: colorMask,
185
- blue: colorMask,
186
- alpha: colorMask
187
- },
188
- depthMask: true,
189
- polygonOffset: {
190
- enabled: bias.polygonOffset,
191
- factor: bias.polygonOffsetFactor,
192
- units: bias.polygonOffsetUnits
193
- }
194
- });
195
- }
196
- function createRenderStates(shadowMap) {
197
- // Enable the color mask if the shadow map is backed by a color texture, e.g. when depth textures aren't supported
198
- var colorMask = !shadowMap._usesDepthTexture;
199
- shadowMap._primitiveRenderState = createRenderState(colorMask, shadowMap._primitiveBias);
200
- shadowMap._terrainRenderState = createRenderState(colorMask, shadowMap._terrainBias);
201
- shadowMap._pointRenderState = createRenderState(colorMask, shadowMap._pointBias);
202
- }
203
-
204
- /**
205
- * @private
206
- */
207
- ViewshedMap.prototype.debugCreateRenderStates = function () {
208
- createRenderStates(this);
209
- };
210
- Object.defineProperties(ViewshedMap.prototype, {
211
- enabled: {
212
- get: function get() {
213
- return this._enabled;
214
- },
215
- set: function set(value) {
216
- this.dirty = this._enabled !== value;
217
- this._enabled = value;
218
- }
219
- },
220
- isViewShed: {
221
- get: function get() {
222
- return true;
223
- }
224
- },
225
- normalOffset: {
226
- get: function get() {
227
- return this._normalOffset;
228
- },
229
- set: function set(value) {
230
- this.dirty = this._normalOffset !== value;
231
- this._normalOffset = value;
232
- this._terrainBias.normalOffset = value;
233
- this._primitiveBias.normalOffset = value;
234
- this._pointBias.normalOffset = value;
235
- }
236
- },
237
- softShadows: {
238
- get: function get() {
239
- return this._softShadows;
240
- },
241
- set: function set(value) {
242
- this.dirty = this._softShadows !== value;
243
- this._softShadows = value;
244
- }
245
- },
246
- size: {
247
- get: function get() {
248
- return this._size;
249
- },
250
- set: function set(value) {
251
- resize(this, value);
252
- }
253
- },
254
- outOfView: {
255
- get: function get() {
256
- return this._outOfView;
257
- }
258
- },
259
- shadowMapCullingVolume: {
260
- get: function get() {
261
- return this._shadowMapCullingVolume;
262
- }
263
- },
264
- passes: {
265
- get: function get() {
266
- return this._passes;
267
- }
268
- },
269
- isPointLight: {
270
- get: function get() {
271
- return this._isPointLight;
272
- }
273
- },
274
- debugCascadeColors: {
275
- get: function get() {
276
- return this._debugCascadeColors;
277
- },
278
- set: function set(value) {
279
- this.dirty = this._debugCascadeColors !== value;
280
- this._debugCascadeColors = value;
281
- }
282
- }
283
- });
284
- function destroyFramebuffer(shadowMap) {
285
- var length = shadowMap._passes.length;
286
- for (var i = 0; i < length; ++i) {
287
- var pass = shadowMap._passes[i];
288
- var framebuffer = pass.framebuffer;
289
- if (Cesium.defined(framebuffer) && !framebuffer.isDestroyed()) {
290
- framebuffer.destroy();
291
- }
292
- pass.framebuffer = undefined;
293
- }
294
-
295
- // Destroy the framebuffer attachments
296
- shadowMap._depthAttachment = shadowMap._depthAttachment && shadowMap._depthAttachment.destroy();
297
- shadowMap._colorAttachment = shadowMap._colorAttachment && shadowMap._colorAttachment.destroy();
298
- }
299
- function createSampler() {
300
- return new Cesium.Sampler({
301
- wrapS: Cesium.TextureWrap.CLAMP_TO_EDGE,
302
- wrapT: Cesium.TextureWrap.CLAMP_TO_EDGE,
303
- minificationFilter: Cesium.TextureMinificationFilter.NEAREST,
304
- magnificationFilter: Cesium.TextureMagnificationFilter.NEAREST
305
- });
306
- }
307
- function createFramebufferColor(shadowMap, context) {
308
- var depthRenderbuffer = new Cesium.Renderbuffer({
309
- context: context,
310
- width: shadowMap._textureSize.x,
311
- height: shadowMap._textureSize.y,
312
- format: Cesium.RenderbufferFormat.DEPTH_COMPONENT16
313
- });
314
- var colorTexture = new Cesium.Texture({
315
- context: context,
316
- width: shadowMap._textureSize.x,
317
- height: shadowMap._textureSize.y,
318
- pixelFormat: Cesium.PixelFormat.RGBA,
319
- pixelDatatype: Cesium.PixelDatatype.UNSIGNED_BYTE,
320
- sampler: createSampler()
321
- });
322
- var framebuffer = new Cesium.Framebuffer({
323
- context: context,
324
- depthRenderbuffer: depthRenderbuffer,
325
- colorTextures: [colorTexture],
326
- destroyAttachments: false
327
- });
328
- var length = shadowMap._passes.length;
329
- for (var i = 0; i < length; ++i) {
330
- var pass = shadowMap._passes[i];
331
- pass.framebuffer = framebuffer;
332
- pass.passState.framebuffer = framebuffer;
333
- }
334
- shadowMap._shadowMapTexture = colorTexture;
335
- shadowMap._depthAttachment = depthRenderbuffer;
336
- shadowMap._colorAttachment = colorTexture;
337
- }
338
- function createFramebufferDepth(shadowMap, context) {
339
- var depthStencilTexture = new Cesium.Texture({
340
- context: context,
341
- width: shadowMap._textureSize.x,
342
- height: shadowMap._textureSize.y,
343
- pixelFormat: Cesium.PixelFormat.DEPTH_STENCIL,
344
- pixelDatatype: Cesium.PixelDatatype.UNSIGNED_INT_24_8,
345
- sampler: createSampler()
346
- });
347
- var framebuffer = new Cesium.Framebuffer({
348
- context: context,
349
- depthStencilTexture: depthStencilTexture,
350
- destroyAttachments: false
351
- });
352
- var length = shadowMap._passes.length;
353
- for (var i = 0; i < length; ++i) {
354
- var pass = shadowMap._passes[i];
355
- pass.framebuffer = framebuffer;
356
- pass.passState.framebuffer = framebuffer;
357
- }
358
- shadowMap._shadowMapTexture = depthStencilTexture;
359
- shadowMap._depthAttachment = depthStencilTexture;
360
- }
361
- function createFramebufferCube(shadowMap, context) {
362
- var depthRenderbuffer = new Cesium.Renderbuffer({
363
- context: context,
364
- width: shadowMap._textureSize.x,
365
- height: shadowMap._textureSize.y,
366
- format: Cesium.RenderbufferFormat.DEPTH_COMPONENT16
367
- });
368
- var cubeMap = new Cesium.CubeMap({
369
- context: context,
370
- width: shadowMap._textureSize.x,
371
- height: shadowMap._textureSize.y,
372
- pixelFormat: Cesium.PixelFormat.RGBA,
373
- pixelDatatype: Cesium.PixelDatatype.UNSIGNED_BYTE,
374
- sampler: createSampler()
375
- });
376
- var faces = [cubeMap.negativeX, cubeMap.negativeY, cubeMap.negativeZ, cubeMap.positiveX, cubeMap.positiveY, cubeMap.positiveZ];
377
- for (var i = 0; i < 6; ++i) {
378
- var framebuffer = new Cesium.Framebuffer({
379
- context: context,
380
- depthRenderbuffer: depthRenderbuffer,
381
- colorTextures: [faces[i]],
382
- destroyAttachments: false
383
- });
384
- var pass = shadowMap._passes[i];
385
- pass.framebuffer = framebuffer;
386
- pass.passState.framebuffer = framebuffer;
387
- }
388
- shadowMap._shadowMapTexture = cubeMap;
389
- shadowMap._depthAttachment = depthRenderbuffer;
390
- shadowMap._colorAttachment = cubeMap;
391
- }
392
- function createFramebuffer(shadowMap, context) {
393
- if (shadowMap._isPointLight) {
394
- createFramebufferCube(shadowMap, context);
395
- } else if (shadowMap._usesDepthTexture) {
396
- createFramebufferDepth(shadowMap, context);
397
- } else {
398
- createFramebufferColor(shadowMap, context);
399
- }
400
- }
401
- function checkFramebuffer(shadowMap, context) {
402
- // Attempt to make an FBO with only a depth texture. If it fails, fallback to a color texture.
403
- if (shadowMap._usesDepthTexture && shadowMap._passes[0].framebuffer.status !== Cesium.WebGLConstants.FRAMEBUFFER_COMPLETE) {
404
- shadowMap._usesDepthTexture = false;
405
- createRenderStates(shadowMap);
406
- destroyFramebuffer(shadowMap);
407
- createFramebuffer(shadowMap, context);
408
- }
409
- }
410
- function updateFramebuffer(shadowMap, context) {
411
- if (!Cesium.defined(shadowMap._passes[0].framebuffer) || shadowMap._shadowMapTexture.width !== shadowMap._textureSize.x) {
412
- destroyFramebuffer(shadowMap);
413
- createFramebuffer(shadowMap, context);
414
- checkFramebuffer(shadowMap, context);
415
- clearFramebuffer(shadowMap, context);
416
- }
417
- }
418
- function clearFramebuffer(shadowMap, context, shadowPass) {
419
- var _shadowPass;
420
- shadowPass = (_shadowPass = shadowPass) !== null && _shadowPass !== void 0 ? _shadowPass : 0;
421
- if (shadowMap._isPointLight || shadowPass === 0) {
422
- shadowMap._clearCommand.framebuffer = shadowMap._passes[shadowPass].framebuffer;
423
- shadowMap._clearCommand.execute(context, shadowMap._clearPassState);
424
- }
425
- }
426
- function resize(shadowMap, size) {
427
- shadowMap._size = size;
428
- var passes = shadowMap._passes;
429
- var numberOfPasses = passes.length;
430
- var textureSize = shadowMap._textureSize;
431
- if (shadowMap._isPointLight) {
432
- size = Cesium.ContextLimits.maximumCubeMapSize >= size ? size : Cesium.ContextLimits.maximumCubeMapSize;
433
- textureSize.x = size;
434
- textureSize.y = size;
435
- var faceViewport = new Cesium.BoundingRectangle(0, 0, size, size);
436
- passes[0].passState.viewport = faceViewport;
437
- passes[1].passState.viewport = faceViewport;
438
- passes[2].passState.viewport = faceViewport;
439
- passes[3].passState.viewport = faceViewport;
440
- passes[4].passState.viewport = faceViewport;
441
- passes[5].passState.viewport = faceViewport;
442
- } else if (numberOfPasses === 1) {
443
- // +----+
444
- // | 1 |
445
- // +----+
446
- size = Cesium.ContextLimits.maximumTextureSize >= size ? size : Cesium.ContextLimits.maximumTextureSize;
447
- textureSize.x = size;
448
- textureSize.y = size;
449
- passes[0].passState.viewport = new Cesium.BoundingRectangle(0, 0, size, size);
450
- } else if (numberOfPasses === 4) {
451
- // +----+----+
452
- // | 3 | 4 |
453
- // +----+----+
454
- // | 1 | 2 |
455
- // +----+----+
456
- size = Cesium.ContextLimits.maximumTextureSize >= size * 2 ? size : Cesium.ContextLimits.maximumTextureSize / 2;
457
- textureSize.x = size * 2;
458
- textureSize.y = size * 2;
459
- passes[0].passState.viewport = new Cesium.BoundingRectangle(0, 0, size, size);
460
- passes[1].passState.viewport = new Cesium.BoundingRectangle(size, 0, size, size);
461
- passes[2].passState.viewport = new Cesium.BoundingRectangle(0, size, size, size);
462
- passes[3].passState.viewport = new Cesium.BoundingRectangle(size, size, size, size);
463
- }
464
-
465
- // Update clear pass state
466
- shadowMap._clearPassState.viewport = new Cesium.BoundingRectangle(0, 0, textureSize.x, textureSize.y);
467
-
468
- // Transforms shadow coordinates [0, 1] into the pass's region of the texture
469
- for (var i = 0; i < numberOfPasses; ++i) {
470
- var pass = passes[i];
471
- var viewport = pass.passState.viewport;
472
- var biasX = viewport.x / textureSize.x;
473
- var biasY = viewport.y / textureSize.y;
474
- var scaleX = viewport.width / textureSize.x;
475
- var scaleY = viewport.height / textureSize.y;
476
- pass.textureOffsets = new Cesium.Matrix4(scaleX, 0.0, 0.0, biasX, 0.0, scaleY, 0.0, biasY, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0);
477
- }
478
- }
479
- var scratchViewport = new Cesium.BoundingRectangle();
480
- function createDebugShadowViewCommand(shadowMap, context) {
481
- var fs;
482
- if (shadowMap._isPointLight) {
483
- fs = 'uniform samplerCube shadowMap_textureCube; \n' + 'in vec2 v_textureCoordinates; \n' + 'void main() \n' + '{ \n' + ' vec2 uv = v_textureCoordinates; \n' + ' vec3 dir; \n' + ' \n' + ' if (uv.y < 0.5) \n' + ' { \n' + ' if (uv.x < 0.333) \n' + ' { \n' + ' dir.x = -1.0; \n' + ' dir.y = uv.x * 6.0 - 1.0; \n' + ' dir.z = uv.y * 4.0 - 1.0; \n' + ' } \n' + ' else if (uv.x < 0.666) \n' + ' { \n' + ' dir.y = -1.0; \n' + ' dir.x = uv.x * 6.0 - 3.0; \n' + ' dir.z = uv.y * 4.0 - 1.0; \n' + ' } \n' + ' else \n' + ' { \n' + ' dir.z = -1.0; \n' + ' dir.x = uv.x * 6.0 - 5.0; \n' + ' dir.y = uv.y * 4.0 - 1.0; \n' + ' } \n' + ' } \n' + ' else \n' + ' { \n' + ' if (uv.x < 0.333) \n' + ' { \n' + ' dir.x = 1.0; \n' + ' dir.y = uv.x * 6.0 - 1.0; \n' + ' dir.z = uv.y * 4.0 - 3.0; \n' + ' } \n' + ' else if (uv.x < 0.666) \n' + ' { \n' + ' dir.y = 1.0; \n' + ' dir.x = uv.x * 6.0 - 3.0; \n' + ' dir.z = uv.y * 4.0 - 3.0; \n' + ' } \n' + ' else \n' + ' { \n' + ' dir.z = 1.0; \n' + ' dir.x = uv.x * 6.0 - 5.0; \n' + ' dir.y = uv.y * 4.0 - 3.0; \n' + ' } \n' + ' } \n' + ' \n' + ' float shadow = czm_unpackDepth(textureCube(shadowMap_textureCube, dir)); \n' + ' out_FragColor = vec4(vec3(shadow), 1.0); \n' + '} \n';
484
- } else {
485
- fs = 'uniform sampler2D shadowMap_texture; \n' + 'in vec2 v_textureCoordinates; \n' + 'void main() \n' + '{ \n' + (shadowMap._usesDepthTexture ? ' float shadow = texture2D(shadowMap_texture, v_textureCoordinates).r; \n' : ' float shadow = czm_unpackDepth(texture2D(shadowMap_texture, v_textureCoordinates)); \n') + ' out_FragColor = vec4(vec3(shadow), 1.0); \n' + '} \n';
486
- }
487
- var drawCommand = context.createViewportQuadCommand(fs, {
488
- uniformMap: {
489
- shadowMap_texture: function shadowMap_texture() {
490
- return shadowMap._shadowMapTexture;
491
- },
492
- shadowMap_textureCube: function shadowMap_textureCube() {
493
- return shadowMap._shadowMapTexture;
494
- }
495
- }
496
- });
497
- drawCommand.pass = Cesium.Pass.OVERLAY;
498
- return drawCommand;
499
- }
500
- function updateDebugShadowViewCommand(shadowMap, frameState) {
501
- // Draws the shadow map on the bottom-right corner of the screen
502
- var context = frameState.context;
503
- var screenWidth = frameState.context.drawingBufferWidth;
504
- var screenHeight = frameState.context.drawingBufferHeight;
505
- var size = Math.min(screenWidth, screenHeight) * 0.3;
506
- var viewport = scratchViewport;
507
- viewport.x = screenWidth - size;
508
- viewport.y = 0;
509
- viewport.width = size;
510
- viewport.height = size;
511
- var debugCommand = shadowMap._debugShadowViewCommand;
512
- if (!Cesium.defined(debugCommand)) {
513
- debugCommand = createDebugShadowViewCommand(shadowMap, context);
514
- shadowMap._debugShadowViewCommand = debugCommand;
515
- }
516
-
517
- // Get a new Cesium.RenderState for the updated viewport size
518
- if (!Cesium.defined(debugCommand.renderState) || !Cesium.BoundingRectangle.equals(debugCommand.renderState.viewport, viewport)) {
519
- debugCommand.renderState = Cesium.RenderState.fromCache({
520
- viewport: Cesium.BoundingRectangle.clone(viewport)
521
- });
522
- }
523
- frameState.commandList.push(shadowMap._debugShadowViewCommand);
524
- }
525
- var frustumCornersNDC = new Array(8);
526
- frustumCornersNDC[0] = new Cesium.Cartesian4(-1.0, -1.0, -1.0, 1.0);
527
- frustumCornersNDC[1] = new Cesium.Cartesian4(1.0, -1.0, -1.0, 1.0);
528
- frustumCornersNDC[2] = new Cesium.Cartesian4(1.0, 1.0, -1.0, 1.0);
529
- frustumCornersNDC[3] = new Cesium.Cartesian4(-1.0, 1.0, -1.0, 1.0);
530
- frustumCornersNDC[4] = new Cesium.Cartesian4(-1.0, -1.0, 1.0, 1.0);
531
- frustumCornersNDC[5] = new Cesium.Cartesian4(1.0, -1.0, 1.0, 1.0);
532
- frustumCornersNDC[6] = new Cesium.Cartesian4(1.0, 1.0, 1.0, 1.0);
533
- frustumCornersNDC[7] = new Cesium.Cartesian4(-1.0, 1.0, 1.0, 1.0);
534
- var scratchMatrix = new Cesium.Matrix4();
535
- var scratchFrustumCorners = new Array(8);
536
- for (var i = 0; i < 8; ++i) {
537
- scratchFrustumCorners[i] = new Cesium.Cartesian4();
538
- }
539
- function createDebugPointLight(modelMatrix, color) {
540
- var box = new Cesium.GeometryInstance({
541
- geometry: new Cesium.BoxOutlineGeometry({
542
- minimum: new Cesium.Cartesian3(-0.5, -0.5, -0.5),
543
- maximum: new Cesium.Cartesian3(0.5, 0.5, 0.5)
544
- }),
545
- attributes: {
546
- color: Cesium.ColorGeometryInstanceAttribute.fromColor(color)
547
- }
548
- });
549
- var sphere = new Cesium.GeometryInstance({
550
- geometry: new Cesium.SphereOutlineGeometry({
551
- radius: 0.5
552
- }),
553
- attributes: {
554
- color: Cesium.ColorGeometryInstanceAttribute.fromColor(color)
555
- }
556
- });
557
- return new Cesium.Primitive({
558
- geometryInstances: [box, sphere],
559
- appearance: new Cesium.PerInstanceColorAppearance({
560
- translucent: false,
561
- flat: true
562
- }),
563
- asynchronous: false,
564
- modelMatrix: modelMatrix
565
- });
566
- }
567
- var debugOutlineColors = [Cesium.Color.RED, Cesium.Color.GREEN, Cesium.Color.BLUE, Cesium.Color.MAGENTA];
568
- var scratchScale = new Cesium.Cartesian3();
569
- function applyDebugSettings(shadowMap, frameState) {
570
- updateDebugShadowViewCommand(shadowMap, frameState);
571
- var enterFreezeFrame = shadowMap.debugFreezeFrame && !shadowMap._debugFreezeFrame;
572
- shadowMap._debugFreezeFrame = shadowMap.debugFreezeFrame;
573
-
574
- // Draw scene camera in freeze frame mode
575
- if (shadowMap.debugFreezeFrame) {
576
- if (enterFreezeFrame) {
577
- // Recreate debug camera when entering freeze frame mode
578
- shadowMap._debugCameraFrustum = shadowMap._debugCameraFrustum && shadowMap._debugCameraFrustum.destroy();
579
- shadowMap._debugCameraFrustum = new Cesium.DebugCameraPrimitive({
580
- camera: shadowMap._sceneCamera,
581
- color: Cesium.Color.CYAN,
582
- updateOnChange: false
583
- });
584
- }
585
- shadowMap._debugCameraFrustum.update(frameState);
586
- }
587
- if (shadowMap._cascadesEnabled) {
588
- // Draw cascades only in freeze frame mode
589
- if (shadowMap.debugFreezeFrame) {
590
- if (enterFreezeFrame) {
591
- // Recreate debug frustum when entering freeze frame mode
592
- shadowMap._debugLightFrustum = shadowMap._debugLightFrustum && shadowMap._debugLightFrustum.destroy();
593
- shadowMap._debugLightFrustum = new Cesium.DebugCameraPrimitive({
594
- camera: shadowMap._shadowMapCamera,
595
- color: Cesium.Color.YELLOW,
596
- updateOnChange: false
597
- });
598
- }
599
- shadowMap._debugLightFrustum.update(frameState);
600
- for (var _i = 0; _i < shadowMap._numberOfCascades; ++_i) {
601
- if (enterFreezeFrame) {
602
- // Recreate debug frustum when entering freeze frame mode
603
- shadowMap._debugCascadeFrustums[_i] = shadowMap._debugCascadeFrustums[_i] && shadowMap._debugCascadeFrustums[_i].destroy();
604
- shadowMap._debugCascadeFrustums[_i] = new Cesium.DebugCameraPrimitive({
605
- camera: shadowMap._passes[_i].camera,
606
- color: debugOutlineColors[_i],
607
- updateOnChange: false
608
- });
609
- }
610
- shadowMap._debugCascadeFrustums[_i].update(frameState);
611
- }
612
- }
613
- } else if (shadowMap._isPointLight) {
614
- if (!Cesium.defined(shadowMap._debugLightFrustum) || shadowMap._needsUpdate) {
615
- var translation = shadowMap._shadowMapCamera.positionWC;
616
- var rotation = Cesium.Quaternion.IDENTITY;
617
- var uniformScale = shadowMap._pointLightRadius * 2.0;
618
- var scale = Cesium.Cartesian3.fromElements(uniformScale, uniformScale, uniformScale, scratchScale);
619
- var modelMatrix = Cesium.Matrix4.fromTranslationQuaternionRotationScale(translation, rotation, scale, scratchMatrix);
620
- shadowMap._debugLightFrustum = shadowMap._debugLightFrustum && shadowMap._debugLightFrustum.destroy();
621
- shadowMap._debugLightFrustum = createDebugPointLight(modelMatrix, Cesium.Color.YELLOW);
622
- }
623
- shadowMap._debugLightFrustum.update(frameState);
624
- } else {
625
- if (!Cesium.defined(shadowMap._debugLightFrustum) || shadowMap._needsUpdate) {
626
- shadowMap._debugLightFrustum = new Cesium.DebugCameraPrimitive({
627
- camera: shadowMap._shadowMapCamera,
628
- color: Cesium.Color.YELLOW,
629
- updateOnChange: false
630
- });
631
- }
632
- shadowMap._debugLightFrustum.update(frameState);
633
- }
634
- }
635
- function ShadowMapCamera() {
636
- this.viewMatrix = new Cesium.Matrix4();
637
- this.inverseViewMatrix = new Cesium.Matrix4();
638
- this.frustum = undefined;
639
- this.positionCartographic = new Cesium.Cartographic();
640
- this.positionWC = new Cesium.Cartesian3();
641
- this.directionWC = Cesium.Cartesian3.clone(Cesium.Cartesian3.UNIT_Z);
642
- this.upWC = Cesium.Cartesian3.clone(Cesium.Cartesian3.UNIT_Y);
643
- this.rightWC = Cesium.Cartesian3.clone(Cesium.Cartesian3.UNIT_X);
644
- this.viewProjectionMatrix = new Cesium.Matrix4();
645
- }
646
- ShadowMapCamera.prototype.clone = function (camera) {
647
- Cesium.Matrix4.clone(camera.viewMatrix, this.viewMatrix);
648
- Cesium.Matrix4.clone(camera.inverseViewMatrix, this.inverseViewMatrix);
649
- this.frustum = camera.frustum.clone(this.frustum);
650
- Cesium.Cartographic.clone(camera.positionCartographic, this.positionCartographic);
651
- Cesium.Cartesian3.clone(camera.positionWC, this.positionWC);
652
- Cesium.Cartesian3.clone(camera.directionWC, this.directionWC);
653
- Cesium.Cartesian3.clone(camera.upWC, this.upWC);
654
- Cesium.Cartesian3.clone(camera.rightWC, this.rightWC);
655
- };
656
-
657
- // Converts from NDC space to texture space
658
- var scaleBiasMatrix = new Cesium.Matrix4(0.5, 0.0, 0.0, 0.5, 0.0, 0.5, 0.0, 0.5, 0.0, 0.0, 0.5, 0.5, 0.0, 0.0, 0.0, 1.0);
659
- ShadowMapCamera.prototype.getViewProjection = function () {
660
- var view = this.viewMatrix;
661
- var projection = this.frustum.projectionMatrix;
662
- Cesium.Matrix4.multiply(projection, view, this.viewProjectionMatrix);
663
- Cesium.Matrix4.multiply(scaleBiasMatrix, this.viewProjectionMatrix, this.viewProjectionMatrix);
664
- return this.viewProjectionMatrix;
665
- };
666
- var scratchSplits = new Array(5);
667
- var scratchFrustum = new Cesium.PerspectiveFrustum();
668
- var scratchCascadeDistances = new Array(4);
669
- var scratchMin = new Cesium.Cartesian3();
670
- var scratchMax = new Cesium.Cartesian3();
671
- function computeCascades(shadowMap, frameState) {
672
- var shadowMapCamera = shadowMap._shadowMapCamera;
673
- var sceneCamera = shadowMap._sceneCamera;
674
- var cameraNear = sceneCamera.frustum.near;
675
- var cameraFar = sceneCamera.frustum.far;
676
- var numberOfCascades = shadowMap._numberOfCascades;
677
-
678
- // Split cascades. Use a mix of linear and log splits.
679
- var i;
680
- var range = cameraFar - cameraNear;
681
- var ratio = cameraFar / cameraNear;
682
- var lambda = 0.9;
683
- var clampCascadeDistances = false;
684
-
685
- // When the camera is close to a relatively small model, provide more detail in the closer cascades.
686
- // If the camera is near or inside a large model, such as the root tile of a city, then use the default values.
687
- // To get the most accurate cascade splits we would need to find the min and max values from the depth texture.
688
- if (frameState.shadowState.closestObjectSize < 200.0) {
689
- clampCascadeDistances = true;
690
- lambda = 0.9;
691
- }
692
- var cascadeDistances = scratchCascadeDistances;
693
- var splits = scratchSplits;
694
- splits[0] = cameraNear;
695
- splits[numberOfCascades] = cameraFar;
696
-
697
- // Find initial splits
698
- for (i = 0; i < numberOfCascades; ++i) {
699
- var p = (i + 1) / numberOfCascades;
700
- var logScale = cameraNear * Math.pow(ratio, p);
701
- var uniformScale = cameraNear + range * p;
702
- var split = Cesium.Math.lerp(uniformScale, logScale, lambda);
703
- splits[i + 1] = split;
704
- cascadeDistances[i] = split - splits[i];
705
- }
706
- if (clampCascadeDistances) {
707
- // Clamp each cascade to its maximum distance
708
- for (i = 0; i < numberOfCascades; ++i) {
709
- cascadeDistances[i] = Math.min(cascadeDistances[i], shadowMap._maximumCascadeDistances[i]);
710
- }
711
-
712
- // Recompute splits
713
- var distance = splits[0];
714
- for (i = 0; i < numberOfCascades - 1; ++i) {
715
- distance += cascadeDistances[i];
716
- splits[i + 1] = distance;
717
- }
718
- }
719
- Cesium.Cartesian4.unpack(splits, 0, shadowMap._cascadeSplits[0]);
720
- Cesium.Cartesian4.unpack(splits, 1, shadowMap._cascadeSplits[1]);
721
- Cesium.Cartesian4.unpack(cascadeDistances, 0, shadowMap._cascadeDistances);
722
- var shadowFrustum = shadowMapCamera.frustum;
723
- var left = shadowFrustum.left;
724
- var right = shadowFrustum.right;
725
- var bottom = shadowFrustum.bottom;
726
- var top = shadowFrustum.top;
727
- var near = shadowFrustum.near;
728
- var far = shadowFrustum.far;
729
- var position = shadowMapCamera.positionWC;
730
- var direction = shadowMapCamera.directionWC;
731
- var up = shadowMapCamera.upWC;
732
- var cascadeSubFrustum = sceneCamera.frustum.clone(scratchFrustum);
733
- var shadowViewProjection = shadowMapCamera.getViewProjection();
734
- for (i = 0; i < numberOfCascades; ++i) {
735
- // Find the bounding box of the camera sub-frustum in shadow map texture space
736
- cascadeSubFrustum.near = splits[i];
737
- cascadeSubFrustum.far = splits[i + 1];
738
- var viewProjection = Cesium.Matrix4.multiply(cascadeSubFrustum.projectionMatrix, sceneCamera.viewMatrix, scratchMatrix);
739
- var inverseViewProjection = Cesium.Matrix4.inverse(viewProjection, scratchMatrix);
740
- var shadowMapMatrix = Cesium.Matrix4.multiply(shadowViewProjection, inverseViewProjection, scratchMatrix);
741
-
742
- // Project each corner from camera NDC space to shadow map texture space. Min and max will be from 0 to 1.
743
- var min = Cesium.Cartesian3.fromElements(Number.MAX_VALUE, Number.MAX_VALUE, Number.MAX_VALUE, scratchMin);
744
- var max = Cesium.Cartesian3.fromElements(-Number.MAX_VALUE, -Number.MAX_VALUE, -Number.MAX_VALUE, scratchMax);
745
- for (var k = 0; k < 8; ++k) {
746
- var corner = Cesium.Cartesian4.clone(frustumCornersNDC[k], scratchFrustumCorners[k]);
747
- Cesium.Matrix4.multiplyByVector(shadowMapMatrix, corner, corner);
748
- Cesium.Cartesian3.divideByScalar(corner, corner.w, corner); // Handle the perspective divide
749
- Cesium.Cartesian3.minimumByComponent(corner, min, min);
750
- Cesium.Cartesian3.maximumByComponent(corner, max, max);
751
- }
752
-
753
- // Limit light-space coordinates to the [0, 1] range
754
- min.x = Math.max(min.x, 0.0);
755
- min.y = Math.max(min.y, 0.0);
756
- min.z = 0.0; // Always start cascade frustum at the top of the light frustum to capture objects in the light's path
757
- max.x = Math.min(max.x, 1.0);
758
- max.y = Math.min(max.y, 1.0);
759
- max.z = Math.min(max.z, 1.0);
760
- var pass = shadowMap._passes[i];
761
- var cascadeCamera = pass.camera;
762
- cascadeCamera.clone(shadowMapCamera); // PERFORMANCE_IDEA : could do a shallow clone for all properties except the frustum
763
-
764
- var frustum = cascadeCamera.frustum;
765
- frustum.left = left + min.x * (right - left);
766
- frustum.right = left + max.x * (right - left);
767
- frustum.bottom = bottom + min.y * (top - bottom);
768
- frustum.top = bottom + max.y * (top - bottom);
769
- frustum.near = near + min.z * (far - near);
770
- frustum.far = near + max.z * (far - near);
771
- pass.cullingVolume = cascadeCamera.frustum.computeCullingVolume(position, direction, up);
772
-
773
- // Transforms from eye space to the cascade's texture space
774
- var cascadeMatrix = shadowMap._cascadeMatrices[i];
775
- Cesium.Matrix4.multiply(cascadeCamera.getViewProjection(), sceneCamera.inverseViewMatrix, cascadeMatrix);
776
- Cesium.Matrix4.multiply(pass.textureOffsets, cascadeMatrix, cascadeMatrix);
777
- }
778
- }
779
- var scratchLightView = new Cesium.Matrix4();
780
- var scratchRight = new Cesium.Cartesian3();
781
- var scratchUp = new Cesium.Cartesian3();
782
- var scratchTranslation = new Cesium.Cartesian3();
783
- function fitShadowMapToScene(shadowMap, frameState) {
784
- var shadowMapCamera = shadowMap._shadowMapCamera;
785
- var sceneCamera = shadowMap._sceneCamera;
786
-
787
- // 1. First find a tight bounding box in light space that contains the entire camera frustum.
788
- var viewProjection = Cesium.Matrix4.multiply(sceneCamera.frustum.projectionMatrix, sceneCamera.viewMatrix, scratchMatrix);
789
- var inverseViewProjection = Cesium.Matrix4.inverse(viewProjection, scratchMatrix);
790
-
791
- // Start to construct the light view matrix. Set translation later once the bounding box is found.
792
- var lightDir = shadowMapCamera.directionWC;
793
- var lightUp = sceneCamera.directionWC; // Align shadows to the camera view.
794
- var lightRight = Cesium.Cartesian3.cross(lightDir, lightUp, scratchRight);
795
- lightUp = Cesium.Cartesian3.cross(lightRight, lightDir, scratchUp); // Recalculate up now that right is derived
796
- Cesium.Cartesian3.normalize(lightUp, lightUp);
797
- Cesium.Cartesian3.normalize(lightRight, lightRight);
798
- var lightPosition = Cesium.Cartesian3.fromElements(0.0, 0.0, 0.0, scratchTranslation);
799
- var lightView = Cesium.Matrix4.computeView(lightPosition, lightDir, lightUp, lightRight, scratchLightView);
800
- var cameraToLight = Cesium.Matrix4.multiply(lightView, inverseViewProjection, scratchMatrix);
801
-
802
- // Project each corner from NDC space to light view space, and calculate a min and max in light view space
803
- var min = Cesium.Cartesian3.fromElements(Number.MAX_VALUE, Number.MAX_VALUE, Number.MAX_VALUE, scratchMin);
804
- var max = Cesium.Cartesian3.fromElements(-Number.MAX_VALUE, -Number.MAX_VALUE, -Number.MAX_VALUE, scratchMax);
805
- for (var _i2 = 0; _i2 < 8; ++_i2) {
806
- var corner = Cesium.Cartesian4.clone(frustumCornersNDC[_i2], scratchFrustumCorners[_i2]);
807
- Cesium.Matrix4.multiplyByVector(cameraToLight, corner, corner);
808
- Cesium.Cartesian3.divideByScalar(corner, corner.w, corner); // Handle the perspective divide
809
- Cesium.Cartesian3.minimumByComponent(corner, min, min);
810
- Cesium.Cartesian3.maximumByComponent(corner, max, max);
811
- }
812
-
813
- // 2. Set bounding box back to include objects in the light's view
814
- max.z += 1000.0; // Note: in light space, a positive number is behind the camera
815
- min.z -= 10.0; // Extend the shadow volume forward slightly to avoid problems right at the edge
816
-
817
- // 3. Adjust light view matrix so that it is centered on the bounding volume
818
- var translation = scratchTranslation;
819
- translation.x = -(0.5 * (min.x + max.x));
820
- translation.y = -(0.5 * (min.y + max.y));
821
- translation.z = -max.z;
822
- var translationMatrix = Cesium.Matrix4.fromTranslation(translation, scratchMatrix);
823
- lightView = Cesium.Matrix4.multiply(translationMatrix, lightView, lightView);
824
-
825
- // 4. Create an orthographic frustum that covers the bounding box extents
826
- var halfWidth = 0.5 * (max.x - min.x);
827
- var halfHeight = 0.5 * (max.y - min.y);
828
- var depth = max.z - min.z;
829
- var frustum = shadowMapCamera.frustum;
830
- frustum.left = -halfWidth;
831
- frustum.right = halfWidth;
832
- frustum.bottom = -halfHeight;
833
- frustum.top = halfHeight;
834
- frustum.near = 0.01;
835
- frustum.far = depth;
836
-
837
- // 5. Update the shadow map camera
838
- Cesium.Matrix4.clone(lightView, shadowMapCamera.viewMatrix);
839
- Cesium.Matrix4.inverse(lightView, shadowMapCamera.inverseViewMatrix);
840
- Cesium.Matrix4.getTranslation(shadowMapCamera.inverseViewMatrix, shadowMapCamera.positionWC);
841
- frameState.mapProjection.ellipsoid.cartesianToCartographic(shadowMapCamera.positionWC, shadowMapCamera.positionCartographic);
842
- Cesium.Cartesian3.clone(lightDir, shadowMapCamera.directionWC);
843
- Cesium.Cartesian3.clone(lightUp, shadowMapCamera.upWC);
844
- Cesium.Cartesian3.clone(lightRight, shadowMapCamera.rightWC);
845
- }
846
- var directions = [new Cesium.Cartesian3(-1.0, 0.0, 0.0), new Cesium.Cartesian3(0.0, -1.0, 0.0), new Cesium.Cartesian3(0.0, 0.0, -1.0), new Cesium.Cartesian3(1.0, 0.0, 0.0), new Cesium.Cartesian3(0.0, 1.0, 0.0), new Cesium.Cartesian3(0.0, 0.0, 1.0)];
847
- var ups = [new Cesium.Cartesian3(0.0, -1.0, 0.0), new Cesium.Cartesian3(0.0, 0.0, -1.0), new Cesium.Cartesian3(0.0, -1.0, 0.0), new Cesium.Cartesian3(0.0, -1.0, 0.0), new Cesium.Cartesian3(0.0, 0.0, 1.0), new Cesium.Cartesian3(0.0, -1.0, 0.0)];
848
- var rights = [new Cesium.Cartesian3(0.0, 0.0, 1.0), new Cesium.Cartesian3(1.0, 0.0, 0.0), new Cesium.Cartesian3(-1.0, 0.0, 0.0), new Cesium.Cartesian3(0.0, 0.0, -1.0), new Cesium.Cartesian3(1.0, 0.0, 0.0), new Cesium.Cartesian3(1.0, 0.0, 0.0)];
849
- function computeOmnidirectional(shadowMap, frameState) {
850
- // All sides share the same frustum
851
- var frustum = new Cesium.PerspectiveFrustum();
852
- frustum.fov = Cesium.Math.PI_OVER_TWO;
853
- frustum.near = 1.0;
854
- frustum.far = shadowMap._pointLightRadius;
855
- frustum.aspectRatio = 1.0;
856
- for (var _i3 = 0; _i3 < 6; ++_i3) {
857
- var camera = shadowMap._passes[_i3].camera;
858
- camera.positionWC = shadowMap._shadowMapCamera.positionWC;
859
- camera.positionCartographic = frameState.mapProjection.ellipsoid.cartesianToCartographic(camera.positionWC, camera.positionCartographic);
860
- camera.directionWC = directions[_i3];
861
- camera.upWC = ups[_i3];
862
- camera.rightWC = rights[_i3];
863
- Cesium.Matrix4.computeView(camera.positionWC, camera.directionWC, camera.upWC, camera.rightWC, camera.viewMatrix);
864
- Cesium.Matrix4.inverse(camera.viewMatrix, camera.inverseViewMatrix);
865
- camera.frustum = frustum;
866
- }
867
- }
868
- var scratchCartesian1 = new Cesium.Cartesian3();
869
- var scratchCartesian2 = new Cesium.Cartesian3();
870
- var scratchBoundingSphere = new Cesium.BoundingSphere();
871
- var scratchCenter = scratchBoundingSphere.center;
872
- function checkVisibility(shadowMap, frameState) {
873
- var sceneCamera = shadowMap._sceneCamera;
874
- var shadowMapCamera = shadowMap._shadowMapCamera;
875
- var boundingSphere = scratchBoundingSphere;
876
-
877
- // Check whether the shadow map is in view and needs to be updated
878
- if (shadowMap._cascadesEnabled) {
879
- // If the nearest shadow receiver is further than the shadow map's maximum distance then the shadow map is out of view.
880
- if (sceneCamera.frustum.near >= shadowMap.maximumDistance) {
881
- shadowMap._outOfView = true;
882
- shadowMap._needsUpdate = false;
883
- return;
884
- }
885
-
886
- // If the light source is below the horizon then the shadow map is out of view
887
- var surfaceNormal = frameState.mapProjection.ellipsoid.geodeticSurfaceNormal(sceneCamera.positionWC, scratchCartesian1);
888
- var lightDirection = Cesium.Cartesian3.negate(shadowMapCamera.directionWC, scratchCartesian2);
889
- var dot = Cesium.Cartesian3.dot(surfaceNormal, lightDirection);
890
-
891
- // Shadows start to fade out once the light gets closer to the horizon.
892
- // At this point the globe uses vertex lighting alone to darken the surface.
893
- var darknessAmount = Cesium.Math.clamp(dot / 0.1, 0.0, 1.0);
894
- shadowMap._darkness = Cesium.Math.lerp(1.0, shadowMap.darkness, darknessAmount);
895
- if (dot < 0.0) {
896
- shadowMap._outOfView = true;
897
- shadowMap._needsUpdate = false;
898
- return;
899
- }
900
-
901
- // By default cascaded shadows need to update and are always in view
902
- shadowMap._needsUpdate = true;
903
- shadowMap._outOfView = false;
904
- } else if (shadowMap._isPointLight) {
905
- // Sphere-frustum intersection test
906
- boundingSphere.center = shadowMapCamera.positionWC;
907
- boundingSphere.radius = shadowMap._pointLightRadius;
908
- shadowMap._outOfView = frameState.cullingVolume.computeVisibility(boundingSphere) === Cesium.Intersect.OUTSIDE;
909
- shadowMap._needsUpdate = !shadowMap._outOfView && !shadowMap._boundingSphere.equals(boundingSphere);
910
- Cesium.BoundingSphere.clone(boundingSphere, shadowMap._boundingSphere);
911
- } else {
912
- // Simplify frustum-frustum intersection test as a sphere-frustum test
913
- var frustumRadius = shadowMapCamera.frustum.far / 2.0;
914
- var frustumCenter = Cesium.Cartesian3.add(shadowMapCamera.positionWC, Cesium.Cartesian3.multiplyByScalar(shadowMapCamera.directionWC, frustumRadius, scratchCenter), scratchCenter);
915
- boundingSphere.center = frustumCenter;
916
- boundingSphere.radius = frustumRadius;
917
- shadowMap._outOfView = frameState.cullingVolume.computeVisibility(boundingSphere) === Cesium.Intersect.OUTSIDE;
918
- shadowMap._needsUpdate = !shadowMap._outOfView && !shadowMap._boundingSphere.equals(boundingSphere);
919
- Cesium.BoundingSphere.clone(boundingSphere, shadowMap._boundingSphere);
920
- }
921
- }
922
- function updateCameras(shadowMap, frameState) {
923
- var camera = frameState.camera; // The actual camera in the scene
924
- var lightCamera = shadowMap._lightCamera; // The external camera representing the light source
925
- var sceneCamera = shadowMap._sceneCamera; // Clone of camera, with clamped near and far planes
926
- var shadowMapCamera = shadowMap._shadowMapCamera; // Cesium.Camera representing the shadow volume, initially cloned from lightCamera
927
-
928
- // Clone light camera into the shadow map camera
929
- if (shadowMap._cascadesEnabled) {
930
- Cesium.Cartesian3.clone(lightCamera.directionWC, shadowMapCamera.directionWC);
931
- } else if (shadowMap._isPointLight) {
932
- Cesium.Cartesian3.clone(lightCamera.positionWC, shadowMapCamera.positionWC);
933
- } else {
934
- shadowMapCamera.clone(lightCamera);
935
- }
936
-
937
- // Get the light direction in eye coordinates
938
- var lightDirection = shadowMap._lightDirectionEC;
939
- Cesium.Matrix4.multiplyByPointAsVector(camera.viewMatrix, shadowMapCamera.directionWC, lightDirection);
940
- Cesium.Cartesian3.normalize(lightDirection, lightDirection);
941
- Cesium.Cartesian3.negate(lightDirection, lightDirection);
942
-
943
- // Get the light position in eye coordinates
944
- Cesium.Matrix4.multiplyByPoint(camera.viewMatrix, shadowMapCamera.positionWC, shadowMap._lightPositionEC);
945
- shadowMap._lightPositionEC.w = shadowMap._pointLightRadius;
946
-
947
- // Get the near and far of the scene camera
948
- var near;
949
- var far;
950
- if (shadowMap.isViewShed) {
951
- near = lightCamera.frustum.near;
952
- far = lightCamera.frustum.far;
953
- } else if (shadowMap._fitNearFar) {
954
- // shadowFar can be very large, so limit to shadowMap.maximumDistance
955
- // Push the far plane slightly further than the near plane to avoid degenerate frustum
956
- near = Math.min(frameState.shadowState.nearPlane, shadowMap.maximumDistance);
957
- far = Math.min(frameState.shadowState.farPlane, shadowMap.maximumDistance + 1.0);
958
- } else {
959
- near = camera.frustum.near;
960
- far = shadowMap.maximumDistance;
961
- }
962
- shadowMap._sceneCamera = Cesium.Camera.clone(camera, sceneCamera);
963
- camera.frustum.clone(shadowMap._sceneCamera.frustum);
964
- shadowMap._sceneCamera.frustum.near = near;
965
- shadowMap._sceneCamera.frustum.far = far;
966
- shadowMap._distance = far - near;
967
- checkVisibility(shadowMap, frameState);
968
- if (!shadowMap._outOfViewPrevious && shadowMap._outOfView) {
969
- shadowMap._needsUpdate = true;
970
- }
971
- shadowMap._outOfViewPrevious = shadowMap._outOfView;
972
- }
973
-
974
- /**
975
- * @private
976
- */
977
- ViewshedMap.prototype.update = function (frameState) {
978
- updateCameras(this, frameState);
979
- if (this._needsUpdate) {
980
- updateFramebuffer(this, frameState.context);
981
- if (this._isPointLight) {
982
- computeOmnidirectional(this, frameState);
983
- }
984
- if (this._cascadesEnabled) {
985
- fitShadowMapToScene(this, frameState);
986
- if (this._numberOfCascades > 1) {
987
- computeCascades(this, frameState);
988
- }
989
- }
990
- if (!this._isPointLight) {
991
- // Compute the culling volume
992
- var shadowMapCamera = this._shadowMapCamera;
993
- var position = shadowMapCamera.positionWC;
994
- var direction = shadowMapCamera.directionWC;
995
- var up = shadowMapCamera.upWC;
996
- this._shadowMapCullingVolume = shadowMapCamera.frustum.computeCullingVolume(position, direction, up);
997
- if (this._passes.length === 1) {
998
- // Since there is only one pass, use the shadow map camera as the pass camera.
999
- this._passes[0].camera.clone(shadowMapCamera);
1000
- }
1001
- } else {
1002
- this._shadowMapCullingVolume = Cesium.CullingVolume.fromBoundingSphere(this._boundingSphere);
1003
- }
1004
- }
1005
- if (this._passes.length === 1) {
1006
- // Transforms from eye space to shadow texture space.
1007
- // Always requires an update since the scene camera constantly changes.
1008
- var inverseView = this._sceneCamera.inverseViewMatrix;
1009
- Cesium.Matrix4.multiply(this._shadowMapCamera.getViewProjection(), inverseView, this._shadowMapMatrix);
1010
- }
1011
- if (this.debugShow) {
1012
- applyDebugSettings(this, frameState);
1013
- }
1014
- };
1015
-
1016
- /**
1017
- * @private
1018
- */
1019
- ViewshedMap.prototype.updatePass = function (context, shadowPass) {
1020
- clearFramebuffer(this, context, shadowPass);
1021
- };
1022
- var scratchTexelStepSize = new Cesium.Cartesian2();
1023
- function combineUniforms(shadowMap, uniforms, isTerrain) {
1024
- var bias = shadowMap._isPointLight ? shadowMap._pointBias : isTerrain ? shadowMap._terrainBias : shadowMap._primitiveBias;
1025
- var mapUniforms = {
1026
- shadowMap_texture: function shadowMap_texture() {
1027
- return shadowMap._shadowMapTexture;
1028
- },
1029
- shadowMap_textureCube: function shadowMap_textureCube() {
1030
- return shadowMap._shadowMapTexture;
1031
- },
1032
- shadowMap_matrix: function shadowMap_matrix() {
1033
- return shadowMap._shadowMapMatrix;
1034
- },
1035
- shadowMap_cascadeSplits: function shadowMap_cascadeSplits() {
1036
- return shadowMap._cascadeSplits;
1037
- },
1038
- shadowMap_cascadeMatrices: function shadowMap_cascadeMatrices() {
1039
- return shadowMap._cascadeMatrices;
1040
- },
1041
- shadowMap_lightDirectionEC: function shadowMap_lightDirectionEC() {
1042
- return shadowMap._lightDirectionEC;
1043
- },
1044
- shadowMap_lightPositionEC: function shadowMap_lightPositionEC() {
1045
- return shadowMap._lightPositionEC;
1046
- },
1047
- shadowMap_cascadeDistances: function shadowMap_cascadeDistances() {
1048
- return shadowMap._cascadeDistances;
1049
- },
1050
- shadowMap_texelSizeDepthBiasAndNormalShadingSmooth: function shadowMap_texelSizeDepthBiasAndNormalShadingSmooth() {
1051
- var texelStepSize = scratchTexelStepSize;
1052
- texelStepSize.x = 1.0 / shadowMap._textureSize.x;
1053
- texelStepSize.y = 1.0 / shadowMap._textureSize.y;
1054
- return Cesium.Cartesian4.fromElements(texelStepSize.x, texelStepSize.y, bias.depthBias, bias.normalShadingSmooth, this.combinedUniforms1);
1055
- },
1056
- shadowMap_normalOffsetScaleDistanceMaxDistanceAndDarkness: function shadowMap_normalOffsetScaleDistanceMaxDistanceAndDarkness() {
1057
- return Cesium.Cartesian4.fromElements(bias.normalOffsetScale, shadowMap._distance, shadowMap.maximumDistance, shadowMap._darkness, this.combinedUniforms2);
1058
- },
1059
- combinedUniforms1: new Cesium.Cartesian4(),
1060
- combinedUniforms2: new Cesium.Cartesian4()
1061
- };
1062
- return Cesium.combine(uniforms, mapUniforms, false);
1063
- }
1064
- function getShadowReceiveShaderKeyword(shadowMap, castShadows, isTerrain, hasTerrainNormal) {
1065
- var usesDepthTexture = shadowMap._usesDepthTexture;
1066
- var polygonOffsetSupported = shadowMap._polygonOffsetSupported;
1067
- var isPointLight = shadowMap._isPointLight;
1068
- var isSpotLight = shadowMap._isSpotLight;
1069
- var hasCascades = shadowMap._numberOfCascades > 1;
1070
- var debugCascadeColors = shadowMap.debugCascadeColors;
1071
- var softShadows = shadowMap.softShadows;
1072
- return 'view receiveShadow ' + usesDepthTexture + polygonOffsetSupported + isPointLight + isSpotLight + hasCascades + debugCascadeColors + softShadows + castShadows + isTerrain + hasTerrainNormal;
1073
- }
1074
- function createShadowReceiveFragmentShader(fs, shadowMap, castShadows, isTerrain, hasTerrainNormal) {
1075
- var normalVaryingName = Cesium.ShaderSource.findNormalVarying(fs);
1076
- var hasNormalVarying = !isTerrain && Cesium.defined(normalVaryingName) || isTerrain && hasTerrainNormal;
1077
- var positionVaryingName = Cesium.ShaderSource.findPositionVarying(fs);
1078
- var hasPositionVarying = Cesium.defined(positionVaryingName);
1079
- var usesDepthTexture = shadowMap._usesDepthTexture;
1080
- var polygonOffsetSupported = shadowMap._polygonOffsetSupported;
1081
- var isPointLight = shadowMap._isPointLight;
1082
- var isSpotLight = shadowMap._isSpotLight;
1083
- var hasCascades = shadowMap._numberOfCascades > 1;
1084
- var debugCascadeColors = shadowMap.debugCascadeColors;
1085
- var softShadows = shadowMap.softShadows;
1086
- var bias = isPointLight ? shadowMap._pointBias : isTerrain ? shadowMap._terrainBias : shadowMap._primitiveBias;
1087
- var defines = fs.defines.slice(0);
1088
- var sources = fs.sources.slice(0);
1089
- var length = sources.length;
1090
- for (var _i4 = 0; _i4 < length; ++_i4) {
1091
- sources[_i4] = Cesium.ShaderSource.replaceMain(sources[_i4], 'czm_shadow_receive_main');
1092
- }
1093
- if (isPointLight) {
1094
- defines.push('USE_CUBE_MAP_SHADOW');
1095
- } else if (usesDepthTexture) {
1096
- defines.push('USE_SHADOW_DEPTH_TEXTURE');
1097
- }
1098
- if (softShadows && !isPointLight) {
1099
- defines.push('USE_SOFT_SHADOWS');
1100
- }
1101
-
1102
- // Enable day-night shading so that the globe is dark when the light is below the horizon
1103
- if (hasCascades && castShadows && isTerrain) {
1104
- if (hasNormalVarying) {
1105
- defines.push('ENABLE_VERTEX_LIGHTING');
1106
- } else {
1107
- defines.push('ENABLE_DAYNIGHT_SHADING');
1108
- }
1109
- }
1110
- if (castShadows && bias.normalShading && hasNormalVarying) {
1111
- defines.push('USE_NORMAL_SHADING');
1112
- if (bias.normalShadingSmooth > 0.0) {
1113
- defines.push('USE_NORMAL_SHADING_SMOOTH');
1114
- }
1115
- }
1116
- var fsSource = '';
1117
- if (isPointLight) {
1118
- fsSource += 'uniform samplerCube shadowMap_textureCube; \n';
1119
- } else {
1120
- fsSource += 'uniform sampler2D shadowMap_texture; \n';
1121
- }
1122
- var returnPositionEC;
1123
- if (hasPositionVarying) {
1124
- returnPositionEC = ' return vec4(' + positionVaryingName + ', 1.0); \n';
1125
- } else {
1126
- returnPositionEC = '#ifndef LOG_DEPTH \n' + ' return czm_windowToEyeCoordinates(gl_FragCoord); \n' + '#else \n' + ' return vec4(v_logPositionEC, 1.0); \n' + '#endif \n';
1127
- }
1128
- fsSource += 'uniform mat4 shadowMap_matrix; \n' + 'uniform vec3 shadowMap_lightDirectionEC; \n' + 'uniform vec4 shadowMap_lightPositionEC; \n' + 'uniform vec4 shadowMap_normalOffsetScaleDistanceMaxDistanceAndDarkness; \n' + 'uniform vec4 shadowMap_texelSizeDepthBiasAndNormalShadingSmooth; \n' + '#ifdef LOG_DEPTH \n' + 'in vec3 v_logPositionEC; \n' + '#endif \n' + 'vec4 getPositionEC() \n' + '{ \n' + returnPositionEC + '} \n' + 'vec3 getNormalEC() \n' + '{ \n' + (hasNormalVarying ? ' return normalize(' + normalVaryingName + '); \n' : ' return vec3(1.0); \n') + '} \n' +
1129
- // Offset the shadow position in the direction of the normal for perpendicular and back faces
1130
- 'void applyNormalOffset(inout vec4 positionEC, vec3 normalEC, float nDotL) \n' + '{ \n' + (bias.normalOffset && hasNormalVarying ? ' float normalOffset = shadowMap_normalOffsetScaleDistanceMaxDistanceAndDarkness.x; \n' + ' float normalOffsetScale = 1.0 - nDotL; \n' + ' vec3 offset = normalOffset * normalOffsetScale * normalEC; \n' + ' positionEC.xyz += offset; \n' : '') + '} \n';
1131
- fsSource += 'void main() \n' + '{ \n' + ' czm_shadow_receive_main(); \n' + ' vec4 positionEC = getPositionEC(); \n' + ' vec3 normalEC = getNormalEC(); \n' + ' float depth = -positionEC.z; \n';
1132
- fsSource += ' czm_shadowParameters shadowParameters; \n' + ' shadowParameters.texelStepSize = shadowMap_texelSizeDepthBiasAndNormalShadingSmooth.xy; \n' + ' shadowParameters.depthBias = shadowMap_texelSizeDepthBiasAndNormalShadingSmooth.z; \n' + ' shadowParameters.normalShadingSmooth = shadowMap_texelSizeDepthBiasAndNormalShadingSmooth.w; \n' + ' shadowParameters.darkness = shadowMap_normalOffsetScaleDistanceMaxDistanceAndDarkness.w; \n';
1133
- if (isTerrain) {
1134
- // Scale depth bias based on view distance to reduce z-fighting in distant terrain
1135
- fsSource += ' shadowParameters.depthBias *= max(depth * 0.01, 1.0); \n';
1136
- } else if (!polygonOffsetSupported) {
1137
- // If polygon offset isn't supported push the depth back based on view, however this
1138
- // causes light leaking at further away views
1139
- fsSource += ' shadowParameters.depthBias *= mix(1.0, 100.0, depth * 0.0015); \n';
1140
- }
1141
- if (isPointLight) {
1142
- fsSource += ' vec3 directionEC = positionEC.xyz - shadowMap_lightPositionEC.xyz; \n' + ' float distance = length(directionEC); \n' + ' directionEC = normalize(directionEC); \n' + ' float radius = shadowMap_lightPositionEC.w; \n' + ' // Stop early if the fragment is beyond the point light radius \n' + ' if (distance > radius) \n' + ' { \n' + ' return; \n' + ' } \n' + ' vec3 directionWC = czm_inverseViewRotation * directionEC; \n' + ' shadowParameters.depth = distance / radius; \n' + ' shadowParameters.nDotL = clamp(dot(normalEC, -directionEC), 0.0, 1.0); \n' + ' shadowParameters.texCoords = directionWC; \n' + ' float visibility = czm_shadowVisibility(shadowMap_textureCube, shadowParameters); \n';
1143
- } else if (isSpotLight) {
1144
- fsSource += ' vec3 directionEC1 = positionEC.xyz - shadowMap_lightPositionEC.xyz; \n' + ' float distance = length(directionEC1); \n' + ' if (distance > shadowMap_normalOffsetScaleDistanceMaxDistanceAndDarkness.y) \n' + ' { \n' + ' return; \n' + ' } \n' + ' vec3 directionEC = normalize(positionEC.xyz - shadowMap_lightPositionEC.xyz); \n' + ' float nDotL = clamp(dot(normalEC, -directionEC), 0.0, 1.0); \n' + ' applyNormalOffset(positionEC, normalEC, nDotL); \n' + ' vec4 shadowPosition = shadowMap_matrix * positionEC; \n' + ' // Spot light uses a perspective projection, so perform the perspective divide \n' + ' shadowPosition /= shadowPosition.w; \n' + ' // Stop early if the fragment is not in the shadow bounds \n' + ' if (any(lessThan(shadowPosition.xyz, vec3(0.0))) || any(greaterThan(shadowPosition.xyz, vec3(1.0)))) \n' + ' { \n' + ' return; \n' + ' } \n' + ' shadowParameters.texCoords = shadowPosition.xy; \n' + ' shadowParameters.depth = shadowPosition.z; \n' + ' shadowParameters.nDotL = nDotL; \n' + ' float visibility = czm_shadowVisibility(shadowMap_texture, shadowParameters); \n';
1145
- } else if (hasCascades) {
1146
- fsSource += ' float maxDepth = shadowMap_cascadeSplits[1].w; \n' + ' // Stop early if the eye depth exceeds the last cascade \n' + ' if (depth > maxDepth) \n' + ' { \n' + ' return; \n' + ' } \n' + ' // Get the cascade based on the eye-space depth \n' + ' vec4 weights = czm_cascadeWeights(depth); \n' + ' // Apply normal offset \n' + ' float nDotL = clamp(dot(normalEC, shadowMap_lightDirectionEC), 0.0, 1.0); \n' + ' applyNormalOffset(positionEC, normalEC, nDotL); \n' + ' // Transform position into the cascade \n' + ' vec4 shadowPosition = czm_cascadeMatrix(weights) * positionEC; \n' + ' // Get visibility \n' + ' shadowParameters.texCoords = shadowPosition.xy; \n' + ' shadowParameters.depth = shadowPosition.z; \n' + ' shadowParameters.nDotL = nDotL; \n' + ' float visibility = czm_shadowVisibility(shadowMap_texture, shadowParameters); \n' + ' // Fade out shadows that are far away \n' + ' float shadowMapMaximumDistance = shadowMap_normalOffsetScaleDistanceMaxDistanceAndDarkness.z; \n' + ' float fade = max((depth - shadowMapMaximumDistance * 0.8) / (shadowMapMaximumDistance * 0.2), 0.0); \n' + ' visibility = mix(visibility, 1.0, fade); \n' + (debugCascadeColors ? ' // Draw cascade colors for debugging \n' + ' out_FragColor *= czm_cascadeColor(weights); \n' : '');
1147
- } else {
1148
- fsSource += ' float nDotL = clamp(dot(normalEC, shadowMap_lightDirectionEC), 0.0, 1.0); \n' + ' applyNormalOffset(positionEC, normalEC, nDotL); \n' + ' vec4 shadowPosition = shadowMap_matrix * positionEC; \n' + ' // Stop early if the fragment is not in the shadow bounds \n' + ' if (any(lessThan(shadowPosition.xyz, vec3(0.0))) || any(greaterThan(shadowPosition.xyz, vec3(1.0)))) \n' + ' { \n' + ' return; \n' + ' } \n' + ' shadowParameters.texCoords = shadowPosition.xy; \n' + ' shadowParameters.depth = shadowPosition.z; \n' + ' shadowParameters.nDotL = nDotL; \n' + ' float visibility = czm_shadowVisibility(shadowMap_texture, shadowParameters); \n';
1149
- }
1150
- fsSource += ' if(visibility==0.0) \n' + ' {\n' + ' out_FragColor.rgb *= vec3(0.8,0.0,0.0);\n' + ' }else{\n' + ' out_FragColor.rgb *= vec3(0.0,0.8,0.0) * visibility;\n' + ' } \n ' + '} \n ';
1151
- sources.push(fsSource);
1152
- return new Cesium.ShaderSource({
1153
- defines: defines,
1154
- sources: sources
1155
- });
1156
- }
1157
- Cesium.ShadowMap.createReceiveDerivedCommand = function (lightShadowMaps, command, shadowsDirty, context, result) {
1158
- if (!Cesium.defined(result)) {
1159
- result = {};
1160
- }
1161
- var lightShadowMapsEnabled = lightShadowMaps.length > 0;
1162
- var shaderProgram = command.shaderProgram;
1163
- var vertexShaderSource = shaderProgram.vertexShaderSource;
1164
- var fragmentShaderSource = shaderProgram.fragmentShaderSource;
1165
- var isTerrain = command.pass === Cesium.Pass.GLOBE;
1166
- var hasTerrainNormal = false;
1167
- if (isTerrain) {
1168
- hasTerrainNormal = command.owner.data.renderedMesh.encoding.hasVertexNormals;
1169
- }
1170
- if (command.receiveShadows && lightShadowMapsEnabled) {
1171
- // Only generate a receiveCommand if there is a shadow map originating from a light source.
1172
- var receiveShader;
1173
- var receiveUniformMap;
1174
- if (Cesium.defined(result.receiveCommand)) {
1175
- receiveShader = result.receiveCommand.shaderProgram;
1176
- receiveUniformMap = result.receiveCommand.uniformMap;
1177
- }
1178
- result.receiveCommand = Cesium.DrawCommand.shallowClone(command, result.receiveCommand);
1179
- result.castShadows = false;
1180
- result.receiveShadows = true;
1181
-
1182
- // If castShadows changed, recompile the receive shadows shader. The normal shading technique simulates
1183
- // self-shadowing so it should be turned off if castShadows is false.
1184
- var castShadowsDirty = result.receiveShaderCastShadows !== command.castShadows;
1185
- var shaderDirty = result.receiveShaderProgramId !== command.shaderProgram.id;
1186
- if (!Cesium.defined(receiveShader) || shaderDirty || shadowsDirty || castShadowsDirty) {
1187
- var keyword;
1188
- if (lightShadowMaps[0].isViewShed) {
1189
- keyword = getShadowReceiveShaderKeyword(lightShadowMaps[0], command.castShadows, isTerrain, hasTerrainNormal);
1190
- } else {
1191
- keyword = Cesium.ShadowMapShader.getShadowReceiveShaderKeyword(lightShadowMaps[0], command.castShadows, isTerrain, hasTerrainNormal);
1192
- }
1193
- receiveShader = context.shaderCache.getDerivedShaderProgram(shaderProgram, keyword);
1194
- if (!Cesium.defined(receiveShader)) {
1195
- var receiveVS = Cesium.ShadowMapShader.createShadowReceiveVertexShader(vertexShaderSource, isTerrain, hasTerrainNormal);
1196
- var receiveFS;
1197
- if (lightShadowMaps[0].isViewShed) {
1198
- receiveFS = createShadowReceiveFragmentShader(fragmentShaderSource, lightShadowMaps[0], command.castShadows, isTerrain, hasTerrainNormal);
1199
- } else {
1200
- receiveFS = Cesium.ShadowMapShader.createShadowReceiveFragmentShader(fragmentShaderSource, lightShadowMaps[0], command.castShadows, isTerrain, hasTerrainNormal);
1201
- }
1202
- receiveShader = context.shaderCache.createDerivedShaderProgram(shaderProgram, keyword, {
1203
- vertexShaderSource: receiveVS,
1204
- fragmentShaderSource: receiveFS,
1205
- attributeLocations: shaderProgram._attributeLocations
1206
- });
1207
- }
1208
- receiveUniformMap = combineUniforms(lightShadowMaps[0], command.uniformMap, isTerrain);
1209
- }
1210
- result.receiveCommand.shaderProgram = receiveShader;
1211
- result.receiveCommand.uniformMap = receiveUniformMap;
1212
- result.receiveShaderProgramId = command.shaderProgram.id;
1213
- result.receiveShaderCastShadows = command.castShadows;
1214
- }
1215
- return result;
1216
- };
1217
-
1218
- /**
1219
- * @private
1220
- */
1221
- ViewshedMap.prototype.isDestroyed = function () {
1222
- return false;
1223
- };
1224
-
1225
- /**
1226
- * @private
1227
- */
1228
- ViewshedMap.prototype.destroy = function () {
1229
- destroyFramebuffer(this);
1230
- this._debugLightFrustum = this._debugLightFrustum && this._debugLightFrustum.destroy();
1231
- this._debugCameraFrustum = this._debugCameraFrustum && this._debugCameraFrustum.destroy();
1232
- this._debugShadowViewCommand = this._debugShadowViewCommand && this._debugShadowViewCommand.shaderProgram && this._debugShadowViewCommand.shaderProgram.destroy();
1233
- for (var _i5 = 0; _i5 < this._numberOfCascades; ++_i5) {
1234
- this._debugCascadeFrustums[_i5] = this._debugCascadeFrustums[_i5] && this._debugCascadeFrustums[_i5].destroy();
1235
- }
1236
- return Cesium.destroyObject(this);
1237
- };
1238
- export default ViewshedMap;
1
+ var _0x44f789=_0x1cb5;(function(_0x1c85f1,_0x4bdc76){var _0x2e5a7d=_0x1cb5,_0x26b3a2=_0x1c85f1();while(!![]){try{var _0x42f2a3=-parseInt(_0x2e5a7d(0x19e))/0x1*(-parseInt(_0x2e5a7d(0x148))/0x2)+-parseInt(_0x2e5a7d(0x189))/0x3*(-parseInt(_0x2e5a7d(0x1da))/0x4)+parseInt(_0x2e5a7d(0x122))/0x5*(-parseInt(_0x2e5a7d(0x193))/0x6)+-parseInt(_0x2e5a7d(0x170))/0x7+-parseInt(_0x2e5a7d(0x145))/0x8*(parseInt(_0x2e5a7d(0x1a3))/0x9)+-parseInt(_0x2e5a7d(0x1c1))/0xa*(parseInt(_0x2e5a7d(0x211))/0xb)+-parseInt(_0x2e5a7d(0x1a8))/0xc*(-parseInt(_0x2e5a7d(0x18f))/0xd);if(_0x42f2a3===_0x4bdc76)break;else _0x26b3a2['push'](_0x26b3a2['shift']());}catch(_0x102e82){_0x26b3a2['push'](_0x26b3a2['shift']());}}}(_0x5996,0x87185));import*as _0x1f9119 from'deeptwins-cesium';function ViewshedMap(_0x407343){var _0x8d901f=_0x1cb5,_0x56bcea,_0x46b4c2,_0x1c342d,_0xaf270,_0x270202,_0x3b703e,_0x56d39e,_0x1c8324,_0x974057,_0x144e01,_0x4706e5;_0x407343=(_0x56bcea=_0x407343)!==null&&_0x56bcea!==void 0x0?_0x56bcea:_0x1f9119['defaultValue']['EMPTY_OBJECT'];var _0x27e0bd=_0x407343['context'];if(!_0x1f9119[_0x8d901f(0x21d)](_0x27e0bd))throw new _0x1f9119['DeveloperError'](_0x8d901f(0x17b));if(!_0x1f9119[_0x8d901f(0x21d)](_0x407343[_0x8d901f(0x16e)]))throw new _0x1f9119[(_0x8d901f(0x13a))](_0x8d901f(0x127));if(_0x1f9119[_0x8d901f(0x21d)](_0x407343['numberOfCascades'])&&_0x407343['numberOfCascades']!==0x1&&_0x407343['numberOfCascades']!==0x4)throw new _0x1f9119['DeveloperError'](_0x8d901f(0x125));this['_enabled']=(_0x46b4c2=_0x407343[_0x8d901f(0x23a)])!==null&&_0x46b4c2!==void 0x0?_0x46b4c2:!![],this[_0x8d901f(0x238)]=(_0x1c342d=_0x407343['softShadows'])!==null&&_0x1c342d!==void 0x0?_0x1c342d:![],this['_normalOffset']=(_0xaf270=_0x407343['normalOffset'])!==null&&_0xaf270!==void 0x0?_0xaf270:!![],this['dirty']=!![],this[_0x8d901f(0x1c5)]=(_0x270202=_0x407343[_0x8d901f(0x1c5)])!==null&&_0x270202!==void 0x0?_0x270202:!![],this[_0x8d901f(0x1d7)]=0x0,this['_darkness']=this[_0x8d901f(0x1d7)],this['maximumDistance']=(_0x3b703e=_0x407343[_0x8d901f(0x1fe)])!==null&&_0x3b703e!==void 0x0?_0x3b703e:0x1388,this['_outOfView']=![],this[_0x8d901f(0x12c)]=![],this['_needsUpdate']=!![];var _0x126e6b=!![];(_0x1f9119[_0x8d901f(0x202)]['isInternetExplorer']()||_0x1f9119[_0x8d901f(0x202)][_0x8d901f(0x208)]()||(_0x1f9119[_0x8d901f(0x202)][_0x8d901f(0x203)]()||_0x1f9119['FeatureDetection']['isFirefox']())&&_0x1f9119[_0x8d901f(0x202)]['isWindows']()&&!_0x27e0bd[_0x8d901f(0x157)])&&(_0x126e6b=![]);this['_polygonOffsetSupported']=_0x126e6b,this['_terrainBias']={'polygonOffset':_0x126e6b,'polygonOffsetFactor':1.1,'polygonOffsetUnits':0x4,'normalOffset':this['_normalOffset'],'normalOffsetScale':0.5,'normalShading':!![],'normalShadingSmooth':0.3,'depthBias':0.0001},this['_primitiveBias']={'polygonOffset':_0x126e6b,'polygonOffsetFactor':1.1,'polygonOffsetUnits':0x4,'normalOffset':this['_normalOffset'],'normalOffsetScale':0.1,'normalShading':!![],'normalShadingSmooth':0.05,'depthBias':0.00002},this[_0x8d901f(0x1c3)]={'polygonOffset':![],'polygonOffsetFactor':1.1,'polygonOffsetUnits':0x4,'normalOffset':this['_normalOffset'],'normalOffsetScale':0x0,'normalShading':!![],'normalShadingSmooth':0.1,'depthBias':0.0005},this[_0x8d901f(0x1d2)]=undefined,this['_colorAttachment']=undefined,this[_0x8d901f(0x17f)]=new _0x1f9119['Matrix4'](),this['_shadowMapTexture']=undefined,this[_0x8d901f(0x1fc)]=new _0x1f9119[(_0x8d901f(0x179))](),this[_0x8d901f(0x163)]=new _0x1f9119['Cartesian4'](),this[_0x8d901f(0x1b6)]=0x0,this['_lightCamera']=_0x407343[_0x8d901f(0x16e)],this[_0x8d901f(0x1cf)]=new ShadowMapCamera(),this['_shadowMapCullingVolume']=undefined,this['_sceneCamera']=undefined,this[_0x8d901f(0x209)]=(_0x56d39e=_0x407343['boundingSphere'])!==null&&_0x56d39e!==void 0x0?_0x56d39e:new _0x1f9119['BoundingSphere'](),this['_isPointLight']=(_0x1c8324=_0x407343['isPointLight'])!==null&&_0x1c8324!==void 0x0?_0x1c8324:![],this['_pointLightRadius']=(_0x974057=_0x407343['pointLightRadius'])!==null&&_0x974057!==void 0x0?_0x974057:0x64,this['_cascadesEnabled']=![],this[_0x8d901f(0x131)]=!this['_cascadesEnabled']?0x0:(_0x144e01=_0x407343['numberOfCascades'])!==null&&_0x144e01!==void 0x0?_0x144e01:0x4,this['_fitNearFar']=!![],this[_0x8d901f(0x1f8)]=[0x19,0x96,0x2bc,Number['MAX_VALUE']],this[_0x8d901f(0x1ff)]=new _0x1f9119['Cartesian2'](),this['_isSpotLight']=![];if(this['_cascadesEnabled'])this[_0x8d901f(0x1cf)][_0x8d901f(0x156)]=new _0x1f9119[(_0x8d901f(0x237))]();else _0x1f9119['defined'](this['_lightCamera']['frustum']['fov'])&&(this['_isSpotLight']=!![]);this['_cascadeSplits']=[new _0x1f9119[(_0x8d901f(0x231))](),new _0x1f9119[(_0x8d901f(0x231))]()],this['_cascadeMatrices']=[new _0x1f9119[(_0x8d901f(0x188))](),new _0x1f9119['Matrix4'](),new _0x1f9119[(_0x8d901f(0x188))](),new _0x1f9119['Matrix4']()],this['_cascadeDistances']=new _0x1f9119[(_0x8d901f(0x231))]();var _0x142ca4;if(this['_isPointLight'])_0x142ca4=0x6;else!this[_0x8d901f(0x18a)]?_0x142ca4=0x1:_0x142ca4=this['_numberOfCascades'];this['_passes']=new Array(_0x142ca4);for(var _0x54051b=0x0;_0x54051b<_0x142ca4;++_0x54051b){this['_passes'][_0x54051b]=new ShadowPass(_0x27e0bd);}this['debugShow']=![],this[_0x8d901f(0x13b)]=![],this[_0x8d901f(0x228)]=![],this['_debugCascadeColors']=![],this['_debugLightFrustum']=undefined,this[_0x8d901f(0x219)]=undefined,this['_debugCascadeFrustums']=new Array(this['_numberOfCascades']),this[_0x8d901f(0x1ba)]=undefined,this[_0x8d901f(0x15f)]=_0x27e0bd[_0x8d901f(0x157)],this[_0x8d901f(0x147)]&&(this['_usesDepthTexture']=![]),this['_primitiveRenderState']=undefined,this[_0x8d901f(0x1ae)]=undefined,this['_pointRenderState']=undefined,createRenderStates(this),this[_0x8d901f(0x15d)]=new _0x1f9119['ClearCommand']({'depth':0x1,'color':new _0x1f9119['Color']()}),this['_clearPassState']=new _0x1f9119[(_0x8d901f(0x184))](_0x27e0bd),this['_size']=(_0x4706e5=_0x407343[_0x8d901f(0x21a)])!==null&&_0x4706e5!==void 0x0?_0x4706e5:0x800,this[_0x8d901f(0x21a)]=this[_0x8d901f(0x149)];}ViewshedMap['MAXIMUM_DISTANCE']=0x4e20;function ShadowPass(_0x53950a){var _0x4308c7=_0x1cb5;this[_0x4308c7(0x12e)]=new ShadowMapCamera(),this['passState']=new _0x1f9119['PassState'](_0x53950a),this[_0x4308c7(0x216)]=undefined,this[_0x4308c7(0x1ad)]=undefined,this[_0x4308c7(0x1cc)]=[],this[_0x4308c7(0x223)]=undefined;}function createRenderState(_0x3ffa5d,_0x104bba){var _0x3f5454=_0x1cb5;return _0x1f9119['RenderState']['fromCache']({'cull':{'enabled':!![],'face':_0x1f9119['CullFace']['BACK']},'depthTest':{'enabled':!![]},'colorMask':{'red':_0x3ffa5d,'green':_0x3ffa5d,'blue':_0x3ffa5d,'alpha':_0x3ffa5d},'depthMask':!![],'polygonOffset':{'enabled':_0x104bba[_0x3f5454(0x234)],'factor':_0x104bba[_0x3f5454(0x1a0)],'units':_0x104bba[_0x3f5454(0x205)]}});}function createRenderStates(_0x10460a){var _0x31c239=_0x1cb5,_0x390e21=!_0x10460a[_0x31c239(0x15f)];_0x10460a['_primitiveRenderState']=createRenderState(_0x390e21,_0x10460a[_0x31c239(0x1d6)]),_0x10460a[_0x31c239(0x1ae)]=createRenderState(_0x390e21,_0x10460a['_terrainBias']),_0x10460a['_pointRenderState']=createRenderState(_0x390e21,_0x10460a[_0x31c239(0x1c3)]);}ViewshedMap['prototype']['debugCreateRenderStates']=function(){createRenderStates(this);},Object[_0x44f789(0x138)](ViewshedMap['prototype'],{'enabled':{'get':function get(){return this['_enabled'];},'set':function set(_0x281346){var _0x3d34e8=_0x44f789;this[_0x3d34e8(0x1c8)]=this[_0x3d34e8(0x13f)]!==_0x281346,this[_0x3d34e8(0x13f)]=_0x281346;}},'isViewShed':{'get':function get(){return!![];}},'normalOffset':{'get':function get(){var _0x578ae8=_0x44f789;return this[_0x578ae8(0x221)];},'set':function set(_0x4731db){var _0x319148=_0x44f789;this['dirty']=this[_0x319148(0x221)]!==_0x4731db,this[_0x319148(0x221)]=_0x4731db,this['_terrainBias'][_0x319148(0x233)]=_0x4731db,this['_primitiveBias'][_0x319148(0x233)]=_0x4731db,this['_pointBias'][_0x319148(0x233)]=_0x4731db;}},'softShadows':{'get':function get(){var _0x4a1023=_0x44f789;return this[_0x4a1023(0x238)];},'set':function set(_0x115fbf){var _0x2df3fb=_0x44f789;this[_0x2df3fb(0x1c8)]=this[_0x2df3fb(0x238)]!==_0x115fbf,this['_softShadows']=_0x115fbf;}},'size':{'get':function get(){var _0x36d3a0=_0x44f789;return this[_0x36d3a0(0x149)];},'set':function set(_0x3bd5b0){resize(this,_0x3bd5b0);}},'outOfView':{'get':function get(){return this['_outOfView'];}},'shadowMapCullingVolume':{'get':function get(){return this['_shadowMapCullingVolume'];}},'passes':{'get':function get(){return this['_passes'];}},'isPointLight':{'get':function get(){return this['_isPointLight'];}},'debugCascadeColors':{'get':function get(){return this['_debugCascadeColors'];},'set':function set(_0x1c0645){var _0x1b0aaa=_0x44f789;this[_0x1b0aaa(0x1c8)]=this['_debugCascadeColors']!==_0x1c0645,this[_0x1b0aaa(0x1bf)]=_0x1c0645;}}});function destroyFramebuffer(_0x48bcf1){var _0x378057=_0x44f789,_0xe16cd4=_0x48bcf1['_passes'][_0x378057(0x139)];for(var _0x333b2d=0x0;_0x333b2d<_0xe16cd4;++_0x333b2d){var _0x246b48=_0x48bcf1[_0x378057(0x1d0)][_0x333b2d],_0x348e83=_0x246b48[_0x378057(0x216)];_0x1f9119[_0x378057(0x21d)](_0x348e83)&&!_0x348e83[_0x378057(0x167)]()&&_0x348e83[_0x378057(0x134)](),_0x246b48[_0x378057(0x216)]=undefined;}_0x48bcf1['_depthAttachment']=_0x48bcf1['_depthAttachment']&&_0x48bcf1[_0x378057(0x1d2)][_0x378057(0x134)](),_0x48bcf1['_colorAttachment']=_0x48bcf1['_colorAttachment']&&_0x48bcf1[_0x378057(0x176)][_0x378057(0x134)]();}function createSampler(){var _0x2b9245=_0x44f789;return new _0x1f9119['Sampler']({'wrapS':_0x1f9119['TextureWrap']['CLAMP_TO_EDGE'],'wrapT':_0x1f9119[_0x2b9245(0x1a4)][_0x2b9245(0x1f6)],'minificationFilter':_0x1f9119['TextureMinificationFilter']['NEAREST'],'magnificationFilter':_0x1f9119[_0x2b9245(0x19a)][_0x2b9245(0x18b)]});}function createFramebufferColor(_0x3c8950,_0x50d101){var _0x2fc750=_0x44f789,_0x55bc97=new _0x1f9119['Renderbuffer']({'context':_0x50d101,'width':_0x3c8950['_textureSize']['x'],'height':_0x3c8950['_textureSize']['y'],'format':_0x1f9119[_0x2fc750(0x1b9)]['DEPTH_COMPONENT16']}),_0x2acd96=new _0x1f9119['Texture']({'context':_0x50d101,'width':_0x3c8950['_textureSize']['x'],'height':_0x3c8950[_0x2fc750(0x1ff)]['y'],'pixelFormat':_0x1f9119['PixelFormat']['RGBA'],'pixelDatatype':_0x1f9119[_0x2fc750(0x1aa)][_0x2fc750(0x218)],'sampler':createSampler()}),_0x2b3eef=new _0x1f9119[(_0x2fc750(0x194))]({'context':_0x50d101,'depthRenderbuffer':_0x55bc97,'colorTextures':[_0x2acd96],'destroyAttachments':![]}),_0x1201d1=_0x3c8950['_passes'][_0x2fc750(0x139)];for(var _0xca2033=0x0;_0xca2033<_0x1201d1;++_0xca2033){var _0x461580=_0x3c8950['_passes'][_0xca2033];_0x461580[_0x2fc750(0x216)]=_0x2b3eef,_0x461580['passState']['framebuffer']=_0x2b3eef;}_0x3c8950['_shadowMapTexture']=_0x2acd96,_0x3c8950[_0x2fc750(0x1d2)]=_0x55bc97,_0x3c8950['_colorAttachment']=_0x2acd96;}function createFramebufferDepth(_0xf05018,_0x57d61b){var _0x40b5e6=_0x44f789,_0x4d23c4=new _0x1f9119['Texture']({'context':_0x57d61b,'width':_0xf05018['_textureSize']['x'],'height':_0xf05018['_textureSize']['y'],'pixelFormat':_0x1f9119['PixelFormat']['DEPTH_STENCIL'],'pixelDatatype':_0x1f9119['PixelDatatype'][_0x40b5e6(0x14f)],'sampler':createSampler()}),_0x2532cc=new _0x1f9119[(_0x40b5e6(0x194))]({'context':_0x57d61b,'depthStencilTexture':_0x4d23c4,'destroyAttachments':![]}),_0x10900f=_0xf05018['_passes']['length'];for(var _0x573727=0x0;_0x573727<_0x10900f;++_0x573727){var _0x5a1fe4=_0xf05018[_0x40b5e6(0x1d0)][_0x573727];_0x5a1fe4['framebuffer']=_0x2532cc,_0x5a1fe4[_0x40b5e6(0x168)][_0x40b5e6(0x216)]=_0x2532cc;}_0xf05018['_shadowMapTexture']=_0x4d23c4,_0xf05018[_0x40b5e6(0x1d2)]=_0x4d23c4;}function createFramebufferCube(_0x1845c6,_0x1cef14){var _0x4c9a09=_0x44f789,_0x223c55=new _0x1f9119['Renderbuffer']({'context':_0x1cef14,'width':_0x1845c6[_0x4c9a09(0x1ff)]['x'],'height':_0x1845c6[_0x4c9a09(0x1ff)]['y'],'format':_0x1f9119['RenderbufferFormat']['DEPTH_COMPONENT16']}),_0x48da21=new _0x1f9119[(_0x4c9a09(0x1e0))]({'context':_0x1cef14,'width':_0x1845c6[_0x4c9a09(0x1ff)]['x'],'height':_0x1845c6['_textureSize']['y'],'pixelFormat':_0x1f9119[_0x4c9a09(0x1ce)]['RGBA'],'pixelDatatype':_0x1f9119['PixelDatatype']['UNSIGNED_BYTE'],'sampler':createSampler()}),_0x57479a=[_0x48da21['negativeX'],_0x48da21['negativeY'],_0x48da21[_0x4c9a09(0x1d4)],_0x48da21['positiveX'],_0x48da21['positiveY'],_0x48da21[_0x4c9a09(0x15c)]];for(var _0x3cb99a=0x0;_0x3cb99a<0x6;++_0x3cb99a){var _0x54f13c=new _0x1f9119['Framebuffer']({'context':_0x1cef14,'depthRenderbuffer':_0x223c55,'colorTextures':[_0x57479a[_0x3cb99a]],'destroyAttachments':![]}),_0x2d63b4=_0x1845c6['_passes'][_0x3cb99a];_0x2d63b4['framebuffer']=_0x54f13c,_0x2d63b4[_0x4c9a09(0x168)][_0x4c9a09(0x216)]=_0x54f13c;}_0x1845c6[_0x4c9a09(0x21c)]=_0x48da21,_0x1845c6['_depthAttachment']=_0x223c55,_0x1845c6[_0x4c9a09(0x176)]=_0x48da21;}function createFramebuffer(_0xd6282e,_0x1a9168){var _0x17e4fc=_0x44f789;if(_0xd6282e[_0x17e4fc(0x147)])createFramebufferCube(_0xd6282e,_0x1a9168);else _0xd6282e[_0x17e4fc(0x15f)]?createFramebufferDepth(_0xd6282e,_0x1a9168):createFramebufferColor(_0xd6282e,_0x1a9168);}function checkFramebuffer(_0x3257df,_0x2dee1d){var _0x5a55bd=_0x44f789;_0x3257df['_usesDepthTexture']&&_0x3257df['_passes'][0x0]['framebuffer']['status']!==_0x1f9119[_0x5a55bd(0x1e9)]['FRAMEBUFFER_COMPLETE']&&(_0x3257df['_usesDepthTexture']=![],createRenderStates(_0x3257df),destroyFramebuffer(_0x3257df),createFramebuffer(_0x3257df,_0x2dee1d));}function updateFramebuffer(_0x11075c,_0x2971e5){var _0x5103dc=_0x44f789;(!_0x1f9119[_0x5103dc(0x21d)](_0x11075c[_0x5103dc(0x1d0)][0x0]['framebuffer'])||_0x11075c['_shadowMapTexture']['width']!==_0x11075c[_0x5103dc(0x1ff)]['x'])&&(destroyFramebuffer(_0x11075c),createFramebuffer(_0x11075c,_0x2971e5),checkFramebuffer(_0x11075c,_0x2971e5),clearFramebuffer(_0x11075c,_0x2971e5));}function clearFramebuffer(_0x1e4a73,_0xb42d8c,_0x4cb600){var _0x35824d=_0x44f789,_0x30970e;_0x4cb600=(_0x30970e=_0x4cb600)!==null&&_0x30970e!==void 0x0?_0x30970e:0x0,(_0x1e4a73['_isPointLight']||_0x4cb600===0x0)&&(_0x1e4a73[_0x35824d(0x15d)][_0x35824d(0x216)]=_0x1e4a73['_passes'][_0x4cb600]['framebuffer'],_0x1e4a73[_0x35824d(0x15d)]['execute'](_0xb42d8c,_0x1e4a73['_clearPassState']));}function resize(_0x2c7afd,_0x281dcb){var _0x1a86f5=_0x44f789;_0x2c7afd['_size']=_0x281dcb;var _0x487f68=_0x2c7afd[_0x1a86f5(0x1d0)],_0x361a6b=_0x487f68['length'],_0x5c7542=_0x2c7afd[_0x1a86f5(0x1ff)];if(_0x2c7afd['_isPointLight']){_0x281dcb=_0x1f9119[_0x1a86f5(0x17d)][_0x1a86f5(0x1bc)]>=_0x281dcb?_0x281dcb:_0x1f9119['ContextLimits']['maximumCubeMapSize'],_0x5c7542['x']=_0x281dcb,_0x5c7542['y']=_0x281dcb;var _0x32ffd7=new _0x1f9119[(_0x1a86f5(0x239))](0x0,0x0,_0x281dcb,_0x281dcb);_0x487f68[0x0][_0x1a86f5(0x168)][_0x1a86f5(0x181)]=_0x32ffd7,_0x487f68[0x1][_0x1a86f5(0x168)]['viewport']=_0x32ffd7,_0x487f68[0x2]['passState']['viewport']=_0x32ffd7,_0x487f68[0x3][_0x1a86f5(0x168)][_0x1a86f5(0x181)]=_0x32ffd7,_0x487f68[0x4][_0x1a86f5(0x168)][_0x1a86f5(0x181)]=_0x32ffd7,_0x487f68[0x5]['passState'][_0x1a86f5(0x181)]=_0x32ffd7;}else{if(_0x361a6b===0x1)_0x281dcb=_0x1f9119['ContextLimits'][_0x1a86f5(0x236)]>=_0x281dcb?_0x281dcb:_0x1f9119['ContextLimits']['maximumTextureSize'],_0x5c7542['x']=_0x281dcb,_0x5c7542['y']=_0x281dcb,_0x487f68[0x0]['passState'][_0x1a86f5(0x181)]=new _0x1f9119['BoundingRectangle'](0x0,0x0,_0x281dcb,_0x281dcb);else _0x361a6b===0x4&&(_0x281dcb=_0x1f9119[_0x1a86f5(0x17d)]['maximumTextureSize']>=_0x281dcb*0x2?_0x281dcb:_0x1f9119[_0x1a86f5(0x17d)][_0x1a86f5(0x236)]/0x2,_0x5c7542['x']=_0x281dcb*0x2,_0x5c7542['y']=_0x281dcb*0x2,_0x487f68[0x0]['passState'][_0x1a86f5(0x181)]=new _0x1f9119['BoundingRectangle'](0x0,0x0,_0x281dcb,_0x281dcb),_0x487f68[0x1]['passState']['viewport']=new _0x1f9119[(_0x1a86f5(0x239))](_0x281dcb,0x0,_0x281dcb,_0x281dcb),_0x487f68[0x2]['passState'][_0x1a86f5(0x181)]=new _0x1f9119[(_0x1a86f5(0x239))](0x0,_0x281dcb,_0x281dcb,_0x281dcb),_0x487f68[0x3][_0x1a86f5(0x168)]['viewport']=new _0x1f9119['BoundingRectangle'](_0x281dcb,_0x281dcb,_0x281dcb,_0x281dcb));}_0x2c7afd['_clearPassState'][_0x1a86f5(0x181)]=new _0x1f9119[(_0x1a86f5(0x239))](0x0,0x0,_0x5c7542['x'],_0x5c7542['y']);for(var _0x41c7e9=0x0;_0x41c7e9<_0x361a6b;++_0x41c7e9){var _0x2d001d=_0x487f68[_0x41c7e9],_0x2da556=_0x2d001d['passState']['viewport'],_0x24da84=_0x2da556['x']/_0x5c7542['x'],_0x2a9310=_0x2da556['y']/_0x5c7542['y'],_0x5e6ea7=_0x2da556['width']/_0x5c7542['x'],_0x17daae=_0x2da556[_0x1a86f5(0x224)]/_0x5c7542['y'];_0x2d001d['textureOffsets']=new _0x1f9119[(_0x1a86f5(0x188))](_0x5e6ea7,0x0,0x0,_0x24da84,0x0,_0x17daae,0x0,_0x2a9310,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x1);}}var scratchViewport=new _0x1f9119['BoundingRectangle']();function createDebugShadowViewCommand(_0xcd15f4,_0xe5dd9d){var _0x2c4b69=_0x44f789,_0xf1e5df;_0xcd15f4['_isPointLight']?_0xf1e5df='uniform\x20samplerCube\x20shadowMap_textureCube;\x20\x0a'+'in\x20vec2\x20v_textureCoordinates;\x20\x0a'+_0x2c4b69(0x1fa)+'{\x20\x0a'+_0x2c4b69(0x12d)+_0x2c4b69(0x1df)+'\x20\x0a'+_0x2c4b69(0x1c0)+_0x2c4b69(0x22c)+'\x20\x20\x20\x20\x20\x20\x20\x20if\x20(uv.x\x20<\x200.333)\x20\x0a'+_0x2c4b69(0x1e4)+_0x2c4b69(0x1d5)+'\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20dir.y\x20=\x20uv.x\x20*\x206.0\x20-\x201.0;\x20\x0a'+'\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20dir.z\x20=\x20uv.y\x20*\x204.0\x20-\x201.0;\x20\x0a'+_0x2c4b69(0x1f9)+'\x20\x20\x20\x20\x20\x20\x20\x20else\x20if\x20(uv.x\x20<\x200.666)\x20\x0a'+'\x20\x20\x20\x20\x20\x20\x20\x20{\x20\x0a'+_0x2c4b69(0x133)+'\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20dir.x\x20=\x20uv.x\x20*\x206.0\x20-\x203.0;\x20\x0a'+_0x2c4b69(0x182)+_0x2c4b69(0x1f9)+_0x2c4b69(0x180)+_0x2c4b69(0x1e4)+'\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20dir.z\x20=\x20-1.0;\x20\x0a'+_0x2c4b69(0x186)+'\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20dir.y\x20=\x20uv.y\x20*\x204.0\x20-\x201.0;\x20\x0a'+_0x2c4b69(0x1f9)+'\x20\x20\x20\x20}\x20\x0a'+_0x2c4b69(0x178)+_0x2c4b69(0x22c)+'\x20\x20\x20\x20\x20\x20\x20\x20if\x20(uv.x\x20<\x200.333)\x20\x0a'+_0x2c4b69(0x1e4)+_0x2c4b69(0x220)+_0x2c4b69(0x22e)+_0x2c4b69(0x21f)+_0x2c4b69(0x1f9)+_0x2c4b69(0x1cb)+_0x2c4b69(0x1e4)+_0x2c4b69(0x201)+_0x2c4b69(0x222)+'\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20dir.z\x20=\x20uv.y\x20*\x204.0\x20-\x203.0;\x20\x0a'+_0x2c4b69(0x1f9)+_0x2c4b69(0x180)+'\x20\x20\x20\x20\x20\x20\x20\x20{\x20\x0a'+'\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20dir.z\x20=\x201.0;\x20\x0a'+_0x2c4b69(0x186)+_0x2c4b69(0x1db)+'\x20\x20\x20\x20\x20\x20\x20\x20}\x20\x0a'+_0x2c4b69(0x1f2)+'\x20\x0a'+_0x2c4b69(0x1d9)+'\x20\x20\x20\x20out_FragColor\x20=\x20vec4(vec3(shadow),\x201.0);\x20\x0a'+_0x2c4b69(0x18d):_0xf1e5df=_0x2c4b69(0x198)+_0x2c4b69(0x22a)+'void\x20main()\x20\x0a'+_0x2c4b69(0x1e2)+(_0xcd15f4[_0x2c4b69(0x15f)]?'\x20\x20\x20\x20float\x20shadow\x20=\x20texture2D(shadowMap_texture,\x20v_textureCoordinates).r;\x20\x0a':'\x20\x20\x20\x20float\x20shadow\x20=\x20czm_unpackDepth(texture2D(shadowMap_texture,\x20v_textureCoordinates));\x20\x0a')+_0x2c4b69(0x225)+'}\x20\x0a';var _0x429ec6=_0xe5dd9d['createViewportQuadCommand'](_0xf1e5df,{'uniformMap':{'shadowMap_texture':function _0x422147(){return _0xcd15f4['_shadowMapTexture'];},'shadowMap_textureCube':function _0x489fe5(){return _0xcd15f4['_shadowMapTexture'];}}});return _0x429ec6[_0x2c4b69(0x21b)]=_0x1f9119['Pass']['OVERLAY'],_0x429ec6;}function updateDebugShadowViewCommand(_0x57ba4f,_0x537810){var _0x304827=_0x44f789,_0x4317b7=_0x537810['context'],_0x1b95cf=_0x537810['context']['drawingBufferWidth'],_0x2070f7=_0x537810[_0x304827(0x23b)]['drawingBufferHeight'],_0x2686b7=Math['min'](_0x1b95cf,_0x2070f7)*0.3,_0x783a6a=scratchViewport;_0x783a6a['x']=_0x1b95cf-_0x2686b7,_0x783a6a['y']=0x0,_0x783a6a['width']=_0x2686b7,_0x783a6a['height']=_0x2686b7;var _0x68f6a0=_0x57ba4f['_debugShadowViewCommand'];!_0x1f9119[_0x304827(0x21d)](_0x68f6a0)&&(_0x68f6a0=createDebugShadowViewCommand(_0x57ba4f,_0x4317b7),_0x57ba4f[_0x304827(0x1ba)]=_0x68f6a0),(!_0x1f9119[_0x304827(0x21d)](_0x68f6a0['renderState'])||!_0x1f9119[_0x304827(0x239)]['equals'](_0x68f6a0['renderState'][_0x304827(0x181)],_0x783a6a))&&(_0x68f6a0['renderState']=_0x1f9119[_0x304827(0x126)]['fromCache']({'viewport':_0x1f9119[_0x304827(0x239)]['clone'](_0x783a6a)})),_0x537810[_0x304827(0x1cc)]['push'](_0x57ba4f['_debugShadowViewCommand']);}var frustumCornersNDC=new Array(0x8);frustumCornersNDC[0x0]=new _0x1f9119[(_0x44f789(0x231))](-0x1,-0x1,-0x1,0x1),frustumCornersNDC[0x1]=new _0x1f9119[(_0x44f789(0x231))](0x1,-0x1,-0x1,0x1),frustumCornersNDC[0x2]=new _0x1f9119[(_0x44f789(0x231))](0x1,0x1,-0x1,0x1),frustumCornersNDC[0x3]=new _0x1f9119['Cartesian4'](-0x1,0x1,-0x1,0x1),frustumCornersNDC[0x4]=new _0x1f9119['Cartesian4'](-0x1,-0x1,0x1,0x1),frustumCornersNDC[0x5]=new _0x1f9119[(_0x44f789(0x231))](0x1,-0x1,0x1,0x1),frustumCornersNDC[0x6]=new _0x1f9119[(_0x44f789(0x231))](0x1,0x1,0x1,0x1),frustumCornersNDC[0x7]=new _0x1f9119['Cartesian4'](-0x1,0x1,0x1,0x1);var scratchMatrix=new _0x1f9119['Matrix4'](),scratchFrustumCorners=new Array(0x8);for(var i=0x0;i<0x8;++i){scratchFrustumCorners[i]=new _0x1f9119[(_0x44f789(0x231))]();}function createDebugPointLight(_0x3fb24b,_0x4aa873){var _0x32fc52=_0x44f789,_0x303629=new _0x1f9119['GeometryInstance']({'geometry':new _0x1f9119['BoxOutlineGeometry']({'minimum':new _0x1f9119['Cartesian3'](-0.5,-0.5,-0.5),'maximum':new _0x1f9119['Cartesian3'](0.5,0.5,0.5)}),'attributes':{'color':_0x1f9119[_0x32fc52(0x11d)]['fromColor'](_0x4aa873)}}),_0x2cda6f=new _0x1f9119['GeometryInstance']({'geometry':new _0x1f9119[(_0x32fc52(0x16a))]({'radius':0.5}),'attributes':{'color':_0x1f9119['ColorGeometryInstanceAttribute']['fromColor'](_0x4aa873)}});return new _0x1f9119[(_0x32fc52(0x152))]({'geometryInstances':[_0x303629,_0x2cda6f],'appearance':new _0x1f9119['PerInstanceColorAppearance']({'translucent':![],'flat':!![]}),'asynchronous':![],'modelMatrix':_0x3fb24b});}var debugOutlineColors=[_0x1f9119[_0x44f789(0x17a)]['RED'],_0x1f9119['Color']['GREEN'],_0x1f9119[_0x44f789(0x17a)]['BLUE'],_0x1f9119['Color']['MAGENTA']],scratchScale=new _0x1f9119['Cartesian3']();function applyDebugSettings(_0x2077be,_0x3a121e){var _0x5d3df7=_0x44f789;updateDebugShadowViewCommand(_0x2077be,_0x3a121e);var _0x25aa14=_0x2077be['debugFreezeFrame']&&!_0x2077be[_0x5d3df7(0x228)];_0x2077be[_0x5d3df7(0x228)]=_0x2077be['debugFreezeFrame'];_0x2077be[_0x5d3df7(0x13b)]&&(_0x25aa14&&(_0x2077be['_debugCameraFrustum']=_0x2077be['_debugCameraFrustum']&&_0x2077be['_debugCameraFrustum'][_0x5d3df7(0x134)](),_0x2077be['_debugCameraFrustum']=new _0x1f9119[(_0x5d3df7(0x14d))]({'camera':_0x2077be[_0x5d3df7(0x135)],'color':_0x1f9119['Color']['CYAN'],'updateOnChange':![]})),_0x2077be['_debugCameraFrustum'][_0x5d3df7(0x165)](_0x3a121e));if(_0x2077be[_0x5d3df7(0x18a)]){if(_0x2077be[_0x5d3df7(0x13b)]){_0x25aa14&&(_0x2077be[_0x5d3df7(0x173)]=_0x2077be[_0x5d3df7(0x173)]&&_0x2077be[_0x5d3df7(0x173)]['destroy'](),_0x2077be[_0x5d3df7(0x173)]=new _0x1f9119[(_0x5d3df7(0x14d))]({'camera':_0x2077be['_shadowMapCamera'],'color':_0x1f9119[_0x5d3df7(0x17a)][_0x5d3df7(0x1a7)],'updateOnChange':![]}));_0x2077be[_0x5d3df7(0x173)][_0x5d3df7(0x165)](_0x3a121e);for(var _0x337489=0x0;_0x337489<_0x2077be['_numberOfCascades'];++_0x337489){_0x25aa14&&(_0x2077be['_debugCascadeFrustums'][_0x337489]=_0x2077be['_debugCascadeFrustums'][_0x337489]&&_0x2077be[_0x5d3df7(0x235)][_0x337489]['destroy'](),_0x2077be['_debugCascadeFrustums'][_0x337489]=new _0x1f9119['DebugCameraPrimitive']({'camera':_0x2077be['_passes'][_0x337489]['camera'],'color':debugOutlineColors[_0x337489],'updateOnChange':![]})),_0x2077be[_0x5d3df7(0x235)][_0x337489]['update'](_0x3a121e);}}}else{if(_0x2077be['_isPointLight']){if(!_0x1f9119['defined'](_0x2077be['_debugLightFrustum'])||_0x2077be['_needsUpdate']){var _0x4277ad=_0x2077be['_shadowMapCamera'][_0x5d3df7(0x120)],_0x2b0216=_0x1f9119['Quaternion'][_0x5d3df7(0x14c)],_0x7f93aa=_0x2077be[_0x5d3df7(0x1be)]*0x2,_0x1d305d=_0x1f9119['Cartesian3'][_0x5d3df7(0x210)](_0x7f93aa,_0x7f93aa,_0x7f93aa,scratchScale),_0xe6c6d0=_0x1f9119['Matrix4']['fromTranslationQuaternionRotationScale'](_0x4277ad,_0x2b0216,_0x1d305d,scratchMatrix);_0x2077be['_debugLightFrustum']=_0x2077be[_0x5d3df7(0x173)]&&_0x2077be[_0x5d3df7(0x173)]['destroy'](),_0x2077be['_debugLightFrustum']=createDebugPointLight(_0xe6c6d0,_0x1f9119[_0x5d3df7(0x17a)][_0x5d3df7(0x1a7)]);}_0x2077be[_0x5d3df7(0x173)]['update'](_0x3a121e);}else(!_0x1f9119[_0x5d3df7(0x21d)](_0x2077be[_0x5d3df7(0x173)])||_0x2077be[_0x5d3df7(0x140)])&&(_0x2077be[_0x5d3df7(0x173)]=new _0x1f9119[(_0x5d3df7(0x14d))]({'camera':_0x2077be[_0x5d3df7(0x1cf)],'color':_0x1f9119[_0x5d3df7(0x17a)]['YELLOW'],'updateOnChange':![]})),_0x2077be[_0x5d3df7(0x173)][_0x5d3df7(0x165)](_0x3a121e);}}function _0x1cb5(_0x28ad63,_0x4ed96b){_0x28ad63=_0x28ad63-0x11b;var _0x59962a=_0x5996();var _0x1cb5bd=_0x59962a[_0x28ad63];if(_0x1cb5['hkUTte']===undefined){var _0xe3a5a9=function(_0x4fdbee){var _0x2e29f7='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';var _0x1f9119='',_0x407343='';for(var _0x56bcea=0x0,_0x46b4c2,_0x1c342d,_0xaf270=0x0;_0x1c342d=_0x4fdbee['charAt'](_0xaf270++);~_0x1c342d&&(_0x46b4c2=_0x56bcea%0x4?_0x46b4c2*0x40+_0x1c342d:_0x1c342d,_0x56bcea++%0x4)?_0x1f9119+=String['fromCharCode'](0xff&_0x46b4c2>>(-0x2*_0x56bcea&0x6)):0x0){_0x1c342d=_0x2e29f7['indexOf'](_0x1c342d);}for(var _0x270202=0x0,_0x3b703e=_0x1f9119['length'];_0x270202<_0x3b703e;_0x270202++){_0x407343+='%'+('00'+_0x1f9119['charCodeAt'](_0x270202)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x407343);};_0x1cb5['jOcQBf']=_0xe3a5a9,_0x1cb5['GtPpDQ']={},_0x1cb5['hkUTte']=!![];}var _0x468c0e=_0x59962a[0x0],_0x13019d=_0x28ad63+_0x468c0e,_0x3870d4=_0x1cb5['GtPpDQ'][_0x13019d];return!_0x3870d4?(_0x1cb5bd=_0x1cb5['jOcQBf'](_0x1cb5bd),_0x1cb5['GtPpDQ'][_0x13019d]=_0x1cb5bd):_0x1cb5bd=_0x3870d4,_0x1cb5bd;}function ShadowMapCamera(){var _0x37d820=_0x44f789;this[_0x37d820(0x1b0)]=new _0x1f9119[(_0x37d820(0x188))](),this['inverseViewMatrix']=new _0x1f9119[(_0x37d820(0x188))](),this['frustum']=undefined,this['positionCartographic']=new _0x1f9119['Cartographic'](),this[_0x37d820(0x120)]=new _0x1f9119[(_0x37d820(0x179))](),this[_0x37d820(0x1f1)]=_0x1f9119['Cartesian3'][_0x37d820(0x16b)](_0x1f9119['Cartesian3']['UNIT_Z']),this[_0x37d820(0x13e)]=_0x1f9119[_0x37d820(0x179)]['clone'](_0x1f9119[_0x37d820(0x179)]['UNIT_Y']),this['rightWC']=_0x1f9119['Cartesian3']['clone'](_0x1f9119['Cartesian3'][_0x37d820(0x20c)]),this['viewProjectionMatrix']=new _0x1f9119['Matrix4']();}ShadowMapCamera['prototype']['clone']=function(_0x128408){var _0x47b5d2=_0x44f789;_0x1f9119[_0x47b5d2(0x188)]['clone'](_0x128408['viewMatrix'],this['viewMatrix']),_0x1f9119['Matrix4']['clone'](_0x128408['inverseViewMatrix'],this['inverseViewMatrix']),this['frustum']=_0x128408['frustum'][_0x47b5d2(0x16b)](this['frustum']),_0x1f9119[_0x47b5d2(0x1b8)][_0x47b5d2(0x16b)](_0x128408['positionCartographic'],this[_0x47b5d2(0x217)]),_0x1f9119['Cartesian3'][_0x47b5d2(0x16b)](_0x128408[_0x47b5d2(0x120)],this['positionWC']),_0x1f9119['Cartesian3']['clone'](_0x128408['directionWC'],this[_0x47b5d2(0x1f1)]),_0x1f9119['Cartesian3'][_0x47b5d2(0x16b)](_0x128408[_0x47b5d2(0x13e)],this[_0x47b5d2(0x13e)]),_0x1f9119['Cartesian3'][_0x47b5d2(0x16b)](_0x128408[_0x47b5d2(0x143)],this['rightWC']);};var scaleBiasMatrix=new _0x1f9119['Matrix4'](0.5,0x0,0x0,0.5,0x0,0.5,0x0,0.5,0x0,0x0,0.5,0.5,0x0,0x0,0x0,0x1);ShadowMapCamera[_0x44f789(0x212)]['getViewProjection']=function(){var _0x284bfc=_0x44f789,_0x1417f6=this[_0x284bfc(0x1b0)],_0x159f94=this['frustum']['projectionMatrix'];return _0x1f9119['Matrix4'][_0x284bfc(0x183)](_0x159f94,_0x1417f6,this[_0x284bfc(0x1b3)]),_0x1f9119['Matrix4']['multiply'](scaleBiasMatrix,this[_0x284bfc(0x1b3)],this[_0x284bfc(0x1b3)]),this['viewProjectionMatrix'];};var scratchSplits=new Array(0x5),scratchFrustum=new _0x1f9119['PerspectiveFrustum'](),scratchCascadeDistances=new Array(0x4),scratchMin=new _0x1f9119['Cartesian3'](),scratchMax=new _0x1f9119['Cartesian3']();function computeCascades(_0x457bbe,_0x6f10b){var _0x2a65e8=_0x44f789,_0x55716b=_0x457bbe['_shadowMapCamera'],_0x3b551b=_0x457bbe['_sceneCamera'],_0x3e0853=_0x3b551b[_0x2a65e8(0x156)][_0x2a65e8(0x121)],_0x5b94ef=_0x3b551b[_0x2a65e8(0x156)][_0x2a65e8(0x19b)],_0x52d4fd=_0x457bbe['_numberOfCascades'],_0x39495e,_0x491c96=_0x5b94ef-_0x3e0853,_0x30f63a=_0x5b94ef/_0x3e0853,_0x2eed88=0.9,_0x29f6c4=![];_0x6f10b[_0x2a65e8(0x14a)][_0x2a65e8(0x226)]<0xc8&&(_0x29f6c4=!![],_0x2eed88=0.9);var _0x160c25=scratchCascadeDistances,_0x1f41d2=scratchSplits;_0x1f41d2[0x0]=_0x3e0853,_0x1f41d2[_0x52d4fd]=_0x5b94ef;for(_0x39495e=0x0;_0x39495e<_0x52d4fd;++_0x39495e){var _0x1bdb28=(_0x39495e+0x1)/_0x52d4fd,_0x7d4f02=_0x3e0853*Math[_0x2a65e8(0x123)](_0x30f63a,_0x1bdb28),_0x173e94=_0x3e0853+_0x491c96*_0x1bdb28,_0x349784=_0x1f9119['Math']['lerp'](_0x173e94,_0x7d4f02,_0x2eed88);_0x1f41d2[_0x39495e+0x1]=_0x349784,_0x160c25[_0x39495e]=_0x349784-_0x1f41d2[_0x39495e];}if(_0x29f6c4){for(_0x39495e=0x0;_0x39495e<_0x52d4fd;++_0x39495e){_0x160c25[_0x39495e]=Math[_0x2a65e8(0x1b2)](_0x160c25[_0x39495e],_0x457bbe[_0x2a65e8(0x1f8)][_0x39495e]);}var _0x1be447=_0x1f41d2[0x0];for(_0x39495e=0x0;_0x39495e<_0x52d4fd-0x1;++_0x39495e){_0x1be447+=_0x160c25[_0x39495e],_0x1f41d2[_0x39495e+0x1]=_0x1be447;}}_0x1f9119['Cartesian4']['unpack'](_0x1f41d2,0x0,_0x457bbe['_cascadeSplits'][0x0]),_0x1f9119['Cartesian4'][_0x2a65e8(0x1fb)](_0x1f41d2,0x1,_0x457bbe[_0x2a65e8(0x172)][0x1]),_0x1f9119['Cartesian4']['unpack'](_0x160c25,0x0,_0x457bbe[_0x2a65e8(0x190)]);var _0x2bf6bb=_0x55716b[_0x2a65e8(0x156)],_0x16bc7e=_0x2bf6bb['left'],_0x20f1d1=_0x2bf6bb['right'],_0x32d505=_0x2bf6bb[_0x2a65e8(0x142)],_0x49324e=_0x2bf6bb[_0x2a65e8(0x227)],_0x3fc3d6=_0x2bf6bb['near'],_0x3dea81=_0x2bf6bb['far'],_0x2341e6=_0x55716b['positionWC'],_0x106bd1=_0x55716b['directionWC'],_0x48f84=_0x55716b['upWC'],_0x2cc9d3=_0x3b551b['frustum'][_0x2a65e8(0x16b)](scratchFrustum),_0x42dc9d=_0x55716b[_0x2a65e8(0x13d)]();for(_0x39495e=0x0;_0x39495e<_0x52d4fd;++_0x39495e){_0x2cc9d3[_0x2a65e8(0x121)]=_0x1f41d2[_0x39495e],_0x2cc9d3['far']=_0x1f41d2[_0x39495e+0x1];var _0x4e187f=_0x1f9119[_0x2a65e8(0x188)][_0x2a65e8(0x183)](_0x2cc9d3[_0x2a65e8(0x185)],_0x3b551b['viewMatrix'],scratchMatrix),_0x139acf=_0x1f9119[_0x2a65e8(0x188)][_0x2a65e8(0x1ec)](_0x4e187f,scratchMatrix),_0x1f6120=_0x1f9119[_0x2a65e8(0x188)][_0x2a65e8(0x183)](_0x42dc9d,_0x139acf,scratchMatrix),_0x38e996=_0x1f9119['Cartesian3']['fromElements'](Number['MAX_VALUE'],Number[_0x2a65e8(0x1a6)],Number['MAX_VALUE'],scratchMin),_0x29b7f2=_0x1f9119[_0x2a65e8(0x179)][_0x2a65e8(0x210)](-Number['MAX_VALUE'],-Number['MAX_VALUE'],-Number['MAX_VALUE'],scratchMax);for(var _0x348353=0x0;_0x348353<0x8;++_0x348353){var _0x49c5f7=_0x1f9119['Cartesian4']['clone'](frustumCornersNDC[_0x348353],scratchFrustumCorners[_0x348353]);_0x1f9119[_0x2a65e8(0x188)]['multiplyByVector'](_0x1f6120,_0x49c5f7,_0x49c5f7),_0x1f9119[_0x2a65e8(0x179)][_0x2a65e8(0x161)](_0x49c5f7,_0x49c5f7['w'],_0x49c5f7),_0x1f9119['Cartesian3'][_0x2a65e8(0x1f4)](_0x49c5f7,_0x38e996,_0x38e996),_0x1f9119[_0x2a65e8(0x179)]['maximumByComponent'](_0x49c5f7,_0x29b7f2,_0x29b7f2);}_0x38e996['x']=Math['max'](_0x38e996['x'],0x0),_0x38e996['y']=Math['max'](_0x38e996['y'],0x0),_0x38e996['z']=0x0,_0x29b7f2['x']=Math[_0x2a65e8(0x1b2)](_0x29b7f2['x'],0x1),_0x29b7f2['y']=Math['min'](_0x29b7f2['y'],0x1),_0x29b7f2['z']=Math['min'](_0x29b7f2['z'],0x1);var _0x211b6d=_0x457bbe[_0x2a65e8(0x1d0)][_0x39495e],_0x118836=_0x211b6d[_0x2a65e8(0x12e)];_0x118836['clone'](_0x55716b);var _0x2f931a=_0x118836['frustum'];_0x2f931a[_0x2a65e8(0x158)]=_0x16bc7e+_0x38e996['x']*(_0x20f1d1-_0x16bc7e),_0x2f931a[_0x2a65e8(0x1de)]=_0x16bc7e+_0x29b7f2['x']*(_0x20f1d1-_0x16bc7e),_0x2f931a[_0x2a65e8(0x142)]=_0x32d505+_0x38e996['y']*(_0x49324e-_0x32d505),_0x2f931a[_0x2a65e8(0x227)]=_0x32d505+_0x29b7f2['y']*(_0x49324e-_0x32d505),_0x2f931a[_0x2a65e8(0x121)]=_0x3fc3d6+_0x38e996['z']*(_0x3dea81-_0x3fc3d6),_0x2f931a['far']=_0x3fc3d6+_0x29b7f2['z']*(_0x3dea81-_0x3fc3d6),_0x211b6d[_0x2a65e8(0x223)]=_0x118836[_0x2a65e8(0x156)][_0x2a65e8(0x19c)](_0x2341e6,_0x106bd1,_0x48f84);var _0x33afad=_0x457bbe['_cascadeMatrices'][_0x39495e];_0x1f9119[_0x2a65e8(0x188)][_0x2a65e8(0x183)](_0x118836[_0x2a65e8(0x13d)](),_0x3b551b['inverseViewMatrix'],_0x33afad),_0x1f9119['Matrix4'][_0x2a65e8(0x183)](_0x211b6d[_0x2a65e8(0x1ad)],_0x33afad,_0x33afad);}}var scratchLightView=new _0x1f9119[(_0x44f789(0x188))](),scratchRight=new _0x1f9119[(_0x44f789(0x179))](),scratchUp=new _0x1f9119[(_0x44f789(0x179))](),scratchTranslation=new _0x1f9119['Cartesian3']();function fitShadowMapToScene(_0x40ea07,_0xd80184){var _0x1c24dd=_0x44f789,_0x3092c1=_0x40ea07[_0x1c24dd(0x1cf)],_0x5c0fc7=_0x40ea07[_0x1c24dd(0x135)],_0x7ae7b7=_0x1f9119[_0x1c24dd(0x188)][_0x1c24dd(0x183)](_0x5c0fc7['frustum'][_0x1c24dd(0x185)],_0x5c0fc7['viewMatrix'],scratchMatrix),_0x2460ba=_0x1f9119['Matrix4']['inverse'](_0x7ae7b7,scratchMatrix),_0x4aece8=_0x3092c1['directionWC'],_0x330f11=_0x5c0fc7[_0x1c24dd(0x1f1)],_0x484717=_0x1f9119[_0x1c24dd(0x179)][_0x1c24dd(0x19d)](_0x4aece8,_0x330f11,scratchRight);_0x330f11=_0x1f9119['Cartesian3']['cross'](_0x484717,_0x4aece8,scratchUp),_0x1f9119[_0x1c24dd(0x179)]['normalize'](_0x330f11,_0x330f11),_0x1f9119['Cartesian3'][_0x1c24dd(0x22b)](_0x484717,_0x484717);var _0x5157d5=_0x1f9119['Cartesian3'][_0x1c24dd(0x210)](0x0,0x0,0x0,scratchTranslation),_0x28d8ef=_0x1f9119['Matrix4'][_0x1c24dd(0x1ed)](_0x5157d5,_0x4aece8,_0x330f11,_0x484717,scratchLightView),_0x889518=_0x1f9119[_0x1c24dd(0x188)][_0x1c24dd(0x183)](_0x28d8ef,_0x2460ba,scratchMatrix),_0x5aae60=_0x1f9119[_0x1c24dd(0x179)][_0x1c24dd(0x210)](Number[_0x1c24dd(0x1a6)],Number[_0x1c24dd(0x1a6)],Number[_0x1c24dd(0x1a6)],scratchMin),_0x330d8b=_0x1f9119[_0x1c24dd(0x179)]['fromElements'](-Number['MAX_VALUE'],-Number['MAX_VALUE'],-Number[_0x1c24dd(0x1a6)],scratchMax);for(var _0x27d30c=0x0;_0x27d30c<0x8;++_0x27d30c){var _0x3aa682=_0x1f9119['Cartesian4'][_0x1c24dd(0x16b)](frustumCornersNDC[_0x27d30c],scratchFrustumCorners[_0x27d30c]);_0x1f9119['Matrix4'][_0x1c24dd(0x175)](_0x889518,_0x3aa682,_0x3aa682),_0x1f9119[_0x1c24dd(0x179)][_0x1c24dd(0x161)](_0x3aa682,_0x3aa682['w'],_0x3aa682),_0x1f9119['Cartesian3']['minimumByComponent'](_0x3aa682,_0x5aae60,_0x5aae60),_0x1f9119[_0x1c24dd(0x179)]['maximumByComponent'](_0x3aa682,_0x330d8b,_0x330d8b);}_0x330d8b['z']+=0x3e8,_0x5aae60['z']-=0xa;var _0x380fd2=scratchTranslation;_0x380fd2['x']=-(0.5*(_0x5aae60['x']+_0x330d8b['x'])),_0x380fd2['y']=-(0.5*(_0x5aae60['y']+_0x330d8b['y'])),_0x380fd2['z']=-_0x330d8b['z'];var _0x22594b=_0x1f9119['Matrix4']['fromTranslation'](_0x380fd2,scratchMatrix);_0x28d8ef=_0x1f9119['Matrix4']['multiply'](_0x22594b,_0x28d8ef,_0x28d8ef);var _0x186599=0.5*(_0x330d8b['x']-_0x5aae60['x']),_0x98408c=0.5*(_0x330d8b['y']-_0x5aae60['y']),_0x6b3e28=_0x330d8b['z']-_0x5aae60['z'],_0x4c08de=_0x3092c1['frustum'];_0x4c08de[_0x1c24dd(0x158)]=-_0x186599,_0x4c08de[_0x1c24dd(0x1de)]=_0x186599,_0x4c08de['bottom']=-_0x98408c,_0x4c08de['top']=_0x98408c,_0x4c08de[_0x1c24dd(0x121)]=0.01,_0x4c08de[_0x1c24dd(0x19b)]=_0x6b3e28,_0x1f9119['Matrix4']['clone'](_0x28d8ef,_0x3092c1['viewMatrix']),_0x1f9119[_0x1c24dd(0x188)]['inverse'](_0x28d8ef,_0x3092c1[_0x1c24dd(0x1b4)]),_0x1f9119[_0x1c24dd(0x188)][_0x1c24dd(0x19f)](_0x3092c1[_0x1c24dd(0x1b4)],_0x3092c1[_0x1c24dd(0x120)]),_0xd80184['mapProjection'][_0x1c24dd(0x1c7)][_0x1c24dd(0x11b)](_0x3092c1['positionWC'],_0x3092c1['positionCartographic']),_0x1f9119['Cartesian3'][_0x1c24dd(0x16b)](_0x4aece8,_0x3092c1['directionWC']),_0x1f9119['Cartesian3']['clone'](_0x330f11,_0x3092c1[_0x1c24dd(0x13e)]),_0x1f9119['Cartesian3']['clone'](_0x484717,_0x3092c1[_0x1c24dd(0x143)]);}var directions=[new _0x1f9119['Cartesian3'](-0x1,0x0,0x0),new _0x1f9119['Cartesian3'](0x0,-0x1,0x0),new _0x1f9119[(_0x44f789(0x179))](0x0,0x0,-0x1),new _0x1f9119['Cartesian3'](0x1,0x0,0x0),new _0x1f9119[(_0x44f789(0x179))](0x0,0x1,0x0),new _0x1f9119[(_0x44f789(0x179))](0x0,0x0,0x1)],ups=[new _0x1f9119[(_0x44f789(0x179))](0x0,-0x1,0x0),new _0x1f9119[(_0x44f789(0x179))](0x0,0x0,-0x1),new _0x1f9119[(_0x44f789(0x179))](0x0,-0x1,0x0),new _0x1f9119['Cartesian3'](0x0,-0x1,0x0),new _0x1f9119['Cartesian3'](0x0,0x0,0x1),new _0x1f9119['Cartesian3'](0x0,-0x1,0x0)],rights=[new _0x1f9119[(_0x44f789(0x179))](0x0,0x0,0x1),new _0x1f9119['Cartesian3'](0x1,0x0,0x0),new _0x1f9119[(_0x44f789(0x179))](-0x1,0x0,0x0),new _0x1f9119['Cartesian3'](0x0,0x0,-0x1),new _0x1f9119[(_0x44f789(0x179))](0x1,0x0,0x0),new _0x1f9119[(_0x44f789(0x179))](0x1,0x0,0x0)];function computeOmnidirectional(_0x3244dc,_0x539739){var _0x45ba9b=_0x44f789,_0x5a020a=new _0x1f9119['PerspectiveFrustum']();_0x5a020a['fov']=_0x1f9119[_0x45ba9b(0x11c)]['PI_OVER_TWO'],_0x5a020a[_0x45ba9b(0x121)]=0x1,_0x5a020a['far']=_0x3244dc[_0x45ba9b(0x1be)],_0x5a020a[_0x45ba9b(0x1d1)]=0x1;for(var _0x25fbd3=0x0;_0x25fbd3<0x6;++_0x25fbd3){var _0x5b6104=_0x3244dc[_0x45ba9b(0x1d0)][_0x25fbd3][_0x45ba9b(0x12e)];_0x5b6104['positionWC']=_0x3244dc[_0x45ba9b(0x1cf)][_0x45ba9b(0x120)],_0x5b6104['positionCartographic']=_0x539739['mapProjection']['ellipsoid']['cartesianToCartographic'](_0x5b6104[_0x45ba9b(0x120)],_0x5b6104[_0x45ba9b(0x217)]),_0x5b6104[_0x45ba9b(0x1f1)]=directions[_0x25fbd3],_0x5b6104[_0x45ba9b(0x13e)]=ups[_0x25fbd3],_0x5b6104['rightWC']=rights[_0x25fbd3],_0x1f9119['Matrix4'][_0x45ba9b(0x1ed)](_0x5b6104[_0x45ba9b(0x120)],_0x5b6104[_0x45ba9b(0x1f1)],_0x5b6104['upWC'],_0x5b6104['rightWC'],_0x5b6104['viewMatrix']),_0x1f9119['Matrix4']['inverse'](_0x5b6104[_0x45ba9b(0x1b0)],_0x5b6104[_0x45ba9b(0x1b4)]),_0x5b6104['frustum']=_0x5a020a;}}var scratchCartesian1=new _0x1f9119[(_0x44f789(0x179))](),scratchCartesian2=new _0x1f9119[(_0x44f789(0x179))](),scratchBoundingSphere=new _0x1f9119[(_0x44f789(0x1e6))](),scratchCenter=scratchBoundingSphere['center'];function _0x5996(){var _0x33fe74=['x2XPz2H0rgLYzwn0Aw9Urum','zxf1ywXZ','Bwf4Aw11BurPC3rHBMnL','x3rLEhr1CMvtAxPL','icaGihzLyZmGzgLYzwn0Aw9UrumGpsbWB3nPDgLVBKvdlNH5EIaTihnOywrVD01HCf9SAwDODfbVC2L0Aw9UrumUEhL6oYak','icaGicaGicaGicaGzgLYlNKGpsaXlJa7iaO','rMvHDhvYzurLDgvJDgLVBG','AxndAhjVBwu','y29TyMLUzwrvBMLMB3jTCZi','Cg9SEwDVBK9MzNnLDfvUAxrZ','icaGihnOywrVD1bHCMfTzxrLCNmUDgv4q29VCMrZid0GzgLYzwn0Aw9Uv0m7iaO','ktSGcG','AxnfzgDL','x2jVDw5KAw5Nu3bOzxjL','icaGigzSB2f0igrPC3rHBMnLid0GBgvUz3rOkgrPCMvJDgLVBKvdmsK7iaO','Dw5PzM9YBsb2zwmZihnOywrVD01HCf9SAwDODerPCMvJDgLVBKvdoYak','vu5jvf9y','q2fTzxjH','icaGihnOywrVD1bVC2L0Aw9Uic89ihnOywrVD1bVC2L0Aw9UlNC7iaO','CMvJzwL2zvnOywrLCLbYB2DYyw1jza','zNjVBuvSzw1LBNrZ','mJG2D0DRqLDU','ChjVDg90ExbL','C291CMnLCW','zgvIDwDdyxnJywrLq29SB3jZ','icaGicaGicbVDxrFrNjHz0nVBg9YlNjNyIaQpsb2zwmZkdaUmcWWlJGSmc4WksaQihzPC2LIAwXPDhK7cG','zNjHBwvIDwzMzxi','Cg9ZAxrPB25dyxj0B2DYyxbOAwm','vu5tsuDorurFqLLurq','x2rLyNvNq2fTzxjHrNj1C3r1Bq','C2L6zq','CgfZCW','x3nOywrVD01HCfrLEhr1CMu','zgvMAw5Lza','Dw5PzM9YBsb2zwm0ihnOywrVD01HCf90zxHLBfnPEMvezxb0AejPyxnbBMroB3jTywXtAgfKAw5Nu21VB3rOoYak','icaGicaGicaGicaGzgLYlNOGpsb1DI55icOGnc4Wic0GmY4WoYak','icaGicaGicaGicaGzgLYlNGGpsaXlJa7iaO','x25VCM1HBe9MzNnLDa','icaGicaGicaGicaGzgLYlNGGpsb1DI54icOGnI4Wic0GmY4WoYak','y3vSBgLUz1zVBhvTzq','AgvPz2H0','icaGig91Df9gCMfNq29SB3iGpsb2zwm0khzLyZmOC2HHzg93ksWGms4WktSGcG','y2XVC2vZDe9IAMvJDfnPEMu','Dg9W','x2rLyNvNrNjLzxPLrNjHBwu','y3jLyxrLrgvYAxzLzfnOywrLCLbYB2DYyw0','Aw4GDMvJmIb2x3rLEhr1CMvdB29YzgLUyxrLCZSGcG','BM9YBwfSAxPL','icaGihSGcG','icaGigzSB2f0ig5eB3rmid0Gy2XHBxaOzg90kg5VCM1HBevdlcbZAgfKB3DnyxbFBgLNAhreAxjLy3rPB25fqYKSidaUmcWGms4WktSGcG','icaGicaGicaGicaGzgLYlNKGpsb1DI54icOGnI4Wic0Gms4WoYak','zgvIDwDtAg93','icaGihjLDhvYBIb2zwmZkdeUmcK7iaO','q2fYDgvZAwfUna','CMfKAxvZ','BM9YBwfSt2zMC2v0','Cg9SEwDVBK9MzNnLDa','x2rLyNvNq2fZy2fKzuzYDxn0Dw1Z','Bwf4Aw11BvrLEhr1CMvtAxPL','t3j0Ag9NCMfWAgLJt2zMq2vUDgvYrNj1C3r1Bq','x3nVzNrtAgfKB3DZ','qM91BMrPBMDszwn0yw5NBgu','zw5HyMXLza','y29UDgv4Da','y2fYDgvZAwfUvg9dyxj0B2DYyxbOAwm','twf0Aa','q29SB3jhzw9TzxrYEuLUC3rHBMnLqxr0CMLIDxrL','DM9PzcbHChbSEu5VCM1HBe9MzNnLDcHPBM91Dcb2zwm0ihbVC2L0Aw9UrumSihzLyZmGBM9YBwfSrumSigzSB2f0ig5eB3rmksak','u2HHzg93twfW','Cg9ZAxrPB25xqW','BMvHCG','nJC1mJa1rwXQz3j1','Cg93','C2HHzgvYuhjVz3jHBq','t25SEsbVBMuGB3iGzM91CIbJyxnJywrLCYbHCMuGC3vWCg9YDgvKlG','uMvUzgvYu3rHDgu','BgLNAhrdyw1LCMeGAxmGCMvXDwLYzwqU','icaGigzSB2f0ig5eB3rmid0Gy2XHBxaOzg90kg5VCM1HBevdlcaTzgLYzwn0Aw9UrumPlcaWlJaSideUmcK7iaO','ChvZAa','icaGign6Bv9ZAgfKB3DFCMvJzwL2zv9TywLUkcK7iaO','vvnfx05puK1btf9tsefesu5h','x291De9MvMLLD1bYzxzPB3vZ','icaGihzLyZiGDxyGpsb2x3rLEhr1CMvdB29YzgLUyxrLCZSGcG','y2fTzxjH','BxvSDgLWBhLcEvbVAw50qxnwzwn0B3i','zMLUze5VCM1HBfzHCNLPBMC','x251BwjLCK9Mq2fZy2fKzxm','zNjHz21LBNrtAgfKzxjtB3vYy2u','icaGicaGicaGicaGzgLYlNKGpsaTms4WoYak','zgvZDhjVEq','x3nJzw5Lq2fTzxjH','x2nHC2nHzgvnyxrYAwnLCW','zMfYugXHBMu','zgvMAw5LuhjVCgvYDgLLCW','BgvUz3rO','rgv2zwXVCgvYrxjYB3i','zgvIDwDgCMvLEMvgCMfTzq','icaGign6Bv9ZAgfKB3DqyxjHBwv0zxjZihnOywrVD1bHCMfTzxrLCNm7iaO','z2v0vMLLD1bYB2PLy3rPB24','DxbxqW','x2vUywjSzwq','x25LzwrZvxbKyxrL','icaGihzLyZqGC2HHzg93ug9ZAxrPB24GpsbJEM1Fy2fZy2fKzu1HDhjPEcH3zwLNAhrZksaQihbVC2L0Aw9Urum7iaO','yM90Dg9T','CMLNAhrxqW','icaGicaGicbYzxr1CM47iaO','mJqZmJe1mLjJyvflEG','q2fYDgvZAwfUmG','x2LZug9PBNrmAwDODa','ndK5otHXC0LvC2u','x3nPEMu','C2HHzg93u3rHDgu','vvnfx0nvqKvFtufqx1niqurpvW','surftLrjvfK','rgvIDwDdyw1LCMfqCMLTAxrPDMu','icaGihzLyZmGBM9YBwfSrumGpsbNzxroB3jTywXfqYGPoYak','vu5tsuDorurFsu5uxZi0xZG','y29TyMLUzwrvBMLMB3jTCZe','Dw5PzM9YBu1HCa','uhjPBwL0AxzL','z2v0rgvYAxzLzfnOywrLCLbYB2DYyw0','icaGihnOywrVD1bHCMfTzxrLCNmUzgvWDgGGpsbZAgfKB3DqB3nPDgLVBI56oYak','zw5JB2rPBMC','zNj1C3r1Bq','zgvWDgHuzxH0DxjL','BgvMDa','icaGihnOywrVD1bHCMfTzxrLCNmUDgv4q29VCMrZid0GC2HHzg93ug9ZAxrPB24UEhK7iaO','icaGigzSB2f0ihzPC2LIAwXPDhKGpsbJEM1FC2HHzg93vMLZAwjPBgL0EsHZAgfKB3DnyxbFDgv4DhvYzsWGC2HHzg93ugfYyw1LDgvYCYK7iaO','icaGihnOywrVD1bHCMfTzxrLCNmUDgv4zwXtDgvWu2L6zsa9ihnOywrVD01HCf90zxHLBfnPEMvezxb0AejPyxnbBMroB3jTywXtAgfKAw5Nu21VB3rOlNH5oYak','Cg9ZAxrPDMvA','x2nSzwfYq29TBwfUza','u2HHzgvYu291CMnL','x3vZzxnezxb0AfrLEhr1CMu','icaGihnOywrVD1bHCMfTzxrLCNmUBKrVDeWGpsbUrg90tdSGcG','zgL2AwrLqNLty2fSyxi','icaGic8VieDLDcb2AxnPyMLSAxr5iaO','x2XPz2H0ug9ZAxrPB25fqW','ru5bqKXfx1zfuLrfwf9msuDiveLorW','DxbKyxrL','x2XPz2H0q2fTzxjH','Axnezxn0CM95zwq','CgfZC1n0yxrL','icaGic8Vifn0B3aGzwfYBhKGAwyGDgHLigzYywDTzw50igLZigjLEw9Uzcb0AguGCg9PBNqGBgLNAhqGCMfKAxvZiaO','u3bOzxjLt3v0BgLUzuDLB21LDhj5','y2XVBMu','icaGigzSB2f0ig5VCM1HBe9MzNnLDfnJywXLid0Gms4Wic0GBKrVDeW7iaO','icaGigzSB2f0ihjHzgL1CYa9ihnOywrVD01HCf9SAwDODfbVC2L0Aw9UrumUDZSGcG','BgLNAhrdyw1LCMe','y2fZDfnOywrVD3m','mZeXnJKXoeTmEe5pAG','AxnwAwv3u2HLza','x2nHC2nHzgvtCgXPDhm','x2rLyNvNtgLNAhrgCNvZDhvT','icaGigzSB2f0ig1HEerLChrOid0GC2HHzg93twfWx2nHC2nHzgvtCgXPDhnBmv0UDZSGcG','BxvSDgLWBhLcEvzLy3rVCG','x2nVBg9Yqxr0ywnOBwvUDa','BM9YBwfSu2HHzgLUz1nTB290Aa','icaGigvSC2uGcG','q2fYDgvZAwfUmW','q29SB3i','y29UDgv4DcbPCYbYzxf1AxjLzc4','lcaXlJaPoYak','q29UDgv4DeXPBwL0CW','C2HHzgvYq2fJAgu','x3nOywrVD01HCe1HDhjPEa','icaGicaGicbLBhnLiaO','DMLLD3bVCNq','icaGicaGicaGicaGzgLYlNOGpsb1DI55icOGnc4Wic0Gms4WoYak','BxvSDgLWBhK','ugfZC1n0yxrL','ChjVAMvJDgLVBK1HDhjPEa','icaGicaGicaGicaGzgLYlNGGpsb1DI54icOGnI4Wic0Gns4WoYak','icaGigLMicHKzxb0Aca+ig1HEerLChrOksak','twf0CML4na','ndu0odG3AeXiELP5','x2nHC2nHzgvZrw5HyMXLza','tKvbuKvtva','B3DUzxi','Fsak','z2v0u2HHzg93uMvJzwL2zvnOywrLCKTLExDVCMq','odi4ntaZDeP4uxre','x2nHC2nHzgveAxn0yw5Jzxm','DxbKyxrLugfZCW','C2XPy2u','mZbiuK9fv3O','rNjHBwvIDwzMzxi','x3rLCNjHAw5cAwfZ','rhjHD0nVBw1HBMq','DMvYDgv4u2HHzgvYu291CMnL','Dw5PzM9YBsbZyw1WBgvYmKqGC2HHzg93twfWx3rLEhr1CMu7iaO','x291De9MvMLLDW','vgv4DhvYzu1Hz25PzMLJyxrPB25gAwX0zxi','zMfY','y29TChv0zun1BgXPBMDwB2X1Bwu','y3jVC3m','ndr1u2jwBMO','z2v0vhjHBNnSyxrPB24','Cg9SEwDVBK9MzNnLDezHy3rVCG','x2zPDe5Lyxjgyxi','x3bVBhLNB25pzMzZzxrtDxbWB3j0zwq','ouHJrKvMtG','vgv4DhvYzvDYyxa','x3nOywrVD01HCen1BgXPBMDwB2X1Bwu','tufyx1zbtfvf','wuvmte9x','mJa0DKrNsMXJ','icaGihnOywrVD1bHCMfTzxrLCNmUBKrVDeWGpsbJBgfTCcHKB3qOBM9YBwfSrumSic1KAxjLy3rPB25fqYKSidaUmcWGms4WktSGcG','ugL4zwXeyxrHDhLWzq','icaGihnOywrVD1bHCMfTzxrLCNmUzgvWDgHcAwfZid0GC2HHzg93twfWx3rLEgvSu2L6zurLChrOqMLHC0fUze5VCM1HBfnOywrPBMDtBw9VDgGUEJSGcG','sw50zxjZzwn0','Dgv4DhvYzu9MzNnLDhm','x3rLCNjHAw5szw5KzxjtDgf0zq','Dw5PzM9YBsbTyxq0ihnOywrVD01HCf9TyxrYAxG7iaO','DMLLD01HDhjPEa','icaGAwyODMLZAwjPBgL0Et09mc4Wksak','BwLU','DMLLD1bYB2PLy3rPB25nyxrYAxG','Aw52zxjZzvzPzxDnyxrYAxG','i2vUzgLMiaO','x2rPC3rHBMnL','icaGihzLyZqGC2HHzg93ug9ZAxrPB24GpsbZAgfKB3DnyxbFBwf0CML4icOGCg9ZAxrPB25fqZSGcG','q2fYDg9NCMfWAgLJ','uMvUzgvYyNvMzMvYrM9YBwf0','x2rLyNvNu2HHzg93vMLLD0nVBw1HBMq','Fsakia','Bwf4Aw11Bun1yMvnyxbtAxPL','CMvJzwL2zvnOywrVD3m','x3bVAw50tgLNAhrsywrPDxm','x2rLyNvNq2fZy2fKzunVBg9YCW','icaGigLMicH1DI55idWGmc41ksak','mtK1nJKWvgjRvePm','vvnfx1niqurpv19ervbusf9urvHuvvjf','x3bVAw50qMLHCW','icaGigzSB2f0igrPC3rHBMnLid0GBgvUz3rOkgrPCMvJDgLVBKvdktSGcG','zNjVBuXPz2H0u291CMnL','ywrK','zwXSAxbZB2LK','zgLYDhK','BMvNyxrL','zgf0yq','icaGicaGicbLBhnLigLMicH1DI54idWGmc42nJyPiaO','y29TBwfUzeXPC3q','icaGigzSB2f0ig5VCM1HBe9MzNnLDca9ihnOywrVD01HCf9UB3jTywXpzMzZzxrty2fSzurPC3rHBMnLtwf4rgLZDgfUy2vbBMreyxjRBMvZCY54oYak','ugL4zwXgB3jTyxq','x3nOywrVD01HCenHBwvYyq','x3bHC3nLCW','yxnWzwn0uMf0Aw8','x2rLChrOqxr0ywnOBwvUDa','icaGigLMicHKAxn0yw5Jzsa+ihnOywrVD01HCf9UB3jTywXpzMzZzxrty2fSzurPC3rHBMnLtwf4rgLZDgfUy2vbBMreyxjRBMvZCY55ksak','BMvNyxrPDMvA','icaGicaGicaGicaGzgLYlNGGpsaTms4WoYak','x3bYAw1PDgL2zujPyxm','zgfYA25LC3m','icaGic8ViezHzguGB3v0ihnOywrVD3mGDgHHDcbHCMuGzMfYigf3yxKGcG','icaGigzSB2f0ihnOywrVDYa9ign6Bv91BNbHy2Tezxb0AcH0zxH0DxjLq3vIzsHZAgfKB3DnyxbFDgv4DhvYzun1yMuSigrPCIKPoYak','ofzor2f2Eq','icaGicaGicaGicaGzgLYlNKGpsb1DI55icOGnc4Wic0GmY4WoYak','DMLLDYbYzwnLAxzLu2HHzg93ia','u2HHzg93twfWu2HHzgvY','CMLNAhq','icaGihzLyZmGzgLYoYak','q3vIzu1HCa','x2LZu3bVDeXPz2H0','EYak','icaGic8Vifn0B3aGzwfYBhKGAwyGDgHLigv5zsbKzxb0AcbLEgnLzwrZihrOzsbSyxn0ignHC2nHzguGcG','icaGicaGicb7iaO','zNjVBujVDw5KAw5Nu3bOzxjL','qM91BMrPBMDtCgHLCMu','BgvYCa','icaGigLMicHHBNKOBgvZC1rOyw4OC2HHzg93ug9ZAxrPB24UEhL6lcb2zwmZkdaUmcKPksb8FcbHBNKOz3jLyxrLCLrOyw4OC2HHzg93ug9ZAxrPB24UEhL6lcb2zwmZkdeUmcKPksKGcG','v2vIr0XdB25ZDgfUDhm','icaGic8ViefWCgX5ig5VCM1HBcbVzMzZzxqGcG','CMvJzwL2zvnOywrLCKnHC3rtAgfKB3DZ','Aw52zxjZzq','y29TChv0zvzPzxC','zgvWDgHcAwfZ','CMvJzwL2zunVBw1HBMq','icaGihzLyZmGzgLYzwn0Aw9UrumXid0GCg9ZAxrPB25fqY54ExOGlsbZAgfKB3DnyxbFBgLNAhrqB3nPDgLVBKvdlNH5EJSGcG','zgLYzwn0Aw9Uv0m','icaGih0GcG','icaGihzLyZmGzgLYzwn0Aw9UrumGpsbUB3jTywXPEMuOCg9ZAxrPB25fqY54ExOGlsbZAgfKB3DnyxbFBgLNAhrqB3nPDgLVBKvdlNH5EIK7iaO','BwLUAw11Buj5q29TCg9Uzw50','icaGigfWCgX5tM9YBwfSt2zMC2v0khbVC2L0Aw9UrumSig5VCM1HBevdlcbUrg90tcK7iaO','q0XbtvbFve9Frurhrq','CMvUzgvYzwrnzxnO','x21HEgLTDw1dyxnJywrLrgLZDgfUy2vZ','icaGicaGicb9iaO','DM9PzcbTywLUkcKGcG','Dw5WywnR'];_0x5996=function(){return _0x33fe74;};return _0x5996();}function checkVisibility(_0x2df84b,_0x121cc2){var _0x220894=_0x44f789,_0x3613cf=_0x2df84b['_sceneCamera'],_0x46425d=_0x2df84b[_0x220894(0x1cf)],_0x538f29=scratchBoundingSphere;if(_0x2df84b[_0x220894(0x18a)]){if(_0x3613cf[_0x220894(0x156)][_0x220894(0x121)]>=_0x2df84b['maximumDistance']){_0x2df84b['_outOfView']=!![],_0x2df84b['_needsUpdate']=![];return;}var _0x3c8a29=_0x121cc2['mapProjection'][_0x220894(0x1c7)]['geodeticSurfaceNormal'](_0x3613cf[_0x220894(0x120)],scratchCartesian1),_0x1a2cc3=_0x1f9119[_0x220894(0x179)]['negate'](_0x46425d['directionWC'],scratchCartesian2),_0x4d0640=_0x1f9119[_0x220894(0x179)]['dot'](_0x3c8a29,_0x1a2cc3),_0x22d906=_0x1f9119[_0x220894(0x11c)]['clamp'](_0x4d0640/0.1,0x0,0x1);_0x2df84b['_darkness']=_0x1f9119['Math'][_0x220894(0x1e7)](0x1,_0x2df84b['darkness'],_0x22d906);if(_0x4d0640<0x0){_0x2df84b['_outOfView']=!![],_0x2df84b[_0x220894(0x140)]=![];return;}_0x2df84b[_0x220894(0x140)]=!![],_0x2df84b['_outOfView']=![];}else{if(_0x2df84b['_isPointLight'])_0x538f29['center']=_0x46425d[_0x220894(0x120)],_0x538f29[_0x220894(0x232)]=_0x2df84b[_0x220894(0x1be)],_0x2df84b['_outOfView']=_0x121cc2['cullingVolume']['computeVisibility'](_0x538f29)===_0x1f9119['Intersect']['OUTSIDE'],_0x2df84b[_0x220894(0x140)]=!_0x2df84b[_0x220894(0x199)]&&!_0x2df84b[_0x220894(0x209)][_0x220894(0x1fd)](_0x538f29),_0x1f9119[_0x220894(0x1e6)][_0x220894(0x16b)](_0x538f29,_0x2df84b[_0x220894(0x209)]);else{var _0x301385=_0x46425d['frustum']['far']/0x2,_0xc979d9=_0x1f9119[_0x220894(0x179)][_0x220894(0x1c6)](_0x46425d['positionWC'],_0x1f9119['Cartesian3']['multiplyByScalar'](_0x46425d['directionWC'],_0x301385,scratchCenter),scratchCenter);_0x538f29['center']=_0xc979d9,_0x538f29['radius']=_0x301385,_0x2df84b[_0x220894(0x199)]=_0x121cc2['cullingVolume']['computeVisibility'](_0x538f29)===_0x1f9119[_0x220894(0x1ac)]['OUTSIDE'],_0x2df84b['_needsUpdate']=!_0x2df84b[_0x220894(0x199)]&&!_0x2df84b[_0x220894(0x209)]['equals'](_0x538f29),_0x1f9119[_0x220894(0x1e6)][_0x220894(0x16b)](_0x538f29,_0x2df84b[_0x220894(0x209)]);}}}function updateCameras(_0x2e6c34,_0x57cf79){var _0x5b507e=_0x44f789,_0x25d93a=_0x57cf79[_0x5b507e(0x12e)],_0x462a47=_0x2e6c34[_0x5b507e(0x166)],_0x2365f3=_0x2e6c34[_0x5b507e(0x135)],_0xd565dd=_0x2e6c34['_shadowMapCamera'];if(_0x2e6c34[_0x5b507e(0x18a)])_0x1f9119['Cartesian3']['clone'](_0x462a47['directionWC'],_0xd565dd[_0x5b507e(0x1f1)]);else _0x2e6c34['_isPointLight']?_0x1f9119[_0x5b507e(0x179)][_0x5b507e(0x16b)](_0x462a47['positionWC'],_0xd565dd['positionWC']):_0xd565dd[_0x5b507e(0x16b)](_0x462a47);var _0x3de528=_0x2e6c34[_0x5b507e(0x1fc)];_0x1f9119['Matrix4'][_0x5b507e(0x12f)](_0x25d93a['viewMatrix'],_0xd565dd[_0x5b507e(0x1f1)],_0x3de528),_0x1f9119[_0x5b507e(0x179)]['normalize'](_0x3de528,_0x3de528),_0x1f9119['Cartesian3'][_0x5b507e(0x1c9)](_0x3de528,_0x3de528),_0x1f9119['Matrix4']['multiplyByPoint'](_0x25d93a['viewMatrix'],_0xd565dd['positionWC'],_0x2e6c34['_lightPositionEC']),_0x2e6c34[_0x5b507e(0x163)]['w']=_0x2e6c34[_0x5b507e(0x1be)];var _0x51a2ad,_0x46d223;if(_0x2e6c34[_0x5b507e(0x171)])_0x51a2ad=_0x462a47['frustum'][_0x5b507e(0x121)],_0x46d223=_0x462a47[_0x5b507e(0x156)][_0x5b507e(0x19b)];else _0x2e6c34[_0x5b507e(0x1a1)]?(_0x51a2ad=Math['min'](_0x57cf79[_0x5b507e(0x14a)]['nearPlane'],_0x2e6c34['maximumDistance']),_0x46d223=Math[_0x5b507e(0x1b2)](_0x57cf79['shadowState'][_0x5b507e(0x137)],_0x2e6c34['maximumDistance']+0x1)):(_0x51a2ad=_0x25d93a[_0x5b507e(0x156)][_0x5b507e(0x121)],_0x46d223=_0x2e6c34['maximumDistance']);_0x2e6c34['_sceneCamera']=_0x1f9119[_0x5b507e(0x20d)][_0x5b507e(0x16b)](_0x25d93a,_0x2365f3),_0x25d93a[_0x5b507e(0x156)][_0x5b507e(0x16b)](_0x2e6c34[_0x5b507e(0x135)][_0x5b507e(0x156)]),_0x2e6c34['_sceneCamera']['frustum']['near']=_0x51a2ad,_0x2e6c34[_0x5b507e(0x135)]['frustum']['far']=_0x46d223,_0x2e6c34[_0x5b507e(0x1b6)]=_0x46d223-_0x51a2ad,checkVisibility(_0x2e6c34,_0x57cf79),!_0x2e6c34[_0x5b507e(0x12c)]&&_0x2e6c34[_0x5b507e(0x199)]&&(_0x2e6c34[_0x5b507e(0x140)]=!![]),_0x2e6c34[_0x5b507e(0x12c)]=_0x2e6c34['_outOfView'];}ViewshedMap['prototype']['update']=function(_0x408f25){var _0xeb86a8=_0x44f789;updateCameras(this,_0x408f25);if(this[_0xeb86a8(0x140)]){updateFramebuffer(this,_0x408f25['context']);this['_isPointLight']&&computeOmnidirectional(this,_0x408f25);this['_cascadesEnabled']&&(fitShadowMapToScene(this,_0x408f25),this[_0xeb86a8(0x131)]>0x1&&computeCascades(this,_0x408f25));if(!this['_isPointLight']){var _0x31a889=this['_shadowMapCamera'],_0x1a1b82=_0x31a889['positionWC'],_0x1d75b2=_0x31a889['directionWC'],_0x9b36cc=_0x31a889[_0xeb86a8(0x13e)];this[_0xeb86a8(0x1a5)]=_0x31a889['frustum'][_0xeb86a8(0x19c)](_0x1a1b82,_0x1d75b2,_0x9b36cc),this['_passes'][_0xeb86a8(0x139)]===0x1&&this['_passes'][0x0][_0xeb86a8(0x12e)]['clone'](_0x31a889);}else this[_0xeb86a8(0x1a5)]=_0x1f9119['CullingVolume'][_0xeb86a8(0x1e5)](this['_boundingSphere']);}if(this['_passes'][_0xeb86a8(0x139)]===0x1){var _0x1795f7=this[_0xeb86a8(0x135)][_0xeb86a8(0x1b4)];_0x1f9119['Matrix4']['multiply'](this['_shadowMapCamera'][_0xeb86a8(0x13d)](),_0x1795f7,this['_shadowMapMatrix']);}this[_0xeb86a8(0x22f)]&&applyDebugSettings(this,_0x408f25);},ViewshedMap['prototype'][_0x44f789(0x191)]=function(_0x105036,_0x5a0cd3){clearFramebuffer(this,_0x105036,_0x5a0cd3);};var scratchTexelStepSize=new _0x1f9119[(_0x44f789(0x146))]();function combineUniforms(_0x54d3ba,_0x49a41e,_0x4f3777){var _0x5c282f=_0x44f789,_0x370ff7=_0x54d3ba[_0x5c282f(0x147)]?_0x54d3ba['_pointBias']:_0x4f3777?_0x54d3ba[_0x5c282f(0x195)]:_0x54d3ba[_0x5c282f(0x1d6)],_0x3b3fdf={'shadowMap_texture':function _0x300c3(){return _0x54d3ba['_shadowMapTexture'];},'shadowMap_textureCube':function _0x1ada68(){var _0x488c94=_0x5c282f;return _0x54d3ba[_0x488c94(0x21c)];},'shadowMap_matrix':function _0x4c901c(){var _0x241788=_0x5c282f;return _0x54d3ba[_0x241788(0x17f)];},'shadowMap_cascadeSplits':function _0x9c95ce(){var _0xf4c706=_0x5c282f;return _0x54d3ba[_0xf4c706(0x172)];},'shadowMap_cascadeMatrices':function _0x3bb8fd(){var _0x2fc221=_0x5c282f;return _0x54d3ba[_0x2fc221(0x136)];},'shadowMap_lightDirectionEC':function _0x4992dd(){return _0x54d3ba['_lightDirectionEC'];},'shadowMap_lightPositionEC':function _0x5e75b0(){var _0x4ba100=_0x5c282f;return _0x54d3ba[_0x4ba100(0x163)];},'shadowMap_cascadeDistances':function _0x3d5ee4(){var _0x4eb954=_0x5c282f;return _0x54d3ba[_0x4eb954(0x190)];},'shadowMap_texelSizeDepthBiasAndNormalShadingSmooth':function _0x3679e4(){var _0x35182a=_0x5c282f,_0x41ab7d=scratchTexelStepSize;return _0x41ab7d['x']=0x1/_0x54d3ba['_textureSize']['x'],_0x41ab7d['y']=0x1/_0x54d3ba['_textureSize']['y'],_0x1f9119['Cartesian4']['fromElements'](_0x41ab7d['x'],_0x41ab7d['y'],_0x370ff7[_0x35182a(0x1ee)],_0x370ff7['normalShadingSmooth'],this[_0x35182a(0x150)]);},'shadowMap_normalOffsetScaleDistanceMaxDistanceAndDarkness':function _0x4f6b7f(){var _0x41cff3=_0x5c282f;return _0x1f9119['Cartesian4'][_0x41cff3(0x210)](_0x370ff7['normalOffsetScale'],_0x54d3ba[_0x41cff3(0x1b6)],_0x54d3ba['maximumDistance'],_0x54d3ba['_darkness'],this[_0x41cff3(0x204)]);},'combinedUniforms1':new _0x1f9119['Cartesian4'](),'combinedUniforms2':new _0x1f9119['Cartesian4']()};return _0x1f9119['combine'](_0x49a41e,_0x3b3fdf,![]);}function getShadowReceiveShaderKeyword(_0x3c5f1a,_0x2b3e53,_0x2253bd,_0x555131){var _0x1d0f6c=_0x44f789,_0x31fed7=_0x3c5f1a[_0x1d0f6c(0x15f)],_0x18cbf5=_0x3c5f1a[_0x1d0f6c(0x1a2)],_0xff8bc2=_0x3c5f1a[_0x1d0f6c(0x147)],_0x2d5419=_0x3c5f1a[_0x1d0f6c(0x1e1)],_0x1f387f=_0x3c5f1a['_numberOfCascades']>0x1,_0x19f9c3=_0x3c5f1a[_0x1d0f6c(0x214)],_0x1f31d0=_0x3c5f1a['softShadows'];return _0x1d0f6c(0x1dc)+_0x31fed7+_0x18cbf5+_0xff8bc2+_0x2d5419+_0x1f387f+_0x19f9c3+_0x1f31d0+_0x2b3e53+_0x2253bd+_0x555131;}function createShadowReceiveFragmentShader(_0x54ddc4,_0x1abd25,_0x478f0c,_0x22f995,_0x1a4686){var _0x1b59ec=_0x44f789,_0x1a125e=_0x1f9119[_0x1b59ec(0x15e)][_0x1b59ec(0x130)](_0x54ddc4),_0x3aaf74=!_0x22f995&&_0x1f9119[_0x1b59ec(0x21d)](_0x1a125e)||_0x22f995&&_0x1a4686,_0x5073a0=_0x1f9119['ShaderSource']['findPositionVarying'](_0x54ddc4),_0x287c30=_0x1f9119['defined'](_0x5073a0),_0xe3135b=_0x1abd25[_0x1b59ec(0x15f)],_0x16ca0d=_0x1abd25['_polygonOffsetSupported'],_0x5c7521=_0x1abd25[_0x1b59ec(0x147)],_0x580f6a=_0x1abd25['_isSpotLight'],_0x3deb05=_0x1abd25['_numberOfCascades']>0x1,_0x140172=_0x1abd25[_0x1b59ec(0x214)],_0x430255=_0x1abd25['softShadows'],_0xfde78a=_0x5c7521?_0x1abd25[_0x1b59ec(0x1c3)]:_0x22f995?_0x1abd25[_0x1b59ec(0x195)]:_0x1abd25['_primitiveBias'],_0x51127f=_0x54ddc4['defines']['slice'](0x0),_0x511986=_0x54ddc4[_0x1b59ec(0x213)][_0x1b59ec(0x192)](0x0),_0x5e64c5=_0x511986[_0x1b59ec(0x139)];for(var _0x12eebd=0x0;_0x12eebd<_0x5e64c5;++_0x12eebd){_0x511986[_0x12eebd]=_0x1f9119['ShaderSource']['replaceMain'](_0x511986[_0x12eebd],'czm_shadow_receive_main');}if(_0x5c7521)_0x51127f['push'](_0x1b59ec(0x14b));else _0xe3135b&&_0x51127f['push'](_0x1b59ec(0x1c2));_0x430255&&!_0x5c7521&&_0x51127f['push']('USE_SOFT_SHADOWS');_0x3deb05&&_0x478f0c&&_0x22f995&&(_0x3aaf74?_0x51127f[_0x1b59ec(0x129)](_0x1b59ec(0x164)):_0x51127f[_0x1b59ec(0x129)]('ENABLE_DAYNIGHT_SHADING'));_0x478f0c&&_0xfde78a['normalShading']&&_0x3aaf74&&(_0x51127f['push'](_0x1b59ec(0x12b)),_0xfde78a[_0x1b59ec(0x177)]>0x0&&_0x51127f['push']('USE_NORMAL_SHADING_SMOOTH'));var _0x34f9c9='';_0x5c7521?_0x34f9c9+='uniform\x20samplerCube\x20shadowMap_textureCube;\x20\x0a':_0x34f9c9+='uniform\x20sampler2D\x20shadowMap_texture;\x20\x0a';var _0x3b7b18;_0x287c30?_0x3b7b18='\x20\x20\x20\x20return\x20vec4('+_0x5073a0+_0x1b59ec(0x17c):_0x3b7b18='#ifndef\x20LOG_DEPTH\x20\x0a'+'\x20\x20\x20\x20return\x20czm_windowToEyeCoordinates(gl_FragCoord);\x20\x0a'+'#else\x20\x0a'+'\x20\x20\x20\x20return\x20vec4(v_logPositionEC,\x201.0);\x20\x0a'+_0x1b59ec(0x1b5);_0x34f9c9+=_0x1b59ec(0x1af)+_0x1b59ec(0x20b)+'uniform\x20vec4\x20shadowMap_lightPositionEC;\x20\x0a'+'uniform\x20vec4\x20shadowMap_normalOffsetScaleDistanceMaxDistanceAndDarkness;\x20\x0a'+_0x1b59ec(0x21e)+'#ifdef\x20LOG_DEPTH\x20\x0a'+'in\x20vec3\x20v_logPositionEC;\x20\x0a'+_0x1b59ec(0x1b5)+'vec4\x20getPositionEC()\x20\x0a'+'{\x20\x0a'+_0x3b7b18+'}\x20\x0a'+'vec3\x20getNormalEC()\x20\x0a'+_0x1b59ec(0x1e2)+(_0x3aaf74?'\x20\x20\x20\x20return\x20normalize('+_0x1a125e+_0x1b59ec(0x207):_0x1b59ec(0x230))+'}\x20\x0a'+_0x1b59ec(0x11e)+'{\x20\x0a'+(_0xfde78a[_0x1b59ec(0x233)]&&_0x3aaf74?_0x1b59ec(0x1cd)+_0x1b59ec(0x16c)+'\x20\x20\x20\x20vec3\x20offset\x20=\x20normalOffset\x20*\x20normalOffsetScale\x20*\x20normalEC;\x20\x0a'+'\x20\x20\x20\x20positionEC.xyz\x20+=\x20offset;\x20\x0a':'')+'}\x20\x0a',_0x34f9c9+='void\x20main()\x20\x0a'+'{\x20\x0a'+_0x1b59ec(0x12a)+'\x20\x20\x20\x20vec4\x20positionEC\x20=\x20getPositionEC();\x20\x0a'+_0x1b59ec(0x14e)+'\x20\x20\x20\x20float\x20depth\x20=\x20-positionEC.z;\x20\x0a',_0x34f9c9+=_0x1b59ec(0x13c)+_0x1b59ec(0x15b)+_0x1b59ec(0x1ab)+'\x20\x20\x20\x20shadowParameters.normalShadingSmooth\x20=\x20shadowMap_texelSizeDepthBiasAndNormalShadingSmooth.w;\x20\x0a'+'\x20\x20\x20\x20shadowParameters.darkness\x20=\x20shadowMap_normalOffsetScaleDistanceMaxDistanceAndDarkness.w;\x20\x0a';if(_0x22f995)_0x34f9c9+='\x20\x20\x20\x20shadowParameters.depthBias\x20*=\x20max(depth\x20*\x200.01,\x201.0);\x20\x0a';else!_0x16ca0d&&(_0x34f9c9+='\x20\x20\x20\x20shadowParameters.depthBias\x20*=\x20mix(1.0,\x20100.0,\x20depth\x20*\x200.0015);\x20\x0a');if(_0x5c7521)_0x34f9c9+=_0x1b59ec(0x200)+_0x1b59ec(0x1c4)+'\x20\x20\x20\x20directionEC\x20=\x20normalize(directionEC);\x20\x0a'+_0x1b59ec(0x16d)+_0x1b59ec(0x169)+'\x20\x20\x20\x20if\x20(distance\x20>\x20radius)\x20\x0a'+'\x20\x20\x20\x20{\x20\x0a'+_0x1b59ec(0x144)+'\x20\x20\x20\x20}\x20\x0a'+'\x20\x20\x20\x20vec3\x20directionWC\x20\x20=\x20czm_inverseViewRotation\x20*\x20directionEC;\x20\x0a'+'\x20\x20\x20\x20shadowParameters.depth\x20=\x20distance\x20/\x20radius;\x20\x0a'+_0x1b59ec(0x1a9)+_0x1b59ec(0x206)+'\x20\x20\x20\x20float\x20visibility\x20=\x20czm_shadowVisibility(shadowMap_textureCube,\x20shadowParameters);\x20\x0a';else{if(_0x580f6a)_0x34f9c9+=_0x1b59ec(0x1f0)+_0x1b59ec(0x20a)+_0x1b59ec(0x1d3)+'\x20\x20\x20\x20{\x20\x0a'+_0x1b59ec(0x144)+_0x1b59ec(0x1f2)+_0x1b59ec(0x1f3)+_0x1b59ec(0x128)+'\x20\x20\x20\x20applyNormalOffset(positionEC,\x20normalEC,\x20nDotL);\x20\x0a'+'\x20\x20\x20\x20vec4\x20shadowPosition\x20=\x20shadowMap_matrix\x20*\x20positionEC;\x20\x0a'+'\x20\x20\x20\x20//\x20Spot\x20light\x20uses\x20a\x20perspective\x20projection,\x20so\x20perform\x20the\x20perspective\x20divide\x20\x0a'+_0x1b59ec(0x20e)+'\x20\x20\x20\x20//\x20Stop\x20early\x20if\x20the\x20fragment\x20is\x20not\x20in\x20the\x20shadow\x20bounds\x20\x0a'+'\x20\x20\x20\x20if\x20(any(lessThan(shadowPosition.xyz,\x20vec3(0.0)))\x20||\x20any(greaterThan(shadowPosition.xyz,\x20vec3(1.0))))\x20\x0a'+'\x20\x20\x20\x20{\x20\x0a'+'\x20\x20\x20\x20\x20\x20\x20\x20return;\x20\x0a'+_0x1b59ec(0x1f2)+_0x1b59ec(0x159)+'\x20\x20\x20\x20shadowParameters.depth\x20=\x20shadowPosition.z;\x20\x0a'+'\x20\x20\x20\x20shadowParameters.nDotL\x20=\x20nDotL;\x20\x0a'+_0x1b59ec(0x15a);else _0x3deb05?_0x34f9c9+=_0x1b59ec(0x174)+_0x1b59ec(0x1e3)+_0x1b59ec(0x187)+_0x1b59ec(0x22c)+_0x1b59ec(0x144)+'\x20\x20\x20\x20}\x20\x0a'+'\x20\x20\x20\x20//\x20Get\x20the\x20cascade\x20based\x20on\x20the\x20eye-space\x20depth\x20\x0a'+'\x20\x20\x20\x20vec4\x20weights\x20=\x20czm_cascadeWeights(depth);\x20\x0a'+_0x1b59ec(0x1ea)+'\x20\x20\x20\x20float\x20nDotL\x20=\x20clamp(dot(normalEC,\x20shadowMap_lightDirectionEC),\x200.0,\x201.0);\x20\x0a'+'\x20\x20\x20\x20applyNormalOffset(positionEC,\x20normalEC,\x20nDotL);\x20\x0a'+'\x20\x20\x20\x20//\x20Transform\x20position\x20into\x20the\x20cascade\x20\x0a'+_0x1b59ec(0x141)+_0x1b59ec(0x162)+_0x1b59ec(0x159)+_0x1b59ec(0x154)+_0x1b59ec(0x160)+_0x1b59ec(0x15a)+_0x1b59ec(0x1d8)+'\x20\x20\x20\x20float\x20shadowMapMaximumDistance\x20=\x20shadowMap_normalOffsetScaleDistanceMaxDistanceAndDarkness.z;\x20\x0a'+'\x20\x20\x20\x20float\x20fade\x20=\x20max((depth\x20-\x20shadowMapMaximumDistance\x20*\x200.8)\x20/\x20(shadowMapMaximumDistance\x20*\x200.2),\x200.0);\x20\x0a'+'\x20\x20\x20\x20visibility\x20=\x20mix(visibility,\x201.0,\x20fade);\x20\x0a'+(_0x140172?'\x20\x20\x20\x20//\x20Draw\x20cascade\x20colors\x20for\x20debugging\x20\x0a'+'\x20\x20\x20\x20out_FragColor\x20*=\x20czm_cascadeColor(weights);\x20\x0a':''):_0x34f9c9+=_0x1b59ec(0x22d)+_0x1b59ec(0x1f5)+_0x1b59ec(0x1b7)+'\x20\x20\x20\x20//\x20Stop\x20early\x20if\x20the\x20fragment\x20is\x20not\x20in\x20the\x20shadow\x20bounds\x20\x0a'+_0x1b59ec(0x1e8)+'\x20\x20\x20\x20{\x20\x0a'+_0x1b59ec(0x144)+'\x20\x20\x20\x20}\x20\x0a'+_0x1b59ec(0x159)+_0x1b59ec(0x154)+'\x20\x20\x20\x20shadowParameters.nDotL\x20=\x20nDotL;\x20\x0a'+'\x20\x20\x20\x20float\x20visibility\x20=\x20czm_shadowVisibility(shadowMap_texture,\x20shadowParameters);\x20\x0a';}return _0x34f9c9+=_0x1b59ec(0x1b1)+'\x20\x20\x20{\x0a'+'\x20\x20\x20\x20\x20\x20\x20\x20out_FragColor.rgb\x20*=\x20vec3(0.8,0.0,0.0);\x0a'+'\x20\x20\x20}else{\x0a'+_0x1b59ec(0x215)+'\x20\x20\x20}\x20\x0a\x20'+_0x1b59ec(0x1bb),_0x511986['push'](_0x34f9c9),new _0x1f9119['ShaderSource']({'defines':_0x51127f,'sources':_0x511986});}_0x1f9119[_0x44f789(0x11f)]['createReceiveDerivedCommand']=function(_0xc0561e,_0x142b41,_0x352d81,_0x3356b1,_0x2e7e8a){var _0x355d58=_0x44f789;!_0x1f9119['defined'](_0x2e7e8a)&&(_0x2e7e8a={});var _0x4e1f92=_0xc0561e[_0x355d58(0x139)]>0x0,_0x2302a8=_0x142b41['shaderProgram'],_0x8381fa=_0x2302a8[_0x355d58(0x197)],_0x4525d3=_0x2302a8[_0x355d58(0x132)],_0x36e617=_0x142b41['pass']===_0x1f9119['Pass']['GLOBE'],_0x3db277=![];_0x36e617&&(_0x3db277=_0x142b41[_0x355d58(0x18c)][_0x355d58(0x1ca)][_0x355d58(0x1f7)][_0x355d58(0x155)]['hasVertexNormals']);if(_0x142b41[_0x355d58(0x1bd)]&&_0x4e1f92){var _0x1d2271,_0x351ec6;_0x1f9119[_0x355d58(0x21d)](_0x2e7e8a['receiveCommand'])&&(_0x1d2271=_0x2e7e8a[_0x355d58(0x1ef)][_0x355d58(0x124)],_0x351ec6=_0x2e7e8a['receiveCommand'][_0x355d58(0x151)]);_0x2e7e8a[_0x355d58(0x1ef)]=_0x1f9119[_0x355d58(0x196)]['shallowClone'](_0x142b41,_0x2e7e8a[_0x355d58(0x1ef)]),_0x2e7e8a[_0x355d58(0x16f)]=![],_0x2e7e8a[_0x355d58(0x1bd)]=!![];var _0x1a17d2=_0x2e7e8a[_0x355d58(0x1eb)]!==_0x142b41[_0x355d58(0x16f)],_0x45dec0=_0x2e7e8a['receiveShaderProgramId']!==_0x142b41[_0x355d58(0x124)]['id'];if(!_0x1f9119[_0x355d58(0x21d)](_0x1d2271)||_0x45dec0||_0x352d81||_0x1a17d2){var _0x34adf8;_0xc0561e[0x0][_0x355d58(0x171)]?_0x34adf8=getShadowReceiveShaderKeyword(_0xc0561e[0x0],_0x142b41['castShadows'],_0x36e617,_0x3db277):_0x34adf8=_0x1f9119[_0x355d58(0x1dd)][_0x355d58(0x18e)](_0xc0561e[0x0],_0x142b41[_0x355d58(0x16f)],_0x36e617,_0x3db277);_0x1d2271=_0x3356b1[_0x355d58(0x17e)][_0x355d58(0x153)](_0x2302a8,_0x34adf8);if(!_0x1f9119['defined'](_0x1d2271)){var _0x18ba12=_0x1f9119[_0x355d58(0x1dd)]['createShadowReceiveVertexShader'](_0x8381fa,_0x36e617,_0x3db277),_0x345efa;_0xc0561e[0x0]['isViewShed']?_0x345efa=createShadowReceiveFragmentShader(_0x4525d3,_0xc0561e[0x0],_0x142b41['castShadows'],_0x36e617,_0x3db277):_0x345efa=_0x1f9119[_0x355d58(0x1dd)]['createShadowReceiveFragmentShader'](_0x4525d3,_0xc0561e[0x0],_0x142b41['castShadows'],_0x36e617,_0x3db277),_0x1d2271=_0x3356b1[_0x355d58(0x17e)][_0x355d58(0x229)](_0x2302a8,_0x34adf8,{'vertexShaderSource':_0x18ba12,'fragmentShaderSource':_0x345efa,'attributeLocations':_0x2302a8['_attributeLocations']});}_0x351ec6=combineUniforms(_0xc0561e[0x0],_0x142b41['uniformMap'],_0x36e617);}_0x2e7e8a['receiveCommand'][_0x355d58(0x124)]=_0x1d2271,_0x2e7e8a[_0x355d58(0x1ef)][_0x355d58(0x151)]=_0x351ec6,_0x2e7e8a[_0x355d58(0x20f)]=_0x142b41[_0x355d58(0x124)]['id'],_0x2e7e8a['receiveShaderCastShadows']=_0x142b41['castShadows'];}return _0x2e7e8a;},ViewshedMap['prototype']['isDestroyed']=function(){return![];},ViewshedMap['prototype'][_0x44f789(0x134)]=function(){var _0x4539e4=_0x44f789;destroyFramebuffer(this),this[_0x4539e4(0x173)]=this['_debugLightFrustum']&&this['_debugLightFrustum']['destroy'](),this['_debugCameraFrustum']=this[_0x4539e4(0x219)]&&this[_0x4539e4(0x219)][_0x4539e4(0x134)](),this['_debugShadowViewCommand']=this[_0x4539e4(0x1ba)]&&this['_debugShadowViewCommand']['shaderProgram']&&this['_debugShadowViewCommand'][_0x4539e4(0x124)]['destroy']();for(var _0xb7081e=0x0;_0xb7081e<this['_numberOfCascades'];++_0xb7081e){this['_debugCascadeFrustums'][_0xb7081e]=this[_0x4539e4(0x235)][_0xb7081e]&&this['_debugCascadeFrustums'][_0xb7081e][_0x4539e4(0x134)]();}return _0x1f9119['destroyObject'](this);};export default ViewshedMap;