feat(viewer): rendering & lighting pass — sun-dominant look, sky backdrop, grounded horizon (#493)
* feat(editor): dev-only window hook for deterministic camera poses Exposes a getter for the CameraControls impl in development so screenshot/automation tooling can set exact camera poses. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * feat(viewer): rendering pass — sun-dominant lighting, grade, gradient-sky IBL, albedo clamp, SSGI tune - Shadow intensity clamp 0.55 → 0.9 (sun no longer leaks into shadow), 2048 shadow maps, PCFSoft filtering - Scene-referred contrast/saturation grade before ACES output (GRADE_PARAMS in post-processing) - Procedural gradient-sky IBL (cool zenith / warm horizon / ground bounce) replaces the venice_sunset HDR fetch; env-only, background unchanged - Near-white albedos clamped to ~0.83 linear (defaults, white palette, catalog preset-white/softwhite, schema presets) - SSGI: 2 slices / 6 steps, radius 1.6, aoIntensity 1.7, giIntensity 2 (bounce on); studio hemi 0.6→0.45, fill 0.75→0.6 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * feat(viewer): shadow-caster-only cutaway, glass fresnel, ground fade, specular-map unwiring - SHADOW_ONLY_LAYER (4) + lib/shadow-only.ts: hidden roofs/levels in level-solo (editor) and dollhouse (GLB viewer) stay in the shadow map, so interiors keep sun shadows + window light patches; only the sun's shadow camera enables the layer - Glass: fresnel-driven opacity + envMapIntensity on transparent standard materials (catalog glass, scene glass, window default) - Site ground: radial fade into the theme background at the lot boundary (TSL colorNode); dead ground-occluder.tsx removed - Catalog: 22 bogus *specular*→metalnessMap wirings removed (specular level maps are not metalness; they darkened/metallized dielectrics) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * feat(viewer): PCSS contact-hardening sun shadows via LightShadow.filterNode Custom TSL filter: Vogel-disk blocker search (textureLoad — the sampled path would inherit the comparison sampler, which WGSL rejects) → receiver-blocker penumbra estimate → variable-radius rotated PCF. shadow.radius scales max penumbra (now 4). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * feat(viewer): dark-theme recalibration for the new lighting pipeline Night/twilight: lifted ambient/hemi beds (the 0.9 shadow intensity crushed them), brightened theme grounds to a lit mid-tone, and dimmed the daylight gradient-sky IBL to 0.2 for dark appearances. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * feat(viewer): rendering-pass follow-ups — GI denoise, lighter interactive SSGI, sky gradients, scoped solo shadows - Denoise the SSGI GI bounce (it composited raw — the visible grain) and drop giIntensity to 1 - Interactive SSGI back to 1 slice (×6 steps); SSGI_BAKE_PARAMS (2×6) for the thumbnail/bake pipeline - Per-theme backgroundSky: vertical zenith→horizon backdrop gradient in the post pipeline; makes the lot-edge ground fade read in every theme - Level solo: only levels above the soloed floor stay shadow-caster-only; below-levels plain-hide (they can't block the sun) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * feat(viewer): kill SSGI grain, real horizon — infinite ground disc fading into the sky - SSGI back to 2 slices × 6 steps: three's own minimum preset without temporal filtering — 1×6 was below the floor and the grain showed on flat walls; denoise radius 5 on both AO and GI, aoIntensity 1.5; bake preset raised to 3×8 (single-frame renders) - Site renderer: presentation horizon disc (8× lot radius, min 400 m) under the lot in the theme ground colour, fading radially into the theme background; lot fill back to plain ground colour (the disc carries the fade); never pickable (noop raycast) - Backdrop sky gradient compressed to the upper half of the screen so it meets the disc's far fade at exactly the horizon colour — no seam Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * feat(viewer): laptop-budget SSGI + seamless world-space horizon - SSGI interactive: 1 slice × 6 steps, GI bounce OFF (denoised AO only) — 2 slices was a thermal problem on laptops; the bounce moves to SSGI_BAKE_PARAMS (3×8, gi 1) for one-shot renders - Horizon disc dissolve: albedo fades to black while emissive fades to the background colour, so the far end IS the backdrop (no lit-vs-flat seam); backdrop gradient graded with the same transform as the scene - Sky gradient is now world-space: per-pixel view ray reconstructed from the scene camera matrices, sky above the true horizon (dir.y 0→0.35), pure background below — aligns with the disc at any camera angle - Studio theme: ground #e9e7e2 / horizon #fbfbfa / sky #dde7ef so the fade is actually visible against the white void Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * fix(viewer): kill shadow grain (PCSS opt-in only) and the inked horizon line - The eye-level ground grain was measured (high-pass σ on a flat patch: 2.95 baseline → 1.52 shadows-off → 2.49 ao-off): PCSS's per-pixel IGN dither was the dominant source, and it can't be fixed within a laptop budget without TAA. Interactive shadows revert to the renderer's PCFSoft (clean, cheap); PCSS stays wired behind ?enable=pcss for experiments and future bake-time use - The horizon 'line' was the ink pass edge-detecting the ground disc's depth silhouette against the backdrop. Ink now fades with raw depth (full below ~150 m, gone past ~350 m) — near silhouettes keep their SketchUp line, the horizon dissolves cleanly Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * feat(viewer): soft blue skies for light presets, slab coplanarity epsilon - backgroundSky retuned: studio/paper/blueprint/verdant get a soft blue zenith (overcast keeps a bluish gray — it's overcast; mediterranean/ sunset were already blue; dark themes untouched) - Slabs duplicated at the exact same position z-fight and no camera near/far tuning can separate identical depths; each slab mesh now gets a deterministic sub-3mm lift hashed from its node id. Render-only — node data, snapping and measurements untouched. (Long-term fix is reversedDepthBuffer; parked in plans with the depth-consumer audit.) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * fix(viewer): walk back perf-costly rendering-pass pieces, soften dark-theme ink Review feedback on the rendering pass: - SSGI back to main's params (1 slice / 4 steps / r1, AO-only) everywhere, including thumbnails — SSGI_BAKE_PARAMS removed. Kills the added AO grain and the extra per-frame cost; bake workers also stop paying for heavier GI. - Shadows stay visible via plain knobs only (intensity 0.9, radius 4): the custom TSL PCSS filter is gone, shadow map back to 1024, filter back to PCF (r184's Vogel-disk PCF respects radius, so edges stay soft). - Night/twilight ink edges: colour now derived from the theme background (lifted toward white) instead of a near-white constant, and dark scenes run the ink at 70% alpha — no more glowing wireframe on dark backdrops. - Snapshots: the `transparent` capture flag is now honored — preset/item captures keep their alpha, while studio renders and project thumbnails composite the theme background + sky gradient (same world-ray math as the viewport backdrop, uniform-driven so the cached pipeline serves both). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * feat(viewer,nodes): ground the scene — contact vignette + horizon haze, shadow tune Follow-ups from review: - Shadow intensity 0.9 → 0.75 (read too heavy) and PCF radius 4 → 2: the filter's per-pixel dither spreads with radius, which showed as dots across wide penumbras. Both are free knobs. - New shared backdrop formula (viewer lib/backdrop.ts): background below, theme-derived haze band hugging the horizon (background lifted toward white — faint glow on dark themes), sky above. Used by the post pipeline, the thumbnail pipeline, and the site horizon disc, whose far-field dissolve now evaluates the same gradient per fragment view direction — ground and backdrop converge to identical colours, so no horizon seam from any camera pose. - Contact vignette on the horizon disc: a soft albedo darkening hugging the lot (15%, fading out by ~2.6 lot radii) so the parcel sits on the field instead of floating on it. Albedo-only — never tints the dissolve. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * fix(nodes): make the contact vignette read on bright themes A fixed 15% albedo cut disappears into the tone mapper's shoulder on themes with strong key lights (studio runs intensity 4), and the dissolve's bright emissive diluted what was left. Scale the vignette with the theme's strongest light (0.13×, clamped at 0.45) and apply the halo to the in-band emissive as well — it zeroes out by 2.6R while the dissolve completes at 5R, so the far field stays the pure backdrop and the horizon seam guarantee holds. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * fix(viewer): no more horizon line, sky gradient reaches the horizon Two things drew a visible line where the infinite ground met the sky: - SSGI AO grows a band along the geometry↔sky depth cliff (same disease the ink pass had). Fade AO to 1 with raw depth over the ink's ≈150→350 m window, in both the viewport and thumbnail pipelines — AO is a near-field cue, it has no business shading the horizon. - The backdrop's flat haze plateau sat between two ramps, which the eye amplifies into Mach lines. The gradient is now one smooth background→sky ramp crossing the horizon, with the haze applied as an exponential glow peaking exactly at dir.y = 0 — C¹-smooth on both sides, edge-free. The sky ramp also starts at the horizon instead of ~11° up, so the theme's backgroundSky blue actually reads at eye level instead of hiding at the top of the frame. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * feat(viewer): three-stop sky — derived deep zenith, warm horizon haze The single pale backgroundSky stop read as a white void with blue hiding at the top of the frame. The backdrop is now three derived stops, inZOI-style: - pale theme sky arrives fast (full by ≈8° elevation), - then deepens toward a zenith colour derived per theme in HSL (saturate ×1.5, darken ×0.72 — hue stays the theme's own: blue studio, lavender sunset, near-black night), - horizon haze now lifts toward a warm white (#fff4de) instead of pure white, giving the junction the slight yellow of sun-scattered atmosphere. All derived from the existing backgroundSky/background fields — no theme data changes, and the shared-formula seam guarantee (viewport = captures = horizon disc) carries over. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * fix(viewer): horizon haze derives from the sky, hugs the horizon tighter White-based haze read as a tall white stripe between ground and sky. Aerial perspective is sky-coloured light with a little sun scatter, so the haze now pulls the theme's backgroundSky toward the warm sun tint (50% light themes, 25% dark) and the glow decay tightens (exp −7→−11, weight 0.9→0.8) — the merge band is skyish, sunish, and half the height, so blue starts right above the ground line. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> --------- Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Fable 5
parent
c45808840c
commit
47313263fb
@@ -132,7 +132,6 @@ export const MATERIAL_CATALOG: MaterialCatalogItem[] = [
|
||||
maps: {
|
||||
albedoMap: '/material/wood/floor_plank_1/floor_plank-diffuse.webp',
|
||||
aoMap: '/material/wood/floor_plank_1/floor_plank-ao.webp',
|
||||
metalnessMap: '/material/wood/floor_plank_1/floor_plank-specular.webp',
|
||||
normalMap: '/material/wood/floor_plank_1/floor_plank-normal.webp',
|
||||
},
|
||||
mapProperties: {
|
||||
@@ -169,7 +168,6 @@ export const MATERIAL_CATALOG: MaterialCatalogItem[] = [
|
||||
preset: {
|
||||
maps: {
|
||||
albedoMap: '/material/wood/hungarian_parquet_10/Hungarian Parquet_10_baseColor.webp',
|
||||
metalnessMap: '/material/wood/hungarian_parquet_10/Hungarian Parquet_10_specularLevel.webp',
|
||||
normalMap: '/material/wood/hungarian_parquet_10/Hungarian Parquet_10_normal.webp',
|
||||
roughnessMap: '/material/wood/hungarian_parquet_10/Hungarian Parquet_10_roughness.webp',
|
||||
},
|
||||
@@ -207,7 +205,6 @@ export const MATERIAL_CATALOG: MaterialCatalogItem[] = [
|
||||
preset: {
|
||||
maps: {
|
||||
albedoMap: '/material/wood/hungarian_parquet_2/Hungarian Parquet_2_baseColor.webp',
|
||||
metalnessMap: '/material/wood/hungarian_parquet_2/Hungarian Parquet_2_specularLevel.webp',
|
||||
normalMap: '/material/wood/hungarian_parquet_2/Hungarian Parquet_2_normal.webp',
|
||||
roughnessMap: '/material/wood/hungarian_parquet_2/Hungarian Parquet_2_roughness.webp',
|
||||
},
|
||||
@@ -246,8 +243,6 @@ export const MATERIAL_CATALOG: MaterialCatalogItem[] = [
|
||||
preset: {
|
||||
maps: {
|
||||
albedoMap: '/material/wood/square_parquet_21/Square Pattern Parquet_21_baseColor.webp',
|
||||
metalnessMap:
|
||||
'/material/wood/square_parquet_21/Square Pattern Parquet_21_specularLevel.webp',
|
||||
normalMap: '/material/wood/square_parquet_21/Square Pattern Parquet_21_normal.webp',
|
||||
roughnessMap: '/material/wood/square_parquet_21/Square Pattern Parquet_21_roughness.webp',
|
||||
},
|
||||
@@ -286,8 +281,6 @@ export const MATERIAL_CATALOG: MaterialCatalogItem[] = [
|
||||
preset: {
|
||||
maps: {
|
||||
albedoMap: '/material/wood/square_wood_parquet_23/Square Pattern Parquet_23_baseColor.webp',
|
||||
metalnessMap:
|
||||
'/material/wood/square_wood_parquet_23/Square Pattern Parquet_23_specularLevel.webp',
|
||||
normalMap: '/material/wood/square_wood_parquet_23/Square Pattern Parquet_23_normal.webp',
|
||||
roughnessMap:
|
||||
'/material/wood/square_wood_parquet_23/Square Pattern Parquet_23_roughness.webp',
|
||||
@@ -327,7 +320,6 @@ export const MATERIAL_CATALOG: MaterialCatalogItem[] = [
|
||||
maps: {
|
||||
albedoMap: '/material/wood/wood_fine/wood_fine_1-diffuse.webp',
|
||||
aoMap: '/material/wood/wood_fine/wood_fine_1-ao.webp',
|
||||
metalnessMap: '/material/wood/wood_fine/wood_fine_1-specular.webp',
|
||||
normalMap: '/material/wood/wood_fine/wood_fine_1-normal.webp',
|
||||
},
|
||||
mapProperties: {
|
||||
@@ -365,7 +357,6 @@ export const MATERIAL_CATALOG: MaterialCatalogItem[] = [
|
||||
maps: {
|
||||
albedoMap: '/material/wood/wood_fine_11/wood_fine_11-diffuse.webp',
|
||||
aoMap: '/material/wood/wood_fine_11/wood_fine_11-ao.webp',
|
||||
metalnessMap: '/material/wood/wood_fine_11/wood_fine_11-specular.webp',
|
||||
normalMap: '/material/wood/wood_fine_11/wood_fine_11-normal.webp',
|
||||
},
|
||||
mapProperties: {
|
||||
@@ -403,7 +394,6 @@ export const MATERIAL_CATALOG: MaterialCatalogItem[] = [
|
||||
maps: {
|
||||
albedoMap: '/material/wood/wood_fine_13/wood_fine_13-diffuse.webp',
|
||||
aoMap: '/material/wood/wood_fine_13/wood_fine_13-ao.webp',
|
||||
metalnessMap: '/material/wood/wood_fine_13/wood_fine_13-specular.webp',
|
||||
normalMap: '/material/wood/wood_fine_13/wood_fine_13-normal.webp',
|
||||
},
|
||||
mapProperties: {
|
||||
@@ -441,7 +431,6 @@ export const MATERIAL_CATALOG: MaterialCatalogItem[] = [
|
||||
maps: {
|
||||
albedoMap: '/material/wood/wood_fine_2/wood_fine_2-diffuse.webp',
|
||||
aoMap: '/material/wood/wood_fine_2/wood_fine_2-ao.webp',
|
||||
metalnessMap: '/material/wood/wood_fine_2/wood_fine_2-specular.webp',
|
||||
normalMap: '/material/wood/wood_fine_2/wood_fine_2-normal.webp',
|
||||
},
|
||||
mapProperties: {
|
||||
@@ -479,7 +468,6 @@ export const MATERIAL_CATALOG: MaterialCatalogItem[] = [
|
||||
maps: {
|
||||
albedoMap: '/material/wood/wood_fine_22/wood_fine_22-diffuse.webp',
|
||||
aoMap: '/material/wood/wood_fine_22/wood_fine_22-ao.webp',
|
||||
metalnessMap: '/material/wood/wood_fine_22/wood_fine_22-specular.webp',
|
||||
normalMap: '/material/wood/wood_fine_22/wood_fine_22-normal.webp',
|
||||
},
|
||||
mapProperties: {
|
||||
@@ -517,7 +505,6 @@ export const MATERIAL_CATALOG: MaterialCatalogItem[] = [
|
||||
maps: {
|
||||
albedoMap: '/material/wood/wood_fine_24/wood_fine_24-diffuse.webp',
|
||||
aoMap: '/material/wood/wood_fine_24/wood_fine_24-ao.webp',
|
||||
metalnessMap: '/material/wood/wood_fine_24/wood_fine_24-specular.webp',
|
||||
normalMap: '/material/wood/wood_fine_24/wood_fine_24-normal.webp',
|
||||
},
|
||||
mapProperties: {
|
||||
@@ -593,7 +580,6 @@ export const MATERIAL_CATALOG: MaterialCatalogItem[] = [
|
||||
preset: {
|
||||
maps: {
|
||||
albedoMap: '/material/wood/wooden_parquet_11/Classic Parquet_11_baseColor.webp',
|
||||
metalnessMap: '/material/wood/wooden_parquet_11/Classic Parquet_11_specularLevel.webp',
|
||||
normalMap: '/material/wood/wooden_parquet_11/Classic Parquet_11_normal.webp',
|
||||
roughnessMap: '/material/wood/wooden_parquet_11/Classic Parquet_11_roughness.webp',
|
||||
},
|
||||
@@ -1018,7 +1004,6 @@ export const MATERIAL_CATALOG: MaterialCatalogItem[] = [
|
||||
maps: {
|
||||
albedoMap: '/material/flooring/garage_panel/garage_panel_diffuse.jpg',
|
||||
aoMap: '/material/flooring/garage_panel/garage_panel_ao.jpg',
|
||||
metalnessMap: '/material/flooring/garage_panel/garage_panel_specular.jpg',
|
||||
normalMap: '/material/flooring/garage_panel/garage_panel_normal.jpg',
|
||||
},
|
||||
mapProperties: {
|
||||
@@ -1056,7 +1041,6 @@ export const MATERIAL_CATALOG: MaterialCatalogItem[] = [
|
||||
maps: {
|
||||
albedoMap: '/material/flooring/green_labradorite/green_labradorite_diffuse.jpg',
|
||||
aoMap: '/material/flooring/green_labradorite/green_labradorite_ao.jpg',
|
||||
metalnessMap: '/material/flooring/green_labradorite/green_labradorite_specular.jpg',
|
||||
normalMap: '/material/flooring/green_labradorite/green_labradorite_normal.jpg',
|
||||
},
|
||||
mapProperties: {
|
||||
@@ -1133,7 +1117,6 @@ export const MATERIAL_CATALOG: MaterialCatalogItem[] = [
|
||||
maps: {
|
||||
albedoMap: '/material/flooring/pool_tiles/pool_tiles_diffuse.jpg',
|
||||
aoMap: '/material/flooring/pool_tiles/pool_tiles_ao.jpg',
|
||||
metalnessMap: '/material/flooring/pool_tiles/pool_tiles_specular.jpg',
|
||||
normalMap: '/material/flooring/pool_tiles/pool_tiles_normal.jpg',
|
||||
},
|
||||
mapProperties: {
|
||||
@@ -1171,7 +1154,6 @@ export const MATERIAL_CATALOG: MaterialCatalogItem[] = [
|
||||
maps: {
|
||||
albedoMap: '/material/flooring/tiles_checker/tiles_checker_diffuse.jpg',
|
||||
aoMap: '/material/flooring/tiles_checker/tiles_checker_ao.jpg',
|
||||
metalnessMap: '/material/flooring/tiles_checker/tiles_checker_specular.jpg',
|
||||
normalMap: '/material/flooring/tiles_checker/tiles_checker_normal.jpg',
|
||||
},
|
||||
mapProperties: {
|
||||
@@ -1209,7 +1191,6 @@ export const MATERIAL_CATALOG: MaterialCatalogItem[] = [
|
||||
maps: {
|
||||
albedoMap: '/material/flooring/tiles_grid/tiles_grid_diffuse.jpg',
|
||||
aoMap: '/material/flooring/tiles_grid/tiles_grid_ao.jpg',
|
||||
metalnessMap: '/material/flooring/tiles_grid/tiles_grid_specular.jpg',
|
||||
normalMap: '/material/flooring/tiles_grid/tiles_grid_normal.jpg',
|
||||
},
|
||||
mapProperties: {
|
||||
@@ -1247,7 +1228,6 @@ export const MATERIAL_CATALOG: MaterialCatalogItem[] = [
|
||||
maps: {
|
||||
albedoMap: '/material/flooring/stone_wall/stone_wall_diffuse.webp',
|
||||
aoMap: '/material/flooring/stone_wall/stone_wall_ao.webp',
|
||||
metalnessMap: '/material/flooring/stone_wall/stone_wall_specular.webp',
|
||||
normalMap: '/material/flooring/stone_wall/stone_wall_normal.webp',
|
||||
},
|
||||
mapProperties: {
|
||||
@@ -1285,7 +1265,6 @@ export const MATERIAL_CATALOG: MaterialCatalogItem[] = [
|
||||
maps: {
|
||||
albedoMap: '/material/flooring/wooden_ceramic_3/wooden_ceramic-diffuse.webp',
|
||||
aoMap: '/material/flooring/wooden_ceramic_3/wooden_ceramic-ao.webp',
|
||||
metalnessMap: '/material/flooring/wooden_ceramic_3/wooden_ceramic-specular.webp',
|
||||
normalMap: '/material/flooring/wooden_ceramic_3/wooden_ceramic-normal.webp',
|
||||
},
|
||||
mapProperties: {
|
||||
@@ -1477,7 +1456,6 @@ export const MATERIAL_CATALOG: MaterialCatalogItem[] = [
|
||||
maps: {
|
||||
albedoMap: '/material/flooring/green_glass_quartzite/green_glass_quartzite_diffuse.jpg',
|
||||
aoMap: '/material/flooring/green_glass_quartzite/green_glass_quartzite_ao.jpg',
|
||||
metalnessMap: '/material/flooring/green_glass_quartzite/green_glass_quartzite_specular.jpg',
|
||||
normalMap: '/material/flooring/green_glass_quartzite/green_glass_quartzite_normal.jpg',
|
||||
},
|
||||
mapProperties: {
|
||||
@@ -1594,7 +1572,6 @@ export const MATERIAL_CATALOG: MaterialCatalogItem[] = [
|
||||
maps: {
|
||||
albedoMap: '/material/flooring/statuaretto/statuaretto_diffuse.jpg',
|
||||
aoMap: '/material/flooring/statuaretto/statuaretto_ao.jpg',
|
||||
metalnessMap: '/material/flooring/statuaretto/statuaretto_specular.jpg',
|
||||
normalMap: '/material/flooring/statuaretto/statuaretto_normal.jpg',
|
||||
},
|
||||
mapProperties: {
|
||||
@@ -1710,7 +1687,6 @@ export const MATERIAL_CATALOG: MaterialCatalogItem[] = [
|
||||
maps: {
|
||||
albedoMap: '/material/flooring/wooden_ceramic_2/wooden_ceramic-diffuse.webp',
|
||||
aoMap: '/material/flooring/wooden_ceramic_2/wooden_ceramic-ao.webp',
|
||||
metalnessMap: '/material/flooring/wooden_ceramic_2/wooden_ceramic-specular.webp',
|
||||
normalMap: '/material/flooring/wooden_ceramic_2/wooden_ceramic-normal.webp',
|
||||
},
|
||||
mapProperties: {
|
||||
@@ -1948,11 +1924,13 @@ export const MATERIAL_CATALOG: MaterialCatalogItem[] = [
|
||||
label: 'White',
|
||||
category: 'colors',
|
||||
description: 'Clean painted finish',
|
||||
previewColor: '#ffffff',
|
||||
// Real white paint reflects ~80%; a literal #ffffff albedo kills GI/shadow
|
||||
// contrast, so "white" is clamped to ≈0.83 linear.
|
||||
previewColor: '#e9e9e9',
|
||||
preset: {
|
||||
maps: {},
|
||||
mapProperties: {
|
||||
color: '#ffffff',
|
||||
color: '#e9e9e9',
|
||||
roughness: 0.9,
|
||||
metalness: 0,
|
||||
repeatX: 1,
|
||||
@@ -1980,11 +1958,11 @@ export const MATERIAL_CATALOG: MaterialCatalogItem[] = [
|
||||
label: 'Soft White',
|
||||
category: 'colors',
|
||||
description: 'Warm off-white painted finish',
|
||||
previewColor: '#f2eee6',
|
||||
previewColor: '#ebe7df',
|
||||
preset: {
|
||||
maps: {},
|
||||
mapProperties: {
|
||||
color: '#f2eee6',
|
||||
color: '#ebe7df',
|
||||
roughness: 0.9,
|
||||
metalness: 0,
|
||||
repeatX: 1,
|
||||
|
||||
@@ -115,7 +115,7 @@ export type MaterialPresetPayload = z.infer<typeof MaterialPresetPayloadSchema>
|
||||
|
||||
export const DEFAULT_MATERIALS: Record<MaterialPreset, MaterialProperties> = {
|
||||
white: {
|
||||
color: '#ffffff',
|
||||
color: '#e9e9e9',
|
||||
roughness: 0.9,
|
||||
metalness: 0,
|
||||
opacity: 1,
|
||||
@@ -163,7 +163,7 @@ export const DEFAULT_MATERIALS: Record<MaterialPreset, MaterialProperties> = {
|
||||
side: 'front',
|
||||
},
|
||||
plaster: {
|
||||
color: '#f5f5dc',
|
||||
color: '#ebebd3',
|
||||
roughness: 0.95,
|
||||
metalness: 0,
|
||||
opacity: 1,
|
||||
@@ -179,7 +179,7 @@ export const DEFAULT_MATERIALS: Record<MaterialPreset, MaterialProperties> = {
|
||||
side: 'front',
|
||||
},
|
||||
marble: {
|
||||
color: '#fafafa',
|
||||
color: '#ebebeb',
|
||||
roughness: 0.2,
|
||||
metalness: 0.1,
|
||||
opacity: 1,
|
||||
@@ -187,7 +187,7 @@ export const DEFAULT_MATERIALS: Record<MaterialPreset, MaterialProperties> = {
|
||||
side: 'front',
|
||||
},
|
||||
custom: {
|
||||
color: '#ffffff',
|
||||
color: '#e9e9e9',
|
||||
roughness: 0.5,
|
||||
metalness: 0,
|
||||
opacity: 1,
|
||||
|
||||
Reference in New Issue
Block a user