|
@@ -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;
|