David Catuhe 6 anni fa
parent
commit
ec4a637c79

+ 2 - 3
src/Animations/animatable.ts

@@ -568,8 +568,7 @@ Scene.prototype._animate = function(): void {
     }
     }
 
 
     const animatables = this._activeAnimatables;
     const animatables = this._activeAnimatables;
-    const animatablesLength = animatables.length;
-    if (animatablesLength === 0) {
+    if (animatables.length === 0) {
         return;
         return;
     }
     }
 
 
@@ -587,7 +586,7 @@ Scene.prototype._animate = function(): void {
     const animationTime = this._animationTime;
     const animationTime = this._animationTime;
     this._animationTimeLast = now;
     this._animationTimeLast = now;
 
 
-    for (let index = 0; index < animatablesLength; index++) {
+    for (let index = 0; index < animatables.length; index++) {
         animatables[index]._animate(animationTime);
         animatables[index]._animate(animationTime);
     }
     }
 
 

+ 46 - 44
src/Materials/Background/backgroundMaterial.ts

@@ -909,7 +909,7 @@ export class BackgroundMaterial extends PushMaterial {
             };
             };
 
 
             var join = defines.toString();
             var join = defines.toString();
-            subMesh.setEffect(scene.getEngine().createEffect("background", <EffectCreationOptions>{
+            let effect = scene.getEngine().createEffect("background", <EffectCreationOptions>{
                 attributes: attribs,
                 attributes: attribs,
                 uniformsNames: uniforms,
                 uniformsNames: uniforms,
                 uniformBuffersNames: uniformBuffers,
                 uniformBuffersNames: uniformBuffers,
@@ -919,9 +919,10 @@ export class BackgroundMaterial extends PushMaterial {
                 onCompiled: onCompiled,
                 onCompiled: onCompiled,
                 onError: this.onError,
                 onError: this.onError,
                 indexParameters: { maxSimultaneousLights: this._maxSimultaneousLights }
                 indexParameters: { maxSimultaneousLights: this._maxSimultaneousLights }
-            }, engine), defines);
+            }, engine);
+            subMesh.setEffect(effect, defines);
 
 
-            this.buildUniformLayout();
+            this.buildUniformLayout(effect);
         }
         }
 
 
         if (!subMesh.effect || !subMesh.effect.isReady()) {
         if (!subMesh.effect || !subMesh.effect.isReady()) {
@@ -977,23 +978,23 @@ export class BackgroundMaterial extends PushMaterial {
     /**
     /**
      * Build the uniform buffer used in the material.
      * Build the uniform buffer used in the material.
      */
      */
-    public buildUniformLayout(): void {
+    public buildUniformLayout(effect: Effect): void {
         // Order is important !
         // Order is important !
-        this._uniformBuffer.addUniform("vPrimaryColor", 4);
-        this._uniformBuffer.addUniform("vPrimaryColorShadow", 4);
-        this._uniformBuffer.addUniform("vDiffuseInfos", 2);
-        this._uniformBuffer.addUniform("vReflectionInfos", 2);
-        this._uniformBuffer.addUniform("diffuseMatrix", 16);
-        this._uniformBuffer.addUniform("reflectionMatrix", 16);
-        this._uniformBuffer.addUniform("vReflectionMicrosurfaceInfos", 3);
-        this._uniformBuffer.addUniform("fFovMultiplier", 1);
-        this._uniformBuffer.addUniform("pointSize", 1);
-        this._uniformBuffer.addUniform("shadowLevel", 1);
-        this._uniformBuffer.addUniform("alpha", 1);
-        this._uniformBuffer.addUniform("vBackgroundCenter", 3);
-        this._uniformBuffer.addUniform("vReflectionControl", 4);
-
-        this._uniformBuffer.create();
+        effect._uniformBuffer.addUniform("vPrimaryColor", 4);
+        effect._uniformBuffer.addUniform("vPrimaryColorShadow", 4);
+        effect._uniformBuffer.addUniform("vDiffuseInfos", 2);
+        effect._uniformBuffer.addUniform("vReflectionInfos", 2);
+        effect._uniformBuffer.addUniform("diffuseMatrix", 16);
+        effect._uniformBuffer.addUniform("reflectionMatrix", 16);
+        effect._uniformBuffer.addUniform("vReflectionMicrosurfaceInfos", 3);
+        effect._uniformBuffer.addUniform("fFovMultiplier", 1);
+        effect._uniformBuffer.addUniform("pointSize", 1);
+        effect._uniformBuffer.addUniform("shadowLevel", 1);
+        effect._uniformBuffer.addUniform("alpha", 1);
+        effect._uniformBuffer.addUniform("vBackgroundCenter", 3);
+        effect._uniformBuffer.addUniform("vReflectionControl", 4);
+
+        effect._uniformBuffer.create();
     }
     }
 
 
     /**
     /**
@@ -1001,11 +1002,11 @@ export class BackgroundMaterial extends PushMaterial {
      */
      */
     public unbind(): void {
     public unbind(): void {
         if (this._diffuseTexture && this._diffuseTexture.isRenderTarget) {
         if (this._diffuseTexture && this._diffuseTexture.isRenderTarget) {
-            this._uniformBuffer.setTexture("diffuseSampler", null);
+            this._activeEffect._uniformBuffer.setTexture("diffuseSampler", null);
         }
         }
 
 
         if (this._reflectionTexture && this._reflectionTexture.isRenderTarget) {
         if (this._reflectionTexture && this._reflectionTexture.isRenderTarget) {
-            this._uniformBuffer.setTexture("reflectionSampler", null);
+            this._activeEffect._uniformBuffer.setTexture("reflectionSampler", null);
         }
         }
 
 
         super.unbind();
         super.unbind();
@@ -1045,26 +1046,27 @@ export class BackgroundMaterial extends PushMaterial {
         MaterialHelper.BindBonesParameters(mesh, this._activeEffect);
         MaterialHelper.BindBonesParameters(mesh, this._activeEffect);
 
 
         let mustRebind = this._mustRebind(scene, effect, mesh.visibility);
         let mustRebind = this._mustRebind(scene, effect, mesh.visibility);
+        let uniformBuffer = effect._uniformBuffer;
         if (mustRebind) {
         if (mustRebind) {
-            this._uniformBuffer.bindToEffect(effect, "Material");
+            uniformBuffer.bindToEffect(effect, "Material");
 
 
             this.bindViewProjection(effect);
             this.bindViewProjection(effect);
 
 
             let reflectionTexture = this._reflectionTexture;
             let reflectionTexture = this._reflectionTexture;
-            if (!this._uniformBuffer.useUbo || !this.isFrozen || !this._uniformBuffer.isSync) {
+            if (!uniformBuffer.useUbo || !this.isFrozen || !uniformBuffer.isSync) {
 
 
                 // Texture uniforms
                 // Texture uniforms
                 if (scene.texturesEnabled) {
                 if (scene.texturesEnabled) {
                     if (this._diffuseTexture && MaterialFlags.DiffuseTextureEnabled) {
                     if (this._diffuseTexture && MaterialFlags.DiffuseTextureEnabled) {
-                        this._uniformBuffer.updateFloat2("vDiffuseInfos", this._diffuseTexture.coordinatesIndex, this._diffuseTexture.level);
-                        MaterialHelper.BindTextureMatrix(this._diffuseTexture, this._uniformBuffer, "diffuse");
+                        uniformBuffer.updateFloat2("vDiffuseInfos", this._diffuseTexture.coordinatesIndex, this._diffuseTexture.level);
+                        MaterialHelper.BindTextureMatrix(this._diffuseTexture, uniformBuffer, "diffuse");
                     }
                     }
 
 
                     if (reflectionTexture && MaterialFlags.ReflectionTextureEnabled) {
                     if (reflectionTexture && MaterialFlags.ReflectionTextureEnabled) {
-                        this._uniformBuffer.updateMatrix("reflectionMatrix", reflectionTexture.getReflectionTextureMatrix());
-                        this._uniformBuffer.updateFloat2("vReflectionInfos", reflectionTexture.level, this._reflectionBlur);
+                        uniformBuffer.updateMatrix("reflectionMatrix", reflectionTexture.getReflectionTextureMatrix());
+                        uniformBuffer.updateFloat2("vReflectionInfos", reflectionTexture.level, this._reflectionBlur);
 
 
-                        this._uniformBuffer.updateFloat3("vReflectionMicrosurfaceInfos",
+                        uniformBuffer.updateFloat3("vReflectionMicrosurfaceInfos",
                             reflectionTexture.getSize().width,
                             reflectionTexture.getSize().width,
                             reflectionTexture.lodGenerationScale,
                             reflectionTexture.lodGenerationScale,
                             reflectionTexture.lodGenerationOffset);
                             reflectionTexture.lodGenerationOffset);
@@ -1072,48 +1074,48 @@ export class BackgroundMaterial extends PushMaterial {
                 }
                 }
 
 
                 if (this.shadowLevel > 0) {
                 if (this.shadowLevel > 0) {
-                    this._uniformBuffer.updateFloat("shadowLevel", this.shadowLevel);
+                    uniformBuffer.updateFloat("shadowLevel", this.shadowLevel);
                 }
                 }
-                this._uniformBuffer.updateFloat("alpha", this.alpha);
+                uniformBuffer.updateFloat("alpha", this.alpha);
 
 
                 // Point size
                 // Point size
                 if (this.pointsCloud) {
                 if (this.pointsCloud) {
-                    this._uniformBuffer.updateFloat("pointSize", this.pointSize);
+                    uniformBuffer.updateFloat("pointSize", this.pointSize);
                 }
                 }
 
 
                 if (defines.USEHIGHLIGHTANDSHADOWCOLORS) {
                 if (defines.USEHIGHLIGHTANDSHADOWCOLORS) {
-                    this._uniformBuffer.updateColor4("vPrimaryColor", this._primaryHighlightColor, 1.0);
-                    this._uniformBuffer.updateColor4("vPrimaryColorShadow", this._primaryShadowColor, 1.0);
+                    uniformBuffer.updateColor4("vPrimaryColor", this._primaryHighlightColor, 1.0);
+                    uniformBuffer.updateColor4("vPrimaryColorShadow", this._primaryShadowColor, 1.0);
                 }
                 }
                 else {
                 else {
-                    this._uniformBuffer.updateColor4("vPrimaryColor", this._primaryColor, 1.0);
+                    uniformBuffer.updateColor4("vPrimaryColor", this._primaryColor, 1.0);
                 }
                 }
             }
             }
 
 
-            this._uniformBuffer.updateFloat("fFovMultiplier", this._fovMultiplier);
+            uniformBuffer.updateFloat("fFovMultiplier", this._fovMultiplier);
 
 
             // Textures
             // Textures
             if (scene.texturesEnabled) {
             if (scene.texturesEnabled) {
                 if (this._diffuseTexture && MaterialFlags.DiffuseTextureEnabled) {
                 if (this._diffuseTexture && MaterialFlags.DiffuseTextureEnabled) {
-                    this._uniformBuffer.setTexture("diffuseSampler", this._diffuseTexture);
+                    uniformBuffer.setTexture("diffuseSampler", this._diffuseTexture);
                 }
                 }
 
 
                 if (reflectionTexture && MaterialFlags.ReflectionTextureEnabled) {
                 if (reflectionTexture && MaterialFlags.ReflectionTextureEnabled) {
                     if (defines.REFLECTIONBLUR && defines.TEXTURELODSUPPORT) {
                     if (defines.REFLECTIONBLUR && defines.TEXTURELODSUPPORT) {
-                        this._uniformBuffer.setTexture("reflectionSampler", reflectionTexture);
+                        uniformBuffer.setTexture("reflectionSampler", reflectionTexture);
                     }
                     }
                     else if (!defines.REFLECTIONBLUR) {
                     else if (!defines.REFLECTIONBLUR) {
-                        this._uniformBuffer.setTexture("reflectionSampler", reflectionTexture);
+                        uniformBuffer.setTexture("reflectionSampler", reflectionTexture);
                     }
                     }
                     else {
                     else {
-                        this._uniformBuffer.setTexture("reflectionSampler", reflectionTexture._lodTextureMid || reflectionTexture);
-                        this._uniformBuffer.setTexture("reflectionSamplerLow", reflectionTexture._lodTextureLow || reflectionTexture);
-                        this._uniformBuffer.setTexture("reflectionSamplerHigh", reflectionTexture._lodTextureHigh || reflectionTexture);
+                        uniformBuffer.setTexture("reflectionSampler", reflectionTexture._lodTextureMid || reflectionTexture);
+                        uniformBuffer.setTexture("reflectionSamplerLow", reflectionTexture._lodTextureLow || reflectionTexture);
+                        uniformBuffer.setTexture("reflectionSamplerHigh", reflectionTexture._lodTextureHigh || reflectionTexture);
                     }
                     }
 
 
                     if (defines.REFLECTIONFRESNEL) {
                     if (defines.REFLECTIONFRESNEL) {
-                        this._uniformBuffer.updateFloat3("vBackgroundCenter", this.sceneCenter.x, this.sceneCenter.y, this.sceneCenter.z);
-                        this._uniformBuffer.updateFloat4("vReflectionControl", this._reflectionControls.x, this._reflectionControls.y, this._reflectionControls.z, this._reflectionControls.w);
+                        uniformBuffer.updateFloat3("vBackgroundCenter", this.sceneCenter.x, this.sceneCenter.y, this.sceneCenter.z);
+                        uniformBuffer.updateFloat4("vReflectionControl", this._reflectionControls.x, this._reflectionControls.y, this._reflectionControls.z, this._reflectionControls.w);
                     }
                     }
                 }
                 }
             }
             }
@@ -1141,7 +1143,7 @@ export class BackgroundMaterial extends PushMaterial {
             }
             }
         }
         }
 
 
-        this._uniformBuffer.update();
+        uniformBuffer.update();
 
 
         this._afterBind(mesh, this._activeEffect);
         this._afterBind(mesh, this._activeEffect);
     }
     }

+ 95 - 94
src/Materials/PBR/pbrBaseMaterial.ts

@@ -1009,7 +1009,7 @@ export abstract class PBRBaseMaterial extends PushMaterial {
             } else {
             } else {
                 scene.resetCachedMaterial();
                 scene.resetCachedMaterial();
                 subMesh.setEffect(effect, defines);
                 subMesh.setEffect(effect, defines);
-                this.buildUniformLayout();
+                this.buildUniformLayout(effect);
             }
             }
         }
         }
 
 
@@ -1524,46 +1524,46 @@ export abstract class PBRBaseMaterial extends PushMaterial {
     /**
     /**
      * Initializes the uniform buffer layout for the shader.
      * Initializes the uniform buffer layout for the shader.
      */
      */
-    public buildUniformLayout(): void {
+    public buildUniformLayout(effect: Effect): void {
         // Order is important !
         // Order is important !
-        this._uniformBuffer.addUniform("vAlbedoInfos", 2);
-        this._uniformBuffer.addUniform("vAmbientInfos", 4);
-        this._uniformBuffer.addUniform("vOpacityInfos", 2);
-        this._uniformBuffer.addUniform("vEmissiveInfos", 2);
-        this._uniformBuffer.addUniform("vLightmapInfos", 2);
-        this._uniformBuffer.addUniform("vReflectivityInfos", 3);
-        this._uniformBuffer.addUniform("vMicroSurfaceSamplerInfos", 2);
-        this._uniformBuffer.addUniform("vReflectionInfos", 2);
-        this._uniformBuffer.addUniform("vReflectionPosition", 3);
-        this._uniformBuffer.addUniform("vReflectionSize", 3);
-        this._uniformBuffer.addUniform("vBumpInfos", 3);
-        this._uniformBuffer.addUniform("albedoMatrix", 16);
-        this._uniformBuffer.addUniform("ambientMatrix", 16);
-        this._uniformBuffer.addUniform("opacityMatrix", 16);
-        this._uniformBuffer.addUniform("emissiveMatrix", 16);
-        this._uniformBuffer.addUniform("lightmapMatrix", 16);
-        this._uniformBuffer.addUniform("reflectivityMatrix", 16);
-        this._uniformBuffer.addUniform("microSurfaceSamplerMatrix", 16);
-        this._uniformBuffer.addUniform("bumpMatrix", 16);
-        this._uniformBuffer.addUniform("vTangentSpaceParams", 2);
-        this._uniformBuffer.addUniform("reflectionMatrix", 16);
-
-        this._uniformBuffer.addUniform("vReflectionColor", 3);
-        this._uniformBuffer.addUniform("vAlbedoColor", 4);
-        this._uniformBuffer.addUniform("vLightingIntensity", 4);
-
-        this._uniformBuffer.addUniform("vReflectionMicrosurfaceInfos", 3);
-        this._uniformBuffer.addUniform("pointSize", 1);
-        this._uniformBuffer.addUniform("vReflectivityColor", 4);
-        this._uniformBuffer.addUniform("vEmissiveColor", 3);
-        this._uniformBuffer.addUniform("visibility", 1);
-
-        PBRClearCoatConfiguration.PrepareUniformBuffer(this._uniformBuffer);
-        PBRAnisotropicConfiguration.PrepareUniformBuffer(this._uniformBuffer);
-        PBRSheenConfiguration.PrepareUniformBuffer(this._uniformBuffer);
-        PBRSubSurfaceConfiguration.PrepareUniformBuffer(this._uniformBuffer);
-
-        this._uniformBuffer.create();
+        effect._uniformBuffer.addUniform("vAlbedoInfos", 2);
+        effect._uniformBuffer.addUniform("vAmbientInfos", 4);
+        effect._uniformBuffer.addUniform("vOpacityInfos", 2);
+        effect._uniformBuffer.addUniform("vEmissiveInfos", 2);
+        effect._uniformBuffer.addUniform("vLightmapInfos", 2);
+        effect._uniformBuffer.addUniform("vReflectivityInfos", 3);
+        effect._uniformBuffer.addUniform("vMicroSurfaceSamplerInfos", 2);
+        effect._uniformBuffer.addUniform("vReflectionInfos", 2);
+        effect._uniformBuffer.addUniform("vReflectionPosition", 3);
+        effect._uniformBuffer.addUniform("vReflectionSize", 3);
+        effect._uniformBuffer.addUniform("vBumpInfos", 3);
+        effect._uniformBuffer.addUniform("albedoMatrix", 16);
+        effect._uniformBuffer.addUniform("ambientMatrix", 16);
+        effect._uniformBuffer.addUniform("opacityMatrix", 16);
+        effect._uniformBuffer.addUniform("emissiveMatrix", 16);
+        effect._uniformBuffer.addUniform("lightmapMatrix", 16);
+        effect._uniformBuffer.addUniform("reflectivityMatrix", 16);
+        effect._uniformBuffer.addUniform("microSurfaceSamplerMatrix", 16);
+        effect._uniformBuffer.addUniform("bumpMatrix", 16);
+        effect._uniformBuffer.addUniform("vTangentSpaceParams", 2);
+        effect._uniformBuffer.addUniform("reflectionMatrix", 16);
+
+        effect._uniformBuffer.addUniform("vReflectionColor", 3);
+        effect._uniformBuffer.addUniform("vAlbedoColor", 4);
+        effect._uniformBuffer.addUniform("vLightingIntensity", 4);
+
+        effect._uniformBuffer.addUniform("vReflectionMicrosurfaceInfos", 3);
+        effect._uniformBuffer.addUniform("pointSize", 1);
+        effect._uniformBuffer.addUniform("vReflectivityColor", 4);
+        effect._uniformBuffer.addUniform("vEmissiveColor", 3);
+        effect._uniformBuffer.addUniform("visibility", 1);
+
+        PBRClearCoatConfiguration.PrepareUniformBuffer(effect._uniformBuffer);
+        PBRAnisotropicConfiguration.PrepareUniformBuffer(effect._uniformBuffer);
+        PBRSheenConfiguration.PrepareUniformBuffer(effect._uniformBuffer);
+        PBRSubSurfaceConfiguration.PrepareUniformBuffer(effect._uniformBuffer);
+
+        effect._uniformBuffer.create();
     }
     }
 
 
     /**
     /**
@@ -1628,41 +1628,42 @@ export abstract class PBRBaseMaterial extends PushMaterial {
         MaterialHelper.BindBonesParameters(mesh, this._activeEffect);
         MaterialHelper.BindBonesParameters(mesh, this._activeEffect);
 
 
         let reflectionTexture: Nullable<BaseTexture> = null;
         let reflectionTexture: Nullable<BaseTexture> = null;
+        let uniformBuffer = effect._uniformBuffer;
         if (mustRebind) {
         if (mustRebind) {
             var engine = scene.getEngine();
             var engine = scene.getEngine();
-            this._uniformBuffer.bindToEffect(effect, "Material");
+            uniformBuffer.bindToEffect(effect, "Material");
 
 
             this.bindViewProjection(effect);
             this.bindViewProjection(effect);
             reflectionTexture = this._getReflectionTexture();
             reflectionTexture = this._getReflectionTexture();
 
 
-            if (!this._uniformBuffer.useUbo || !this.isFrozen || !this._uniformBuffer.isSync) {
+            if (!uniformBuffer.useUbo || !this.isFrozen || !uniformBuffer.isSync) {
 
 
                 // Texture uniforms
                 // Texture uniforms
                 if (scene.texturesEnabled) {
                 if (scene.texturesEnabled) {
                     if (this._albedoTexture && MaterialFlags.DiffuseTextureEnabled) {
                     if (this._albedoTexture && MaterialFlags.DiffuseTextureEnabled) {
-                        this._uniformBuffer.updateFloat2("vAlbedoInfos", this._albedoTexture.coordinatesIndex, this._albedoTexture.level);
-                        MaterialHelper.BindTextureMatrix(this._albedoTexture, this._uniformBuffer, "albedo");
+                        uniformBuffer.updateFloat2("vAlbedoInfos", this._albedoTexture.coordinatesIndex, this._albedoTexture.level);
+                        MaterialHelper.BindTextureMatrix(this._albedoTexture, uniformBuffer, "albedo");
                     }
                     }
 
 
                     if (this._ambientTexture && MaterialFlags.AmbientTextureEnabled) {
                     if (this._ambientTexture && MaterialFlags.AmbientTextureEnabled) {
-                        this._uniformBuffer.updateFloat4("vAmbientInfos", this._ambientTexture.coordinatesIndex, this._ambientTexture.level, this._ambientTextureStrength, this._ambientTextureImpactOnAnalyticalLights);
-                        MaterialHelper.BindTextureMatrix(this._ambientTexture, this._uniformBuffer, "ambient");
+                        uniformBuffer.updateFloat4("vAmbientInfos", this._ambientTexture.coordinatesIndex, this._ambientTexture.level, this._ambientTextureStrength, this._ambientTextureImpactOnAnalyticalLights);
+                        MaterialHelper.BindTextureMatrix(this._ambientTexture, uniformBuffer, "ambient");
                     }
                     }
 
 
                     if (this._opacityTexture && MaterialFlags.OpacityTextureEnabled) {
                     if (this._opacityTexture && MaterialFlags.OpacityTextureEnabled) {
-                        this._uniformBuffer.updateFloat2("vOpacityInfos", this._opacityTexture.coordinatesIndex, this._opacityTexture.level);
-                        MaterialHelper.BindTextureMatrix(this._opacityTexture, this._uniformBuffer, "opacity");
+                        uniformBuffer.updateFloat2("vOpacityInfos", this._opacityTexture.coordinatesIndex, this._opacityTexture.level);
+                        MaterialHelper.BindTextureMatrix(this._opacityTexture, uniformBuffer, "opacity");
                     }
                     }
 
 
                     if (reflectionTexture && MaterialFlags.ReflectionTextureEnabled) {
                     if (reflectionTexture && MaterialFlags.ReflectionTextureEnabled) {
-                        this._uniformBuffer.updateMatrix("reflectionMatrix", reflectionTexture.getReflectionTextureMatrix());
-                        this._uniformBuffer.updateFloat2("vReflectionInfos", reflectionTexture.level, 0);
+                        uniformBuffer.updateMatrix("reflectionMatrix", reflectionTexture.getReflectionTextureMatrix());
+                        uniformBuffer.updateFloat2("vReflectionInfos", reflectionTexture.level, 0);
 
 
                         if ((<any>reflectionTexture).boundingBoxSize) {
                         if ((<any>reflectionTexture).boundingBoxSize) {
                             let cubeTexture = <CubeTexture>reflectionTexture;
                             let cubeTexture = <CubeTexture>reflectionTexture;
 
 
-                            this._uniformBuffer.updateVector3("vReflectionPosition", cubeTexture.boundingBoxPosition);
-                            this._uniformBuffer.updateVector3("vReflectionSize", cubeTexture.boundingBoxSize);
+                            uniformBuffer.updateVector3("vReflectionPosition", cubeTexture.boundingBoxPosition);
+                            uniformBuffer.updateVector3("vReflectionSize", cubeTexture.boundingBoxSize);
                         }
                         }
 
 
                         var polynomials = reflectionTexture.sphericalPolynomial;
                         var polynomials = reflectionTexture.sphericalPolynomial;
@@ -1682,71 +1683,71 @@ export abstract class PBRBaseMaterial extends PushMaterial {
                             this._activeEffect.setFloat3("vSphericalZX", polynomials.zx.x, polynomials.zx.y, polynomials.zx.z);
                             this._activeEffect.setFloat3("vSphericalZX", polynomials.zx.x, polynomials.zx.y, polynomials.zx.z);
                         }
                         }
 
 
-                        this._uniformBuffer.updateFloat3("vReflectionMicrosurfaceInfos",
+                        uniformBuffer.updateFloat3("vReflectionMicrosurfaceInfos",
                             reflectionTexture.getSize().width,
                             reflectionTexture.getSize().width,
                             reflectionTexture.lodGenerationScale,
                             reflectionTexture.lodGenerationScale,
                             reflectionTexture.lodGenerationOffset);
                             reflectionTexture.lodGenerationOffset);
                     }
                     }
 
 
                     if (this._emissiveTexture && MaterialFlags.EmissiveTextureEnabled) {
                     if (this._emissiveTexture && MaterialFlags.EmissiveTextureEnabled) {
-                        this._uniformBuffer.updateFloat2("vEmissiveInfos", this._emissiveTexture.coordinatesIndex, this._emissiveTexture.level);
-                        MaterialHelper.BindTextureMatrix(this._emissiveTexture, this._uniformBuffer, "emissive");
+                        uniformBuffer.updateFloat2("vEmissiveInfos", this._emissiveTexture.coordinatesIndex, this._emissiveTexture.level);
+                        MaterialHelper.BindTextureMatrix(this._emissiveTexture, uniformBuffer, "emissive");
                     }
                     }
 
 
                     if (this._lightmapTexture && MaterialFlags.LightmapTextureEnabled) {
                     if (this._lightmapTexture && MaterialFlags.LightmapTextureEnabled) {
-                        this._uniformBuffer.updateFloat2("vLightmapInfos", this._lightmapTexture.coordinatesIndex, this._lightmapTexture.level);
-                        MaterialHelper.BindTextureMatrix(this._lightmapTexture, this._uniformBuffer, "lightmap");
+                        uniformBuffer.updateFloat2("vLightmapInfos", this._lightmapTexture.coordinatesIndex, this._lightmapTexture.level);
+                        MaterialHelper.BindTextureMatrix(this._lightmapTexture, uniformBuffer, "lightmap");
                     }
                     }
 
 
                     if (MaterialFlags.SpecularTextureEnabled) {
                     if (MaterialFlags.SpecularTextureEnabled) {
                         if (this._metallicTexture) {
                         if (this._metallicTexture) {
-                            this._uniformBuffer.updateFloat3("vReflectivityInfos", this._metallicTexture.coordinatesIndex, this._metallicTexture.level, this._ambientTextureStrength);
-                            MaterialHelper.BindTextureMatrix(this._metallicTexture, this._uniformBuffer, "reflectivity");
+                            uniformBuffer.updateFloat3("vReflectivityInfos", this._metallicTexture.coordinatesIndex, this._metallicTexture.level, this._ambientTextureStrength);
+                            MaterialHelper.BindTextureMatrix(this._metallicTexture, uniformBuffer, "reflectivity");
                         }
                         }
                         else if (this._reflectivityTexture) {
                         else if (this._reflectivityTexture) {
-                            this._uniformBuffer.updateFloat3("vReflectivityInfos", this._reflectivityTexture.coordinatesIndex, this._reflectivityTexture.level, 1.0);
-                            MaterialHelper.BindTextureMatrix(this._reflectivityTexture, this._uniformBuffer, "reflectivity");
+                            uniformBuffer.updateFloat3("vReflectivityInfos", this._reflectivityTexture.coordinatesIndex, this._reflectivityTexture.level, 1.0);
+                            MaterialHelper.BindTextureMatrix(this._reflectivityTexture, uniformBuffer, "reflectivity");
                         }
                         }
 
 
                         if (this._microSurfaceTexture) {
                         if (this._microSurfaceTexture) {
-                            this._uniformBuffer.updateFloat2("vMicroSurfaceSamplerInfos", this._microSurfaceTexture.coordinatesIndex, this._microSurfaceTexture.level);
-                            MaterialHelper.BindTextureMatrix(this._microSurfaceTexture, this._uniformBuffer, "microSurfaceSampler");
+                            uniformBuffer.updateFloat2("vMicroSurfaceSamplerInfos", this._microSurfaceTexture.coordinatesIndex, this._microSurfaceTexture.level);
+                            MaterialHelper.BindTextureMatrix(this._microSurfaceTexture, uniformBuffer, "microSurfaceSampler");
                         }
                         }
                     }
                     }
 
 
                     if (this._bumpTexture && engine.getCaps().standardDerivatives && MaterialFlags.BumpTextureEnabled && !this._disableBumpMap) {
                     if (this._bumpTexture && engine.getCaps().standardDerivatives && MaterialFlags.BumpTextureEnabled && !this._disableBumpMap) {
-                        this._uniformBuffer.updateFloat3("vBumpInfos", this._bumpTexture.coordinatesIndex, this._bumpTexture.level, this._parallaxScaleBias);
-                        MaterialHelper.BindTextureMatrix(this._bumpTexture, this._uniformBuffer, "bump");
+                        uniformBuffer.updateFloat3("vBumpInfos", this._bumpTexture.coordinatesIndex, this._bumpTexture.level, this._parallaxScaleBias);
+                        MaterialHelper.BindTextureMatrix(this._bumpTexture, uniformBuffer, "bump");
 
 
                         if (scene._mirroredCameraPosition) {
                         if (scene._mirroredCameraPosition) {
-                            this._uniformBuffer.updateFloat2("vTangentSpaceParams", this._invertNormalMapX ? 1.0 : -1.0, this._invertNormalMapY ? 1.0 : -1.0);
+                            uniformBuffer.updateFloat2("vTangentSpaceParams", this._invertNormalMapX ? 1.0 : -1.0, this._invertNormalMapY ? 1.0 : -1.0);
                         } else {
                         } else {
-                            this._uniformBuffer.updateFloat2("vTangentSpaceParams", this._invertNormalMapX ? -1.0 : 1.0, this._invertNormalMapY ? -1.0 : 1.0);
+                            uniformBuffer.updateFloat2("vTangentSpaceParams", this._invertNormalMapX ? -1.0 : 1.0, this._invertNormalMapY ? -1.0 : 1.0);
                         }
                         }
                     }
                     }
                 }
                 }
 
 
                 // Point size
                 // Point size
                 if (this.pointsCloud) {
                 if (this.pointsCloud) {
-                    this._uniformBuffer.updateFloat("pointSize", this.pointSize);
+                    uniformBuffer.updateFloat("pointSize", this.pointSize);
                 }
                 }
 
 
                 // Colors
                 // Colors
                 if (defines.METALLICWORKFLOW) {
                 if (defines.METALLICWORKFLOW) {
                     Tmp.Color3[0].r = (this._metallic === undefined || this._metallic === null) ? 1 : this._metallic;
                     Tmp.Color3[0].r = (this._metallic === undefined || this._metallic === null) ? 1 : this._metallic;
                     Tmp.Color3[0].g = (this._roughness === undefined || this._roughness === null) ? 1 : this._roughness;
                     Tmp.Color3[0].g = (this._roughness === undefined || this._roughness === null) ? 1 : this._roughness;
-                    this._uniformBuffer.updateColor4("vReflectivityColor", Tmp.Color3[0], 0);
+                    uniformBuffer.updateColor4("vReflectivityColor", Tmp.Color3[0], 0);
                 }
                 }
                 else {
                 else {
-                    this._uniformBuffer.updateColor4("vReflectivityColor", this._reflectivityColor, this._microSurface);
+                    uniformBuffer.updateColor4("vReflectivityColor", this._reflectivityColor, this._microSurface);
                 }
                 }
 
 
-                this._uniformBuffer.updateColor3("vEmissiveColor", MaterialFlags.EmissiveTextureEnabled ? this._emissiveColor : Color3.BlackReadOnly);
-                this._uniformBuffer.updateColor3("vReflectionColor", this._reflectionColor);
-                this._uniformBuffer.updateColor4("vAlbedoColor", this._albedoColor, this.alpha);
+                uniformBuffer.updateColor3("vEmissiveColor", MaterialFlags.EmissiveTextureEnabled ? this._emissiveColor : Color3.BlackReadOnly);
+                uniformBuffer.updateColor3("vReflectionColor", this._reflectionColor);
+                uniformBuffer.updateColor4("vAlbedoColor", this._albedoColor, this.alpha);
 
 
                 // Visibility
                 // Visibility
-                this._uniformBuffer.updateFloat("visibility", mesh.visibility);
+                uniformBuffer.updateFloat("visibility", mesh.visibility);
 
 
                 // Misc
                 // Misc
                 this._lightingInfos.x = this._directIntensity;
                 this._lightingInfos.x = this._directIntensity;
@@ -1754,68 +1755,68 @@ export abstract class PBRBaseMaterial extends PushMaterial {
                 this._lightingInfos.z = this._environmentIntensity;
                 this._lightingInfos.z = this._environmentIntensity;
                 this._lightingInfos.w = this._specularIntensity;
                 this._lightingInfos.w = this._specularIntensity;
 
 
-                this._uniformBuffer.updateVector4("vLightingIntensity", this._lightingInfos);
+                uniformBuffer.updateVector4("vLightingIntensity", this._lightingInfos);
             }
             }
 
 
             // Textures
             // Textures
             if (scene.texturesEnabled) {
             if (scene.texturesEnabled) {
                 if (this._albedoTexture && MaterialFlags.DiffuseTextureEnabled) {
                 if (this._albedoTexture && MaterialFlags.DiffuseTextureEnabled) {
-                    this._uniformBuffer.setTexture("albedoSampler", this._albedoTexture);
+                    uniformBuffer.setTexture("albedoSampler", this._albedoTexture);
                 }
                 }
 
 
                 if (this._ambientTexture && MaterialFlags.AmbientTextureEnabled) {
                 if (this._ambientTexture && MaterialFlags.AmbientTextureEnabled) {
-                    this._uniformBuffer.setTexture("ambientSampler", this._ambientTexture);
+                    uniformBuffer.setTexture("ambientSampler", this._ambientTexture);
                 }
                 }
 
 
                 if (this._opacityTexture && MaterialFlags.OpacityTextureEnabled) {
                 if (this._opacityTexture && MaterialFlags.OpacityTextureEnabled) {
-                    this._uniformBuffer.setTexture("opacitySampler", this._opacityTexture);
+                    uniformBuffer.setTexture("opacitySampler", this._opacityTexture);
                 }
                 }
 
 
                 if (reflectionTexture && MaterialFlags.ReflectionTextureEnabled) {
                 if (reflectionTexture && MaterialFlags.ReflectionTextureEnabled) {
                     if (defines.LODBASEDMICROSFURACE) {
                     if (defines.LODBASEDMICROSFURACE) {
-                        this._uniformBuffer.setTexture("reflectionSampler", reflectionTexture);
+                        uniformBuffer.setTexture("reflectionSampler", reflectionTexture);
                     }
                     }
                     else {
                     else {
-                        this._uniformBuffer.setTexture("reflectionSampler", reflectionTexture._lodTextureMid || reflectionTexture);
-                        this._uniformBuffer.setTexture("reflectionSamplerLow", reflectionTexture._lodTextureLow || reflectionTexture);
-                        this._uniformBuffer.setTexture("reflectionSamplerHigh", reflectionTexture._lodTextureHigh || reflectionTexture);
+                        uniformBuffer.setTexture("reflectionSampler", reflectionTexture._lodTextureMid || reflectionTexture);
+                        uniformBuffer.setTexture("reflectionSamplerLow", reflectionTexture._lodTextureLow || reflectionTexture);
+                        uniformBuffer.setTexture("reflectionSamplerHigh", reflectionTexture._lodTextureHigh || reflectionTexture);
                     }
                     }
                 }
                 }
 
 
                 if (defines.ENVIRONMENTBRDF) {
                 if (defines.ENVIRONMENTBRDF) {
-                    this._uniformBuffer.setTexture("environmentBrdfSampler", this._environmentBRDFTexture);
+                    uniformBuffer.setTexture("environmentBrdfSampler", this._environmentBRDFTexture);
                 }
                 }
 
 
                 if (this._emissiveTexture && MaterialFlags.EmissiveTextureEnabled) {
                 if (this._emissiveTexture && MaterialFlags.EmissiveTextureEnabled) {
-                    this._uniformBuffer.setTexture("emissiveSampler", this._emissiveTexture);
+                    uniformBuffer.setTexture("emissiveSampler", this._emissiveTexture);
                 }
                 }
 
 
                 if (this._lightmapTexture && MaterialFlags.LightmapTextureEnabled) {
                 if (this._lightmapTexture && MaterialFlags.LightmapTextureEnabled) {
-                    this._uniformBuffer.setTexture("lightmapSampler", this._lightmapTexture);
+                    uniformBuffer.setTexture("lightmapSampler", this._lightmapTexture);
                 }
                 }
 
 
                 if (MaterialFlags.SpecularTextureEnabled) {
                 if (MaterialFlags.SpecularTextureEnabled) {
                     if (this._metallicTexture) {
                     if (this._metallicTexture) {
-                        this._uniformBuffer.setTexture("reflectivitySampler", this._metallicTexture);
+                        uniformBuffer.setTexture("reflectivitySampler", this._metallicTexture);
                     }
                     }
                     else if (this._reflectivityTexture) {
                     else if (this._reflectivityTexture) {
-                        this._uniformBuffer.setTexture("reflectivitySampler", this._reflectivityTexture);
+                        uniformBuffer.setTexture("reflectivitySampler", this._reflectivityTexture);
                     }
                     }
 
 
                     if (this._microSurfaceTexture) {
                     if (this._microSurfaceTexture) {
-                        this._uniformBuffer.setTexture("microSurfaceSampler", this._microSurfaceTexture);
+                        uniformBuffer.setTexture("microSurfaceSampler", this._microSurfaceTexture);
                     }
                     }
                 }
                 }
 
 
                 if (this._bumpTexture && engine.getCaps().standardDerivatives && MaterialFlags.BumpTextureEnabled && !this._disableBumpMap) {
                 if (this._bumpTexture && engine.getCaps().standardDerivatives && MaterialFlags.BumpTextureEnabled && !this._disableBumpMap) {
-                    this._uniformBuffer.setTexture("bumpSampler", this._bumpTexture);
+                    uniformBuffer.setTexture("bumpSampler", this._bumpTexture);
                 }
                 }
             }
             }
 
 
-            this.subSurface.bindForSubMesh(this._uniformBuffer, scene, engine, this.isFrozen, defines.LODBASEDMICROSFURACE);
-            this.clearCoat.bindForSubMesh(this._uniformBuffer, scene, engine, this._disableBumpMap, this.isFrozen, this._invertNormalMapX, this._invertNormalMapY);
-            this.anisotropy.bindForSubMesh(this._uniformBuffer, scene, this.isFrozen);
-            this.sheen.bindForSubMesh(this._uniformBuffer, scene, this.isFrozen);
+            this.subSurface.bindForSubMesh(uniformBuffer, scene, engine, this.isFrozen, defines.LODBASEDMICROSFURACE);
+            this.clearCoat.bindForSubMesh(uniformBuffer, scene, engine, this._disableBumpMap, this.isFrozen, this._invertNormalMapX, this._invertNormalMapY);
+            this.anisotropy.bindForSubMesh(uniformBuffer, scene, this.isFrozen);
+            this.sheen.bindForSubMesh(uniformBuffer, scene, this.isFrozen);
 
 
             // Clip plane
             // Clip plane
             MaterialHelper.BindClipPlane(this._activeEffect, scene);
             MaterialHelper.BindClipPlane(this._activeEffect, scene);
@@ -1861,7 +1862,7 @@ export abstract class PBRBaseMaterial extends PushMaterial {
             MaterialHelper.BindLogDepth(defines, this._activeEffect, scene);
             MaterialHelper.BindLogDepth(defines, this._activeEffect, scene);
         }
         }
 
 
-        this._uniformBuffer.update();
+        uniformBuffer.update();
 
 
         this._afterBind(mesh, this._activeEffect);
         this._afterBind(mesh, this._activeEffect);
     }
     }

+ 1 - 3
src/Materials/Textures/Procedurals/proceduralTexture.ts

@@ -201,9 +201,7 @@ export class ProceduralTexture extends Texture {
         if (this._effect === undefined) {
         if (this._effect === undefined) {
             return;
             return;
         }
         }
-
-        var engine = this._engine;
-        engine._releaseEffect(this._effect);
+        this._effect.dispose();
     }
     }
 
 
     protected _getDefines(): string {
     protected _getDefines(): string {

+ 16 - 1
src/Materials/effect.ts

@@ -4,6 +4,8 @@ import { Matrix, Vector3, Vector2, Color3, Color4, Vector4 } from "../Maths/math
 import { Constants } from "../Engines/constants";
 import { Constants } from "../Engines/constants";
 import { DomManagement } from "../Misc/domManagement";
 import { DomManagement } from "../Misc/domManagement";
 import { Logger } from "../Misc/logger";
 import { Logger } from "../Misc/logger";
+import { UniformBuffer } from './uniformBuffer';
+import { IDisposable } from 'scene';
 
 
 declare type Engine = import("../Engines/engine").Engine;
 declare type Engine = import("../Engines/engine").Engine;
 declare type InternalTexture = import("../Materials/Textures/internalTexture").InternalTexture;
 declare type InternalTexture = import("../Materials/Textures/internalTexture").InternalTexture;
@@ -181,7 +183,7 @@ export class EffectCreationOptions {
 /**
 /**
  * Effect containing vertex and fragment shader that can be executed on an object.
  * Effect containing vertex and fragment shader that can be executed on an object.
  */
  */
-export class Effect {
+export class Effect implements IDisposable {
     /**
     /**
      * Gets or sets the relative url used to load shaders if using the engine in non-minified mode
      * Gets or sets the relative url used to load shaders if using the engine in non-minified mode
      */
      */
@@ -237,6 +239,11 @@ export class Effect {
     /** @hidden */
     /** @hidden */
     public _bonesComputationForcedToCPU = false;
     public _bonesComputationForcedToCPU = false;
 
 
+    /**
+     * Stores the uniform buffer
+     */
+    public _uniformBuffer: UniformBuffer;
+
     private static _uniqueIdSeed = 0;
     private static _uniqueIdSeed = 0;
     private _engine: Engine;
     private _engine: Engine;
     private _uniformBuffersNames: { [key: string]: number } = {};
     private _uniformBuffersNames: { [key: string]: number } = {};
@@ -320,6 +327,8 @@ export class Effect {
         }
         }
 
 
         this.uniqueId = Effect._uniqueIdSeed++;
         this.uniqueId = Effect._uniqueIdSeed++;
+        
+        this._uniformBuffer = new UniformBuffer(this._engine);
 
 
         var vertexSource: any;
         var vertexSource: any;
         var fragmentSource: any;
         var fragmentSource: any;
@@ -1501,6 +1510,12 @@ export class Effect {
         return this;
         return this;
     }
     }
 
 
+    public dispose() {
+        this._uniformBuffer.dispose();
+
+        this._engine._releaseEffect(this);
+    }
+
     /**
     /**
      * This function will add a new shader to the shader store
      * This function will add a new shader to the shader store
      * @param name the name of the shader
      * @param name the name of the shader

+ 2 - 11
src/Materials/material.ts

@@ -522,11 +522,6 @@ export class Material implements IAnimatable {
      */
      */
     private _cachedDepthWriteState: boolean;
     private _cachedDepthWriteState: boolean;
 
 
-    /**
-     * Stores the uniform buffer
-     */
-    protected _uniformBuffer: UniformBuffer;
-
     /** @hidden */
     /** @hidden */
     public _indexInSceneMaterialArray = -1;
     public _indexInSceneMaterialArray = -1;
 
 
@@ -552,7 +547,6 @@ export class Material implements IAnimatable {
             this.sideOrientation = Material.CounterClockWiseSideOrientation;
             this.sideOrientation = Material.CounterClockWiseSideOrientation;
         }
         }
 
 
-        this._uniformBuffer = new UniformBuffer(this._scene.getEngine());
         this._useUBO = this.getScene().getEngine().supportsUniformBuffers;
         this._useUBO = this.getScene().getEngine().supportsUniformBuffers;
 
 
         if (!doNotAdd) {
         if (!doNotAdd) {
@@ -1099,12 +1093,10 @@ export class Material implements IAnimatable {
             }
             }
         }
         }
 
 
-        this._uniformBuffer.dispose();
-
         // Shader are kept in cache for further use but we can get rid of this by using forceDisposeEffect
         // Shader are kept in cache for further use but we can get rid of this by using forceDisposeEffect
         if (forceDisposeEffect && this._effect) {
         if (forceDisposeEffect && this._effect) {
             if (!this._storeEffectOnSubMeshes) {
             if (!this._storeEffectOnSubMeshes) {
-                scene.getEngine()._releaseEffect(this._effect);
+                this._effect.dispose();
             }
             }
 
 
             this._effect = null;
             this._effect = null;
@@ -1127,12 +1119,11 @@ export class Material implements IAnimatable {
     private releaseVertexArrayObject(mesh: AbstractMesh, forceDisposeEffect?: boolean) {
     private releaseVertexArrayObject(mesh: AbstractMesh, forceDisposeEffect?: boolean) {
         if ((<Mesh>mesh).geometry) {
         if ((<Mesh>mesh).geometry) {
             var geometry = <Geometry>((<Mesh>mesh).geometry);
             var geometry = <Geometry>((<Mesh>mesh).geometry);
-            const scene = this.getScene();
             if (this._storeEffectOnSubMeshes) {
             if (this._storeEffectOnSubMeshes) {
                 for (var subMesh of mesh.subMeshes) {
                 for (var subMesh of mesh.subMeshes) {
                     geometry._releaseVertexArrayObject(subMesh._materialEffect);
                     geometry._releaseVertexArrayObject(subMesh._materialEffect);
                     if (forceDisposeEffect && subMesh._materialEffect) {
                     if (forceDisposeEffect && subMesh._materialEffect) {
-                        scene.getEngine()._releaseEffect(subMesh._materialEffect);
+                        subMesh._materialEffect.dispose();
                     }
                     }
                 }
                 }
             } else {
             } else {

+ 83 - 81
src/Materials/standardMaterial.ts

@@ -14,7 +14,7 @@ import { Mesh } from "../Meshes/mesh";
 import { ImageProcessingConfiguration, IImageProcessingConfigurationDefines } from "./imageProcessingConfiguration";
 import { ImageProcessingConfiguration, IImageProcessingConfigurationDefines } from "./imageProcessingConfiguration";
 import { ColorCurves } from "./colorCurves";
 import { ColorCurves } from "./colorCurves";
 import { FresnelParameters } from "./fresnelParameters";
 import { FresnelParameters } from "./fresnelParameters";
-import { EffectFallbacks, EffectCreationOptions } from "./effect";
+import { EffectFallbacks, EffectCreationOptions, Effect } from "./effect";
 import { MaterialDefines } from "../Materials/materialDefines";
 import { MaterialDefines } from "../Materials/materialDefines";
 import { PushMaterial } from "./pushMaterial";
 import { PushMaterial } from "./pushMaterial";
 import { MaterialHelper } from "./materialHelper";
 import { MaterialHelper } from "./materialHelper";
@@ -1169,7 +1169,7 @@ export class StandardMaterial extends PushMaterial {
                 } else {
                 } else {
                     scene.resetCachedMaterial();
                     scene.resetCachedMaterial();
                     subMesh.setEffect(effect, defines);
                     subMesh.setEffect(effect, defines);
-                    this.buildUniformLayout();
+                    this.buildUniformLayout(effect);
                 }
                 }
             }
             }
         }
         }
@@ -1188,47 +1188,47 @@ export class StandardMaterial extends PushMaterial {
      * Builds the material UBO layouts.
      * Builds the material UBO layouts.
      * Used internally during the effect preparation.
      * Used internally during the effect preparation.
      */
      */
-    public buildUniformLayout(): void {
+    public buildUniformLayout(effect: Effect): void {
         // Order is important !
         // Order is important !
-        this._uniformBuffer.addUniform("diffuseLeftColor", 4);
-        this._uniformBuffer.addUniform("diffuseRightColor", 4);
-        this._uniformBuffer.addUniform("opacityParts", 4);
-        this._uniformBuffer.addUniform("reflectionLeftColor", 4);
-        this._uniformBuffer.addUniform("reflectionRightColor", 4);
-        this._uniformBuffer.addUniform("refractionLeftColor", 4);
-        this._uniformBuffer.addUniform("refractionRightColor", 4);
-        this._uniformBuffer.addUniform("emissiveLeftColor", 4);
-        this._uniformBuffer.addUniform("emissiveRightColor", 4);
-
-        this._uniformBuffer.addUniform("vDiffuseInfos", 2);
-        this._uniformBuffer.addUniform("vAmbientInfos", 2);
-        this._uniformBuffer.addUniform("vOpacityInfos", 2);
-        this._uniformBuffer.addUniform("vReflectionInfos", 2);
-        this._uniformBuffer.addUniform("vReflectionPosition", 3);
-        this._uniformBuffer.addUniform("vReflectionSize", 3);
-        this._uniformBuffer.addUniform("vEmissiveInfos", 2);
-        this._uniformBuffer.addUniform("vLightmapInfos", 2);
-        this._uniformBuffer.addUniform("vSpecularInfos", 2);
-        this._uniformBuffer.addUniform("vBumpInfos", 3);
-
-        this._uniformBuffer.addUniform("diffuseMatrix", 16);
-        this._uniformBuffer.addUniform("ambientMatrix", 16);
-        this._uniformBuffer.addUniform("opacityMatrix", 16);
-        this._uniformBuffer.addUniform("reflectionMatrix", 16);
-        this._uniformBuffer.addUniform("emissiveMatrix", 16);
-        this._uniformBuffer.addUniform("lightmapMatrix", 16);
-        this._uniformBuffer.addUniform("specularMatrix", 16);
-        this._uniformBuffer.addUniform("bumpMatrix", 16);
-        this._uniformBuffer.addUniform("vTangentSpaceParams", 2);
-        this._uniformBuffer.addUniform("pointSize", 1);
-        this._uniformBuffer.addUniform("refractionMatrix", 16);
-        this._uniformBuffer.addUniform("vRefractionInfos", 4);
-        this._uniformBuffer.addUniform("vSpecularColor", 4);
-        this._uniformBuffer.addUniform("vEmissiveColor", 3);
-        this._uniformBuffer.addUniform("visibility", 1);
-        this._uniformBuffer.addUniform("vDiffuseColor", 4);
-
-        this._uniformBuffer.create();
+        effect._uniformBuffer.addUniform("diffuseLeftColor", 4);
+        effect._uniformBuffer.addUniform("diffuseRightColor", 4);
+        effect._uniformBuffer.addUniform("opacityParts", 4);
+        effect._uniformBuffer.addUniform("reflectionLeftColor", 4);
+        effect._uniformBuffer.addUniform("reflectionRightColor", 4);
+        effect._uniformBuffer.addUniform("refractionLeftColor", 4);
+        effect._uniformBuffer.addUniform("refractionRightColor", 4);
+        effect._uniformBuffer.addUniform("emissiveLeftColor", 4);
+        effect._uniformBuffer.addUniform("emissiveRightColor", 4);
+
+        effect._uniformBuffer.addUniform("vDiffuseInfos", 2);
+        effect._uniformBuffer.addUniform("vAmbientInfos", 2);
+        effect._uniformBuffer.addUniform("vOpacityInfos", 2);
+        effect._uniformBuffer.addUniform("vReflectionInfos", 2);
+        effect._uniformBuffer.addUniform("vReflectionPosition", 3);
+        effect._uniformBuffer.addUniform("vReflectionSize", 3);
+        effect._uniformBuffer.addUniform("vEmissiveInfos", 2);
+        effect._uniformBuffer.addUniform("vLightmapInfos", 2);
+        effect._uniformBuffer.addUniform("vSpecularInfos", 2);
+        effect._uniformBuffer.addUniform("vBumpInfos", 3);
+
+        effect._uniformBuffer.addUniform("diffuseMatrix", 16);
+        effect._uniformBuffer.addUniform("ambientMatrix", 16);
+        effect._uniformBuffer.addUniform("opacityMatrix", 16);
+        effect._uniformBuffer.addUniform("reflectionMatrix", 16);
+        effect._uniformBuffer.addUniform("emissiveMatrix", 16);
+        effect._uniformBuffer.addUniform("lightmapMatrix", 16);
+        effect._uniformBuffer.addUniform("specularMatrix", 16);
+        effect._uniformBuffer.addUniform("bumpMatrix", 16);
+        effect._uniformBuffer.addUniform("vTangentSpaceParams", 2);
+        effect._uniformBuffer.addUniform("pointSize", 1);
+        effect._uniformBuffer.addUniform("refractionMatrix", 16);
+        effect._uniformBuffer.addUniform("vRefractionInfos", 4);
+        effect._uniformBuffer.addUniform("vSpecularColor", 4);
+        effect._uniformBuffer.addUniform("vEmissiveColor", 3);
+        effect._uniformBuffer.addUniform("visibility", 1);
+        effect._uniformBuffer.addUniform("vDiffuseColor", 4);
+
+        effect._uniformBuffer.create();
     }
     }
 
 
     /**
     /**
@@ -1291,44 +1291,46 @@ export class StandardMaterial extends PushMaterial {
         // Bones
         // Bones
         MaterialHelper.BindBonesParameters(mesh, effect);
         MaterialHelper.BindBonesParameters(mesh, effect);
 
 
+        let uniformBuffer = effect._uniformBuffer;
+
         if (mustRebind) {
         if (mustRebind) {
-            this._uniformBuffer.bindToEffect(effect, "Material");
+            uniformBuffer.bindToEffect(effect, "Material");
 
 
             this.bindViewProjection(effect);
             this.bindViewProjection(effect);
-            if (!this._uniformBuffer.useUbo || !this.isFrozen || !this._uniformBuffer.isSync) {
+            if (!uniformBuffer.useUbo || !this.isFrozen || !uniformBuffer.isSync) {
 
 
                 if (StandardMaterial.FresnelEnabled && defines.FRESNEL) {
                 if (StandardMaterial.FresnelEnabled && defines.FRESNEL) {
                     // Fresnel
                     // Fresnel
                     if (this.diffuseFresnelParameters && this.diffuseFresnelParameters.isEnabled) {
                     if (this.diffuseFresnelParameters && this.diffuseFresnelParameters.isEnabled) {
-                        this._uniformBuffer.updateColor4("diffuseLeftColor", this.diffuseFresnelParameters.leftColor, this.diffuseFresnelParameters.power);
-                        this._uniformBuffer.updateColor4("diffuseRightColor", this.diffuseFresnelParameters.rightColor, this.diffuseFresnelParameters.bias);
+                        uniformBuffer.updateColor4("diffuseLeftColor", this.diffuseFresnelParameters.leftColor, this.diffuseFresnelParameters.power);
+                        uniformBuffer.updateColor4("diffuseRightColor", this.diffuseFresnelParameters.rightColor, this.diffuseFresnelParameters.bias);
                     }
                     }
 
 
                     if (this.opacityFresnelParameters && this.opacityFresnelParameters.isEnabled) {
                     if (this.opacityFresnelParameters && this.opacityFresnelParameters.isEnabled) {
-                        this._uniformBuffer.updateColor4("opacityParts", new Color3(this.opacityFresnelParameters.leftColor.toLuminance(), this.opacityFresnelParameters.rightColor.toLuminance(), this.opacityFresnelParameters.bias), this.opacityFresnelParameters.power);
+                        uniformBuffer.updateColor4("opacityParts", new Color3(this.opacityFresnelParameters.leftColor.toLuminance(), this.opacityFresnelParameters.rightColor.toLuminance(), this.opacityFresnelParameters.bias), this.opacityFresnelParameters.power);
                     }
                     }
 
 
                     if (this.reflectionFresnelParameters && this.reflectionFresnelParameters.isEnabled) {
                     if (this.reflectionFresnelParameters && this.reflectionFresnelParameters.isEnabled) {
-                        this._uniformBuffer.updateColor4("reflectionLeftColor", this.reflectionFresnelParameters.leftColor, this.reflectionFresnelParameters.power);
-                        this._uniformBuffer.updateColor4("reflectionRightColor", this.reflectionFresnelParameters.rightColor, this.reflectionFresnelParameters.bias);
+                        uniformBuffer.updateColor4("reflectionLeftColor", this.reflectionFresnelParameters.leftColor, this.reflectionFresnelParameters.power);
+                        uniformBuffer.updateColor4("reflectionRightColor", this.reflectionFresnelParameters.rightColor, this.reflectionFresnelParameters.bias);
                     }
                     }
 
 
                     if (this.refractionFresnelParameters && this.refractionFresnelParameters.isEnabled) {
                     if (this.refractionFresnelParameters && this.refractionFresnelParameters.isEnabled) {
-                        this._uniformBuffer.updateColor4("refractionLeftColor", this.refractionFresnelParameters.leftColor, this.refractionFresnelParameters.power);
-                        this._uniformBuffer.updateColor4("refractionRightColor", this.refractionFresnelParameters.rightColor, this.refractionFresnelParameters.bias);
+                        uniformBuffer.updateColor4("refractionLeftColor", this.refractionFresnelParameters.leftColor, this.refractionFresnelParameters.power);
+                        uniformBuffer.updateColor4("refractionRightColor", this.refractionFresnelParameters.rightColor, this.refractionFresnelParameters.bias);
                     }
                     }
 
 
                     if (this.emissiveFresnelParameters && this.emissiveFresnelParameters.isEnabled) {
                     if (this.emissiveFresnelParameters && this.emissiveFresnelParameters.isEnabled) {
-                        this._uniformBuffer.updateColor4("emissiveLeftColor", this.emissiveFresnelParameters.leftColor, this.emissiveFresnelParameters.power);
-                        this._uniformBuffer.updateColor4("emissiveRightColor", this.emissiveFresnelParameters.rightColor, this.emissiveFresnelParameters.bias);
+                        uniformBuffer.updateColor4("emissiveLeftColor", this.emissiveFresnelParameters.leftColor, this.emissiveFresnelParameters.power);
+                        uniformBuffer.updateColor4("emissiveRightColor", this.emissiveFresnelParameters.rightColor, this.emissiveFresnelParameters.bias);
                     }
                     }
                 }
                 }
 
 
                 // Textures
                 // Textures
                 if (scene.texturesEnabled) {
                 if (scene.texturesEnabled) {
                     if (this._diffuseTexture && StandardMaterial.DiffuseTextureEnabled) {
                     if (this._diffuseTexture && StandardMaterial.DiffuseTextureEnabled) {
-                        this._uniformBuffer.updateFloat2("vDiffuseInfos", this._diffuseTexture.coordinatesIndex, this._diffuseTexture.level);
-                        MaterialHelper.BindTextureMatrix(this._diffuseTexture, this._uniformBuffer, "diffuse");
+                        uniformBuffer.updateFloat2("vDiffuseInfos", this._diffuseTexture.coordinatesIndex, this._diffuseTexture.level);
+                        MaterialHelper.BindTextureMatrix(this._diffuseTexture, uniformBuffer, "diffuse");
 
 
                         if (this._diffuseTexture.hasAlpha) {
                         if (this._diffuseTexture.hasAlpha) {
                             effect.setFloat("alphaCutOff", this.alphaCutOff);
                             effect.setFloat("alphaCutOff", this.alphaCutOff);
@@ -1336,81 +1338,81 @@ export class StandardMaterial extends PushMaterial {
                     }
                     }
 
 
                     if (this._ambientTexture && StandardMaterial.AmbientTextureEnabled) {
                     if (this._ambientTexture && StandardMaterial.AmbientTextureEnabled) {
-                        this._uniformBuffer.updateFloat2("vAmbientInfos", this._ambientTexture.coordinatesIndex, this._ambientTexture.level);
-                        MaterialHelper.BindTextureMatrix(this._ambientTexture, this._uniformBuffer, "ambient");
+                        uniformBuffer.updateFloat2("vAmbientInfos", this._ambientTexture.coordinatesIndex, this._ambientTexture.level);
+                        MaterialHelper.BindTextureMatrix(this._ambientTexture, uniformBuffer, "ambient");
                     }
                     }
 
 
                     if (this._opacityTexture && StandardMaterial.OpacityTextureEnabled) {
                     if (this._opacityTexture && StandardMaterial.OpacityTextureEnabled) {
-                        this._uniformBuffer.updateFloat2("vOpacityInfos", this._opacityTexture.coordinatesIndex, this._opacityTexture.level);
-                        MaterialHelper.BindTextureMatrix(this._opacityTexture, this._uniformBuffer, "opacity");
+                        uniformBuffer.updateFloat2("vOpacityInfos", this._opacityTexture.coordinatesIndex, this._opacityTexture.level);
+                        MaterialHelper.BindTextureMatrix(this._opacityTexture, uniformBuffer, "opacity");
                     }
                     }
 
 
                     if (this._reflectionTexture && StandardMaterial.ReflectionTextureEnabled) {
                     if (this._reflectionTexture && StandardMaterial.ReflectionTextureEnabled) {
-                        this._uniformBuffer.updateFloat2("vReflectionInfos", this._reflectionTexture.level, this.roughness);
-                        this._uniformBuffer.updateMatrix("reflectionMatrix", this._reflectionTexture.getReflectionTextureMatrix());
+                        uniformBuffer.updateFloat2("vReflectionInfos", this._reflectionTexture.level, this.roughness);
+                        uniformBuffer.updateMatrix("reflectionMatrix", this._reflectionTexture.getReflectionTextureMatrix());
 
 
                         if ((<any>this._reflectionTexture).boundingBoxSize) {
                         if ((<any>this._reflectionTexture).boundingBoxSize) {
                             let cubeTexture = <CubeTexture>this._reflectionTexture;
                             let cubeTexture = <CubeTexture>this._reflectionTexture;
 
 
-                            this._uniformBuffer.updateVector3("vReflectionPosition", cubeTexture.boundingBoxPosition);
-                            this._uniformBuffer.updateVector3("vReflectionSize", cubeTexture.boundingBoxSize);
+                            uniformBuffer.updateVector3("vReflectionPosition", cubeTexture.boundingBoxPosition);
+                            uniformBuffer.updateVector3("vReflectionSize", cubeTexture.boundingBoxSize);
                         }
                         }
                     }
                     }
 
 
                     if (this._emissiveTexture && StandardMaterial.EmissiveTextureEnabled) {
                     if (this._emissiveTexture && StandardMaterial.EmissiveTextureEnabled) {
-                        this._uniformBuffer.updateFloat2("vEmissiveInfos", this._emissiveTexture.coordinatesIndex, this._emissiveTexture.level);
-                        MaterialHelper.BindTextureMatrix(this._emissiveTexture, this._uniformBuffer, "emissive");
+                        uniformBuffer.updateFloat2("vEmissiveInfos", this._emissiveTexture.coordinatesIndex, this._emissiveTexture.level);
+                        MaterialHelper.BindTextureMatrix(this._emissiveTexture, uniformBuffer, "emissive");
                     }
                     }
 
 
                     if (this._lightmapTexture && StandardMaterial.LightmapTextureEnabled) {
                     if (this._lightmapTexture && StandardMaterial.LightmapTextureEnabled) {
-                        this._uniformBuffer.updateFloat2("vLightmapInfos", this._lightmapTexture.coordinatesIndex, this._lightmapTexture.level);
-                        MaterialHelper.BindTextureMatrix(this._lightmapTexture, this._uniformBuffer, "lightmap");
+                        uniformBuffer.updateFloat2("vLightmapInfos", this._lightmapTexture.coordinatesIndex, this._lightmapTexture.level);
+                        MaterialHelper.BindTextureMatrix(this._lightmapTexture, uniformBuffer, "lightmap");
                     }
                     }
 
 
                     if (this._specularTexture && StandardMaterial.SpecularTextureEnabled) {
                     if (this._specularTexture && StandardMaterial.SpecularTextureEnabled) {
-                        this._uniformBuffer.updateFloat2("vSpecularInfos", this._specularTexture.coordinatesIndex, this._specularTexture.level);
-                        MaterialHelper.BindTextureMatrix(this._specularTexture, this._uniformBuffer, "specular");
+                        uniformBuffer.updateFloat2("vSpecularInfos", this._specularTexture.coordinatesIndex, this._specularTexture.level);
+                        MaterialHelper.BindTextureMatrix(this._specularTexture, uniformBuffer, "specular");
                     }
                     }
 
 
                     if (this._bumpTexture && scene.getEngine().getCaps().standardDerivatives && StandardMaterial.BumpTextureEnabled) {
                     if (this._bumpTexture && scene.getEngine().getCaps().standardDerivatives && StandardMaterial.BumpTextureEnabled) {
-                        this._uniformBuffer.updateFloat3("vBumpInfos", this._bumpTexture.coordinatesIndex, 1.0 / this._bumpTexture.level, this.parallaxScaleBias);
-                        MaterialHelper.BindTextureMatrix(this._bumpTexture, this._uniformBuffer, "bump");
+                        uniformBuffer.updateFloat3("vBumpInfos", this._bumpTexture.coordinatesIndex, 1.0 / this._bumpTexture.level, this.parallaxScaleBias);
+                        MaterialHelper.BindTextureMatrix(this._bumpTexture, uniformBuffer, "bump");
 
 
                         if (scene._mirroredCameraPosition) {
                         if (scene._mirroredCameraPosition) {
-                            this._uniformBuffer.updateFloat2("vTangentSpaceParams", this._invertNormalMapX ? 1.0 : -1.0, this._invertNormalMapY ? 1.0 : -1.0);
+                            uniformBuffer.updateFloat2("vTangentSpaceParams", this._invertNormalMapX ? 1.0 : -1.0, this._invertNormalMapY ? 1.0 : -1.0);
                         } else {
                         } else {
-                            this._uniformBuffer.updateFloat2("vTangentSpaceParams", this._invertNormalMapX ? -1.0 : 1.0, this._invertNormalMapY ? -1.0 : 1.0);
+                            uniformBuffer.updateFloat2("vTangentSpaceParams", this._invertNormalMapX ? -1.0 : 1.0, this._invertNormalMapY ? -1.0 : 1.0);
                         }
                         }
                     }
                     }
 
 
                     if (this._refractionTexture && StandardMaterial.RefractionTextureEnabled) {
                     if (this._refractionTexture && StandardMaterial.RefractionTextureEnabled) {
                         var depth = 1.0;
                         var depth = 1.0;
                         if (!this._refractionTexture.isCube) {
                         if (!this._refractionTexture.isCube) {
-                            this._uniformBuffer.updateMatrix("refractionMatrix", this._refractionTexture.getReflectionTextureMatrix());
+                            uniformBuffer.updateMatrix("refractionMatrix", this._refractionTexture.getReflectionTextureMatrix());
 
 
                             if ((<any>this._refractionTexture).depth) {
                             if ((<any>this._refractionTexture).depth) {
                                 depth = (<any>this._refractionTexture).depth;
                                 depth = (<any>this._refractionTexture).depth;
                             }
                             }
                         }
                         }
-                        this._uniformBuffer.updateFloat4("vRefractionInfos", this._refractionTexture.level, this.indexOfRefraction, depth, this.invertRefractionY ? -1 : 1);
+                        uniformBuffer.updateFloat4("vRefractionInfos", this._refractionTexture.level, this.indexOfRefraction, depth, this.invertRefractionY ? -1 : 1);
                     }
                     }
                 }
                 }
 
 
                 // Point size
                 // Point size
                 if (this.pointsCloud) {
                 if (this.pointsCloud) {
-                    this._uniformBuffer.updateFloat("pointSize", this.pointSize);
+                    uniformBuffer.updateFloat("pointSize", this.pointSize);
                 }
                 }
 
 
                 if (defines.SPECULARTERM) {
                 if (defines.SPECULARTERM) {
-                    this._uniformBuffer.updateColor4("vSpecularColor", this.specularColor, this.specularPower);
+                    uniformBuffer.updateColor4("vSpecularColor", this.specularColor, this.specularPower);
                 }
                 }
-                this._uniformBuffer.updateColor3("vEmissiveColor", StandardMaterial.EmissiveTextureEnabled ? this.emissiveColor : Color3.BlackReadOnly);
+                uniformBuffer.updateColor3("vEmissiveColor", StandardMaterial.EmissiveTextureEnabled ? this.emissiveColor : Color3.BlackReadOnly);
 
 
                 // Visibility
                 // Visibility
-                this._uniformBuffer.updateFloat("visibility", mesh.visibility);
+                uniformBuffer.updateFloat("visibility", mesh.visibility);
 
 
                 // Diffuse
                 // Diffuse
-                this._uniformBuffer.updateColor4("vDiffuseColor", this.diffuseColor, this.alpha);
+                uniformBuffer.updateColor4("vDiffuseColor", this.diffuseColor, this.alpha);
             }
             }
 
 
             // Textures
             // Textures
@@ -1499,7 +1501,7 @@ export class StandardMaterial extends PushMaterial {
             }
             }
         }
         }
 
 
-        this._uniformBuffer.update();
+        uniformBuffer.update();
         this._afterBind(mesh, this._activeEffect);
         this._afterBind(mesh, this._activeEffect);
     }
     }