Просмотр исходного кода

better interface for diffusion profiles

Benjamin Guignabert 5 лет назад
Родитель
Сommit
a4967420d7

+ 2 - 1
src/Materials/PBR/pbrBaseMaterial.ts

@@ -806,7 +806,7 @@ export abstract class PBRBaseMaterial extends PushMaterial {
     /**
      * Defines the SubSurface parameters for the material.
      */
-    public readonly subSurface = new PBRSubSurfaceConfiguration(this._markAllSubMeshesAsTexturesDirty.bind(this), this._markScenePrePassDirty.bind(this));
+    public readonly subSurface : PBRSubSurfaceConfiguration;
 
     /**
      * Defines the detail map parameters for the material.
@@ -840,6 +840,7 @@ export abstract class PBRBaseMaterial extends PushMaterial {
         };
 
         this._environmentBRDFTexture = BRDFTextureTools.GetEnvironmentBRDFTexture(scene);
+        this.subSurface = new PBRSubSurfaceConfiguration(this._markAllSubMeshesAsTexturesDirty.bind(this), this._markScenePrePassDirty.bind(this), scene);
     }
 
     /**

+ 21 - 4
src/Materials/PBR/pbrSubSurfaceConfiguration.ts

@@ -72,12 +72,26 @@ export class PBRSubSurfaceConfiguration {
     @expandToProperty("_markScenePrePassDirty")
     public isScatteringEnabled = false;
 
+    @serialize()
+    private _scatteringDiffusionProfileIndex = 0;
+
     /**
      * Diffusion profile for subsurface scattering.
      * Useful for better scattering in the skins or foliages.
      */
-    @serialize()
-    public scatteringDiffusionProfileIndex = 0;
+    public get scatteringDiffusionProfile() {
+        return this._scene.ssDiffusionProfileColors[this._scatteringDiffusionProfileIndex];
+    }
+
+    public set scatteringDiffusionProfile(c: Color3) {
+        if (!this._scene.enablePrePassRenderer()) {
+            // Not supported
+            return;
+        }
+
+        // addDiffusionProfile automatically checks for doubles
+        this._scatteringDiffusionProfileIndex = this._scene.prePassRenderer!.addDiffusionProfile(c);
+    }
 
     /**
      * Defines the refraction intensity of the material.
@@ -229,6 +243,8 @@ export class PBRSubSurfaceConfiguration {
     @expandToProperty("_markAllSubMeshesAsTexturesDirty")
     public useMaskFromThicknessTexture: boolean = false;
 
+    private _scene: Scene;
+
     /** @hidden */
     private _internalMarkAllSubMeshesAsTexturesDirty: () => void;
     private _internalMarkScenePrePassDirty: () => void;
@@ -247,9 +263,10 @@ export class PBRSubSurfaceConfiguration {
      * @param markAllSubMeshesAsTexturesDirty Callback to flag the material to dirty
      * @param markScenePrePassDirty Callback to flag the scene as prepass dirty
      */
-    constructor(markAllSubMeshesAsTexturesDirty: () => void, markScenePrePassDirty: () => void) {
+    constructor(markAllSubMeshesAsTexturesDirty: () => void, markScenePrePassDirty: () => void, scene: Scene) {
         this._internalMarkAllSubMeshesAsTexturesDirty = markAllSubMeshesAsTexturesDirty;
         this._internalMarkScenePrePassDirty = markScenePrePassDirty;
+        this._scene = scene;
     }
 
     /**
@@ -379,7 +396,7 @@ export class PBRSubSurfaceConfiguration {
             }
 
             if (this.isScatteringEnabled) {
-                uniformBuffer.updateFloat("scatteringDiffusionProfile", this.scatteringDiffusionProfileIndex);
+                uniformBuffer.updateFloat("scatteringDiffusionProfile", this._scatteringDiffusionProfileIndex);
             }
             uniformBuffer.updateColor3("vDiffusionDistance", this.diffusionDistance);
 

+ 1 - 1
src/Rendering/prePassRenderer.ts

@@ -297,7 +297,7 @@ export class PrePassRenderer {
         if (this.ssDiffusionD.length >= 5) {
             // We only suppport 5 diffusion profiles
             Logger.Error("You already reached the maximum number of diffusion profiles.");
-            return -1;
+            return 0; // default profile
         }
 
         // Do not add doubles