Переглянути джерело

Merge pull request #8864 from sebavan/master

Try fix Transmission helper
sebavan 5 роки тому
батько
коміт
fbce4356a9

+ 19 - 5
loaders/src/glTF/2.0/Extensions/KHR_materials_transmission.ts

@@ -13,6 +13,13 @@ import { Texture } from "babylonjs/Materials/Textures/texture";
 import { RenderTargetTexture } from "babylonjs/Materials/Textures/renderTargetTexture";
 import { Observable } from "babylonjs/Misc/observable";
 
+interface ITransmissionHelperHolder {
+    /**
+     * @hidden
+     */
+    _transmissionHelper: TransmissionHelper | undefined;
+}
+
 interface ITransmissionHelperOptions {
     /**
      * The size of the render buffers
@@ -37,7 +44,8 @@ class TransmissionHelper {
     /**
      * Stores the creation options.
      */
-    private readonly _scene: Scene;
+    private readonly _scene: Scene & ITransmissionHelperHolder;
+
     private _options: ITransmissionHelperOptions;
 
     private _opaqueRenderTarget: Nullable<RenderTargetTexture> = null;
@@ -60,8 +68,13 @@ class TransmissionHelper {
             ...TransmissionHelper._getDefaultOptions(),
             ...options
         };
-        this._scene = scene;
+        this._scene = scene as any;
+        this._scene._transmissionHelper = this;
+
         this.onErrorObservable = new Observable();
+        this._scene.onDisposeObservable.addOnce((scene) => {
+            this.dispose();
+        });
 
         this._parseScene();
         this._setupRenderTargets();
@@ -224,6 +237,7 @@ class TransmissionHelper {
      * Dispose all the elements created by the Helper.
      */
     public dispose(): void {
+        this._scene._transmissionHelper = undefined;
         if (this._opaqueRenderTarget) {
             this._opaqueRenderTarget.dispose();
             this._opaqueRenderTarget = null;
@@ -233,7 +247,6 @@ class TransmissionHelper {
     }
 }
 
-let _transmissionHelper: TransmissionHelper;
 const NAME = "KHR_materials_transmission";
 
 /**
@@ -300,8 +313,9 @@ export class KHR_materials_transmission implements IGLTFLoaderExtension {
 
         if (extension.transmissionFactor !== undefined) {
             pbrMaterial.subSurface.refractionIntensity = extension.transmissionFactor;
-            if (pbrMaterial.subSurface.refractionIntensity && _transmissionHelper == undefined) {
-                _transmissionHelper = new TransmissionHelper({}, pbrMaterial.getScene());
+            const scene = pbrMaterial.getScene() as unknown as ITransmissionHelperHolder;
+            if (pbrMaterial.subSurface.refractionIntensity && !scene._transmissionHelper) {
+                new TransmissionHelper({}, pbrMaterial.getScene());
             }
         } else {
             pbrMaterial.subSurface.refractionIntensity = 0.0;