From dc130514389588b626cd477c57b6be919950f11b Mon Sep 17 00:00:00 2001 From: Mugen87 Date: Tue, 5 Sep 2023 13:18:58 +0200 Subject: [PATCH] LDrawLoader: Use WeakMap instead of `userData` for indexing materials. --- examples/jsm/loaders/LDrawLoader.js | 32 ++++++++++++++++++----------- 1 file changed, 20 insertions(+), 12 deletions(-) diff --git a/examples/jsm/loaders/LDrawLoader.js b/examples/jsm/loaders/LDrawLoader.js index 0aa121c3fffc42..487c4eb5173463 100644 --- a/examples/jsm/loaders/LDrawLoader.js +++ b/examples/jsm/loaders/LDrawLoader.js @@ -45,6 +45,9 @@ const COLOR_SPACE_LDRAW = SRGBColorSpace; const _tempVec0 = new Vector3(); const _tempVec1 = new Vector3(); +const _edgeMaterialCache = new WeakMap(); +const _conditionalEdgeMaterialCache = new WeakMap(); + class LDrawConditionalLineMaterial extends ShaderMaterial { constructor( parameters ) { @@ -1759,11 +1762,13 @@ function createObject( elements, elementSize, isConditionalSegments = false, tot if ( isConditionalSegments ) { - materials.push( material.userData.edgeMaterial.userData.conditionalEdgeMaterial ); + const edgeMaterial = _edgeMaterialCache.get( material ); + + materials.push( _conditionalEdgeMaterialCache.get( edgeMaterial ) ); } else { - materials.push( material.userData.edgeMaterial ); + materials.push( _edgeMaterialCache.get( material ) ); } @@ -1906,8 +1911,9 @@ class LDrawLoader extends Loader { this.missingColorMaterial = new MeshStandardMaterial( { name: Loader.DEFAULT_MATERIAL_NAME, color: 0xFF00FF, roughness: 0.3, metalness: 0 } ); this.missingEdgeColorMaterial = new LineBasicMaterial( { name: Loader.DEFAULT_MATERIAL_NAME, color: 0xFF00FF } ); this.missingConditionalEdgeColorMaterial = new LDrawConditionalLineMaterial( { name: Loader.DEFAULT_MATERIAL_NAME, fog: true, color: 0xFF00FF } ); - this.missingColorMaterial.userData.edgeMaterial = this.missingEdgeColorMaterial; - this.missingEdgeColorMaterial.userData.conditionalEdgeMaterial = this.missingConditionalEdgeColorMaterial; + + _edgeMaterialCache.set( this.missingColorMaterial, this.missingEdgeColorMaterial ); + _conditionalEdgeMaterialCache.set( this.missingEdgeColorMaterial, this.missingConditionalEdgeColorMaterial ); } @@ -2126,11 +2132,11 @@ class LDrawLoader extends Loader { if ( c.isLineSegments ) { - material = material.userData.edgeMaterial; + material = _edgeMaterialCache.get( material ); if ( c.isConditionalLine ) { - material = material.userData.conditionalEdgeMaterial; + material = _conditionalEdgeMaterialCache.get( material ); } @@ -2151,7 +2157,7 @@ class LDrawLoader extends Loader { getMainEdgeMaterial() { const mat = this.getMaterial( MAIN_EDGE_COLOUR_CODE ); - return mat ? mat.userData.edgeMaterial : null; + return mat ? _edgeMaterialCache.get( mat ) : null; } @@ -2236,7 +2242,7 @@ class LDrawLoader extends Loader { } // Get the edge material for this triangle material - edgeMaterial = edgeMaterial.userData.edgeMaterial; + edgeMaterial = _edgeMaterialCache.get( edgeMaterial ); } @@ -2380,7 +2386,7 @@ class LDrawLoader extends Loader { edgeMaterial.name = name + ' - Edge'; // This is the material used for conditional edges - edgeMaterial.userData.conditionalEdgeMaterial = new LDrawConditionalLineMaterial( { + const conditionalEdgeMaterial = new LDrawConditionalLineMaterial( { fog: true, transparent: isTransparent, @@ -2389,15 +2395,17 @@ class LDrawLoader extends Loader { opacity: alpha, } ); - edgeMaterial.userData.conditionalEdgeMaterial.userData.code = code; - edgeMaterial.userData.conditionalEdgeMaterial.name = name + ' - Conditional Edge'; + conditionalEdgeMaterial.userData.code = code; + conditionalEdgeMaterial.name = name + ' - Conditional Edge'; + + _conditionalEdgeMaterialCache.set( edgeMaterial, conditionalEdgeMaterial ); } material.userData.code = code; material.name = name; - material.userData.edgeMaterial = edgeMaterial; + _edgeMaterialCache.set( material, edgeMaterial ); this.addMaterial( material );