Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
56 commits
Select commit Hold shift + click to select a range
7afb286
feat(paint-slots): authored item materials + unified slot painting
wass08 Jun 15, 2026
b3d840a
feat(paint-slots): scene-material library panel + Colors swatches
wass08 Jun 15, 2026
2ac9f67
feat(paint-slots): persist scene materials + collections via autosave
wass08 Jun 15, 2026
e0179c4
Merge pull request #404 from pascalorg/feat/paint-slots-phase-1
wass08 Jun 15, 2026
d52cbe6
feat(paint-slots): read pascal_material glTF extras as curated slot d…
wass08 Jun 15, 2026
f740f59
Merge pull request #406 from pascalorg/feat/paint-slots-phase-2a
wass08 Jun 15, 2026
3d5a36c
feat(render-modes): items show real materials in colored mode (not fl…
wass08 Jun 15, 2026
4411b8a
feat(render-modes): add Colored / Monochrome toggle to the Render menu
wass08 Jun 15, 2026
0b25e4f
Merge pull request #409 from pascalorg/feat/colored-monochrome-items
wass08 Jun 15, 2026
138543e
chore(render-modes): use US spelling "colors" in Materials toggle detail
wass08 Jun 15, 2026
937cf02
feat(paint-slots): world-scale pool slab floor UVs + document the met…
wass08 Jun 16, 2026
89a7232
Merge pull request #410 from pascalorg/feat/paint-slots-phase-4-uv-wo…
wass08 Jun 16, 2026
101341d
feat(paint-slots): paintable slots on the procedural shelf (phase 5)
wass08 Jun 16, 2026
e17c298
fix(shelf): recess plates 1mm to stop z-fighting with the frame
wass08 Jun 16, 2026
b602e04
fix(shelf): stop top-face z-fighting + avoid plate/side gaps
wass08 Jun 16, 2026
c717c0c
fix(shelf): tuck cubby cell dividers into the boards they meet
wass08 Jun 16, 2026
c68dfa2
fix(shelf): match cubby divider depth to the boards (no front overflo…
wass08 Jun 16, 2026
e079615
fix(shelf): floor-anchor cubby no-bottom divider + embed bookshelf di…
wass08 Jun 16, 2026
8a0f6cf
Merge pull request #412 from pascalorg/feat/paint-slots-phase-5-shelf…
wass08 Jun 16, 2026
dbefcf7
feat(paint-slots): recurate material catalog into families + expand c…
wass08 Jun 16, 2026
0e8a8c3
Merge pull request #414 from pascalorg/feat/paint-slots-material-catalog
wass08 Jun 16, 2026
042f855
feat(paint-slots): KTX2 finish library — fabric/leather/concrete/meta…
wass08 Jun 16, 2026
b0f4e1b
Merge pull request #415 from pascalorg/feat/paint-slots-phase-4-finis…
wass08 Jun 16, 2026
967a905
feat(paint-slots): unified slot defaults + paint for slab, ceiling, w…
wass08 Jun 17, 2026
737c4e9
feat(paint-slots): concrete-plate finish + try defaults (wall=concret…
wass08 Jun 17, 2026
9f1627e
feat(paint-slots): paintable slots for windows + doors (frame/glass, …
wass08 Jun 17, 2026
cebb294
fix(paint-slots): make window/door paint hits land on the tagged chil…
wass08 Jun 17, 2026
531dbb6
perf(post-processing): don't rebuild the pipeline on hover + temp pai…
wass08 Jun 17, 2026
c3bd065
fix(paint-slots): disable the CSG cutout's raycast so window/door pai…
wass08 Jun 17, 2026
8aa179e
feat(paint-slots): per-part paint for windows + doors, chrome/brass, …
wass08 Jun 17, 2026
37c5678
feat(paint-slots): add drei sunset environment as an editor viewer child
wass08 Jun 17, 2026
4818807
refactor(paint-slots): share scene IBL as viewer SceneEnvironment
wass08 Jun 17, 2026
071319e
Merge pull request #417 from pascalorg/feat/paint-slots-node-defaults
wass08 Jun 17, 2026
4c27558
chore(paint-slots): drop 50 unreferenced editor material maps
wass08 Jun 17, 2026
a8f32dd
feat(paint-slots): add node.slots field to fence/stair/column/elevato…
wass08 Jun 17, 2026
751392c
feat(paint-slots): default roof shingle surface to catalog finish
wass08 Jun 17, 2026
5555ad1
feat(paint-slots): migrate fence onto the unified slot model
wass08 Jun 17, 2026
16c1171
feat(paint-slots): migrate stair onto the unified slot model
wass08 Jun 17, 2026
0cdaf8b
feat(paint-slots): migrate column onto the unified slot model
wass08 Jun 17, 2026
1199c04
feat(paint-slots): migrate elevator onto the unified slot model
wass08 Jun 17, 2026
3388614
Merge branch 'feat/paint-slots-fence' into feat/paint-slots
wass08 Jun 17, 2026
9060b92
Merge branch 'feat/paint-slots-stair' into feat/paint-slots
wass08 Jun 17, 2026
adf5077
Merge branch 'feat/paint-slots-column' into feat/paint-slots
wass08 Jun 17, 2026
ad227a0
Merge branch 'feat/paint-slots-elevator' into feat/paint-slots
wass08 Jun 17, 2026
e92ee05
feat(paint-slots): round-2 feedback — fence 2 slots + UVs, roof defau…
wass08 Jun 17, 2026
bba0cc5
feat(paint-slots): prepared-drywall finish + fence 4 slots matching b…
wass08 Jun 18, 2026
f7e7744
fix(paint-slots): guard empty fence slot group before mergeGeometries
wass08 Jun 18, 2026
0e8df1b
fix(paint-slots): nudge fence vertical members 0.001m thinner than th…
wass08 Jun 18, 2026
e46a63d
feat(paint-slots): fence base + rail default to greige
wass08 Jun 18, 2026
c7d0cd3
feat(paint-slots): world-reference roof gable wall UVs to align with …
wass08 Jun 18, 2026
65a7fcb
feat(paint-slots): world-space planar UVs for walls (seamless tiling)
wass08 Jun 18, 2026
faf73d6
feat(paint-slots): full world-space UVs for roof gable walls (match w…
wass08 Jun 18, 2026
c6423e7
feat(paint-slots): migrate wall + procedural kinds onto node.slots
wass08 Jun 18, 2026
6b67ab6
feat(paint-slots): create-in-place scene materials + paint-panel polish
wass08 Jun 18, 2026
d924931
feat(paint-slots): split slab into top + side slots
wass08 Jun 18, 2026
c4b6e74
Merge remote-tracking branch 'origin/main' into feat/paint-slots
wass08 Jun 18, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file not shown.
Binary file not shown.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file not shown.
Binary file not shown.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
2 changes: 1 addition & 1 deletion apps/ifc-converter/next-env.d.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
/// <reference types="next" />
/// <reference types="next/image-types/global" />
import "./.next/dev/types/routes.d.ts";
import "./.next/types/routes.d.ts";

// NOTE: This file should not be edited
// see https://nextjs.org/docs/app/api-reference/config/typescript for more information.
14 changes: 14 additions & 0 deletions packages/core/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,12 @@ export {
segmentsIntersect,
} from './lib/polygon-relations'
export { getRenderableSlabPolygon } from './lib/slab-polygon'
export {
deriveSlotId,
isSlotMaterialName,
SLOT_MATERIAL_PREFIX,
slotLabelFromId,
} from './lib/slots'
export {
type AutoCeilingPlanningContext,
type AutoCeilingSyncPlan,
Expand Down Expand Up @@ -100,12 +106,20 @@ export {
getLibraryMaterialIdFromRef,
getMaterialPresetByRef,
getMaterialsForCategory,
getSceneMaterialIdFromRef,
LIBRARY_MATERIAL_REF_PREFIX,
MATERIAL_CATALOG,
MATERIAL_CATEGORIES,
MATERIAL_SURFACES,
type MaterialCatalogItem,
type MaterialCategory,
type MaterialRef,
type MaterialSurface,
type ParsedMaterialRef,
parseMaterialRef,
SCENE_MATERIAL_REF_PREFIX,
toLibraryMaterialRef,
toSceneMaterialRef,
} from './material-library'
export type {
FloorPlacedFootprint,
Expand Down
27 changes: 27 additions & 0 deletions packages/core/src/lib/slots.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
export const SLOT_MATERIAL_PREFIX = 'slot_'

/** A glTF material name marks a paintable slot when it starts with `slot_` (case-insensitive). */
export function isSlotMaterialName(name: string): boolean {
return name.toLowerCase().startsWith(SLOT_MATERIAL_PREFIX)
}

/**
* Derive the stable slot id from a glTF material name:
* strip the `slot_` prefix (case-insensitive), drop Blender numeric dedupe
* suffixes like `.001`, lowercase the remainder. Returns null when the name
* is not a slot material. Used by BOTH the upload scan (later) and the
* renderer so DB metadata and runtime meshes can never drift.
*/
export function deriveSlotId(materialName: string): string | null {
if (!isSlotMaterialName(materialName)) return null
let rest = materialName.slice(SLOT_MATERIAL_PREFIX.length)
rest = rest.replace(/\.\d+$/, '')
return rest.toLowerCase()
}

/** slot id -> display label: underscores to spaces, sentence case. e.g. 'bed_frame' -> 'Bed frame'. */
export function slotLabelFromId(slotId: string): string {
const spaced = slotId.replace(/_/g, ' ').trim()
if (!spaced) return spaced
return spaced.charAt(0).toUpperCase() + spaced.slice(1)
}
Loading
Loading