Browse Source

Make reflection use the scene env texture if texture not provided

Popov72 5 years ago
parent
commit
847a0dfa40

+ 28 - 18
src/Materials/Node/Blocks/Dual/reflectionTextureBaseBlock.ts

@@ -93,6 +93,10 @@ export abstract class ReflectionTextureBaseBlock extends NodeMaterialBlock {
      */
     public abstract get view(): NodeMaterialConnectionPoint;
 
+    protected _getTexture(): Nullable<BaseTexture> {
+        return this.texture;
+    }
+
     public autoConfigure(material: NodeMaterial) {
         if (!this.position.isConnected) {
             let positionInput = material.getInputBlockByPredicate((b) => b.isAttribute && b.name === "position");
@@ -130,25 +134,29 @@ export abstract class ReflectionTextureBaseBlock extends NodeMaterialBlock {
             return;
         }
 
-        if (!this.texture || !this.texture.getTextureMatrix) {
+        const texture = this._getTexture();
+
+        if (!texture || !texture.getTextureMatrix) {
             return;
         }
 
-        defines.setValue(this._define3DName, this.texture.isCube);
-        defines.setValue(this._defineLocalCubicName, (<any>this.texture).boundingBoxSize ? true : false);
-        defines.setValue(this._defineExplicitName, this.texture.coordinatesMode === Constants.TEXTURE_EXPLICIT_MODE);
-        defines.setValue(this._defineSkyboxName, this.texture.coordinatesMode === Constants.TEXTURE_SKYBOX_MODE);
-        defines.setValue(this._defineCubicName, this.texture.coordinatesMode === Constants.TEXTURE_CUBIC_MODE);
-        defines.setValue(this._defineSphericalName, this.texture.coordinatesMode === Constants.TEXTURE_SPHERICAL_MODE);
-        defines.setValue(this._definePlanarName, this.texture.coordinatesMode === Constants.TEXTURE_PLANAR_MODE);
-        defines.setValue(this._defineProjectionName, this.texture.coordinatesMode === Constants.TEXTURE_PROJECTION_MODE);
-        defines.setValue(this._defineEquirectangularName, this.texture.coordinatesMode === Constants.TEXTURE_EQUIRECTANGULAR_MODE);
-        defines.setValue(this._defineEquirectangularFixedName, this.texture.coordinatesMode === Constants.TEXTURE_FIXED_EQUIRECTANGULAR_MODE);
-        defines.setValue(this._defineMirroredEquirectangularFixedName, this.texture.coordinatesMode === Constants.TEXTURE_FIXED_EQUIRECTANGULAR_MIRRORED_MODE);
+        defines.setValue(this._define3DName, texture.isCube);
+        defines.setValue(this._defineLocalCubicName, (<any>texture).boundingBoxSize ? true : false);
+        defines.setValue(this._defineExplicitName, texture.coordinatesMode === Constants.TEXTURE_EXPLICIT_MODE);
+        defines.setValue(this._defineSkyboxName, texture.coordinatesMode === Constants.TEXTURE_SKYBOX_MODE);
+        defines.setValue(this._defineCubicName, texture.coordinatesMode === Constants.TEXTURE_CUBIC_MODE);
+        defines.setValue(this._defineSphericalName, texture.coordinatesMode === Constants.TEXTURE_SPHERICAL_MODE);
+        defines.setValue(this._definePlanarName, texture.coordinatesMode === Constants.TEXTURE_PLANAR_MODE);
+        defines.setValue(this._defineProjectionName, texture.coordinatesMode === Constants.TEXTURE_PROJECTION_MODE);
+        defines.setValue(this._defineEquirectangularName, texture.coordinatesMode === Constants.TEXTURE_EQUIRECTANGULAR_MODE);
+        defines.setValue(this._defineEquirectangularFixedName, texture.coordinatesMode === Constants.TEXTURE_FIXED_EQUIRECTANGULAR_MODE);
+        defines.setValue(this._defineMirroredEquirectangularFixedName, texture.coordinatesMode === Constants.TEXTURE_FIXED_EQUIRECTANGULAR_MIRRORED_MODE);
     }
 
     public isReady() {
-        if (this.texture && !this.texture.isReadyOrNotBlocking()) {
+        const texture = this._getTexture();
+
+        if (texture && !texture.isReadyOrNotBlocking()) {
             return false;
         }
 
@@ -156,16 +164,18 @@ export abstract class ReflectionTextureBaseBlock extends NodeMaterialBlock {
     }
 
     public bind(effect: Effect, nodeMaterial: NodeMaterial, mesh?: Mesh) {
-        if (!mesh || !this.texture) {
+        const texture = this._getTexture();
+
+        if (!mesh || !texture) {
             return;
         }
 
-        effect.setMatrix(this._reflectionMatrixName, this.texture.getReflectionTextureMatrix());
+        effect.setMatrix(this._reflectionMatrixName, texture.getReflectionTextureMatrix());
 
-        if (this.texture.isCube) {
-            effect.setTexture(this._cubeSamplerName, this.texture);
+        if (texture.isCube) {
+            effect.setTexture(this._cubeSamplerName, texture);
         } else {
-            effect.setTexture(this._2DSamplerName, this.texture);
+            effect.setTexture(this._2DSamplerName, texture);
         }
     }
 

+ 11 - 12
src/Materials/Node/Blocks/Fragment/PBR/reflectionBlock.ts

@@ -106,22 +106,23 @@ export class ReflectionBlock extends ReflectionTextureBaseBlock {
         return this._outputs[0];
     }
 
-    /**
-     * Returns the texture used for reflections.
-     * @returns - Reflection texture if present.  Otherwise, returns the environment texture.
-     */
-    private _getReflectionTexture(): Nullable<BaseTexture> {
+    public get hasTexture(): boolean {
+        return this._getTexture() !== null;
+    }
+
+    protected _getTexture(): Nullable<BaseTexture> {
         if (this.texture) {
             return this.texture;
         }
 
-        return Engine.LastCreatedScene!.environmentTexture;
+        return Engine.LastCreatedScene?.environmentTexture ?? null;
     }
 
     public prepareDefines(mesh: AbstractMesh, nodeMaterial: NodeMaterial, defines: NodeMaterialDefines) {
         super.prepareDefines(mesh, nodeMaterial, defines);
 
-        const reflection = this.texture && this.texture.getTextureMatrix;
+        const reflectionTexture = this._getTexture();
+        const reflection = reflectionTexture && reflectionTexture.getTextureMatrix;
 
         defines.setValue("REFLECTION", reflection);
 
@@ -129,14 +130,12 @@ export class ReflectionBlock extends ReflectionTextureBaseBlock {
             return;
         }
 
-        defines.setValue(this._defineLODReflectionAlpha, this.texture!.lodLevelInAlpha);
-        defines.setValue(this._defineLinearSpecularReflection, this.texture!.linearSpecularLOD);
+        defines.setValue(this._defineLODReflectionAlpha, reflectionTexture!.lodLevelInAlpha);
+        defines.setValue(this._defineLinearSpecularReflection, reflectionTexture!.linearSpecularLOD);
         defines.setValue(this._defineLODBasedMicroSurface, Engine.LastCreatedScene?.getEngine()?.getCaps().textureLOD ?? false);
 
         defines.setValue("SPHERICAL_HARMONICS", this.useSphericalHarmonics);
 
-        const reflectionTexture = this._getReflectionTexture();
-
         if (reflectionTexture && reflectionTexture.coordinatesMode !== Texture.SKYBOX_MODE) {
             if (reflectionTexture.isCube) {
                 defines.setValue("USESPHERICALFROMREFLECTIONMAP", true);
@@ -154,7 +153,7 @@ export class ReflectionBlock extends ReflectionTextureBaseBlock {
     public bind(effect: Effect, nodeMaterial: NodeMaterial, mesh?: Mesh, subMesh?: SubMesh) {
         super.bind(effect, nodeMaterial, mesh);
 
-        const reflectionTexture = this._getReflectionTexture();
+        const reflectionTexture = this._getTexture();
 
         if (!reflectionTexture || !subMesh) {
             return;