From 94f857a6958fb8ad328db6b9389ab06f1d3b860e Mon Sep 17 00:00:00 2001 From: Christian Semmler Date: Sun, 1 Feb 2026 15:53:47 -0800 Subject: [PATCH] Add transparency support to vehicle part rendering Apply mesh alpha values from WDB to Three.js materials. In the original game, alpha=0 means opaque while alpha>0 enables transparency. Disable depthWrite for transparent meshes to prevent z-fighting. --- src/core/rendering/VehiclePartRenderer.js | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/src/core/rendering/VehiclePartRenderer.js b/src/core/rendering/VehiclePartRenderer.js index 22df995..607d908 100644 --- a/src/core/rendering/VehiclePartRenderer.js +++ b/src/core/rendering/VehiclePartRenderer.js @@ -137,13 +137,22 @@ export class VehiclePartRenderer { let material; + // Get alpha from mesh properties + // In the original game: alpha = 0 means opaque, alpha > 0 means transparent + const meshAlpha = mesh.properties?.alpha || 0; + const isTransparent = meshAlpha > 0; + const opacity = isTransparent ? meshAlpha : 1; + if (isColorable) { // Mesh has INH prefix - use the LEGO color material = new THREE.MeshStandardMaterial({ color: legoColor, side: THREE.DoubleSide, roughness: 0.7, - metalness: 0.1 + metalness: 0.1, + transparent: isTransparent, + opacity: opacity, + depthWrite: !isTransparent }); this.colorableMeshes.push(null); // Placeholder, will set after mesh creation } else if (hasUVs && meshTextureName && this.textures.has(meshTextureName)) { @@ -152,7 +161,10 @@ export class VehiclePartRenderer { map: this.textures.get(meshTextureName), side: THREE.DoubleSide, roughness: 0.8, - metalness: 0.1 + metalness: 0.1, + transparent: isTransparent, + opacity: opacity, + depthWrite: !isTransparent }); } else { // Fallback to mesh's vertex color @@ -161,7 +173,10 @@ export class VehiclePartRenderer { color: new THREE.Color(meshColor.r / 255, meshColor.g / 255, meshColor.b / 255), side: THREE.DoubleSide, roughness: 0.8, - metalness: 0.1 + metalness: 0.1, + transparent: isTransparent, + opacity: opacity, + depthWrite: !isTransparent }); }