Phase 1 + paint unification of the paint-slots plan. - core: scene-material data layer (materials map mirroring collections, undo/partialize/setScene full-graph support), SceneMaterial schema, scene:/library: MaterialRef helpers + parseMaterialRef, slot id helpers (deriveSlotId/slotLabelFromId), slots map on ItemNode, hitObject on PaintResolveArgs, optional PaintCapability.commit. - viewer: resolveMaterialRef (library:/scene: -> three material, null on dangling). - nodes(item): renderer keeps authored GLB materials for slot-authored assets and applies per-slot overrides per-instance (never mutates the shared cached GLB); textures-off still collapses to furnishing role; non-authored items unchanged. Item paint capability + registration. - editor: item joins the unified (nodeId, slotId) paint dispatch; item paint target + slot reset. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
14 lines
399 B
TypeScript
14 lines
399 B
TypeScript
import { z } from 'zod'
|
|
import { generateId } from './base'
|
|
import { MaterialSchema } from './material'
|
|
|
|
export type SceneMaterialId = `mat_${string}`
|
|
export const generateSceneMaterialId = (): SceneMaterialId => generateId('mat')
|
|
|
|
export const SceneMaterial = z.object({
|
|
id: z.string(),
|
|
name: z.string(),
|
|
material: MaterialSchema,
|
|
})
|
|
export type SceneMaterial = z.infer<typeof SceneMaterial>
|