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.
- package/dist/assets/Build/DeepTwins/Image/noise.png +0 -0
- package/dist/assets/Build/DeepTwins/Workers/CustomRasterClip.worker.js +1 -2
- package/dist/assets/Build/DeepTwins/Workers/MvtVector.worker.js +1 -1
- package/dist/assets/Build/Map3d/ThirdParty/Workers/zip-web-worker.js +640 -0
- package/dist/assets/Build/Map3d/ThirdParty/wasm_splats_bg.wasm +0 -0
- package/dist/assets/Build/Map3d/ThirdParty/zip-module.wasm +0 -0
- package/dist/assets/Build/Map3d/Workers/chunk-27NG6PQR.js +456 -0
- package/dist/assets/Build/Map3d/Workers/chunk-2JVMMMWT.js +353 -0
- package/dist/assets/Build/Map3d/Workers/chunk-2Y2XYQCS.js +1481 -0
- package/dist/assets/Build/Map3d/Workers/chunk-34RF3V5G.js +220 -0
- package/dist/assets/Build/Map3d/Workers/chunk-35H7BYLJ.js +1800 -0
- package/dist/assets/Build/Map3d/Workers/chunk-57OGEF5V.js +435 -0
- package/dist/assets/Build/Map3d/Workers/chunk-5PX3DYJA.js +196 -0
- package/dist/assets/Build/Map3d/Workers/chunk-7B5XGQRN.js +171 -0
- package/dist/assets/Build/Map3d/Workers/chunk-ATLWOZFF.js +39 -0
- package/dist/assets/Build/Map3d/Workers/chunk-BMSUECTA.js +1055 -0
- package/dist/assets/Build/Map3d/Workers/chunk-C6IA4TKW.js +476 -0
- package/dist/assets/Build/Map3d/Workers/chunk-CZ44I32U.js +157 -0
- package/dist/assets/Build/Map3d/Workers/chunk-DE6UV44R.js +122 -0
- package/dist/assets/Build/Map3d/Workers/chunk-DUCCKVOG.js +834 -0
- package/dist/assets/Build/Map3d/Workers/chunk-EBJBPIYX.js +239 -0
- package/dist/assets/Build/Map3d/Workers/chunk-EYSYQ2R6.js +138 -0
- package/dist/assets/Build/Map3d/Workers/chunk-FMCAAUQI.js +368 -0
- package/dist/assets/Build/Map3d/Workers/chunk-GMYZNRRQ.js +2717 -0
- package/dist/assets/Build/Map3d/Workers/chunk-GWPNZZV4.js +781 -0
- package/dist/assets/Build/Map3d/Workers/chunk-HLP2U4KW.js +758 -0
- package/dist/assets/Build/Map3d/Workers/chunk-HSJSUPQV.js +500 -0
- package/dist/assets/Build/Map3d/Workers/chunk-I73Q3AG7.js +58 -0
- package/dist/assets/Build/Map3d/Workers/chunk-IMZ4YIMV.js +511 -0
- package/dist/assets/Build/Map3d/Workers/chunk-IZSK4DVF.js +421 -0
- package/dist/assets/Build/Map3d/Workers/chunk-JKLMRPKK.js +75 -0
- package/dist/assets/Build/Map3d/Workers/chunk-KGM345JM.js +691 -0
- package/dist/assets/Build/Map3d/Workers/chunk-L4IR5U4G.js +102 -0
- package/dist/assets/Build/Map3d/Workers/chunk-MG4EVQH2.js +44 -0
- package/dist/assets/Build/Map3d/Workers/chunk-NXWEFAZJ.js +300 -0
- package/dist/assets/Build/Map3d/Workers/chunk-PDFAJISJ.js +59 -0
- package/dist/assets/Build/Map3d/Workers/chunk-PHWZFJR5.js +100 -0
- package/dist/assets/Build/Map3d/Workers/chunk-PLE7CHBE.js +101 -0
- package/dist/assets/Build/Map3d/Workers/chunk-PN3GIZ5Q.js +163 -0
- package/dist/assets/Build/Map3d/Workers/chunk-PXL5XLHV.js +1073 -0
- package/dist/assets/Build/Map3d/Workers/chunk-QYXOF5JC.js +959 -0
- package/dist/assets/Build/Map3d/Workers/chunk-R2LIFXV3.js +115 -0
- package/dist/assets/Build/Map3d/Workers/chunk-R4W6IRJZ.js +10357 -0
- package/dist/assets/Build/Map3d/Workers/chunk-R5PZXG56.js +1258 -0
- package/dist/assets/Build/Map3d/Workers/chunk-RZQLZIUI.js +629 -0
- package/dist/assets/Build/Map3d/Workers/chunk-SIBDD6Y4.js +390 -0
- package/dist/assets/Build/Map3d/Workers/chunk-U5NN6JTQ.js +398 -0
- package/dist/assets/Build/Map3d/Workers/chunk-UA5RPPP3.js +73 -0
- package/dist/assets/Build/Map3d/Workers/chunk-UXLKFS3C.js +305 -0
- package/dist/assets/Build/Map3d/Workers/chunk-VUX4BQIM.js +37 -0
- package/dist/assets/Build/Map3d/Workers/chunk-WJDUUUJS.js +684 -0
- package/dist/assets/Build/Map3d/Workers/chunk-XBJOJHWX.js +139 -0
- package/dist/assets/Build/Map3d/Workers/chunk-XJDMTNKD.js +634 -0
- package/dist/assets/Build/Map3d/Workers/chunk-XUCXZZE5.js +963 -0
- package/dist/assets/Build/Map3d/Workers/chunk-YIKGVMJ5.js +287 -0
- package/dist/assets/Build/Map3d/Workers/chunk-YTNCIBPQ.js +262 -0
- package/dist/assets/Build/Map3d/Workers/chunk-ZMDUYETO.js +55 -0
- package/dist/assets/Build/Map3d/Workers/chunk-ZW52HXFN.js +2857 -0
- package/dist/esm/analyze/LineOfSightAnalysis.js +1 -326
- package/dist/esm/analyze/SubmergenceAnalysis.js +1 -137
- package/dist/esm/analyze/SunLightAnalysis.js +1 -91
- package/dist/esm/analyze/TerrainExcavationAnalysis.js +1 -612
- package/dist/esm/analyze/ViewshedAnalysis.js +1 -292
- package/dist/esm/cameraControl/ModelRoamHistory.js +1 -639
- package/dist/esm/cameraControl/ModelRoamRealTime.js +1 -874
- package/dist/esm/cameraControl/Roam.js +1 -418
- package/dist/esm/cameraControl/Rotate.js +1 -134
- package/dist/esm/cameraControl/RotateInPlace.js +1 -99
- package/dist/esm/constant.d.ts +90 -0
- package/dist/esm/constant.js +1 -1287
- package/dist/esm/deepTwins/index.js +1 -121
- package/dist/esm/drawCommand/index.js +1 -3
- package/dist/esm/drawCommand/viewShed/Event.js +1 -142
- package/dist/esm/drawCommand/viewShed/RectangularSensorPrimitive.js +1 -1306
- package/dist/esm/drawCommand/viewShed/ViewShadowPrimitive.js +1 -66
- package/dist/esm/drawCommand/viewShed/ViewShedAnalyserLayer.js +1 -466
- package/dist/esm/drawCommand/viewShed/ViewShedMap.js +1 -1238
- package/dist/esm/drawCommand/viewShed/config.js +1 -21
- package/dist/esm/drawCommand/volumeCloud/GeometryPrimitive.js +1 -89
- package/dist/esm/drawCommand/volumeCloud/ImprovedNoise.js +1 -112
- package/dist/esm/drawCommand/volumeCloud/VolumeClouds.js +1 -91
- package/dist/esm/drawer/algorithm.js +1 -314
- package/dist/esm/drawer/common.js +1 -965
- package/dist/esm/drawer/coordinate.js +1 -184
- package/dist/esm/drawer/index.d.ts +1 -1
- package/dist/esm/drawer/index.js +1 -688
- package/dist/esm/drawer/plotUtil.js +1 -266
- package/dist/esm/drawer/shape/Assemble.js +1 -415
- package/dist/esm/drawer/shape/AttackArrow.js +1 -442
- package/dist/esm/drawer/shape/BaseShape.js +1 -383
- package/dist/esm/drawer/shape/Bow.js +1 -375
- package/dist/esm/drawer/shape/Circle.js +1 -461
- package/dist/esm/drawer/shape/Curve.js +1 -386
- package/dist/esm/drawer/shape/DragPoint.js +1 -211
- package/dist/esm/drawer/shape/Elliptic.js +1 -491
- package/dist/esm/drawer/shape/Formation.js +1 -395
- package/dist/esm/drawer/shape/PincerArrow.js +1 -445
- package/dist/esm/drawer/shape/Point.js +1 -131
- package/dist/esm/drawer/shape/Polygon.js +1 -368
- package/dist/esm/drawer/shape/Polyline.js +1 -325
- package/dist/esm/drawer/shape/RegularPolygon.js +1 -468
- package/dist/esm/drawer/shape/RightAngleArrow.js +1 -423
- package/dist/esm/drawer/shape/Sector.js +1 -568
- package/dist/esm/drawer/shape/StraightArrow.js +1 -422
- package/dist/esm/drawer/shape/SwallowtailArrow.js +1 -438
- package/dist/esm/drawer/types.js +1 -11
- package/dist/esm/drawer/utils.js +1 -381
- package/dist/esm/global.css +22 -1
- package/dist/esm/graphicLayer/BaseEntity.js +1 -51
- package/dist/esm/graphicLayer/BaseLayer.js +1 -730
- package/dist/esm/graphicLayer/BasePointPrimitive.js +1 -45
- package/dist/esm/graphicLayer/BasePrimitive.js +1 -36
- package/dist/esm/graphicLayer/BasePrimitiveInstance.js +1 -37
- package/dist/esm/graphicLayer/BaseSource.d.ts +1 -1
- package/dist/esm/graphicLayer/BaseSource.js +1 -630
- package/dist/esm/graphicLayer/BillboardEntity.js +1 -106
- package/dist/esm/graphicLayer/BillboardPrimitive.js +1 -119
- package/dist/esm/graphicLayer/BoxEntity.js +1 -99
- package/dist/esm/graphicLayer/BoxPrimitive.js +1 -48
- package/dist/esm/graphicLayer/BoxPrimitiveInstance.js +1 -91
- package/dist/esm/graphicLayer/EllipseEntity.js +1 -110
- package/dist/esm/graphicLayer/EllipsePrimitive.js +1 -47
- package/dist/esm/graphicLayer/EllipsePrimitiveInstance.js +1 -98
- package/dist/esm/graphicLayer/EllipsoidEntity.js +1 -118
- package/dist/esm/graphicLayer/EllipsoidPrimitive.js +1 -48
- package/dist/esm/graphicLayer/EllipsoidPrimitiveInstance.js +1 -113
- package/dist/esm/graphicLayer/GraphicLayerCollection.js +1 -491
- package/dist/esm/graphicLayer/HtmlEntity.d.ts +4 -0
- package/dist/esm/graphicLayer/HtmlEntity.js +1 -189
- package/dist/esm/graphicLayer/LabelEntity.js +1 -110
- package/dist/esm/graphicLayer/LabelPrimitive.js +1 -127
- package/dist/esm/graphicLayer/ModelEntity.js +1 -122
- package/dist/esm/graphicLayer/ModelPrimitive.js +1 -59
- package/dist/esm/graphicLayer/ModelPrimitiveInstance.js +1 -86
- package/dist/esm/graphicLayer/PointEntity.js +1 -94
- package/dist/esm/graphicLayer/PointPrimitive.js +1 -107
- package/dist/esm/graphicLayer/PolygonEntity.js +1 -103
- package/dist/esm/graphicLayer/PolygonGroundPrimitive.js +1 -49
- package/dist/esm/graphicLayer/PolygonGroundPrimitiveImageMaterialInstance.js +1 -87
- package/dist/esm/graphicLayer/PolygonPrimitive.js +1 -60
- package/dist/esm/graphicLayer/PolygonPrimitiveImageMaterialInstance.js +1 -84
- package/dist/esm/graphicLayer/PolygonPrimitiveInstance.js +1 -101
- package/dist/esm/graphicLayer/PolylineEntity.js +1 -96
- package/dist/esm/graphicLayer/PolylineGroundPrimitive.js +1 -55
- package/dist/esm/graphicLayer/PolylineGroundPrimitiveInstance.js +1 -85
- package/dist/esm/graphicLayer/PolylinePrimitive.js +1 -53
- package/dist/esm/graphicLayer/PolylinePrimitiveInstance.js +1 -85
- package/dist/esm/graphicLayer/PolylineVolumeEntity.js +1 -105
- package/dist/esm/graphicLayer/PolylineVolumePrimitive.js +1 -47
- package/dist/esm/graphicLayer/PolylineVolumePrimitiveInstance.js +1 -94
- package/dist/esm/graphicLayer/WallEntity.js +1 -96
- package/dist/esm/graphicLayer/WallPrimitive.js +1 -47
- package/dist/esm/graphicLayer/WallPrimitiveInstance.js +1 -88
- package/dist/esm/index.d.ts +4 -0
- package/dist/esm/index.js +1 -175
- package/dist/esm/lowAltitude/BarrierLayer.js +1 -172
- package/dist/esm/lowAltitude/BaseGridMvtLayer.js +1 -122
- package/dist/esm/lowAltitude/FactorLayer.js +1 -199
- package/dist/esm/lowAltitude/FlightPlanning.js +1 -411
- package/dist/esm/lowAltitude/FlightRiskEvaluation.js +1 -543
- package/dist/esm/lowAltitude/GridDraw.js +1 -137
- package/dist/esm/lowAltitude/PoiLayer.js +1 -74
- package/dist/esm/lowAltitude/RoutePlanning.js +1 -318
- package/dist/esm/lowAltitude/VisitLayer.js +1 -180
- package/dist/esm/map/Event.js +1 -377
- package/dist/esm/map/GroundSkyBox.js +1 -166
- package/dist/esm/map/Map.js +1 -881
- package/dist/esm/map/Property.js +1 -35
- package/dist/esm/material/AtmosphericDispersion.js +1 -569
- package/dist/esm/material/GlobalVolumetricCloud.js +1 -377
- package/dist/esm/material/VolumeCloud.js +1 -115
- package/dist/esm/material/WeatherEffects.js +1 -351
- package/dist/esm/material/entity/BaseMaterialProperty.js +1 -51
- package/dist/esm/material/entity/CircleWaveMaterialProperty.js +1 -101
- package/dist/esm/material/entity/DynamicWallMaterialProperty.js +1 -101
- package/dist/esm/material/entity/ImageGlowingMaterialProperty.js +1 -89
- package/dist/esm/material/entity/ImageMaterialProperty.js +1 -34
- package/dist/esm/material/entity/PolylineTrailLinkMaterialProperty.js +1 -132
- package/dist/esm/material/primitive/BaseMaterialAppearance.js +1 -28
- package/dist/esm/material/primitive/ImageGlowingMaterialAppearance.js +1 -77
- package/dist/esm/material/primitive/ImageMaterialAppearance.js +1 -77
- package/dist/esm/measure/Area.js +1 -220
- package/dist/esm/measure/BaseDraw.js +1 -105
- package/dist/esm/measure/Distance.js +1 -223
- package/dist/esm/measure/index.js +1 -266
- package/dist/esm/measure/types.js +1 -17
- package/dist/esm/measure/utils.js +1 -319
- package/dist/esm/particle/BaseParticle.js +1 -196
- package/dist/esm/particle/FireParticle.js +1 -65
- package/dist/esm/particle/FountainParticle.js +1 -80
- package/dist/esm/particle/SmokeParticle.js +1 -65
- package/dist/esm/particle/common.js +1 -23
- package/dist/esm/particle/index.js +1 -5
- package/dist/esm/property/PositionProperty.js +1 -56
- package/dist/esm/tileLayer/ArcGisLayer.js +1 -41
- package/dist/esm/tileLayer/CustomRasterClipWorkerClient.js +1 -147
- package/dist/esm/tileLayer/CustomRasterLayer.js +1 -1136
- package/dist/esm/tileLayer/ImageryLayer.js +1 -44
- package/dist/esm/tileLayer/MvtVectorLoad.js +1 -1549
- package/dist/esm/tileLayer/MvtVectorWorkerClient.js +1 -126
- package/dist/esm/tileLayer/RasterLayer.js +1 -23
- package/dist/esm/tileLayer/WmsLayer.js +1 -26
- package/dist/esm/tileLayer/WmtsLayer.js +1 -23
- package/dist/esm/tool/BuildClampedPolygonGrid.js +1 -278
- package/dist/esm/tool/Compass.js +1 -282
- package/dist/esm/tool/PrimitiveCluster.js +1 -706
- package/dist/esm/tool/TimerInterval.js +1 -58
- package/dist/esm/tool/common.js +1 -405
- package/dist/esm/tool/fetch.js +1 -222
- package/dist/esm/tool/heatmap.js +1 -631
- package/dist/esm/tool/utils.d.ts +1 -0
- package/dist/esm/tool/utils.js +1 -501
- package/dist/esm/toolTip/index.js +1 -79
- package/dist/esm/videoFusion/BaseVideo.d.ts +7 -0
- package/dist/esm/videoFusion/BaseVideo.js +1 -330
- package/dist/esm/videoFusion/VideoProject.js +1 -230
- package/dist/esm/videoFusion/VideoTexture.js +1 -163
- package/dist/esm/visualization/BaseHeatmap.js +1 -271
- package/dist/esm/visualization/BoundaryHighlight.d.ts +136 -0
- package/dist/esm/visualization/BoundaryHighlight.js +1 -0
- package/dist/esm/visualization/DynamicWater.js +1 -289
- package/dist/esm/visualization/Frustum.js +1 -248
- package/dist/esm/visualization/Heatmap2d.js +1 -97
- package/dist/esm/visualization/Heatmap3d.js +1 -281
- package/dist/esm/visualization/MigrationEffect.js +1 -397
- package/dist/esm/visualization/PointCluster.js +1 -220
- package/dist/esm/visualization/RadarScan.js +1 -333
- package/dist/esm/visualization/SampledTerrainRiver.d.ts +180 -0
- package/dist/esm/visualization/SampledTerrainRiver.js +1 -0
- package/dist/esm/visualization/SampledTerrainWater.d.ts +170 -0
- package/dist/esm/visualization/SampledTerrainWater.js +1 -0
- package/dist/esm/visualization/WindField.d.ts +72 -0
- package/dist/esm/visualization/WindField.js +1 -0
- package/dist/esm/visualization/windCore.d.ts +161 -0
- package/dist/esm/visualization/windCore.js +8 -0
- package/dist/umd/deeptwins-engine-3d.min.css +1 -1
- package/dist/umd/deeptwins-engine-3d.min.js +1 -1
- 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;
|