feat(paint-slots): prepared-drywall finish + fence 4 slots matching build options

- Add 'concrete-drywall' (Prepared Drywall) catalog finish + 512 KTX2/webp
  runtime assets; default walls (WALL_SLOT_DEFAULT interior+exterior) and the
  roof wall/trim band to it so roofs read continuous with walls.
- fence: replace the 2-slot panel/rail split with 4 slots that match the panel's
  build options — posts / infill (showInfill) / base (grounded only) / rail —
  each its own mesh with userData.slotId; conditional slots track the build
  state. Defaults: posts/infill/base charcoal, rail wood-finewood27.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Wassim SAMAD
2026-06-17 20:51:49 -04:00
co-authored by Claude Opus 4.8
parent e92ee05702
commit bba0cc5f68
14 changed files with 115 additions and 52 deletions
+38
View File
@@ -3938,6 +3938,44 @@ export const MATERIAL_CATALOG: MaterialCatalogItem[] = [
},
},
},
{
id: 'concrete-drywall',
label: 'Prepared Drywall',
category: 'concrete',
surfaces: ['wall', 'ceiling'],
description: 'Smooth prepared drywall ready for paint',
previewThumbnailUrl: '/material/concrete/prepared_drywall/prepared_drywall_thumb.webp',
preset: {
maps: {
albedoMap: '/material/concrete/prepared_drywall/prepared_drywall_basecolor_512.ktx2',
normalMap: '/material/concrete/prepared_drywall/prepared_drywall_normal_512.ktx2',
roughnessMap: '/material/concrete/prepared_drywall/prepared_drywall_roughness_512.ktx2',
aoMap: '/material/concrete/prepared_drywall/prepared_drywall_ao_512.ktx2',
},
mapProperties: {
color: '#ffffff',
roughness: 0.9,
metalness: 0,
repeatX: 0.5,
repeatY: 0.5,
rotation: 0,
wrapS: 'Repeat',
wrapT: 'Repeat',
normalScaleX: 1,
normalScaleY: 1,
emissiveIntensity: 1,
displacementScale: 0,
transparent: false,
flipY: false,
bumpScale: 1,
emissiveColor: '#000000',
aoMapIntensity: 1,
side: 0,
opacity: 1,
lightMapIntensity: 1,
},
},
},
{
id: 'metal-copper',
label: 'Copper',
+2 -2
View File
@@ -52,8 +52,8 @@ export type WallSurfaceSide = 'interior' | 'exterior'
// May be a `#rrggbb` colour or a `library:<id>` ref. Textures-off still
// collapses to the themed wall role (the escape hatch).
export const WALL_SLOT_DEFAULT: Record<WallSurfaceSide, string> = {
interior: 'library:concrete-plate',
exterior: 'library:concrete-plate',
interior: 'library:concrete-drywall',
exterior: 'library:concrete-drywall',
}
export type WallSurfaceMaterialSpec = {