Skip to content

Commit

Permalink
LDrawLoader: Use WeakMap instead of userData for indexing materials.
Browse files Browse the repository at this point in the history
  • Loading branch information
Mugen87 committed Sep 5, 2023
1 parent 06936fc commit dc13051
Showing 1 changed file with 20 additions and 12 deletions.
32 changes: 20 additions & 12 deletions examples/jsm/loaders/LDrawLoader.js
Original file line number Diff line number Diff line change
Expand Up @@ -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 ) {
Expand Down Expand Up @@ -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 ) );

}

Expand Down Expand Up @@ -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 );

}

Expand Down Expand Up @@ -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 );

}

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

}

Expand Down Expand Up @@ -2236,7 +2242,7 @@ class LDrawLoader extends Loader {
}

// Get the edge material for this triangle material
edgeMaterial = edgeMaterial.userData.edgeMaterial;
edgeMaterial = _edgeMaterialCache.get( edgeMaterial );

}

Expand Down Expand Up @@ -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,
Expand All @@ -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 );

Expand Down

0 comments on commit dc13051

Please sign in to comment.