diff --git a/src/materials/nodes/manager/NodeMaterialObserver.js b/src/materials/nodes/manager/NodeMaterialObserver.js index a48680fe0c5610..11bee321d33998 100644 --- a/src/materials/nodes/manager/NodeMaterialObserver.js +++ b/src/materials/nodes/manager/NodeMaterialObserver.js @@ -38,6 +38,7 @@ const refreshUniforms = [ 'normalMap', 'normalScale', 'opacity', + 'retroreflective', 'roughness', 'roughnessMap', 'sheen', @@ -187,6 +188,7 @@ class NodeMaterialObserver { data = { geometryId: geometry.id, + materialVersion: this.getMaterialData( renderObject.material )._version, worldMatrix: object.matrixWorld.clone() }; @@ -327,7 +329,7 @@ class NodeMaterialObserver { if ( data === undefined ) { - data = { _renderId: - 1, _equal: false }; + data = { _renderId: - 1, _version: 0 }; for ( const property of this.refreshUniforms ) { @@ -391,19 +393,21 @@ class NodeMaterialObserver { const materialData = this.getMaterialData( renderObject.material ); - // check the material for the "equal" state just once per render for all render objects + // check the material properties just once per render for all render objects if ( materialData._renderId !== renderId ) { materialData._renderId = renderId; + let changed = false; + for ( const property in materialData ) { const value = materialData[ property ]; const mtlValue = material[ property ]; if ( property === '_renderId' ) continue; - if ( property === '_equal' ) continue; + if ( property === '_version' ) continue; if ( value.equals !== undefined ) { @@ -411,8 +415,7 @@ class NodeMaterialObserver { value.copy( mtlValue ); - materialData._equal = false; - return false; + changed = true; } @@ -423,8 +426,7 @@ class NodeMaterialObserver { value.id = mtlValue.id; value.version = mtlValue.version; - materialData._equal = false; - return false; + changed = true; } @@ -432,34 +434,38 @@ class NodeMaterialObserver { materialData[ property ] = mtlValue; - materialData._equal = false; - return false; + changed = true; } } - if ( materialData.transmission > 0 ) { + if ( changed === true ) materialData._version ++; - const { width, height } = renderObject.context; + } - if ( renderObjectData.bufferWidth !== width || renderObjectData.bufferHeight !== height ) { + // a version mismatch means the material has changed since this render object was last refreshed - renderObjectData.bufferWidth = width; - renderObjectData.bufferHeight = height; + if ( renderObjectData.materialVersion !== materialData._version ) { - materialData._equal = false; - return false; + renderObjectData.materialVersion = materialData._version; - } + return false; - } + } - materialData._equal = true; + if ( materialData.transmission > 0 ) { - } else { + const { width, height } = renderObject.context; + + if ( renderObjectData.bufferWidth !== width || renderObjectData.bufferHeight !== height ) { + + renderObjectData.bufferWidth = width; + renderObjectData.bufferHeight = height; - if ( materialData._equal === false ) return false; + return false; + + } }