deeptwins-engine-3d 0.1.76 → 0.2.0

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 (238) 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.d.ts +1 -1
  86. package/dist/esm/drawer/index.js +1 -688
  87. package/dist/esm/drawer/plotUtil.js +1 -266
  88. package/dist/esm/drawer/shape/Assemble.js +1 -415
  89. package/dist/esm/drawer/shape/AttackArrow.js +1 -442
  90. package/dist/esm/drawer/shape/BaseShape.js +1 -383
  91. package/dist/esm/drawer/shape/Bow.js +1 -375
  92. package/dist/esm/drawer/shape/Circle.js +1 -461
  93. package/dist/esm/drawer/shape/Curve.js +1 -386
  94. package/dist/esm/drawer/shape/DragPoint.js +1 -211
  95. package/dist/esm/drawer/shape/Elliptic.js +1 -491
  96. package/dist/esm/drawer/shape/Formation.js +1 -395
  97. package/dist/esm/drawer/shape/PincerArrow.js +1 -445
  98. package/dist/esm/drawer/shape/Point.js +1 -131
  99. package/dist/esm/drawer/shape/Polygon.js +1 -368
  100. package/dist/esm/drawer/shape/Polyline.js +1 -325
  101. package/dist/esm/drawer/shape/RegularPolygon.js +1 -468
  102. package/dist/esm/drawer/shape/RightAngleArrow.js +1 -423
  103. package/dist/esm/drawer/shape/Sector.js +1 -568
  104. package/dist/esm/drawer/shape/StraightArrow.js +1 -422
  105. package/dist/esm/drawer/shape/SwallowtailArrow.js +1 -438
  106. package/dist/esm/drawer/types.js +1 -11
  107. package/dist/esm/drawer/utils.js +1 -381
  108. package/dist/esm/global.css +22 -1
  109. package/dist/esm/graphicLayer/BaseEntity.js +1 -51
  110. package/dist/esm/graphicLayer/BaseLayer.js +1 -730
  111. package/dist/esm/graphicLayer/BasePointPrimitive.js +1 -45
  112. package/dist/esm/graphicLayer/BasePrimitive.js +1 -36
  113. package/dist/esm/graphicLayer/BasePrimitiveInstance.js +1 -37
  114. package/dist/esm/graphicLayer/BaseSource.d.ts +1 -1
  115. package/dist/esm/graphicLayer/BaseSource.js +1 -630
  116. package/dist/esm/graphicLayer/BillboardEntity.js +1 -106
  117. package/dist/esm/graphicLayer/BillboardPrimitive.js +1 -119
  118. package/dist/esm/graphicLayer/BoxEntity.js +1 -99
  119. package/dist/esm/graphicLayer/BoxPrimitive.js +1 -48
  120. package/dist/esm/graphicLayer/BoxPrimitiveInstance.js +1 -91
  121. package/dist/esm/graphicLayer/EllipseEntity.js +1 -110
  122. package/dist/esm/graphicLayer/EllipsePrimitive.js +1 -47
  123. package/dist/esm/graphicLayer/EllipsePrimitiveInstance.js +1 -98
  124. package/dist/esm/graphicLayer/EllipsoidEntity.js +1 -118
  125. package/dist/esm/graphicLayer/EllipsoidPrimitive.js +1 -48
  126. package/dist/esm/graphicLayer/EllipsoidPrimitiveInstance.js +1 -113
  127. package/dist/esm/graphicLayer/GraphicLayerCollection.js +1 -491
  128. package/dist/esm/graphicLayer/HtmlEntity.d.ts +4 -0
  129. package/dist/esm/graphicLayer/HtmlEntity.js +1 -189
  130. package/dist/esm/graphicLayer/LabelEntity.js +1 -110
  131. package/dist/esm/graphicLayer/LabelPrimitive.js +1 -127
  132. package/dist/esm/graphicLayer/ModelEntity.js +1 -122
  133. package/dist/esm/graphicLayer/ModelPrimitive.js +1 -59
  134. package/dist/esm/graphicLayer/ModelPrimitiveInstance.js +1 -86
  135. package/dist/esm/graphicLayer/PointEntity.js +1 -94
  136. package/dist/esm/graphicLayer/PointPrimitive.js +1 -107
  137. package/dist/esm/graphicLayer/PolygonEntity.js +1 -103
  138. package/dist/esm/graphicLayer/PolygonGroundPrimitive.js +1 -49
  139. package/dist/esm/graphicLayer/PolygonGroundPrimitiveImageMaterialInstance.js +1 -87
  140. package/dist/esm/graphicLayer/PolygonPrimitive.js +1 -60
  141. package/dist/esm/graphicLayer/PolygonPrimitiveImageMaterialInstance.js +1 -84
  142. package/dist/esm/graphicLayer/PolygonPrimitiveInstance.js +1 -101
  143. package/dist/esm/graphicLayer/PolylineEntity.js +1 -96
  144. package/dist/esm/graphicLayer/PolylineGroundPrimitive.js +1 -55
  145. package/dist/esm/graphicLayer/PolylineGroundPrimitiveInstance.js +1 -85
  146. package/dist/esm/graphicLayer/PolylinePrimitive.js +1 -53
  147. package/dist/esm/graphicLayer/PolylinePrimitiveInstance.js +1 -85
  148. package/dist/esm/graphicLayer/PolylineVolumeEntity.js +1 -105
  149. package/dist/esm/graphicLayer/PolylineVolumePrimitive.js +1 -47
  150. package/dist/esm/graphicLayer/PolylineVolumePrimitiveInstance.js +1 -94
  151. package/dist/esm/graphicLayer/WallEntity.js +1 -96
  152. package/dist/esm/graphicLayer/WallPrimitive.js +1 -47
  153. package/dist/esm/graphicLayer/WallPrimitiveInstance.js +1 -88
  154. package/dist/esm/index.d.ts +4 -0
  155. package/dist/esm/index.js +1 -175
  156. package/dist/esm/lowAltitude/BarrierLayer.js +1 -172
  157. package/dist/esm/lowAltitude/BaseGridMvtLayer.js +1 -122
  158. package/dist/esm/lowAltitude/FactorLayer.js +1 -199
  159. package/dist/esm/lowAltitude/FlightPlanning.js +1 -411
  160. package/dist/esm/lowAltitude/FlightRiskEvaluation.js +1 -543
  161. package/dist/esm/lowAltitude/GridDraw.js +1 -137
  162. package/dist/esm/lowAltitude/PoiLayer.js +1 -74
  163. package/dist/esm/lowAltitude/RoutePlanning.js +1 -318
  164. package/dist/esm/lowAltitude/VisitLayer.js +1 -180
  165. package/dist/esm/map/Event.js +1 -377
  166. package/dist/esm/map/GroundSkyBox.js +1 -166
  167. package/dist/esm/map/Map.js +1 -881
  168. package/dist/esm/map/Property.js +1 -35
  169. package/dist/esm/material/AtmosphericDispersion.js +1 -569
  170. package/dist/esm/material/GlobalVolumetricCloud.js +1 -377
  171. package/dist/esm/material/VolumeCloud.js +1 -115
  172. package/dist/esm/material/WeatherEffects.js +1 -351
  173. package/dist/esm/material/entity/BaseMaterialProperty.js +1 -51
  174. package/dist/esm/material/entity/CircleWaveMaterialProperty.js +1 -101
  175. package/dist/esm/material/entity/DynamicWallMaterialProperty.js +1 -101
  176. package/dist/esm/material/entity/ImageGlowingMaterialProperty.js +1 -89
  177. package/dist/esm/material/entity/ImageMaterialProperty.js +1 -34
  178. package/dist/esm/material/entity/PolylineTrailLinkMaterialProperty.js +1 -132
  179. package/dist/esm/material/primitive/BaseMaterialAppearance.js +1 -28
  180. package/dist/esm/material/primitive/ImageGlowingMaterialAppearance.js +1 -77
  181. package/dist/esm/material/primitive/ImageMaterialAppearance.js +1 -77
  182. package/dist/esm/measure/Area.js +1 -220
  183. package/dist/esm/measure/BaseDraw.js +1 -105
  184. package/dist/esm/measure/Distance.js +1 -223
  185. package/dist/esm/measure/index.js +1 -266
  186. package/dist/esm/measure/types.js +1 -17
  187. package/dist/esm/measure/utils.js +1 -319
  188. package/dist/esm/particle/BaseParticle.js +1 -196
  189. package/dist/esm/particle/FireParticle.js +1 -65
  190. package/dist/esm/particle/FountainParticle.js +1 -80
  191. package/dist/esm/particle/SmokeParticle.js +1 -65
  192. package/dist/esm/particle/common.js +1 -23
  193. package/dist/esm/particle/index.js +1 -5
  194. package/dist/esm/property/PositionProperty.js +1 -56
  195. package/dist/esm/tileLayer/ArcGisLayer.js +1 -41
  196. package/dist/esm/tileLayer/CustomRasterClipWorkerClient.js +1 -147
  197. package/dist/esm/tileLayer/CustomRasterLayer.js +1 -1136
  198. package/dist/esm/tileLayer/ImageryLayer.js +1 -44
  199. package/dist/esm/tileLayer/MvtVectorLoad.js +1 -1549
  200. package/dist/esm/tileLayer/MvtVectorWorkerClient.js +1 -126
  201. package/dist/esm/tileLayer/RasterLayer.js +1 -23
  202. package/dist/esm/tileLayer/WmsLayer.js +1 -26
  203. package/dist/esm/tileLayer/WmtsLayer.js +1 -23
  204. package/dist/esm/tool/BuildClampedPolygonGrid.js +1 -278
  205. package/dist/esm/tool/Compass.js +1 -282
  206. package/dist/esm/tool/PrimitiveCluster.js +1 -706
  207. package/dist/esm/tool/TimerInterval.js +1 -58
  208. package/dist/esm/tool/common.js +1 -405
  209. package/dist/esm/tool/fetch.js +1 -222
  210. package/dist/esm/tool/heatmap.js +1 -631
  211. package/dist/esm/tool/utils.d.ts +1 -0
  212. package/dist/esm/tool/utils.js +1 -501
  213. package/dist/esm/toolTip/index.js +1 -79
  214. package/dist/esm/videoFusion/BaseVideo.d.ts +7 -0
  215. package/dist/esm/videoFusion/BaseVideo.js +1 -330
  216. package/dist/esm/videoFusion/VideoProject.js +1 -230
  217. package/dist/esm/videoFusion/VideoTexture.js +1 -163
  218. package/dist/esm/visualization/BaseHeatmap.js +1 -271
  219. package/dist/esm/visualization/BoundaryHighlight.d.ts +136 -0
  220. package/dist/esm/visualization/BoundaryHighlight.js +1 -0
  221. package/dist/esm/visualization/DynamicWater.js +1 -289
  222. package/dist/esm/visualization/Frustum.js +1 -248
  223. package/dist/esm/visualization/Heatmap2d.js +1 -97
  224. package/dist/esm/visualization/Heatmap3d.js +1 -281
  225. package/dist/esm/visualization/MigrationEffect.js +1 -397
  226. package/dist/esm/visualization/PointCluster.js +1 -220
  227. package/dist/esm/visualization/RadarScan.js +1 -333
  228. package/dist/esm/visualization/SampledTerrainRiver.d.ts +180 -0
  229. package/dist/esm/visualization/SampledTerrainRiver.js +1 -0
  230. package/dist/esm/visualization/SampledTerrainWater.d.ts +170 -0
  231. package/dist/esm/visualization/SampledTerrainWater.js +1 -0
  232. package/dist/esm/visualization/WindField.d.ts +72 -0
  233. package/dist/esm/visualization/WindField.js +1 -0
  234. package/dist/esm/visualization/windCore.d.ts +161 -0
  235. package/dist/esm/visualization/windCore.js +8 -0
  236. package/dist/umd/deeptwins-engine-3d.min.css +1 -1
  237. package/dist/umd/deeptwins-engine-3d.min.js +1 -1
  238. 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 _0x22700e=_0x28b6;(function(_0x397986,_0x552a44){var _0x4bbee4=_0x28b6,_0x4a07d8=_0x397986();while(!![]){try{var _0x2068f2=parseInt(_0x4bbee4(0x1be))/0x1*(parseInt(_0x4bbee4(0x152))/0x2)+parseInt(_0x4bbee4(0x18a))/0x3*(parseInt(_0x4bbee4(0xd2))/0x4)+-parseInt(_0x4bbee4(0x13c))/0x5*(-parseInt(_0x4bbee4(0xb6))/0x6)+parseInt(_0x4bbee4(0xe2))/0x7+-parseInt(_0x4bbee4(0x1a6))/0x8+parseInt(_0x4bbee4(0xb0))/0x9+parseInt(_0x4bbee4(0x133))/0xa*(-parseInt(_0x4bbee4(0x16e))/0xb);if(_0x2068f2===_0x552a44)break;else _0x4a07d8['push'](_0x4a07d8['shift']());}catch(_0x300b92){_0x4a07d8['push'](_0x4a07d8['shift']());}}}(_0x7731,0x55f99));import*as _0x48e71c from'deeptwins-cesium';function ViewshedMap(_0x45b3c6){var _0x22e3dd=_0x28b6,_0x2cdb46,_0x2b4be2,_0x2459c7,_0x1aa4d0,_0x40c190,_0x466fa5,_0x58e3f8,_0xeface4,_0x5b1344,_0x5c6e7f,_0x591a11;_0x45b3c6=(_0x2cdb46=_0x45b3c6)!==null&&_0x2cdb46!==void 0x0?_0x2cdb46:_0x48e71c[_0x22e3dd(0x178)][_0x22e3dd(0xeb)];var _0x3d1abc=_0x45b3c6['context'];if(!_0x48e71c['defined'](_0x3d1abc))throw new _0x48e71c[(_0x22e3dd(0x168))](_0x22e3dd(0xbb));if(!_0x48e71c['defined'](_0x45b3c6['lightCamera']))throw new _0x48e71c['DeveloperError'](_0x22e3dd(0x1ae));if(_0x48e71c['defined'](_0x45b3c6['numberOfCascades'])&&_0x45b3c6['numberOfCascades']!==0x1&&_0x45b3c6[_0x22e3dd(0x173)]!==0x4)throw new _0x48e71c[(_0x22e3dd(0x168))](_0x22e3dd(0x172));this[_0x22e3dd(0x164)]=(_0x2b4be2=_0x45b3c6['enabled'])!==null&&_0x2b4be2!==void 0x0?_0x2b4be2:!![],this['_softShadows']=(_0x2459c7=_0x45b3c6[_0x22e3dd(0x132)])!==null&&_0x2459c7!==void 0x0?_0x2459c7:![],this[_0x22e3dd(0x1ab)]=(_0x1aa4d0=_0x45b3c6[_0x22e3dd(0x13f)])!==null&&_0x1aa4d0!==void 0x0?_0x1aa4d0:!![],this[_0x22e3dd(0xf6)]=!![],this[_0x22e3dd(0x18b)]=(_0x40c190=_0x45b3c6['fromLightSource'])!==null&&_0x40c190!==void 0x0?_0x40c190:!![],this['darkness']=0x0,this[_0x22e3dd(0x170)]=this['darkness'],this['maximumDistance']=(_0x466fa5=_0x45b3c6['maximumDistance'])!==null&&_0x466fa5!==void 0x0?_0x466fa5:0x1388,this[_0x22e3dd(0xf8)]=![],this[_0x22e3dd(0x11d)]=![],this[_0x22e3dd(0x137)]=!![];var _0x13d391=!![];(_0x48e71c[_0x22e3dd(0x1ac)][_0x22e3dd(0x171)]()||_0x48e71c['FeatureDetection']['isEdge']()||(_0x48e71c['FeatureDetection']['isChrome']()||_0x48e71c['FeatureDetection']['isFirefox']())&&_0x48e71c['FeatureDetection'][_0x22e3dd(0xd1)]()&&!_0x3d1abc['depthTexture'])&&(_0x13d391=![]);this['_polygonOffsetSupported']=_0x13d391,this['_terrainBias']={'polygonOffset':_0x13d391,'polygonOffsetFactor':1.1,'polygonOffsetUnits':0x4,'normalOffset':this['_normalOffset'],'normalOffsetScale':0.5,'normalShading':!![],'normalShadingSmooth':0.3,'depthBias':0.0001},this['_primitiveBias']={'polygonOffset':_0x13d391,'polygonOffsetFactor':1.1,'polygonOffsetUnits':0x4,'normalOffset':this['_normalOffset'],'normalOffsetScale':0.1,'normalShading':!![],'normalShadingSmooth':0.05,'depthBias':0.00002},this['_pointBias']={'polygonOffset':![],'polygonOffsetFactor':1.1,'polygonOffsetUnits':0x4,'normalOffset':this[_0x22e3dd(0x1ab)],'normalOffsetScale':0x0,'normalShading':!![],'normalShadingSmooth':0.1,'depthBias':0.0005},this['_depthAttachment']=undefined,this[_0x22e3dd(0x141)]=undefined,this['_shadowMapMatrix']=new _0x48e71c[(_0x22e3dd(0x121))](),this['_shadowMapTexture']=undefined,this['_lightDirectionEC']=new _0x48e71c['Cartesian3'](),this[_0x22e3dd(0xf9)]=new _0x48e71c['Cartesian4'](),this['_distance']=0x0,this[_0x22e3dd(0xdc)]=_0x45b3c6['lightCamera'],this['_shadowMapCamera']=new ShadowMapCamera(),this['_shadowMapCullingVolume']=undefined,this[_0x22e3dd(0x1c6)]=undefined,this[_0x22e3dd(0x196)]=(_0x58e3f8=_0x45b3c6[_0x22e3dd(0x197)])!==null&&_0x58e3f8!==void 0x0?_0x58e3f8:new _0x48e71c['BoundingSphere'](),this['_isPointLight']=(_0xeface4=_0x45b3c6[_0x22e3dd(0x1ba)])!==null&&_0xeface4!==void 0x0?_0xeface4:![],this[_0x22e3dd(0x188)]=(_0x5b1344=_0x45b3c6[_0x22e3dd(0x159)])!==null&&_0x5b1344!==void 0x0?_0x5b1344:0x64,this['_cascadesEnabled']=![],this['_numberOfCascades']=!this[_0x22e3dd(0xba)]?0x0:(_0x5c6e7f=_0x45b3c6['numberOfCascades'])!==null&&_0x5c6e7f!==void 0x0?_0x5c6e7f:0x4,this[_0x22e3dd(0x139)]=!![],this[_0x22e3dd(0x19e)]=[0x19,0x96,0x2bc,Number['MAX_VALUE']],this['_textureSize']=new _0x48e71c[(_0x22e3dd(0xf4))](),this['_isSpotLight']=![];if(this['_cascadesEnabled'])this[_0x22e3dd(0x1b9)][_0x22e3dd(0x106)]=new _0x48e71c[(_0x22e3dd(0x127))]();else _0x48e71c['defined'](this['_lightCamera']['frustum'][_0x22e3dd(0xbd)])&&(this[_0x22e3dd(0x176)]=!![]);this[_0x22e3dd(0xdf)]=[new _0x48e71c[(_0x22e3dd(0x12e))](),new _0x48e71c[(_0x22e3dd(0x12e))]()],this['_cascadeMatrices']=[new _0x48e71c['Matrix4'](),new _0x48e71c[(_0x22e3dd(0x121))](),new _0x48e71c['Matrix4'](),new _0x48e71c['Matrix4']()],this['_cascadeDistances']=new _0x48e71c['Cartesian4']();var _0x49d246;if(this['_isPointLight'])_0x49d246=0x6;else!this[_0x22e3dd(0xba)]?_0x49d246=0x1:_0x49d246=this['_numberOfCascades'];this['_passes']=new Array(_0x49d246);for(var _0x588208=0x0;_0x588208<_0x49d246;++_0x588208){this[_0x22e3dd(0xff)][_0x588208]=new ShadowPass(_0x3d1abc);}this['debugShow']=![],this['debugFreezeFrame']=![],this[_0x22e3dd(0xe5)]=![],this[_0x22e3dd(0x194)]=![],this['_debugLightFrustum']=undefined,this[_0x22e3dd(0x1b7)]=undefined,this[_0x22e3dd(0xb8)]=new Array(this[_0x22e3dd(0xc7)]),this['_debugShadowViewCommand']=undefined,this['_usesDepthTexture']=_0x3d1abc['depthTexture'],this[_0x22e3dd(0xc0)]&&(this[_0x22e3dd(0x108)]=![]),this['_primitiveRenderState']=undefined,this['_terrainRenderState']=undefined,this[_0x22e3dd(0xbc)]=undefined,createRenderStates(this),this[_0x22e3dd(0x130)]=new _0x48e71c['ClearCommand']({'depth':0x1,'color':new _0x48e71c[(_0x22e3dd(0x158))]()}),this['_clearPassState']=new _0x48e71c[(_0x22e3dd(0x145))](_0x3d1abc),this[_0x22e3dd(0x190)]=(_0x591a11=_0x45b3c6[_0x22e3dd(0x135)])!==null&&_0x591a11!==void 0x0?_0x591a11:0x800,this['size']=this[_0x22e3dd(0x190)];}ViewshedMap['MAXIMUM_DISTANCE']=0x4e20;function ShadowPass(_0x14c582){var _0x1c0bf1=_0x28b6;this[_0x1c0bf1(0xdd)]=new ShadowMapCamera(),this['passState']=new _0x48e71c[(_0x1c0bf1(0x145))](_0x14c582),this[_0x1c0bf1(0x123)]=undefined,this[_0x1c0bf1(0x10b)]=undefined,this['commandList']=[],this['cullingVolume']=undefined;}function createRenderState(_0x519b02,_0xdb2b0f){var _0x3f088e=_0x28b6;return _0x48e71c[_0x3f088e(0x1a3)]['fromCache']({'cull':{'enabled':!![],'face':_0x48e71c[_0x3f088e(0xc9)]['BACK']},'depthTest':{'enabled':!![]},'colorMask':{'red':_0x519b02,'green':_0x519b02,'blue':_0x519b02,'alpha':_0x519b02},'depthMask':!![],'polygonOffset':{'enabled':_0xdb2b0f['polygonOffset'],'factor':_0xdb2b0f['polygonOffsetFactor'],'units':_0xdb2b0f[_0x3f088e(0x14d)]}});}function createRenderStates(_0x38a098){var _0xdccf5c=_0x28b6,_0x2aeb48=!_0x38a098[_0xdccf5c(0x108)];_0x38a098['_primitiveRenderState']=createRenderState(_0x2aeb48,_0x38a098[_0xdccf5c(0x18c)]),_0x38a098[_0xdccf5c(0x1bc)]=createRenderState(_0x2aeb48,_0x38a098['_terrainBias']),_0x38a098['_pointRenderState']=createRenderState(_0x2aeb48,_0x38a098['_pointBias']);}ViewshedMap[_0x22700e(0xfd)][_0x22700e(0x134)]=function(){createRenderStates(this);},Object['defineProperties'](ViewshedMap[_0x22700e(0xfd)],{'enabled':{'get':function get(){return this['_enabled'];},'set':function set(_0x420a4a){var _0x5c6b9b=_0x22700e;this[_0x5c6b9b(0xf6)]=this[_0x5c6b9b(0x164)]!==_0x420a4a,this[_0x5c6b9b(0x164)]=_0x420a4a;}},'isViewShed':{'get':function get(){return!![];}},'normalOffset':{'get':function get(){var _0x521b88=_0x22700e;return this[_0x521b88(0x1ab)];},'set':function set(_0x53ca7b){var _0x1f856b=_0x22700e;this['dirty']=this[_0x1f856b(0x1ab)]!==_0x53ca7b,this['_normalOffset']=_0x53ca7b,this[_0x1f856b(0xef)][_0x1f856b(0x13f)]=_0x53ca7b,this['_primitiveBias'][_0x1f856b(0x13f)]=_0x53ca7b,this[_0x1f856b(0xd4)]['normalOffset']=_0x53ca7b;}},'softShadows':{'get':function get(){var _0x8697e6=_0x22700e;return this[_0x8697e6(0x11f)];},'set':function set(_0x3414e3){var _0x435ce6=_0x22700e;this[_0x435ce6(0xf6)]=this[_0x435ce6(0x11f)]!==_0x3414e3,this['_softShadows']=_0x3414e3;}},'size':{'get':function get(){var _0x3dc19d=_0x22700e;return this[_0x3dc19d(0x190)];},'set':function set(_0x43ad1f){resize(this,_0x43ad1f);}},'outOfView':{'get':function get(){return this['_outOfView'];}},'shadowMapCullingVolume':{'get':function get(){var _0x1cb7d2=_0x22700e;return this[_0x1cb7d2(0x192)];}},'passes':{'get':function get(){var _0x3982a8=_0x22700e;return this[_0x3982a8(0xff)];}},'isPointLight':{'get':function get(){var _0x566f63=_0x22700e;return this[_0x566f63(0xc0)];}},'debugCascadeColors':{'get':function get(){return this['_debugCascadeColors'];},'set':function set(_0x575393){var _0x2ce5a6=_0x22700e;this[_0x2ce5a6(0xf6)]=this[_0x2ce5a6(0x194)]!==_0x575393,this[_0x2ce5a6(0x194)]=_0x575393;}}});function destroyFramebuffer(_0x506424){var _0x2c1fe3=_0x22700e,_0x79a9dc=_0x506424[_0x2c1fe3(0xff)]['length'];for(var _0x4307fd=0x0;_0x4307fd<_0x79a9dc;++_0x4307fd){var _0x34cf0d=_0x506424[_0x2c1fe3(0xff)][_0x4307fd],_0x49b0a8=_0x34cf0d[_0x2c1fe3(0x123)];_0x48e71c['defined'](_0x49b0a8)&&!_0x49b0a8[_0x2c1fe3(0x17a)]()&&_0x49b0a8[_0x2c1fe3(0x163)](),_0x34cf0d['framebuffer']=undefined;}_0x506424[_0x2c1fe3(0xcf)]=_0x506424[_0x2c1fe3(0xcf)]&&_0x506424['_depthAttachment'][_0x2c1fe3(0x163)](),_0x506424[_0x2c1fe3(0x141)]=_0x506424[_0x2c1fe3(0x141)]&&_0x506424['_colorAttachment'][_0x2c1fe3(0x163)]();}function createSampler(){var _0x169e7f=_0x22700e;return new _0x48e71c['Sampler']({'wrapS':_0x48e71c['TextureWrap'][_0x169e7f(0x1c1)],'wrapT':_0x48e71c[_0x169e7f(0x185)]['CLAMP_TO_EDGE'],'minificationFilter':_0x48e71c['TextureMinificationFilter']['NEAREST'],'magnificationFilter':_0x48e71c['TextureMagnificationFilter']['NEAREST']});}function createFramebufferColor(_0x24c87a,_0x33fc51){var _0x5229d8=_0x22700e,_0x5aa702=new _0x48e71c[(_0x5229d8(0x18e))]({'context':_0x33fc51,'width':_0x24c87a[_0x5229d8(0x187)]['x'],'height':_0x24c87a['_textureSize']['y'],'format':_0x48e71c['RenderbufferFormat'][_0x5229d8(0x12a)]}),_0x5b208a=new _0x48e71c['Texture']({'context':_0x33fc51,'width':_0x24c87a['_textureSize']['x'],'height':_0x24c87a['_textureSize']['y'],'pixelFormat':_0x48e71c[_0x5229d8(0x15e)]['RGBA'],'pixelDatatype':_0x48e71c[_0x5229d8(0xe6)]['UNSIGNED_BYTE'],'sampler':createSampler()}),_0x4fe318=new _0x48e71c['Framebuffer']({'context':_0x33fc51,'depthRenderbuffer':_0x5aa702,'colorTextures':[_0x5b208a],'destroyAttachments':![]}),_0x56b38=_0x24c87a['_passes']['length'];for(var _0xaf42f7=0x0;_0xaf42f7<_0x56b38;++_0xaf42f7){var _0x4ee988=_0x24c87a[_0x5229d8(0xff)][_0xaf42f7];_0x4ee988['framebuffer']=_0x4fe318,_0x4ee988['passState']['framebuffer']=_0x4fe318;}_0x24c87a['_shadowMapTexture']=_0x5b208a,_0x24c87a['_depthAttachment']=_0x5aa702,_0x24c87a['_colorAttachment']=_0x5b208a;}function createFramebufferDepth(_0x441ace,_0x1eda55){var _0x3f8a81=_0x22700e,_0x594b0f=new _0x48e71c['Texture']({'context':_0x1eda55,'width':_0x441ace[_0x3f8a81(0x187)]['x'],'height':_0x441ace['_textureSize']['y'],'pixelFormat':_0x48e71c['PixelFormat'][_0x3f8a81(0x15c)],'pixelDatatype':_0x48e71c[_0x3f8a81(0xe6)][_0x3f8a81(0x165)],'sampler':createSampler()}),_0x1a224c=new _0x48e71c[(_0x3f8a81(0xf5))]({'context':_0x1eda55,'depthStencilTexture':_0x594b0f,'destroyAttachments':![]}),_0x46989d=_0x441ace[_0x3f8a81(0xff)]['length'];for(var _0x1a231=0x0;_0x1a231<_0x46989d;++_0x1a231){var _0x297fc7=_0x441ace['_passes'][_0x1a231];_0x297fc7[_0x3f8a81(0x123)]=_0x1a224c,_0x297fc7[_0x3f8a81(0x180)][_0x3f8a81(0x123)]=_0x1a224c;}_0x441ace[_0x3f8a81(0x17b)]=_0x594b0f,_0x441ace['_depthAttachment']=_0x594b0f;}function createFramebufferCube(_0x3613eb,_0x5bc2e6){var _0x365ea2=_0x22700e,_0x22c408=new _0x48e71c[(_0x365ea2(0x18e))]({'context':_0x5bc2e6,'width':_0x3613eb[_0x365ea2(0x187)]['x'],'height':_0x3613eb['_textureSize']['y'],'format':_0x48e71c['RenderbufferFormat']['DEPTH_COMPONENT16']}),_0x3dbf72=new _0x48e71c['CubeMap']({'context':_0x5bc2e6,'width':_0x3613eb['_textureSize']['x'],'height':_0x3613eb[_0x365ea2(0x187)]['y'],'pixelFormat':_0x48e71c['PixelFormat']['RGBA'],'pixelDatatype':_0x48e71c[_0x365ea2(0xe6)]['UNSIGNED_BYTE'],'sampler':createSampler()}),_0x462613=[_0x3dbf72[_0x365ea2(0x148)],_0x3dbf72[_0x365ea2(0xf7)],_0x3dbf72['negativeZ'],_0x3dbf72['positiveX'],_0x3dbf72['positiveY'],_0x3dbf72['positiveZ']];for(var _0x6fd7c5=0x0;_0x6fd7c5<0x6;++_0x6fd7c5){var _0x1fee8a=new _0x48e71c[(_0x365ea2(0xf5))]({'context':_0x5bc2e6,'depthRenderbuffer':_0x22c408,'colorTextures':[_0x462613[_0x6fd7c5]],'destroyAttachments':![]}),_0x37f9ec=_0x3613eb[_0x365ea2(0xff)][_0x6fd7c5];_0x37f9ec['framebuffer']=_0x1fee8a,_0x37f9ec[_0x365ea2(0x180)][_0x365ea2(0x123)]=_0x1fee8a;}_0x3613eb[_0x365ea2(0x17b)]=_0x3dbf72,_0x3613eb['_depthAttachment']=_0x22c408,_0x3613eb['_colorAttachment']=_0x3dbf72;}function createFramebuffer(_0xa9d484,_0x33c2b1){if(_0xa9d484['_isPointLight'])createFramebufferCube(_0xa9d484,_0x33c2b1);else _0xa9d484['_usesDepthTexture']?createFramebufferDepth(_0xa9d484,_0x33c2b1):createFramebufferColor(_0xa9d484,_0x33c2b1);}function checkFramebuffer(_0x136de1,_0x202d3a){var _0x54cb26=_0x22700e;_0x136de1['_usesDepthTexture']&&_0x136de1['_passes'][0x0]['framebuffer'][_0x54cb26(0x122)]!==_0x48e71c['WebGLConstants'][_0x54cb26(0x13e)]&&(_0x136de1[_0x54cb26(0x108)]=![],createRenderStates(_0x136de1),destroyFramebuffer(_0x136de1),createFramebuffer(_0x136de1,_0x202d3a));}function updateFramebuffer(_0x3872f9,_0x13d634){var _0x190ae6=_0x22700e;(!_0x48e71c[_0x190ae6(0x150)](_0x3872f9['_passes'][0x0]['framebuffer'])||_0x3872f9['_shadowMapTexture'][_0x190ae6(0xaf)]!==_0x3872f9['_textureSize']['x'])&&(destroyFramebuffer(_0x3872f9),createFramebuffer(_0x3872f9,_0x13d634),checkFramebuffer(_0x3872f9,_0x13d634),clearFramebuffer(_0x3872f9,_0x13d634));}function clearFramebuffer(_0x2eb004,_0xdb50ee,_0x49030e){var _0x4a7ad1=_0x22700e,_0x17e6d7;_0x49030e=(_0x17e6d7=_0x49030e)!==null&&_0x17e6d7!==void 0x0?_0x17e6d7:0x0,(_0x2eb004['_isPointLight']||_0x49030e===0x0)&&(_0x2eb004[_0x4a7ad1(0x130)][_0x4a7ad1(0x123)]=_0x2eb004['_passes'][_0x49030e][_0x4a7ad1(0x123)],_0x2eb004[_0x4a7ad1(0x130)]['execute'](_0xdb50ee,_0x2eb004['_clearPassState']));}function resize(_0x202b13,_0x29de0a){var _0x5cf23a=_0x22700e;_0x202b13['_size']=_0x29de0a;var _0xb065b9=_0x202b13['_passes'],_0x14e6f1=_0xb065b9[_0x5cf23a(0x162)],_0x2f8432=_0x202b13['_textureSize'];if(_0x202b13[_0x5cf23a(0xc0)]){_0x29de0a=_0x48e71c['ContextLimits'][_0x5cf23a(0x146)]>=_0x29de0a?_0x29de0a:_0x48e71c[_0x5cf23a(0xc6)][_0x5cf23a(0x146)],_0x2f8432['x']=_0x29de0a,_0x2f8432['y']=_0x29de0a;var _0x12e4e7=new _0x48e71c['BoundingRectangle'](0x0,0x0,_0x29de0a,_0x29de0a);_0xb065b9[0x0]['passState']['viewport']=_0x12e4e7,_0xb065b9[0x1]['passState']['viewport']=_0x12e4e7,_0xb065b9[0x2][_0x5cf23a(0x180)][_0x5cf23a(0x138)]=_0x12e4e7,_0xb065b9[0x3]['passState'][_0x5cf23a(0x138)]=_0x12e4e7,_0xb065b9[0x4][_0x5cf23a(0x180)][_0x5cf23a(0x138)]=_0x12e4e7,_0xb065b9[0x5][_0x5cf23a(0x180)]['viewport']=_0x12e4e7;}else{if(_0x14e6f1===0x1)_0x29de0a=_0x48e71c['ContextLimits'][_0x5cf23a(0x129)]>=_0x29de0a?_0x29de0a:_0x48e71c['ContextLimits']['maximumTextureSize'],_0x2f8432['x']=_0x29de0a,_0x2f8432['y']=_0x29de0a,_0xb065b9[0x0][_0x5cf23a(0x180)]['viewport']=new _0x48e71c[(_0x5cf23a(0x167))](0x0,0x0,_0x29de0a,_0x29de0a);else _0x14e6f1===0x4&&(_0x29de0a=_0x48e71c['ContextLimits'][_0x5cf23a(0x129)]>=_0x29de0a*0x2?_0x29de0a:_0x48e71c['ContextLimits'][_0x5cf23a(0x129)]/0x2,_0x2f8432['x']=_0x29de0a*0x2,_0x2f8432['y']=_0x29de0a*0x2,_0xb065b9[0x0][_0x5cf23a(0x180)][_0x5cf23a(0x138)]=new _0x48e71c['BoundingRectangle'](0x0,0x0,_0x29de0a,_0x29de0a),_0xb065b9[0x1][_0x5cf23a(0x180)]['viewport']=new _0x48e71c[(_0x5cf23a(0x167))](_0x29de0a,0x0,_0x29de0a,_0x29de0a),_0xb065b9[0x2][_0x5cf23a(0x180)]['viewport']=new _0x48e71c[(_0x5cf23a(0x167))](0x0,_0x29de0a,_0x29de0a,_0x29de0a),_0xb065b9[0x3][_0x5cf23a(0x180)][_0x5cf23a(0x138)]=new _0x48e71c['BoundingRectangle'](_0x29de0a,_0x29de0a,_0x29de0a,_0x29de0a));}_0x202b13['_clearPassState']['viewport']=new _0x48e71c['BoundingRectangle'](0x0,0x0,_0x2f8432['x'],_0x2f8432['y']);for(var _0x6c8443=0x0;_0x6c8443<_0x14e6f1;++_0x6c8443){var _0x5b34ca=_0xb065b9[_0x6c8443],_0x19d2d3=_0x5b34ca['passState'][_0x5cf23a(0x138)],_0x56f108=_0x19d2d3['x']/_0x2f8432['x'],_0x5e1e95=_0x19d2d3['y']/_0x2f8432['y'],_0x26c4a7=_0x19d2d3['width']/_0x2f8432['x'],_0x10865f=_0x19d2d3['height']/_0x2f8432['y'];_0x5b34ca[_0x5cf23a(0x10b)]=new _0x48e71c['Matrix4'](_0x26c4a7,0x0,0x0,_0x56f108,0x0,_0x10865f,0x0,_0x5e1e95,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x1);}}var scratchViewport=new _0x48e71c[(_0x22700e(0x167))]();function createDebugShadowViewCommand(_0x6516cf,_0x192c81){var _0x58da1b=_0x22700e,_0x388f95;_0x6516cf[_0x58da1b(0xc0)]?_0x388f95='uniform\x20samplerCube\x20shadowMap_textureCube;\x20\x0a'+'in\x20vec2\x20v_textureCoordinates;\x20\x0a'+'void\x20main()\x20\x0a'+_0x58da1b(0x110)+'\x20\x20\x20\x20vec2\x20uv\x20=\x20v_textureCoordinates;\x20\x0a'+_0x58da1b(0x12c)+'\x20\x0a'+'\x20\x20\x20\x20if\x20(uv.y\x20<\x200.5)\x20\x0a'+'\x20\x20\x20\x20{\x20\x0a'+'\x20\x20\x20\x20\x20\x20\x20\x20if\x20(uv.x\x20<\x200.333)\x20\x0a'+'\x20\x20\x20\x20\x20\x20\x20\x20{\x20\x0a'+_0x58da1b(0x1a1)+_0x58da1b(0xee)+'\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20dir.z\x20=\x20uv.y\x20*\x204.0\x20-\x201.0;\x20\x0a'+'\x20\x20\x20\x20\x20\x20\x20\x20}\x20\x0a'+_0x58da1b(0x109)+'\x20\x20\x20\x20\x20\x20\x20\x20{\x20\x0a'+'\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20dir.y\x20=\x20-1.0;\x20\x0a'+'\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20dir.x\x20=\x20uv.x\x20*\x206.0\x20-\x203.0;\x20\x0a'+_0x58da1b(0xf0)+'\x20\x20\x20\x20\x20\x20\x20\x20}\x20\x0a'+_0x58da1b(0xde)+'\x20\x20\x20\x20\x20\x20\x20\x20{\x20\x0a'+'\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20dir.z\x20=\x20-1.0;\x20\x0a'+'\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20dir.x\x20=\x20uv.x\x20*\x206.0\x20-\x205.0;\x20\x0a'+_0x58da1b(0x1c3)+_0x58da1b(0x1a7)+'\x20\x20\x20\x20}\x20\x0a'+'\x20\x20\x20\x20else\x20\x0a'+_0x58da1b(0x117)+'\x20\x20\x20\x20\x20\x20\x20\x20if\x20(uv.x\x20<\x200.333)\x20\x0a'+'\x20\x20\x20\x20\x20\x20\x20\x20{\x20\x0a'+_0x58da1b(0xc2)+_0x58da1b(0xee)+_0x58da1b(0x199)+_0x58da1b(0x1a7)+'\x20\x20\x20\x20\x20\x20\x20\x20else\x20if\x20(uv.x\x20<\x200.666)\x20\x0a'+_0x58da1b(0x175)+'\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20dir.y\x20=\x201.0;\x20\x0a'+'\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20dir.x\x20=\x20uv.x\x20*\x206.0\x20-\x203.0;\x20\x0a'+'\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20dir.z\x20=\x20uv.y\x20*\x204.0\x20-\x203.0;\x20\x0a'+'\x20\x20\x20\x20\x20\x20\x20\x20}\x20\x0a'+'\x20\x20\x20\x20\x20\x20\x20\x20else\x20\x0a'+_0x58da1b(0x175)+_0x58da1b(0x1c4)+_0x58da1b(0xec)+'\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20dir.y\x20=\x20uv.y\x20*\x204.0\x20-\x203.0;\x20\x0a'+'\x20\x20\x20\x20\x20\x20\x20\x20}\x20\x0a'+'\x20\x20\x20\x20}\x20\x0a'+'\x20\x0a'+_0x58da1b(0xd9)+'\x20\x20\x20\x20out_FragColor\x20=\x20vec4(vec3(shadow),\x201.0);\x20\x0a'+'}\x20\x0a':_0x388f95='uniform\x20sampler2D\x20shadowMap_texture;\x20\x0a'+_0x58da1b(0xed)+_0x58da1b(0x19b)+'{\x20\x0a'+(_0x6516cf[_0x58da1b(0x108)]?_0x58da1b(0xfe):'\x20\x20\x20\x20float\x20shadow\x20=\x20czm_unpackDepth(texture2D(shadowMap_texture,\x20v_textureCoordinates));\x20\x0a')+_0x58da1b(0x147)+_0x58da1b(0xc1);var _0x4784af=_0x192c81[_0x58da1b(0xb4)](_0x388f95,{'uniformMap':{'shadowMap_texture':function _0x413c29(){return _0x6516cf['_shadowMapTexture'];},'shadowMap_textureCube':function _0x28c0a5(){var _0x27f764=_0x58da1b;return _0x6516cf[_0x27f764(0x17b)];}}});return _0x4784af[_0x58da1b(0xc3)]=_0x48e71c[_0x58da1b(0xce)]['OVERLAY'],_0x4784af;}function updateDebugShadowViewCommand(_0x4c01aa,_0x5b6f8c){var _0x5304e8=_0x22700e,_0x44603a=_0x5b6f8c[_0x5304e8(0x1c5)],_0x36f59b=_0x5b6f8c['context']['drawingBufferWidth'],_0x2afcf2=_0x5b6f8c['context'][_0x5304e8(0x155)],_0x5205be=Math[_0x5304e8(0x11c)](_0x36f59b,_0x2afcf2)*0.3,_0x56507c=scratchViewport;_0x56507c['x']=_0x36f59b-_0x5205be,_0x56507c['y']=0x0,_0x56507c['width']=_0x5205be,_0x56507c[_0x5304e8(0x1c7)]=_0x5205be;var _0x65ac39=_0x4c01aa[_0x5304e8(0x14a)];!_0x48e71c[_0x5304e8(0x150)](_0x65ac39)&&(_0x65ac39=createDebugShadowViewCommand(_0x4c01aa,_0x44603a),_0x4c01aa['_debugShadowViewCommand']=_0x65ac39),(!_0x48e71c[_0x5304e8(0x150)](_0x65ac39[_0x5304e8(0x18f)])||!_0x48e71c['BoundingRectangle']['equals'](_0x65ac39[_0x5304e8(0x18f)]['viewport'],_0x56507c))&&(_0x65ac39['renderState']=_0x48e71c['RenderState']['fromCache']({'viewport':_0x48e71c[_0x5304e8(0x167)]['clone'](_0x56507c)})),_0x5b6f8c['commandList'][_0x5304e8(0x11a)](_0x4c01aa[_0x5304e8(0x14a)]);}var frustumCornersNDC=new Array(0x8);frustumCornersNDC[0x0]=new _0x48e71c['Cartesian4'](-0x1,-0x1,-0x1,0x1),frustumCornersNDC[0x1]=new _0x48e71c[(_0x22700e(0x12e))](0x1,-0x1,-0x1,0x1),frustumCornersNDC[0x2]=new _0x48e71c['Cartesian4'](0x1,0x1,-0x1,0x1),frustumCornersNDC[0x3]=new _0x48e71c[(_0x22700e(0x12e))](-0x1,0x1,-0x1,0x1),frustumCornersNDC[0x4]=new _0x48e71c[(_0x22700e(0x12e))](-0x1,-0x1,0x1,0x1),frustumCornersNDC[0x5]=new _0x48e71c['Cartesian4'](0x1,-0x1,0x1,0x1),frustumCornersNDC[0x6]=new _0x48e71c['Cartesian4'](0x1,0x1,0x1,0x1),frustumCornersNDC[0x7]=new _0x48e71c['Cartesian4'](-0x1,0x1,0x1,0x1);var scratchMatrix=new _0x48e71c[(_0x22700e(0x121))](),scratchFrustumCorners=new Array(0x8);function _0x7731(){var _0x8bc901=['Dw5PzM9YBsb2zwm0ihnOywrVD01HCf9SAwDODfbVC2L0Aw9Urum7iaO','zhjHD2LUz0j1zMzLCKHLAwDODa','icaGigLMicHHBNKOBgvZC1rOyw4OC2HHzg93ug9ZAxrPB24UEhL6lcb2zwmZkdaUmcKPksb8FcbHBNKOz3jLyxrLCLrOyw4OC2HHzg93ug9ZAxrPB24UEhL6lcb2zwmZkdeUmcKPksKGcG','ru5bqKXfx0rbwu5jr0Hux1niqurjtKC','q29SB3i','Cg9PBNrmAwDODfjHzgL1CW','uxvHDgvYBMLVBG','icaGig91Df9gCMfNq29SB3iGkJ0Gy3PTx2nHC2nHzgvdB2XVCIH3zwLNAhrZktSGcG','revqveHFu1rftKnjta','CMLNAhrxqW','ugL4zwXgB3jTyxq','ChjVAMvJDgLVBK1HDhjPEa','CMfKAxvZ','r0XpqKu','BgvUz3rO','zgvZDhjVEq','x2vUywjSzwq','vu5tsuDorurFsu5uxZi0xZG','Bwf4','qM91BMrPBMDszwn0yw5NBgu','rgv2zwXVCgvYrxjYB3i','yM90Dg9T','icaGihnOywrVD1bHCMfTzxrLCNmUzgvWDgHcAwfZicO9ig1PEcGXlJaSideWmc4WlcbKzxb0AcaQidaUmdaXnsK7iaO','DxbxqW','zNjVBuvSzw1LBNrZ','yxnWzwn0uMf0Aw8','ntvVzMTxB2m','Fsakia','x2rHCMTUzxnZ','AxnjBNrLCM5LDev4CgXVCMvY','t25SEsbVBMuGB3iGzM91CIbJyxnJywrLCYbHCMuGC3vWCg9YDgvKlG','BNvTyMvYt2zdyxnJywrLCW','BM9YBwfSu2HHzgLUzW','icaGicaGicb7iaO','x2LZu3bVDeXPz2H0','q2fYDg9NCMfWAgLJ','zgvMyxvSDfzHBhvL','icaGFsakia','Axnezxn0CM95zwq','x3nOywrVD01HCfrLEhr1CMu','x2XPz2H0rgLYzwn0Aw9Urum','BgvYCa','x3nOywrVD01HCe1HDhjPEa','x2nHC2nHzgveAxn0yw5Jzxm','CgfZC1n0yxrL','Cg9ZAxrPB25dyxj0B2DYyxbOAwm','C2XPy2u','DM9PzcbHChbSEu5VCM1HBe9MzNnLDcHPBM91Dcb2zwm0ihbVC2L0Aw9UrumSihzLyZmGBM9YBwfSrumSigzSB2f0ig5eB3rmksak','uKve','vgv4DhvYzvDYyxa','icaGihjLDhvYBIbJEM1FD2LUzg93vg9fEwvdB29YzgLUyxrLCYHNBf9gCMfNq29VCMqPoYak','x3rLEhr1CMvtAxPL','x3bVAw50tgLNAhrsywrPDxm','qM94t3v0BgLUzuDLB21LDhj5','ntmZoteZC3rVu1H1','zNjVBuXPz2H0u291CMnL','x3bYAw1PDgL2zujPyxm','DMvYDgv4u2HHzgvYu291CMnL','uMvUzgvYyNvMzMvY','CMvUzgvYu3rHDgu','x3nPEMu','y2fYDgvZAwfUvg9dyxj0B2DYyxbOAwm','x3nOywrVD01HCen1BgXPBMDwB2X1Bwu','zgvIDwDgCMvLEMvgCMfTzq','x2rLyNvNq2fZy2fKzunVBg9YCW','y2XVBMu','x2jVDw5KAw5Nu3bOzxjL','yM91BMrPBMDtCgHLCMu','icaGihbVC2L0Aw9UrumUEhL6icS9ig9MzNnLDdSGcG','icaGicaGicaGicaGzgLYlNOGpsb1DI55icOGnc4Wic0GmY4WoYak','DxbKyxrL','DM9PzcbTywLUkcKGcG','zMLUzfbVC2L0Aw9UvMfYEwLUzW','zgvZDhjVEu9IAMvJDa','x21HEgLTDw1dyxnJywrLrgLZDgfUy2vZ','u2HHzgvYu291CMnL','CMvJzwL2zvnOywrVD3m','icaGicaGicaGicaGzgLYlNGGpsaTms4WoYak','BxvSDgLWBhLcEvbVAw50','uMvUzgvYu3rHDgu','icaGihzLyZqGCg9ZAxrPB25fqYa9igDLDfbVC2L0Aw9UrumOktSGcG','icaGign6Bv9ZAgfKB3DFCMvJzwL2zv9TywLUkcK7iaO','ndK5mduYmfjjB2nOsW','icaGicaGicb9iaO','icaGihzLyZmGzgLYzwn0Aw9Uv0mGid0Gy3PTx2LUDMvYC2vwAwv3uM90yxrPB24GkIbKAxjLy3rPB25fqZSGcG','icaGicaGicbYzxr1CM47iaO','icaGihnOywrVD1bHCMfTzxrLCNmUzgvWDgHcAwfZicO9ig1HEcHKzxb0AcaQidaUmdeSideUmcK7iaO','x25VCM1HBe9MzNnLDa','rMvHDhvYzurLDgvJDgLVBG','rhjHD0nVBw1HBMq','BgLNAhrdyw1LCMeGAxmGCMvXDwLYzwqU','y2fZDfnOywrVD3m','icaGigLMicHKAxn0yw5Jzsa+ihnOywrVD01HCf9UB3jTywXpzMzZzxrty2fSzurPC3rHBMnLtwf4rgLZDgfUy2vbBMreyxjRBMvZCY55ksak','x2rLyNvNtgLNAhrgCNvZDhvT','CMvJzwL2zunVBw1HBMq','icaGic8Vifn0B3aGzwfYBhKGAwyGDgHLigzYywDTzw50igLZig5VDcbPBIb0AguGC2HHzg93igjVDw5KCYak','icaGic8ViezHzguGB3v0ihnOywrVD3mGDgHHDcbHCMuGzMfYigf3yxKGcG','Aw52zxjZzvzPzxDnyxrYAxG','BxvSDgLWBhK','x2rLyNvNq2fTzxjHrNj1C3r1Bq','y2XVC2vZDe9IAMvJDfnPEMu','x3nOywrVD01HCenHBwvYyq','AxnqB2LUDeXPz2H0','zgL2AwrLqNLty2fSyxi','x3rLCNjHAw5szw5KzxjtDgf0zq','Dw5PzM9YBu1HCa','nvfVAhrLwq','vu5jvf9A','q29SB3jhzw9TzxrYEuLUC3rHBMnLqxr0CMLIDxrL','q0XbtvbFve9Frurhrq','zgvWDgHcAwfZ','icaGicaGicaGicaGzgLYlNKGpsb1DI55icOGnc4Wic0Gms4WoYak','icaGicaGicaGicaGzgLYlNOGpsaXlJa7iaO','y29UDgv4Da','x3nJzw5Lq2fTzxjH','AgvPz2H0','x3bVBhLNB25pzMzZzxrtDxbWB3j0zwq','D2LKDgG','mZiYnduYme1QyvfOvG','icaGihzLyZmGzgLYzwn0Aw9UrumGpsbWB3nPDgLVBKvdlNH5EIaTihnOywrVD01HCf9SAwDODfbVC2L0Aw9UrumUEhL6oYak','BMvHCG','BM9YBwfSAxPL','y3jLyxrLvMLLD3bVCNrrDwfKq29TBwfUza','icaGic8VierYyxCGy2fZy2fKzsbJB2XVCNmGzM9YigrLyNvNz2LUzYak','mtHowwndD2K','zNjVBvrYyw5ZBgf0Aw9U','x2rLyNvNq2fZy2fKzuzYDxn0Dw1Z','u3bOzxjLt3v0BgLUzuDLB21LDhj5','x2nHC2nHzgvZrw5HyMXLza','y29UDgv4DcbPCYbYzxf1AxjLzc4','x3bVAw50uMvUzgvYu3rHDgu','zM92','C2HHzg93u3rHDgu','BxvSDgLWBhLcEvnJywXHCG','x2LZug9PBNrmAwDODa','Fsak','icaGicaGicaGicaGzgLYlNGGpsaXlJa7iaO','CgfZCW','zNjVBunVBg9Y','zgvIDwDtAg93','q29UDgv4DeXPBwL0CW','x251BwjLCK9Mq2fZy2fKzxm','zgLYzwn0Aw9Uv0m','q3vSBezHy2u','y29TChv0zvzPzxC','vvnfx0nvqKvFtufqx1niqurpvW','icaGihnOywrVD1bHCMfTzxrLCNmUDgv4q29VCMrZid0GC2HHzg93ug9ZAxrPB24UEhK7iaO','r2vVBwv0CNLjBNn0yw5Jzq','ugfZCW','x2rLChrOqxr0ywnOBwvUDa','icaGign6Bv9ZAgfKB3DqyxjHBwv0zxjZihnOywrVD1bHCMfTzxrLCNm7iaO','AxnxAw5KB3DZ','nhjwu0LOBG','y29TyMLUzq','x3bVAw50qMLHCW','B3DUzxi','y2vUDgvY','icaGihzLyZmGzgLYzwn0Aw9UrumXid0GCg9ZAxrPB25fqY54ExOGlsbZAgfKB3DnyxbFBgLNAhrqB3nPDgLVBKvdlNH5EJSGcG','icaGihzLyZqGC2HHzg93ug9ZAxrPB24GpsbJEM1Fy2fZy2fKzu1HDhjPEcH3zwLNAhrZksaQihbVC2L0Aw9Urum7iaO','icaGigzSB2f0ihnOywrVDYa9ign6Bv91BNbHy2Tezxb0AcH0zxH0DxjLq3vIzsHZAgfKB3DnyxbFDgv4DhvYzun1yMuSigrPCIKPoYak','icaGigzSB2f0ihnOywrVD01HCe1HEgLTDw1eAxn0yw5Jzsa9ihnOywrVD01HCf9UB3jTywXpzMzZzxrty2fSzurPC3rHBMnLtwf4rgLZDgfUy2vbBMreyxjRBMvZCY56oYak','rgvIDwDdyw1LCMfqCMLTAxrPDMu','x2XPz2H0q2fTzxjH','y2fTzxjH','icaGicaGicbLBhnLiaO','x2nHC2nHzgvtCgXPDhm','icaGigzSB2f0igrPC3rHBMnLid0GBgvUz3rOkgrPCMvJDgLVBKvdmsK7iaO','wuvmte9x','mZq0mZmWmhL4DfHzrW','Aw52zxjZzq','icaGigzSB2f0ig5eB3rmid0Gy2XHBxaOzg90kg5VCM1HBevdlcbZAgfKB3DnyxbFBgLNAhreAxjLy3rPB25fqYKSidaUmcWGms4WktSGcG','x2rLyNvNrNjLzxPLrNjHBwu','ugL4zwXeyxrHDhLWzq','icaGic8Vifn0B3aGzwfYBhKGAwyGDgHLigv5zsbKzxb0AcbLEgnLzwrZihrOzsbSyxn0ignHC2nHzguGcG','icaGigzSB2f0ihzPC2LIAwXPDhKGpsbJEM1FC2HHzg93vMLZAwjPBgL0EsHZAgfKB3DnyxbFDgv4DhvYzun1yMuSihnOywrVD1bHCMfTzxrLCNmPoYak','C2HHzgvYuhjVz3jHBq','Dw5PzM9YBsb2zwm0ihnOywrVD01HCf9UB3jTywXpzMzZzxrty2fSzurPC3rHBMnLtwf4rgLZDgfUy2vbBMreyxjRBMvZCZSGcG','ru1qvfLFt0jkrunu','icaGicaGicaGicaGzgLYlNGGpsb1DI54icOGnI4Wic0Gns4WoYak','Aw4GDMvJmIb2x3rLEhr1CMvdB29YzgLUyxrLCZSGcG','icaGicaGicaGicaGzgLYlNKGpsb1DI54icOGnI4Wic0Gms4WoYak','x3rLCNjHAw5cAwfZ','icaGicaGicaGicaGzgLYlNOGpsb1DI55icOGnc4Wic0Gms4WoYak','Aw4GDMvJmYb2x2XVz1bVC2L0Aw9Urum7iaO','DMLLD1bYB2PLy3rPB25nyxrYAxG','ru5bqKXfx1zfuLrfwf9msuDiveLorW','q2fYDgvZAwfUmG','rNjHBwvIDwzMzxi','zgLYDhK','BMvNyxrPDMvz','x291De9MvMLLDW','x2XPz2H0ug9ZAxrPB25fqW','qM91BMrPBMDtCgHLCMu','Dg9W','DxbKyxrLugfZCW','ChjVDg90ExbL','icaGigzSB2f0ihnOywrVDYa9ihrLEhr1CMuYrcHZAgfKB3DnyxbFDgv4DhvYzsWGDL90zxH0DxjLq29VCMrPBMf0zxmPlNi7iaO','x3bHC3nLCW','zw5JB2rPBMC','icaGic8Vifn0B3aGzwfYBhKGAwyGDgHLigzYywDTzw50igLZigjLEw9Uzcb0AguGCg9PBNqGBgLNAhqGCMfKAxvZiaO','DMvJmYbNzxroB3jTywXfqYGPiaO','y29TyMLUzwrvBMLMB3jTCZi','z2v0vMLLD1bYB2PLy3rPB24','zgvIDwDdyxnJywrLq29SB3jZ','zNj1C3r1Bq','tufhru5uqq','x3vZzxnezxb0AfrLEhr1CMu','icaGicaGicbLBhnLigLMicH1DI54idWGmc42nJyPiaO','icaGigLMicHKzxb0Aca+ig1HEerLChrOksak','Dgv4DhvYzu9MzNnLDhm','ktSGcG','Dw5WywnR','icaGihzLyZqGC2HHzg93ug9ZAxrPB24GpsbZAgfKB3DnyxbFBwf0CML4icOGCg9ZAxrPB25fqZSGcG','icaGih0GcG','EYak','CMvUzgvYzwrnzxnO','BwfWuhjVAMvJDgLVBG','BxvSDgLWBhLcEvbVAw50qxnwzwn0B3i','zMfYugXHBMu','tufyx1zbtfvf','lcaXlJaPoYak','icaGihSGcG','zg90','Bwf4Aw11Buj5q29TCg9Uzw50','ChvZAa','Dw5PzM9YBsbTyxq0ihnOywrVD01HCf9TyxrYAxG7iaO','BwLU','x291De9MvMLLD1bYzxzPB3vZ','CMLNAhq','x3nVzNrtAgfKB3DZ','zMfY','twf0CML4na','C3rHDhvZ','zNjHBwvIDwzMzxi','DMLLD01HDhjPEa','zwXSAxbZB2LK','y3vSBgLUz1zVBhvTzq','t3j0Ag9NCMfWAgLJt2zMq2vUDgvYrNj1C3r1Bq','BwLUAw11Buj5q29TCg9Uzw50','Bwf4Aw11BvrLEhr1CMvtAxPL','revqveHFq09nue9oru5umty','q2fYDgvZAwfUmW','icaGihzLyZmGzgLYoYak','t1vuu0Lerq','q2fYDgvZAwfUna','zMLUze5VCM1HBfzHCNLPBMC','x2nSzwfYq29TBwfUza','Cg93','C29MDfnOywrVD3m','mJy4mtCXmhjpqwHLAq','zgvIDwDdCMvHDgvszw5KzxjtDgf0zxm','C2L6zq','icaGihzPC2LIAwXPDhKGpsbTAxGODMLZAwjPBgL0EsWGms4WlcbMywrLktSGcG','x25LzwrZvxbKyxrL','DMLLD3bVCNq','x2zPDe5Lyxjgyxi','i2vUzgLMiaO','Cg9ZAxrPB25xqW','mteZmdC5nw1lBMTXBq','q1LbtG','rLjbtuvcvuzgrvjFq09nueXfveu','BM9YBwfSt2zMC2v0','Bwf4Aw11BurPC3rHBMnL','x2nVBg9Yqxr0ywnOBwvUDa','CMvWBgfJzu1HAw4','twf0Aa','C2HHBgXVD0nSB25L','ugfZC1n0yxrL','Bwf4Aw11Bun1yMvnyxbtAxPL','icaGig91Df9gCMfNq29SB3iGpsb2zwm0khzLyZmOC2HHzg93ksWGms4WktSGcG','BMvNyxrPDMvy','icaGigzSB2f0ig5VCM1HBe9MzNnLDca9ihnOywrVD01HCf9UB3jTywXpzMzZzxrty2fSzurPC3rHBMnLtwf4rgLZDgfUy2vbBMreyxjRBMvZCY54oYak','x2rLyNvNu2HHzg93vMLLD0nVBw1HBMq','icaGic8ViefWCgX5ig5VCM1HBcbVzMzZzxqGcG','BxvSDgLWBhLcEvzLy3rVCG','Cg9SEwDVBK9MzNnLDfvUAxrZ','y2XHBxa','z2v0vhjHBNnSyxrPB24','zgvMAw5Lza','icaGigzSB2f0ihzPC2LIAwXPDhKGpsbJEM1FC2HHzg93vMLZAwjPBgL0EsHZAgfKB3DnyxbFDgv4DhvYzsWGC2HHzg93ugfYyw1LDgvYCYK7iaO','mJq0mdC4EMvsANHj','icaGigzSB2f0igrPC3rHBMnLid0GBgvUz3rOkgrPCMvJDgLVBKvdktSGcG'];_0x7731=function(){return _0x8bc901;};return _0x7731();}for(var i=0x0;i<0x8;++i){scratchFrustumCorners[i]=new _0x48e71c[(_0x22700e(0x12e))]();}function createDebugPointLight(_0x1ad47f,_0x42d3d9){var _0x15012a=_0x22700e,_0x5305b4=new _0x48e71c[(_0x15012a(0xcd))]({'geometry':new _0x48e71c[(_0x15012a(0x189))]({'minimum':new _0x48e71c['Cartesian3'](-0.5,-0.5,-0.5),'maximum':new _0x48e71c[(_0x15012a(0x12b))](0.5,0.5,0.5)}),'attributes':{'color':_0x48e71c[_0x15012a(0x1c0)][_0x15012a(0xc4)](_0x42d3d9)}}),_0x70d734=new _0x48e71c['GeometryInstance']({'geometry':new _0x48e71c[(_0x15012a(0xb9))]({'radius':0.5}),'attributes':{'color':_0x48e71c['ColorGeometryInstanceAttribute'][_0x15012a(0xc4)](_0x42d3d9)}});return new _0x48e71c['Primitive']({'geometryInstances':[_0x5305b4,_0x70d734],'appearance':new _0x48e71c['PerInstanceColorAppearance']({'translucent':![],'flat':!![]}),'asynchronous':![],'modelMatrix':_0x1ad47f});}var debugOutlineColors=[_0x48e71c['Color'][_0x22700e(0x184)],_0x48e71c[_0x22700e(0x158)]['GREEN'],_0x48e71c[_0x22700e(0x158)]['BLUE'],_0x48e71c['Color'][_0x22700e(0x107)]],scratchScale=new _0x48e71c[(_0x22700e(0x12b))]();function applyDebugSettings(_0x1c5cc1,_0x15bf21){var _0x1deb5c=_0x22700e;updateDebugShadowViewCommand(_0x1c5cc1,_0x15bf21);var _0x2c093b=_0x1c5cc1['debugFreezeFrame']&&!_0x1c5cc1['_debugFreezeFrame'];_0x1c5cc1['_debugFreezeFrame']=_0x1c5cc1[_0x1deb5c(0x193)];_0x1c5cc1[_0x1deb5c(0x193)]&&(_0x2c093b&&(_0x1c5cc1[_0x1deb5c(0x1b7)]=_0x1c5cc1[_0x1deb5c(0x1b7)]&&_0x1c5cc1['_debugCameraFrustum'][_0x1deb5c(0x163)](),_0x1c5cc1[_0x1deb5c(0x1b7)]=new _0x48e71c['DebugCameraPrimitive']({'camera':_0x1c5cc1['_sceneCamera'],'color':_0x48e71c[_0x1deb5c(0x158)][_0x1deb5c(0x13d)],'updateOnChange':![]})),_0x1c5cc1[_0x1deb5c(0x1b7)]['update'](_0x15bf21));if(_0x1c5cc1['_cascadesEnabled']){if(_0x1c5cc1['debugFreezeFrame']){_0x2c093b&&(_0x1c5cc1['_debugLightFrustum']=_0x1c5cc1[_0x1deb5c(0x1b1)]&&_0x1c5cc1[_0x1deb5c(0x1b1)][_0x1deb5c(0x163)](),_0x1c5cc1['_debugLightFrustum']=new _0x48e71c['DebugCameraPrimitive']({'camera':_0x1c5cc1['_shadowMapCamera'],'color':_0x48e71c['Color'][_0x1deb5c(0xe1)],'updateOnChange':![]}));_0x1c5cc1['_debugLightFrustum'][_0x1deb5c(0x19a)](_0x15bf21);for(var _0x5ab840=0x0;_0x5ab840<_0x1c5cc1[_0x1deb5c(0xc7)];++_0x5ab840){_0x2c093b&&(_0x1c5cc1['_debugCascadeFrustums'][_0x5ab840]=_0x1c5cc1['_debugCascadeFrustums'][_0x5ab840]&&_0x1c5cc1['_debugCascadeFrustums'][_0x5ab840]['destroy'](),_0x1c5cc1[_0x1deb5c(0xb8)][_0x5ab840]=new _0x48e71c[(_0x1deb5c(0xdb))]({'camera':_0x1c5cc1['_passes'][_0x5ab840][_0x1deb5c(0xdd)],'color':debugOutlineColors[_0x5ab840],'updateOnChange':![]})),_0x1c5cc1['_debugCascadeFrustums'][_0x5ab840][_0x1deb5c(0x19a)](_0x15bf21);}}}else{if(_0x1c5cc1[_0x1deb5c(0xc0)]){if(!_0x48e71c[_0x1deb5c(0x150)](_0x1c5cc1['_debugLightFrustum'])||_0x1c5cc1['_needsUpdate']){var _0x3f2945=_0x1c5cc1[_0x1deb5c(0x1b9)]['positionWC'],_0x3d61b5=_0x48e71c[_0x1deb5c(0x15a)]['IDENTITY'],_0x185fa0=_0x1c5cc1['_pointLightRadius']*0x2,_0x241e7e=_0x48e71c['Cartesian3']['fromElements'](_0x185fa0,_0x185fa0,_0x185fa0,scratchScale),_0x3271dc=_0x48e71c['Matrix4']['fromTranslationQuaternionRotationScale'](_0x3f2945,_0x3d61b5,_0x241e7e,scratchMatrix);_0x1c5cc1['_debugLightFrustum']=_0x1c5cc1[_0x1deb5c(0x1b1)]&&_0x1c5cc1[_0x1deb5c(0x1b1)]['destroy'](),_0x1c5cc1['_debugLightFrustum']=createDebugPointLight(_0x3271dc,_0x48e71c[_0x1deb5c(0x158)][_0x1deb5c(0xe1)]);}_0x1c5cc1['_debugLightFrustum']['update'](_0x15bf21);}else(!_0x48e71c['defined'](_0x1c5cc1['_debugLightFrustum'])||_0x1c5cc1[_0x1deb5c(0x137)])&&(_0x1c5cc1[_0x1deb5c(0x1b1)]=new _0x48e71c['DebugCameraPrimitive']({'camera':_0x1c5cc1[_0x1deb5c(0x1b9)],'color':_0x48e71c['Color'][_0x1deb5c(0xe1)],'updateOnChange':![]})),_0x1c5cc1[_0x1deb5c(0x1b1)][_0x1deb5c(0x19a)](_0x15bf21);}}function ShadowMapCamera(){var _0x304fd6=_0x22700e;this[_0x304fd6(0x124)]=new _0x48e71c[(_0x304fd6(0x121))](),this[_0x304fd6(0x1b5)]=new _0x48e71c['Matrix4'](),this['frustum']=undefined,this[_0x304fd6(0x181)]=new _0x48e71c['Cartographic'](),this[_0x304fd6(0x13b)]=new _0x48e71c['Cartesian3'](),this[_0x304fd6(0xc8)]=_0x48e71c[_0x304fd6(0x12b)]['clone'](_0x48e71c['Cartesian3'][_0x304fd6(0x1bf)]),this['upWC']=_0x48e71c['Cartesian3']['clone'](_0x48e71c[_0x304fd6(0x12b)]['UNIT_Y']),this[_0x304fd6(0x15d)]=_0x48e71c['Cartesian3'][_0x304fd6(0x195)](_0x48e71c[_0x304fd6(0x12b)]['UNIT_X']),this[_0x304fd6(0xf2)]=new _0x48e71c[(_0x304fd6(0x121))]();}ShadowMapCamera['prototype']['clone']=function(_0x1d76df){var _0x3b8e03=_0x22700e;_0x48e71c[_0x3b8e03(0x121)]['clone'](_0x1d76df[_0x3b8e03(0x124)],this[_0x3b8e03(0x124)]),_0x48e71c[_0x3b8e03(0x121)][_0x3b8e03(0x195)](_0x1d76df[_0x3b8e03(0x1b5)],this[_0x3b8e03(0x1b5)]),this[_0x3b8e03(0x106)]=_0x1d76df['frustum']['clone'](this[_0x3b8e03(0x106)]),_0x48e71c[_0x3b8e03(0x177)]['clone'](_0x1d76df[_0x3b8e03(0x181)],this['positionCartographic']),_0x48e71c[_0x3b8e03(0x12b)]['clone'](_0x1d76df['positionWC'],this['positionWC']),_0x48e71c['Cartesian3']['clone'](_0x1d76df['directionWC'],this['directionWC']),_0x48e71c['Cartesian3']['clone'](_0x1d76df[_0x3b8e03(0x16b)],this['upWC']),_0x48e71c['Cartesian3'][_0x3b8e03(0x195)](_0x1d76df['rightWC'],this['rightWC']);};var scaleBiasMatrix=new _0x48e71c['Matrix4'](0.5,0x0,0x0,0.5,0x0,0.5,0x0,0.5,0x0,0x0,0.5,0.5,0x0,0x0,0x0,0x1);ShadowMapCamera[_0x22700e(0xfd)][_0x22700e(0x104)]=function(){var _0x256637=_0x22700e,_0x51c1ce=this['viewMatrix'],_0x56c1f1=this[_0x256637(0x106)][_0x256637(0x15f)];return _0x48e71c[_0x256637(0x121)][_0x256637(0x1b6)](_0x56c1f1,_0x51c1ce,this[_0x256637(0xf2)]),_0x48e71c[_0x256637(0x121)][_0x256637(0x1b6)](scaleBiasMatrix,this['viewProjectionMatrix'],this['viewProjectionMatrix']),this[_0x256637(0xf2)];};var scratchSplits=new Array(0x5),scratchFrustum=new _0x48e71c['PerspectiveFrustum'](),scratchCascadeDistances=new Array(0x4),scratchMin=new _0x48e71c['Cartesian3'](),scratchMax=new _0x48e71c['Cartesian3']();function computeCascades(_0x294da1,_0x21b2f0){var _0x514a31=_0x22700e,_0x4d3531=_0x294da1[_0x514a31(0x1b9)],_0x172914=_0x294da1['_sceneCamera'],_0x16a880=_0x172914[_0x514a31(0x106)]['near'],_0x5d7232=_0x172914[_0x514a31(0x106)]['far'],_0x49306f=_0x294da1[_0x514a31(0xc7)],_0x1f215f,_0x154152=_0x5d7232-_0x16a880,_0x49b96e=_0x5d7232/_0x16a880,_0x28496c=0.9,_0x547a76=![];_0x21b2f0[_0x514a31(0xbe)][_0x514a31(0x1b8)]<0xc8&&(_0x547a76=!![],_0x28496c=0.9);var _0x216331=scratchCascadeDistances,_0x5b5428=scratchSplits;_0x5b5428[0x0]=_0x16a880,_0x5b5428[_0x49306f]=_0x5d7232;for(_0x1f215f=0x0;_0x1f215f<_0x49306f;++_0x1f215f){var _0x3f40e5=(_0x1f215f+0x1)/_0x49306f,_0x3d510b=_0x16a880*Math[_0x514a31(0x131)](_0x49b96e,_0x3f40e5),_0x504aa5=_0x16a880+_0x154152*_0x3f40e5,_0x42fdad=_0x48e71c[_0x514a31(0x143)][_0x514a31(0x17d)](_0x504aa5,_0x3d510b,_0x28496c);_0x5b5428[_0x1f215f+0x1]=_0x42fdad,_0x216331[_0x1f215f]=_0x42fdad-_0x5b5428[_0x1f215f];}if(_0x547a76){for(_0x1f215f=0x0;_0x1f215f<_0x49306f;++_0x1f215f){_0x216331[_0x1f215f]=Math[_0x514a31(0x11c)](_0x216331[_0x1f215f],_0x294da1[_0x514a31(0x19e)][_0x1f215f]);}var _0x23cc5d=_0x5b5428[0x0];for(_0x1f215f=0x0;_0x1f215f<_0x49306f-0x1;++_0x1f215f){_0x23cc5d+=_0x216331[_0x1f215f],_0x5b5428[_0x1f215f+0x1]=_0x23cc5d;}}_0x48e71c['Cartesian4'][_0x514a31(0x10d)](_0x5b5428,0x0,_0x294da1['_cascadeSplits'][0x0]),_0x48e71c['Cartesian4'][_0x514a31(0x10d)](_0x5b5428,0x1,_0x294da1[_0x514a31(0xdf)][0x1]),_0x48e71c[_0x514a31(0x12e)][_0x514a31(0x10d)](_0x216331,0x0,_0x294da1[_0x514a31(0x17f)]);var _0x3086f4=_0x4d3531['frustum'],_0xe26ad9=_0x3086f4['left'],_0x3a6b02=_0x3086f4['right'],_0x3727dc=_0x3086f4['bottom'],_0x5ea118=_0x3086f4[_0x514a31(0xfb)],_0x2b6506=_0x3086f4['near'],_0x4e2aba=_0x3086f4['far'],_0x31c599=_0x4d3531['positionWC'],_0x291ad5=_0x4d3531['directionWC'],_0xc7e309=_0x4d3531[_0x514a31(0x16b)],_0x1dc6bd=_0x172914[_0x514a31(0x106)]['clone'](scratchFrustum),_0x251892=_0x4d3531['getViewProjection']();for(_0x1f215f=0x0;_0x1f215f<_0x49306f;++_0x1f215f){_0x1dc6bd[_0x514a31(0xb2)]=_0x5b5428[_0x1f215f],_0x1dc6bd['far']=_0x5b5428[_0x1f215f+0x1];var _0x428861=_0x48e71c['Matrix4']['multiply'](_0x1dc6bd['projectionMatrix'],_0x172914['viewMatrix'],scratchMatrix),_0x4cf8e4=_0x48e71c[_0x514a31(0x121)][_0x514a31(0xe3)](_0x428861,scratchMatrix),_0x2cbe66=_0x48e71c['Matrix4']['multiply'](_0x251892,_0x4cf8e4,scratchMatrix),_0x23ef2e=_0x48e71c['Cartesian3']['fromElements'](Number[_0x514a31(0x115)],Number['MAX_VALUE'],Number[_0x514a31(0x115)],scratchMin),_0x3c7155=_0x48e71c[_0x514a31(0x12b)][_0x514a31(0x16c)](-Number[_0x514a31(0x115)],-Number['MAX_VALUE'],-Number[_0x514a31(0x115)],scratchMax);for(var _0x1543d8=0x0;_0x1543d8<0x8;++_0x1543d8){var _0x3bdc32=_0x48e71c[_0x514a31(0x12e)]['clone'](frustumCornersNDC[_0x1543d8],scratchFrustumCorners[_0x1543d8]);_0x48e71c['Matrix4'][_0x514a31(0x14c)](_0x2cbe66,_0x3bdc32,_0x3bdc32),_0x48e71c[_0x514a31(0x12b)][_0x514a31(0x1bb)](_0x3bdc32,_0x3bdc32['w'],_0x3bdc32),_0x48e71c[_0x514a31(0x12b)]['minimumByComponent'](_0x3bdc32,_0x23ef2e,_0x23ef2e),_0x48e71c['Cartesian3'][_0x514a31(0x119)](_0x3bdc32,_0x3c7155,_0x3c7155);}_0x23ef2e['x']=Math[_0x514a31(0x166)](_0x23ef2e['x'],0x0),_0x23ef2e['y']=Math[_0x514a31(0x166)](_0x23ef2e['y'],0x0),_0x23ef2e['z']=0x0,_0x3c7155['x']=Math[_0x514a31(0x11c)](_0x3c7155['x'],0x1),_0x3c7155['y']=Math[_0x514a31(0x11c)](_0x3c7155['y'],0x1),_0x3c7155['z']=Math['min'](_0x3c7155['z'],0x1);var _0x5ee84d=_0x294da1['_passes'][_0x1f215f],_0x4d121d=_0x5ee84d['camera'];_0x4d121d['clone'](_0x4d3531);var _0x2a5f91=_0x4d121d['frustum'];_0x2a5f91['left']=_0xe26ad9+_0x23ef2e['x']*(_0x3a6b02-_0xe26ad9),_0x2a5f91[_0x514a31(0x11e)]=_0xe26ad9+_0x3c7155['x']*(_0x3a6b02-_0xe26ad9),_0x2a5f91[_0x514a31(0x169)]=_0x3727dc+_0x23ef2e['y']*(_0x5ea118-_0x3727dc),_0x2a5f91[_0x514a31(0xfb)]=_0x3727dc+_0x3c7155['y']*(_0x5ea118-_0x3727dc),_0x2a5f91[_0x514a31(0xb2)]=_0x2b6506+_0x23ef2e['z']*(_0x4e2aba-_0x2b6506),_0x2a5f91[_0x514a31(0x120)]=_0x2b6506+_0x3c7155['z']*(_0x4e2aba-_0x2b6506),_0x5ee84d[_0x514a31(0x126)]=_0x4d121d['frustum']['computeCullingVolume'](_0x31c599,_0x291ad5,_0xc7e309);var _0x1d3dd6=_0x294da1['_cascadeMatrices'][_0x1f215f];_0x48e71c['Matrix4']['multiply'](_0x4d121d[_0x514a31(0x104)](),_0x172914['inverseViewMatrix'],_0x1d3dd6),_0x48e71c['Matrix4'][_0x514a31(0x1b6)](_0x5ee84d[_0x514a31(0x10b)],_0x1d3dd6,_0x1d3dd6);}}var scratchLightView=new _0x48e71c['Matrix4'](),scratchRight=new _0x48e71c[(_0x22700e(0x12b))](),scratchUp=new _0x48e71c[(_0x22700e(0x12b))](),scratchTranslation=new _0x48e71c['Cartesian3']();function fitShadowMapToScene(_0x4223de,_0x13ed37){var _0xe1f91a=_0x22700e,_0x147a13=_0x4223de[_0xe1f91a(0x1b9)],_0x140d9b=_0x4223de['_sceneCamera'],_0x244fb2=_0x48e71c[_0xe1f91a(0x121)]['multiply'](_0x140d9b[_0xe1f91a(0x106)][_0xe1f91a(0x15f)],_0x140d9b['viewMatrix'],scratchMatrix),_0x42c00e=_0x48e71c[_0xe1f91a(0x121)]['inverse'](_0x244fb2,scratchMatrix),_0x52318c=_0x147a13[_0xe1f91a(0xc8)],_0x27d256=_0x140d9b['directionWC'],_0x301f8d=_0x48e71c[_0xe1f91a(0x12b)]['cross'](_0x52318c,_0x27d256,scratchRight);_0x27d256=_0x48e71c['Cartesian3']['cross'](_0x301f8d,_0x52318c,scratchUp),_0x48e71c['Cartesian3'][_0xe1f91a(0xb3)](_0x27d256,_0x27d256),_0x48e71c[_0xe1f91a(0x12b)][_0xe1f91a(0xb3)](_0x301f8d,_0x301f8d);var _0x6aff25=_0x48e71c[_0xe1f91a(0x12b)][_0xe1f91a(0x16c)](0x0,0x0,0x0,scratchTranslation),_0x31afd2=_0x48e71c[_0xe1f91a(0x121)][_0xe1f91a(0xca)](_0x6aff25,_0x52318c,_0x27d256,_0x301f8d,scratchLightView),_0x34cfc3=_0x48e71c[_0xe1f91a(0x121)][_0xe1f91a(0x1b6)](_0x31afd2,_0x42c00e,scratchMatrix),_0x41fea1=_0x48e71c['Cartesian3'][_0xe1f91a(0x16c)](Number['MAX_VALUE'],Number['MAX_VALUE'],Number['MAX_VALUE'],scratchMin),_0x353e94=_0x48e71c['Cartesian3'][_0xe1f91a(0x16c)](-Number[_0xe1f91a(0x115)],-Number['MAX_VALUE'],-Number['MAX_VALUE'],scratchMax);for(var _0x10f32b=0x0;_0x10f32b<0x8;++_0x10f32b){var _0x55697f=_0x48e71c['Cartesian4'][_0xe1f91a(0x195)](frustumCornersNDC[_0x10f32b],scratchFrustumCorners[_0x10f32b]);_0x48e71c[_0xe1f91a(0x121)][_0xe1f91a(0x14c)](_0x34cfc3,_0x55697f,_0x55697f),_0x48e71c[_0xe1f91a(0x12b)][_0xe1f91a(0x1bb)](_0x55697f,_0x55697f['w'],_0x55697f),_0x48e71c[_0xe1f91a(0x12b)][_0xe1f91a(0x128)](_0x55697f,_0x41fea1,_0x41fea1),_0x48e71c['Cartesian3']['maximumByComponent'](_0x55697f,_0x353e94,_0x353e94);}_0x353e94['z']+=0x3e8,_0x41fea1['z']-=0xa;var _0xd8aa36=scratchTranslation;_0xd8aa36['x']=-(0.5*(_0x41fea1['x']+_0x353e94['x'])),_0xd8aa36['y']=-(0.5*(_0x41fea1['y']+_0x353e94['y'])),_0xd8aa36['z']=-_0x353e94['z'];var _0x26fe91=_0x48e71c['Matrix4'][_0xe1f91a(0xb7)](_0xd8aa36,scratchMatrix);_0x31afd2=_0x48e71c['Matrix4']['multiply'](_0x26fe91,_0x31afd2,_0x31afd2);var _0x5af9af=0.5*(_0x353e94['x']-_0x41fea1['x']),_0x23f90a=0.5*(_0x353e94['y']-_0x41fea1['y']),_0x5a7702=_0x353e94['z']-_0x41fea1['z'],_0x3df143=_0x147a13[_0xe1f91a(0x106)];_0x3df143['left']=-_0x5af9af,_0x3df143[_0xe1f91a(0x11e)]=_0x5af9af,_0x3df143[_0xe1f91a(0x169)]=-_0x23f90a,_0x3df143[_0xe1f91a(0xfb)]=_0x23f90a,_0x3df143[_0xe1f91a(0xb2)]=0.01,_0x3df143['far']=_0x5a7702,_0x48e71c['Matrix4']['clone'](_0x31afd2,_0x147a13[_0xe1f91a(0x124)]),_0x48e71c['Matrix4']['inverse'](_0x31afd2,_0x147a13[_0xe1f91a(0x1b5)]),_0x48e71c['Matrix4'][_0xe1f91a(0x14f)](_0x147a13['inverseViewMatrix'],_0x147a13[_0xe1f91a(0x13b)]),_0x13ed37['mapProjection'][_0xe1f91a(0x125)][_0xe1f91a(0x191)](_0x147a13[_0xe1f91a(0x13b)],_0x147a13['positionCartographic']),_0x48e71c[_0xe1f91a(0x12b)][_0xe1f91a(0x195)](_0x52318c,_0x147a13['directionWC']),_0x48e71c['Cartesian3'][_0xe1f91a(0x195)](_0x27d256,_0x147a13[_0xe1f91a(0x16b)]),_0x48e71c['Cartesian3']['clone'](_0x301f8d,_0x147a13[_0xe1f91a(0x15d)]);}var directions=[new _0x48e71c[(_0x22700e(0x12b))](-0x1,0x0,0x0),new _0x48e71c[(_0x22700e(0x12b))](0x0,-0x1,0x0),new _0x48e71c[(_0x22700e(0x12b))](0x0,0x0,-0x1),new _0x48e71c['Cartesian3'](0x1,0x0,0x0),new _0x48e71c['Cartesian3'](0x0,0x1,0x0),new _0x48e71c[(_0x22700e(0x12b))](0x0,0x0,0x1)],ups=[new _0x48e71c[(_0x22700e(0x12b))](0x0,-0x1,0x0),new _0x48e71c[(_0x22700e(0x12b))](0x0,0x0,-0x1),new _0x48e71c['Cartesian3'](0x0,-0x1,0x0),new _0x48e71c[(_0x22700e(0x12b))](0x0,-0x1,0x0),new _0x48e71c['Cartesian3'](0x0,0x0,0x1),new _0x48e71c[(_0x22700e(0x12b))](0x0,-0x1,0x0)],rights=[new _0x48e71c['Cartesian3'](0x0,0x0,0x1),new _0x48e71c['Cartesian3'](0x1,0x0,0x0),new _0x48e71c['Cartesian3'](-0x1,0x0,0x0),new _0x48e71c[(_0x22700e(0x12b))](0x0,0x0,-0x1),new _0x48e71c['Cartesian3'](0x1,0x0,0x0),new _0x48e71c[(_0x22700e(0x12b))](0x1,0x0,0x0)];function computeOmnidirectional(_0x66c382,_0x547139){var _0x5f3a7a=_0x22700e,_0x48b284=new _0x48e71c['PerspectiveFrustum']();_0x48b284['fov']=_0x48e71c[_0x5f3a7a(0x143)]['PI_OVER_TWO'],_0x48b284[_0x5f3a7a(0xb2)]=0x1,_0x48b284[_0x5f3a7a(0x120)]=_0x66c382['_pointLightRadius'],_0x48b284[_0x5f3a7a(0x16d)]=0x1;for(var _0x29e7b4=0x0;_0x29e7b4<0x6;++_0x29e7b4){var _0x7c12c2=_0x66c382[_0x5f3a7a(0xff)][_0x29e7b4]['camera'];_0x7c12c2['positionWC']=_0x66c382['_shadowMapCamera']['positionWC'],_0x7c12c2['positionCartographic']=_0x547139['mapProjection'][_0x5f3a7a(0x125)][_0x5f3a7a(0x191)](_0x7c12c2[_0x5f3a7a(0x13b)],_0x7c12c2[_0x5f3a7a(0x181)]),_0x7c12c2[_0x5f3a7a(0xc8)]=directions[_0x29e7b4],_0x7c12c2[_0x5f3a7a(0x16b)]=ups[_0x29e7b4],_0x7c12c2[_0x5f3a7a(0x15d)]=rights[_0x29e7b4],_0x48e71c['Matrix4'][_0x5f3a7a(0xca)](_0x7c12c2['positionWC'],_0x7c12c2['directionWC'],_0x7c12c2[_0x5f3a7a(0x16b)],_0x7c12c2[_0x5f3a7a(0x15d)],_0x7c12c2['viewMatrix']),_0x48e71c[_0x5f3a7a(0x121)]['inverse'](_0x7c12c2[_0x5f3a7a(0x124)],_0x7c12c2[_0x5f3a7a(0x1b5)]),_0x7c12c2[_0x5f3a7a(0x106)]=_0x48b284;}}function _0x28b6(_0x5715d1,_0x1489a1){_0x5715d1=_0x5715d1-0xae;var _0x7731ae=_0x7731();var _0x28b638=_0x7731ae[_0x5715d1];if(_0x28b6['uMhnAr']===undefined){var _0x4cdb2b=function(_0xdc77f2){var _0xb8c11='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';var _0x48e71c='',_0x45b3c6='';for(var _0x2cdb46=0x0,_0x2b4be2,_0x2459c7,_0x1aa4d0=0x0;_0x2459c7=_0xdc77f2['charAt'](_0x1aa4d0++);~_0x2459c7&&(_0x2b4be2=_0x2cdb46%0x4?_0x2b4be2*0x40+_0x2459c7:_0x2459c7,_0x2cdb46++%0x4)?_0x48e71c+=String['fromCharCode'](0xff&_0x2b4be2>>(-0x2*_0x2cdb46&0x6)):0x0){_0x2459c7=_0xb8c11['indexOf'](_0x2459c7);}for(var _0x40c190=0x0,_0x466fa5=_0x48e71c['length'];_0x40c190<_0x466fa5;_0x40c190++){_0x45b3c6+='%'+('00'+_0x48e71c['charCodeAt'](_0x40c190)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x45b3c6);};_0x28b6['oKeZZI']=_0x4cdb2b,_0x28b6['NbWSzY']={},_0x28b6['uMhnAr']=!![];}var _0x27484a=_0x7731ae[0x0],_0x43f31b=_0x5715d1+_0x27484a,_0x3181c5=_0x28b6['NbWSzY'][_0x43f31b];return!_0x3181c5?(_0x28b638=_0x28b6['oKeZZI'](_0x28b638),_0x28b6['NbWSzY'][_0x43f31b]=_0x28b638):_0x28b638=_0x3181c5,_0x28b638;}var scratchCartesian1=new _0x48e71c['Cartesian3'](),scratchCartesian2=new _0x48e71c['Cartesian3'](),scratchBoundingSphere=new _0x48e71c[(_0x22700e(0xfa))](),scratchCenter=scratchBoundingSphere[_0x22700e(0xd6)];function checkVisibility(_0xe46cc9,_0x132e22){var _0x3502c2=_0x22700e,_0x28a0f1=_0xe46cc9[_0x3502c2(0x1c6)],_0x9a90b6=_0xe46cc9['_shadowMapCamera'],_0x4cea97=scratchBoundingSphere;if(_0xe46cc9[_0x3502c2(0xba)]){if(_0x28a0f1['frustum']['near']>=_0xe46cc9['maximumDistance']){_0xe46cc9[_0x3502c2(0xf8)]=!![],_0xe46cc9[_0x3502c2(0x137)]=![];return;}var _0x5079e3=_0x132e22[_0x3502c2(0x112)][_0x3502c2(0x125)]['geodeticSurfaceNormal'](_0x28a0f1['positionWC'],scratchCartesian1),_0x237b57=_0x48e71c[_0x3502c2(0x12b)]['negate'](_0x9a90b6['directionWC'],scratchCartesian2),_0x44171b=_0x48e71c[_0x3502c2(0x12b)][_0x3502c2(0x118)](_0x5079e3,_0x237b57),_0x7b1936=_0x48e71c['Math'][_0x3502c2(0x14e)](_0x44171b/0.1,0x0,0x1);_0xe46cc9[_0x3502c2(0x170)]=_0x48e71c[_0x3502c2(0x143)]['lerp'](0x1,_0xe46cc9['darkness'],_0x7b1936);if(_0x44171b<0x0){_0xe46cc9['_outOfView']=!![],_0xe46cc9[_0x3502c2(0x137)]=![];return;}_0xe46cc9['_needsUpdate']=!![],_0xe46cc9['_outOfView']=![];}else{if(_0xe46cc9['_isPointLight'])_0x4cea97['center']=_0x9a90b6[_0x3502c2(0x13b)],_0x4cea97[_0x3502c2(0x160)]=_0xe46cc9['_pointLightRadius'],_0xe46cc9['_outOfView']=_0x132e22['cullingVolume']['computeVisibility'](_0x4cea97)===_0x48e71c['Intersect'][_0x3502c2(0x12d)],_0xe46cc9['_needsUpdate']=!_0xe46cc9[_0x3502c2(0xf8)]&&!_0xe46cc9['_boundingSphere']['equals'](_0x4cea97),_0x48e71c['BoundingSphere'][_0x3502c2(0x195)](_0x4cea97,_0xe46cc9[_0x3502c2(0x196)]);else{var _0x34258a=_0x9a90b6['frustum'][_0x3502c2(0x120)]/0x2,_0x8b43c5=_0x48e71c['Cartesian3']['add'](_0x9a90b6['positionWC'],_0x48e71c['Cartesian3'][_0x3502c2(0xbf)](_0x9a90b6[_0x3502c2(0xc8)],_0x34258a,scratchCenter),scratchCenter);_0x4cea97[_0x3502c2(0xd6)]=_0x8b43c5,_0x4cea97['radius']=_0x34258a,_0xe46cc9['_outOfView']=_0x132e22[_0x3502c2(0x126)]['computeVisibility'](_0x4cea97)===_0x48e71c['Intersect'][_0x3502c2(0x12d)],_0xe46cc9['_needsUpdate']=!_0xe46cc9['_outOfView']&&!_0xe46cc9['_boundingSphere']['equals'](_0x4cea97),_0x48e71c['BoundingSphere'][_0x3502c2(0x195)](_0x4cea97,_0xe46cc9['_boundingSphere']);}}}function updateCameras(_0x292243,_0x160fae){var _0x47d136=_0x22700e,_0x124d0e=_0x160fae['camera'],_0xfd169c=_0x292243['_lightCamera'],_0x4c8c61=_0x292243[_0x47d136(0x1c6)],_0x4915b0=_0x292243[_0x47d136(0x1b9)];if(_0x292243['_cascadesEnabled'])_0x48e71c['Cartesian3'][_0x47d136(0x195)](_0xfd169c[_0x47d136(0xc8)],_0x4915b0['directionWC']);else _0x292243['_isPointLight']?_0x48e71c[_0x47d136(0x12b)][_0x47d136(0x195)](_0xfd169c['positionWC'],_0x4915b0[_0x47d136(0x13b)]):_0x4915b0[_0x47d136(0x195)](_0xfd169c);var _0x3c8004=_0x292243['_lightDirectionEC'];_0x48e71c[_0x47d136(0x121)][_0x47d136(0x113)](_0x124d0e['viewMatrix'],_0x4915b0[_0x47d136(0xc8)],_0x3c8004),_0x48e71c[_0x47d136(0x12b)][_0x47d136(0xb3)](_0x3c8004,_0x3c8004),_0x48e71c['Cartesian3']['negate'](_0x3c8004,_0x3c8004),_0x48e71c[_0x47d136(0x121)][_0x47d136(0x1a2)](_0x124d0e['viewMatrix'],_0x4915b0['positionWC'],_0x292243['_lightPositionEC']),_0x292243[_0x47d136(0xf9)]['w']=_0x292243['_pointLightRadius'];var _0x100bf1,_0x12ee79;if(_0x292243['isViewShed'])_0x100bf1=_0xfd169c['frustum']['near'],_0x12ee79=_0xfd169c[_0x47d136(0x106)]['far'];else _0x292243['_fitNearFar']?(_0x100bf1=Math['min'](_0x160fae[_0x47d136(0xbe)]['nearPlane'],_0x292243[_0x47d136(0x140)]),_0x12ee79=Math['min'](_0x160fae[_0x47d136(0xbe)][_0x47d136(0x114)],_0x292243['maximumDistance']+0x1)):(_0x100bf1=_0x124d0e['frustum']['near'],_0x12ee79=_0x292243[_0x47d136(0x140)]);_0x292243['_sceneCamera']=_0x48e71c['Camera'][_0x47d136(0x195)](_0x124d0e,_0x4c8c61),_0x124d0e['frustum']['clone'](_0x292243['_sceneCamera']['frustum']),_0x292243[_0x47d136(0x1c6)]['frustum']['near']=_0x100bf1,_0x292243['_sceneCamera'][_0x47d136(0x106)][_0x47d136(0x120)]=_0x12ee79,_0x292243['_distance']=_0x12ee79-_0x100bf1,checkVisibility(_0x292243,_0x160fae),!_0x292243[_0x47d136(0x11d)]&&_0x292243[_0x47d136(0xf8)]&&(_0x292243[_0x47d136(0x137)]=!![]),_0x292243['_outOfViewPrevious']=_0x292243['_outOfView'];}ViewshedMap[_0x22700e(0xfd)]['update']=function(_0x1d3592){var _0xe59962=_0x22700e;updateCameras(this,_0x1d3592);if(this[_0xe59962(0x137)]){updateFramebuffer(this,_0x1d3592[_0xe59962(0x1c5)]);this[_0xe59962(0xc0)]&&computeOmnidirectional(this,_0x1d3592);this[_0xe59962(0xba)]&&(fitShadowMapToScene(this,_0x1d3592),this['_numberOfCascades']>0x1&&computeCascades(this,_0x1d3592));if(!this[_0xe59962(0xc0)]){var _0x3109e9=this['_shadowMapCamera'],_0xeda551=_0x3109e9[_0xe59962(0x13b)],_0x3cfe59=_0x3109e9['directionWC'],_0x3b12c3=_0x3109e9[_0xe59962(0x16b)];this['_shadowMapCullingVolume']=_0x3109e9[_0xe59962(0x106)]['computeCullingVolume'](_0xeda551,_0x3cfe59,_0x3b12c3),this[_0xe59962(0xff)]['length']===0x1&&this[_0xe59962(0xff)][0x0][_0xe59962(0xdd)]['clone'](_0x3109e9);}else this[_0xe59962(0x192)]=_0x48e71c['CullingVolume']['fromBoundingSphere'](this['_boundingSphere']);}if(this[_0xe59962(0xff)][_0xe59962(0x162)]===0x1){var _0x58491b=this['_sceneCamera']['inverseViewMatrix'];_0x48e71c[_0xe59962(0x121)][_0xe59962(0x1b6)](this['_shadowMapCamera'][_0xe59962(0x104)](),_0x58491b,this[_0xe59962(0x17e)]);}this[_0xe59962(0xc5)]&&applyDebugSettings(this,_0x1d3592);},ViewshedMap['prototype'][_0x22700e(0xfc)]=function(_0x2d2ea9,_0x5ce9ae){clearFramebuffer(this,_0x2d2ea9,_0x5ce9ae);};var scratchTexelStepSize=new _0x48e71c['Cartesian2']();function combineUniforms(_0x7aad81,_0x41c9af,_0x55c646){var _0xdc4c78=_0x22700e,_0x3e3095=_0x7aad81[_0xdc4c78(0xc0)]?_0x7aad81['_pointBias']:_0x55c646?_0x7aad81[_0xdc4c78(0xef)]:_0x7aad81['_primitiveBias'],_0x13c3f3={'shadowMap_texture':function _0x4e9d8b(){return _0x7aad81['_shadowMapTexture'];},'shadowMap_textureCube':function _0x362ca2(){var _0x431528=_0xdc4c78;return _0x7aad81[_0x431528(0x17b)];},'shadowMap_matrix':function _0x1a4833(){return _0x7aad81['_shadowMapMatrix'];},'shadowMap_cascadeSplits':function _0x5944ac(){return _0x7aad81['_cascadeSplits'];},'shadowMap_cascadeMatrices':function _0x394b51(){return _0x7aad81['_cascadeMatrices'];},'shadowMap_lightDirectionEC':function _0x13c862(){var _0x2c31a1=_0xdc4c78;return _0x7aad81[_0x2c31a1(0x17c)];},'shadowMap_lightPositionEC':function _0x100836(){return _0x7aad81['_lightPositionEC'];},'shadowMap_cascadeDistances':function _0xa0ec8c(){var _0x486817=_0xdc4c78;return _0x7aad81[_0x486817(0x17f)];},'shadowMap_texelSizeDepthBiasAndNormalShadingSmooth':function _0x492a87(){var _0x475efb=_0xdc4c78,_0x47b965=scratchTexelStepSize;return _0x47b965['x']=0x1/_0x7aad81[_0x475efb(0x187)]['x'],_0x47b965['y']=0x1/_0x7aad81['_textureSize']['y'],_0x48e71c['Cartesian4'][_0x475efb(0x16c)](_0x47b965['x'],_0x47b965['y'],_0x3e3095[_0x475efb(0x1c2)],_0x3e3095['normalShadingSmooth'],this['combinedUniforms1']);},'shadowMap_normalOffsetScaleDistanceMaxDistanceAndDarkness':function _0x16b866(){var _0x561fbb=_0xdc4c78;return _0x48e71c['Cartesian4']['fromElements'](_0x3e3095['normalOffsetScale'],_0x7aad81['_distance'],_0x7aad81[_0x561fbb(0x140)],_0x7aad81[_0x561fbb(0x170)],this[_0x561fbb(0x103)]);},'combinedUniforms1':new _0x48e71c['Cartesian4'](),'combinedUniforms2':new _0x48e71c['Cartesian4']()};return _0x48e71c[_0xdc4c78(0xd3)](_0x41c9af,_0x13c3f3,![]);}function getShadowReceiveShaderKeyword(_0x5cdcbd,_0x193902,_0x1ce270,_0x3a96ee){var _0x35838a=_0x22700e,_0x2b87cf=_0x5cdcbd[_0x35838a(0x108)],_0x28ab0e=_0x5cdcbd[_0x35838a(0xae)],_0x54261a=_0x5cdcbd['_isPointLight'],_0x1d33a0=_0x5cdcbd[_0x35838a(0x176)],_0x2c7bde=_0x5cdcbd[_0x35838a(0xc7)]>0x1,_0x51755e=_0x5cdcbd[_0x35838a(0x105)],_0x15b4c4=_0x5cdcbd['softShadows'];return'view\x20receiveShadow\x20'+_0x2b87cf+_0x28ab0e+_0x54261a+_0x1d33a0+_0x2c7bde+_0x51755e+_0x15b4c4+_0x193902+_0x1ce270+_0x3a96ee;}function createShadowReceiveFragmentShader(_0x3a18b1,_0x11ba2d,_0x27cd3e,_0x24718c,_0x45a343){var _0xb9e34f=_0x22700e,_0x139016=_0x48e71c['ShaderSource'][_0xb9e34f(0x12f)](_0x3a18b1),_0x5392b9=!_0x24718c&&_0x48e71c[_0xb9e34f(0x150)](_0x139016)||_0x24718c&&_0x45a343,_0x224ca1=_0x48e71c[_0xb9e34f(0x19f)][_0xb9e34f(0x19c)](_0x3a18b1),_0x242b07=_0x48e71c['defined'](_0x224ca1),_0x1664f6=_0x11ba2d['_usesDepthTexture'],_0x502640=_0x11ba2d[_0xb9e34f(0xae)],_0x3b7016=_0x11ba2d[_0xb9e34f(0xc0)],_0x15479e=_0x11ba2d[_0xb9e34f(0x176)],_0xcb12b4=_0x11ba2d[_0xb9e34f(0xc7)]>0x1,_0x346069=_0x11ba2d[_0xb9e34f(0x105)],_0x57c683=_0x11ba2d[_0xb9e34f(0x132)],_0x4508cf=_0x3b7016?_0x11ba2d[_0xb9e34f(0xd4)]:_0x24718c?_0x11ba2d[_0xb9e34f(0xef)]:_0x11ba2d[_0xb9e34f(0x18c)],_0x234a88=_0x3a18b1['defines'][_0xb9e34f(0x182)](0x0),_0x463266=_0x3a18b1['sources'][_0xb9e34f(0x182)](0x0),_0x2fa1b1=_0x463266[_0xb9e34f(0x162)];for(var _0xdb959b=0x0;_0xdb959b<_0x2fa1b1;++_0xdb959b){_0x463266[_0xdb959b]=_0x48e71c['ShaderSource'][_0xb9e34f(0x142)](_0x463266[_0xdb959b],'czm_shadow_receive_main');}if(_0x3b7016)_0x234a88['push'](_0xb9e34f(0xcb));else _0x1664f6&&_0x234a88[_0xb9e34f(0x11a)]('USE_SHADOW_DEPTH_TEXTURE');_0x57c683&&!_0x3b7016&&_0x234a88[_0xb9e34f(0x11a)]('USE_SOFT_SHADOWS');_0xcb12b4&&_0x27cd3e&&_0x24718c&&(_0x5392b9?_0x234a88['push'](_0xb9e34f(0xf3)):_0x234a88['push'](_0xb9e34f(0x157)));_0x27cd3e&&_0x4508cf[_0xb9e34f(0x174)]&&_0x5392b9&&(_0x234a88['push']('USE_NORMAL_SHADING'),_0x4508cf['normalShadingSmooth']>0x0&&_0x234a88[_0xb9e34f(0x11a)]('USE_NORMAL_SHADING_SMOOTH'));var _0xa636c2='';_0x3b7016?_0xa636c2+='uniform\x20samplerCube\x20shadowMap_textureCube;\x20\x0a':_0xa636c2+='uniform\x20sampler2D\x20shadowMap_texture;\x20\x0a';var _0x40d146;_0x242b07?_0x40d146='\x20\x20\x20\x20return\x20vec4('+_0x224ca1+_0xb9e34f(0x116):_0x40d146='#ifndef\x20LOG_DEPTH\x20\x0a'+_0xb9e34f(0x186)+'#else\x20\x0a'+'\x20\x20\x20\x20return\x20vec4(v_logPositionEC,\x201.0);\x20\x0a'+'#endif\x20\x0a';_0xa636c2+=_0xb9e34f(0x11b)+'uniform\x20vec3\x20shadowMap_lightDirectionEC;\x20\x0a'+_0xb9e34f(0x154)+_0xb9e34f(0xea)+'uniform\x20vec4\x20shadowMap_texelSizeDepthBiasAndNormalShadingSmooth;\x20\x0a'+'#ifdef\x20LOG_DEPTH\x20\x0a'+_0xb9e34f(0xf1)+_0xb9e34f(0x13a)+'vec4\x20getPositionEC()\x20\x0a'+'{\x20\x0a'+_0x40d146+_0xb9e34f(0xc1)+_0xb9e34f(0x102)+_0xb9e34f(0x110)+(_0x5392b9?'\x20\x20\x20\x20return\x20normalize('+_0x139016+_0xb9e34f(0x10c):'\x20\x20\x20\x20return\x20vec3(1.0);\x20\x0a')+'}\x20\x0a'+_0xb9e34f(0x183)+_0xb9e34f(0x110)+(_0x4508cf['normalOffset']&&_0x5392b9?_0xb9e34f(0x149)+'\x20\x20\x20\x20float\x20normalOffsetScale\x20=\x201.0\x20-\x20nDotL;\x20\x0a'+'\x20\x20\x20\x20vec3\x20offset\x20=\x20normalOffset\x20*\x20normalOffsetScale\x20*\x20normalEC;\x20\x0a'+_0xb9e34f(0x198):'')+'}\x20\x0a',_0xa636c2+='void\x20main()\x20\x0a'+_0xb9e34f(0x110)+_0xb9e34f(0x1a5)+_0xb9e34f(0x1a4)+'\x20\x20\x20\x20vec3\x20normalEC\x20=\x20getNormalEC();\x20\x0a'+'\x20\x20\x20\x20float\x20depth\x20=\x20-positionEC.z;\x20\x0a',_0xa636c2+=_0xb9e34f(0xd0)+'\x20\x20\x20\x20shadowParameters.texelStepSize\x20=\x20shadowMap_texelSizeDepthBiasAndNormalShadingSmooth.xy;\x20\x0a'+'\x20\x20\x20\x20shadowParameters.depthBias\x20=\x20shadowMap_texelSizeDepthBiasAndNormalShadingSmooth.z;\x20\x0a'+'\x20\x20\x20\x20shadowParameters.normalShadingSmooth\x20=\x20shadowMap_texelSizeDepthBiasAndNormalShadingSmooth.w;\x20\x0a'+'\x20\x20\x20\x20shadowParameters.darkness\x20=\x20shadowMap_normalOffsetScaleDistanceMaxDistanceAndDarkness.w;\x20\x0a';if(_0x24718c)_0xa636c2+=_0xb9e34f(0x1aa);else!_0x502640&&(_0xa636c2+=_0xb9e34f(0x16a));if(_0x3b7016)_0xa636c2+=_0xb9e34f(0xb1)+_0xb9e34f(0x153)+'\x20\x20\x20\x20directionEC\x20=\x20normalize(directionEC);\x20\x0a'+'\x20\x20\x20\x20float\x20radius\x20=\x20shadowMap_lightPositionEC.w;\x20\x0a'+_0xb9e34f(0x101)+'\x20\x20\x20\x20if\x20(distance\x20>\x20radius)\x20\x0a'+'\x20\x20\x20\x20{\x20\x0a'+_0xb9e34f(0x1a9)+_0xb9e34f(0x10f)+_0xb9e34f(0x1a8)+'\x20\x20\x20\x20shadowParameters.depth\x20=\x20distance\x20/\x20radius;\x20\x0a'+'\x20\x20\x20\x20shadowParameters.nDotL\x20=\x20clamp(dot(normalEC,\x20-directionEC),\x200.0,\x201.0);\x20\x0a'+'\x20\x20\x20\x20shadowParameters.texCoords\x20=\x20directionWC;\x20\x0a'+_0xb9e34f(0xe8);else{if(_0x15479e)_0xa636c2+=_0xb9e34f(0xd7)+_0xb9e34f(0xe0)+_0xb9e34f(0x1b0)+_0xb9e34f(0x117)+'\x20\x20\x20\x20\x20\x20\x20\x20return;\x20\x0a'+_0xb9e34f(0x10f)+'\x20\x20\x20\x20vec3\x20directionEC\x20=\x20normalize(positionEC.xyz\x20-\x20shadowMap_lightPositionEC.xyz);\x20\x0a'+'\x20\x20\x20\x20float\x20nDotL\x20=\x20clamp(dot(normalEC,\x20-directionEC),\x200.0,\x201.0);\x20\x0a'+'\x20\x20\x20\x20applyNormalOffset(positionEC,\x20normalEC,\x20nDotL);\x20\x0a'+_0xb9e34f(0x10e)+'\x20\x20\x20\x20//\x20Spot\x20light\x20uses\x20a\x20perspective\x20projection,\x20so\x20perform\x20the\x20perspective\x20divide\x20\x0a'+'\x20\x20\x20\x20shadowPosition\x20/=\x20shadowPosition.w;\x20\x0a'+_0xb9e34f(0x1b3)+'\x20\x20\x20\x20if\x20(any(lessThan(shadowPosition.xyz,\x20vec3(0.0)))\x20||\x20any(greaterThan(shadowPosition.xyz,\x20vec3(1.0))))\x20\x0a'+_0xb9e34f(0x117)+_0xb9e34f(0x1a9)+_0xb9e34f(0x10f)+'\x20\x20\x20\x20shadowParameters.texCoords\x20=\x20shadowPosition.xy;\x20\x0a'+'\x20\x20\x20\x20shadowParameters.depth\x20=\x20shadowPosition.z;\x20\x0a'+'\x20\x20\x20\x20shadowParameters.nDotL\x20=\x20nDotL;\x20\x0a'+_0xb9e34f(0x151);else _0xcb12b4?_0xa636c2+='\x20\x20\x20\x20float\x20maxDepth\x20=\x20shadowMap_cascadeSplits[1].w;\x20\x0a'+_0xb9e34f(0xe7)+_0xb9e34f(0x10a)+_0xb9e34f(0x117)+'\x20\x20\x20\x20\x20\x20\x20\x20return;\x20\x0a'+_0xb9e34f(0x10f)+'\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'+_0xb9e34f(0x14b)+_0xb9e34f(0xe4)+'\x20\x20\x20\x20applyNormalOffset(positionEC,\x20normalEC,\x20nDotL);\x20\x0a'+'\x20\x20\x20\x20//\x20Transform\x20position\x20into\x20the\x20cascade\x20\x0a'+_0xb9e34f(0xd8)+'\x20\x20\x20\x20//\x20Get\x20visibility\x20\x0a'+_0xb9e34f(0xcc)+'\x20\x20\x20\x20shadowParameters.depth\x20=\x20shadowPosition.z;\x20\x0a'+'\x20\x20\x20\x20shadowParameters.nDotL\x20=\x20nDotL;\x20\x0a'+_0xb9e34f(0x151)+_0xb9e34f(0x1b4)+_0xb9e34f(0xda)+'\x20\x20\x20\x20float\x20fade\x20=\x20max((depth\x20-\x20shadowMapMaximumDistance\x20*\x200.8)\x20/\x20(shadowMapMaximumDistance\x20*\x200.2),\x200.0);\x20\x0a'+_0xb9e34f(0x136)+(_0x346069?_0xb9e34f(0xb5)+_0xb9e34f(0x15b):''):_0xa636c2+=_0xb9e34f(0xe4)+'\x20\x20\x20\x20applyNormalOffset(positionEC,\x20normalEC,\x20nDotL);\x20\x0a'+_0xb9e34f(0x10e)+'\x20\x20\x20\x20//\x20Stop\x20early\x20if\x20the\x20fragment\x20is\x20not\x20in\x20the\x20shadow\x20bounds\x20\x0a'+_0xb9e34f(0x156)+'\x20\x20\x20\x20{\x20\x0a'+'\x20\x20\x20\x20\x20\x20\x20\x20return;\x20\x0a'+'\x20\x20\x20\x20}\x20\x0a'+'\x20\x20\x20\x20shadowParameters.texCoords\x20=\x20shadowPosition.xy;\x20\x0a'+'\x20\x20\x20\x20shadowParameters.depth\x20=\x20shadowPosition.z;\x20\x0a'+'\x20\x20\x20\x20shadowParameters.nDotL\x20=\x20nDotL;\x20\x0a'+'\x20\x20\x20\x20float\x20visibility\x20=\x20czm_shadowVisibility(shadowMap_texture,\x20shadowParameters);\x20\x0a';}return _0xa636c2+='\x20\x20\x20if(visibility==0.0)\x20\x0a'+'\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'+'\x20\x20\x20\x20\x20\x20\x20\x20out_FragColor.rgb\x20*=\x20vec3(0.0,0.8,0.0)\x20*\x20visibility;\x0a'+_0xb9e34f(0x179)+_0xb9e34f(0x16f),_0x463266[_0xb9e34f(0x11a)](_0xa636c2),new _0x48e71c[(_0xb9e34f(0x19f))]({'defines':_0x234a88,'sources':_0x463266});}_0x48e71c['ShadowMap']['createReceiveDerivedCommand']=function(_0x3aaf68,_0x16087f,_0x14d567,_0x4a6e51,_0x208626){var _0x10c13d=_0x22700e;!_0x48e71c[_0x10c13d(0x150)](_0x208626)&&(_0x208626={});var _0x1e8286=_0x3aaf68['length']>0x0,_0x484661=_0x16087f[_0x10c13d(0xe9)],_0x31f02d=_0x484661[_0x10c13d(0x18d)],_0x40f63=_0x484661['fragmentShaderSource'],_0x3533e6=_0x16087f['pass']===_0x48e71c['Pass'][_0x10c13d(0x161)],_0xd13233=![];_0x3533e6&&(_0xd13233=_0x16087f[_0x10c13d(0xd5)]['data'][_0x10c13d(0x111)][_0x10c13d(0x100)]['hasVertexNormals']);if(_0x16087f[_0x10c13d(0x1a0)]&&_0x1e8286){var _0x423167,_0x4051bb;_0x48e71c['defined'](_0x208626['receiveCommand'])&&(_0x423167=_0x208626[_0x10c13d(0x1b2)]['shaderProgram'],_0x4051bb=_0x208626[_0x10c13d(0x1b2)][_0x10c13d(0x1bd)]);_0x208626[_0x10c13d(0x1b2)]=_0x48e71c[_0x10c13d(0x1ad)][_0x10c13d(0x144)](_0x16087f,_0x208626['receiveCommand']),_0x208626['castShadows']=![],_0x208626[_0x10c13d(0x1a0)]=!![];var _0x484eb1=_0x208626['receiveShaderCastShadows']!==_0x16087f['castShadows'],_0x400501=_0x208626['receiveShaderProgramId']!==_0x16087f[_0x10c13d(0xe9)]['id'];if(!_0x48e71c[_0x10c13d(0x150)](_0x423167)||_0x400501||_0x14d567||_0x484eb1){var _0x2eb13c;_0x3aaf68[0x0]['isViewShed']?_0x2eb13c=getShadowReceiveShaderKeyword(_0x3aaf68[0x0],_0x16087f['castShadows'],_0x3533e6,_0xd13233):_0x2eb13c=_0x48e71c['ShadowMapShader']['getShadowReceiveShaderKeyword'](_0x3aaf68[0x0],_0x16087f[_0x10c13d(0x1af)],_0x3533e6,_0xd13233);_0x423167=_0x4a6e51['shaderCache']['getDerivedShaderProgram'](_0x484661,_0x2eb13c);if(!_0x48e71c['defined'](_0x423167)){var _0xe1655e=_0x48e71c['ShadowMapShader']['createShadowReceiveVertexShader'](_0x31f02d,_0x3533e6,_0xd13233),_0x23d96a;_0x3aaf68[0x0]['isViewShed']?_0x23d96a=createShadowReceiveFragmentShader(_0x40f63,_0x3aaf68[0x0],_0x16087f['castShadows'],_0x3533e6,_0xd13233):_0x23d96a=_0x48e71c['ShadowMapShader']['createShadowReceiveFragmentShader'](_0x40f63,_0x3aaf68[0x0],_0x16087f['castShadows'],_0x3533e6,_0xd13233),_0x423167=_0x4a6e51['shaderCache']['createDerivedShaderProgram'](_0x484661,_0x2eb13c,{'vertexShaderSource':_0xe1655e,'fragmentShaderSource':_0x23d96a,'attributeLocations':_0x484661['_attributeLocations']});}_0x4051bb=combineUniforms(_0x3aaf68[0x0],_0x16087f[_0x10c13d(0x1bd)],_0x3533e6);}_0x208626['receiveCommand'][_0x10c13d(0xe9)]=_0x423167,_0x208626['receiveCommand'][_0x10c13d(0x1bd)]=_0x4051bb,_0x208626['receiveShaderProgramId']=_0x16087f[_0x10c13d(0xe9)]['id'],_0x208626['receiveShaderCastShadows']=_0x16087f['castShadows'];}return _0x208626;},ViewshedMap[_0x22700e(0xfd)]['isDestroyed']=function(){return![];},ViewshedMap[_0x22700e(0xfd)][_0x22700e(0x163)]=function(){var _0x513e22=_0x22700e;destroyFramebuffer(this),this[_0x513e22(0x1b1)]=this[_0x513e22(0x1b1)]&&this['_debugLightFrustum']['destroy'](),this['_debugCameraFrustum']=this[_0x513e22(0x1b7)]&&this[_0x513e22(0x1b7)]['destroy'](),this['_debugShadowViewCommand']=this[_0x513e22(0x14a)]&&this['_debugShadowViewCommand']['shaderProgram']&&this[_0x513e22(0x14a)][_0x513e22(0xe9)][_0x513e22(0x163)]();for(var _0x2bf541=0x0;_0x2bf541<this[_0x513e22(0xc7)];++_0x2bf541){this['_debugCascadeFrustums'][_0x2bf541]=this['_debugCascadeFrustums'][_0x2bf541]&&this['_debugCascadeFrustums'][_0x2bf541]['destroy']();}return _0x48e71c[_0x513e22(0x19d)](this);};export default ViewshedMap;