瀏覽代碼

Merge pull request #7446 from Popov72/csm-serialize-parse

CSM: Make sure all properties are serialized/parsed
David Catuhe 5 年之前
父節點
當前提交
b7b9d47213

+ 1 - 0
dist/preview release/what's new.md

@@ -57,6 +57,7 @@
 - Improved cascade blending in CSM shadow technique ([Popov72](https://github.com/Popov72))
 - Speed optimization when cascade blending is not used in CSM shadow technique ([Popov72](https://github.com/Popov72))
 - Added `RenderTargetTexture.getCustomRenderList` to overload the render list at rendering time (and possibly for each layer (2DArray) / face (Cube)) ([Popov72](https://github.com/Popov72))
+- Make sure all properties of CascadedShadowMap class are serialized/parsed ([Popov72](https://github.com/Popov72))
 
 ### Engine
 

+ 60 - 39
src/Lights/Shadows/cascadedShadowGenerator.ts

@@ -61,6 +61,11 @@ export class CascadedShadowGenerator implements IShadowGenerator {
     ];
 
     /**
+     * Name of the CSM class
+     */
+    public static readonly CLASSNAME = "CascadedShadowGenerator";
+
+    /**
      * Defines the default number of cascades used by the CSM.
      */
     public static readonly DEFAULT_CASCADES_COUNT = 4;
@@ -507,7 +512,7 @@ export class CascadedShadowGenerator implements IShadowGenerator {
      * @returns "ShadowGenerator"
      */
     public getClassName(): string {
-        return "CascadedShadowGenerator";
+        return CascadedShadowGenerator.CLASSNAME;
     }
 
     /**
@@ -1701,29 +1706,34 @@ export class CascadedShadowGenerator implements IShadowGenerator {
             return serializationObject;
         }
 
+        serializationObject.className = this.getClassName();
         serializationObject.lightId = this._light.id;
         serializationObject.mapSize = shadowMap.getRenderSize();
         serializationObject.forceBackFacesOnly = this.forceBackFacesOnly;
         serializationObject.darkness = this.getDarkness();
         serializationObject.transparencyShadow = this._transparencyShadow;
         serializationObject.frustumEdgeFalloff = this.frustumEdgeFalloff;
-        serializationObject.numCascades = this._numCascades;
-        serializationObject.stabilizeCascades = this.stabilizeCascades;
-        serializationObject.depthClamp = this._depthClamp;
-        serializationObject.lambda = this._lambda;
-        serializationObject.freezeShadowCastersBoundingInfo = this._freezeShadowCastersBoundingInfo;
-        serializationObject.shadowMaxZ = this._shadowMaxZ;
-        serializationObject.cascadeBlendPercentage = this.cascadeBlendPercentage;
-
         serializationObject.bias = this.bias;
         serializationObject.normalBias = this.normalBias;
-
         serializationObject.usePercentageCloserFiltering = this.usePercentageCloserFiltering;
         serializationObject.useContactHardeningShadow = this.useContactHardeningShadow;
-        serializationObject.filteringQuality = this.filteringQuality;
         serializationObject.contactHardeningLightSizeUVRatio = this.contactHardeningLightSizeUVRatio;
+        serializationObject.filteringQuality = this.filteringQuality;
+
+        serializationObject.numCascades = this._numCascades;
+        serializationObject.debug = this._debug;
+        serializationObject.stabilizeCascades = this.stabilizeCascades;
+        serializationObject.lambda = this._lambda;
+        serializationObject.cascadeBlendPercentage = this.cascadeBlendPercentage;
+        serializationObject.depthClamp = this._depthClamp;
+        serializationObject.autoCalcDepthBounds = this.autoCalcDepthBounds;
+        serializationObject.shadowMaxZ = this._shadowMaxZ;
         serializationObject.penumbraDarkness = this.penumbraDarkness;
 
+        serializationObject.freezeShadowCastersBoundingInfo = this._freezeShadowCastersBoundingInfo;
+        serializationObject.minDistance = this.minDistance;
+        serializationObject.maxDistance = this.maxDistance;
+
         serializationObject.renderList = [];
         if (shadowMap.renderList) {
             for (var meshIndex = 0; meshIndex < shadowMap.renderList.length; meshIndex++) {
@@ -1760,19 +1770,18 @@ export class CascadedShadowGenerator implements IShadowGenerator {
             });
         }
 
-        if (parsedShadowGenerator.usePercentageCloserFiltering) {
-            shadowGenerator.usePercentageCloserFiltering = true;
-        }
-        else if (parsedShadowGenerator.useContactHardeningShadow) {
-            shadowGenerator.useContactHardeningShadow = true;
+        shadowGenerator.forceBackFacesOnly = !!parsedShadowGenerator.forceBackFacesOnly;
+
+        if (parsedShadowGenerator.darkness !== undefined) {
+            shadowGenerator.setDarkness(parsedShadowGenerator.darkness);
         }
 
-        if (parsedShadowGenerator.filteringQuality !== undefined) {
-            shadowGenerator.filteringQuality = parsedShadowGenerator.filteringQuality;
+        if (parsedShadowGenerator.transparencyShadow) {
+            shadowGenerator.setTransparencyShadow(true);
         }
 
-        if (parsedShadowGenerator.contactHardeningLightSizeUVRatio !== undefined) {
-            shadowGenerator.contactHardeningLightSizeUVRatio = parsedShadowGenerator.contactHardeningLightSizeUVRatio;
+        if (parsedShadowGenerator.frustumEdgeFalloff !== undefined) {
+            shadowGenerator.frustumEdgeFalloff = parsedShadowGenerator.frustumEdgeFalloff;
         }
 
         if (parsedShadowGenerator.bias !== undefined) {
@@ -1783,50 +1792,62 @@ export class CascadedShadowGenerator implements IShadowGenerator {
             shadowGenerator.normalBias = parsedShadowGenerator.normalBias;
         }
 
-        if (parsedShadowGenerator.frustumEdgeFalloff !== undefined) {
-            shadowGenerator.frustumEdgeFalloff = parsedShadowGenerator.frustumEdgeFalloff;
+        if (parsedShadowGenerator.usePercentageCloserFiltering) {
+            shadowGenerator.usePercentageCloserFiltering = true;
+        } else if (parsedShadowGenerator.useContactHardeningShadow) {
+            shadowGenerator.useContactHardeningShadow = true;
         }
 
-        if (parsedShadowGenerator.darkness !== undefined) {
-            shadowGenerator.setDarkness(parsedShadowGenerator.darkness);
+        if (parsedShadowGenerator.contactHardeningLightSizeUVRatio !== undefined) {
+            shadowGenerator.contactHardeningLightSizeUVRatio = parsedShadowGenerator.contactHardeningLightSizeUVRatio;
         }
 
-        if (parsedShadowGenerator.transparencyShadow) {
-            shadowGenerator.setTransparencyShadow(true);
+        if (parsedShadowGenerator.filteringQuality !== undefined) {
+            shadowGenerator.filteringQuality = parsedShadowGenerator.filteringQuality;
         }
 
-        shadowGenerator.forceBackFacesOnly = !!parsedShadowGenerator.forceBackFacesOnly;
+        if (parsedShadowGenerator.numCascades !== undefined) {
+            shadowGenerator.numCascades = parsedShadowGenerator.numCascades;
+        }
+
+        if (parsedShadowGenerator.debug !== undefined) {
+            shadowGenerator.debug = parsedShadowGenerator.debug;
+        }
 
         if (parsedShadowGenerator.stabilizeCascades !== undefined) {
             shadowGenerator.stabilizeCascades = parsedShadowGenerator.stabilizeCascades;
         }
 
-        if (parsedShadowGenerator.depthClamp !== undefined) {
-             shadowGenerator.depthClamp = parsedShadowGenerator.depthClamp;
+        if (parsedShadowGenerator.lambda !== undefined) {
+            shadowGenerator.lambda = parsedShadowGenerator.lambda;
         }
 
-        if (parsedShadowGenerator.lambda !== undefined) {
-             shadowGenerator.lambda = parsedShadowGenerator.lambda;
+        if (parsedShadowGenerator.cascadeBlendPercentage !== undefined) {
+            shadowGenerator.cascadeBlendPercentage = parsedShadowGenerator.cascadeBlendPercentage;
         }
 
-        if (parsedShadowGenerator.freezeShadowCastersBoundingInfo !== undefined) {
-            shadowGenerator.freezeShadowCastersBoundingInfo = parsedShadowGenerator.freezeShadowCastersBoundingInfo;
+        if (parsedShadowGenerator.depthClamp !== undefined) {
+             shadowGenerator.depthClamp = parsedShadowGenerator.depthClamp;
         }
 
-        if (parsedShadowGenerator.shadowMaxZ !== undefined) {
-             shadowGenerator.shadowMaxZ = parsedShadowGenerator.shadowMaxZ;
+        if (parsedShadowGenerator.autoCalcDepthBounds !== undefined) {
+            shadowGenerator.autoCalcDepthBounds = parsedShadowGenerator.autoCalcDepthBounds;
         }
 
-        if (parsedShadowGenerator.cascadeBlendPercentage !== undefined) {
-             shadowGenerator.cascadeBlendPercentage = parsedShadowGenerator.cascadeBlendPercentage;
+        if (parsedShadowGenerator.shadowMaxZ !== undefined) {
+            shadowGenerator.shadowMaxZ = parsedShadowGenerator.shadowMaxZ;
         }
 
         if (parsedShadowGenerator.penumbraDarkness !== undefined) {
             shadowGenerator.penumbraDarkness = parsedShadowGenerator.penumbraDarkness;
         }
 
-        if (parsedShadowGenerator.numCascades !== undefined) {
-            shadowGenerator.numCascades = parsedShadowGenerator.numCascades;
+        if (parsedShadowGenerator.freezeShadowCastersBoundingInfo !== undefined) {
+            shadowGenerator.freezeShadowCastersBoundingInfo = parsedShadowGenerator.freezeShadowCastersBoundingInfo;
+        }
+
+        if (parsedShadowGenerator.minDistance !== undefined && parsedShadowGenerator.maxDistance !== undefined) {
+            shadowGenerator.setMinMaxDistance(parsedShadowGenerator.minDistance, parsedShadowGenerator.maxDistance);
         }
 
         return shadowGenerator;

+ 5 - 1
src/Lights/Shadows/shadowGeneratorSceneComponent.ts

@@ -12,7 +12,11 @@ AbstractScene.AddParser(SceneComponentConstants.NAME_SHADOWGENERATOR, (parsedDat
     if (parsedData.shadowGenerators !== undefined && parsedData.shadowGenerators !== null) {
         for (var index = 0, cache = parsedData.shadowGenerators.length; index < cache; index++) {
             var parsedShadowGenerator = parsedData.shadowGenerators[index];
-            ShadowGenerator.Parse(parsedShadowGenerator, scene);
+            if (parsedShadowGenerator.className === CascadedShadowGenerator.CLASSNAME) {
+                CascadedShadowGenerator.Parse(parsedShadowGenerator, scene);
+            } else {
+                ShadowGenerator.Parse(parsedShadowGenerator, scene);
+            }
             // SG would be available on their associated lights
         }
     }