@pascal-app/core 0.9.1 → 1.0.0-beta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (378) hide show
  1. package/README.md +17 -10
  2. package/dist/events/bus.d.ts +49 -2
  3. package/dist/events/bus.d.ts.map +1 -1
  4. package/dist/hooks/scene-registry/item-clip-registry.d.ts +18 -0
  5. package/dist/hooks/scene-registry/item-clip-registry.d.ts.map +1 -0
  6. package/dist/hooks/scene-registry/item-clip-registry.js +10 -0
  7. package/dist/hooks/scene-registry/scene-registry.d.ts +8 -1
  8. package/dist/hooks/scene-registry/scene-registry.d.ts.map +1 -1
  9. package/dist/hooks/scene-registry/scene-registry.js +27 -1
  10. package/dist/hooks/spatial-grid/floor-placed-elevation.d.ts +17 -1
  11. package/dist/hooks/spatial-grid/floor-placed-elevation.d.ts.map +1 -1
  12. package/dist/hooks/spatial-grid/floor-placed-elevation.js +61 -8
  13. package/dist/hooks/spatial-grid/spatial-grid-manager.d.ts +135 -28
  14. package/dist/hooks/spatial-grid/spatial-grid-manager.d.ts.map +1 -1
  15. package/dist/hooks/spatial-grid/spatial-grid-manager.js +427 -271
  16. package/dist/hooks/spatial-grid/spatial-grid-sync.d.ts +46 -1
  17. package/dist/hooks/spatial-grid/spatial-grid-sync.d.ts.map +1 -1
  18. package/dist/hooks/spatial-grid/spatial-grid-sync.js +208 -9
  19. package/dist/hooks/spatial-grid/support-host-id.d.ts +3 -0
  20. package/dist/hooks/spatial-grid/support-host-id.d.ts.map +1 -0
  21. package/dist/hooks/spatial-grid/support-host-id.js +2 -0
  22. package/dist/hooks/spatial-grid/support-host-patch.d.ts +51 -0
  23. package/dist/hooks/spatial-grid/support-host-patch.d.ts.map +1 -0
  24. package/dist/hooks/spatial-grid/support-host-patch.js +164 -0
  25. package/dist/index.d.ts +33 -11
  26. package/dist/index.d.ts.map +1 -1
  27. package/dist/index.js +32 -10
  28. package/dist/lib/level-name.d.ts +4 -0
  29. package/dist/lib/level-name.d.ts.map +1 -0
  30. package/dist/lib/level-name.js +10 -0
  31. package/dist/lib/measurement-geometry.d.ts +23 -0
  32. package/dist/lib/measurement-geometry.d.ts.map +1 -0
  33. package/dist/lib/measurement-geometry.js +249 -0
  34. package/dist/lib/polygon-geometry.d.ts +0 -1
  35. package/dist/lib/polygon-geometry.d.ts.map +1 -1
  36. package/dist/lib/polygon-geometry.js +0 -18
  37. package/dist/lib/selection-proxy.d.ts +4 -0
  38. package/dist/lib/selection-proxy.d.ts.map +1 -0
  39. package/dist/lib/selection-proxy.js +12 -0
  40. package/dist/lib/slab-polygon.d.ts +31 -2
  41. package/dist/lib/slab-polygon.d.ts.map +1 -1
  42. package/dist/lib/slab-polygon.js +557 -31
  43. package/dist/lib/slots.d.ts +14 -0
  44. package/dist/lib/slots.d.ts.map +1 -0
  45. package/dist/lib/slots.js +26 -0
  46. package/dist/lib/space-detection.d.ts +40 -6
  47. package/dist/lib/space-detection.d.ts.map +1 -1
  48. package/dist/lib/space-detection.js +574 -192
  49. package/dist/lib/terrain-brush.d.ts +163 -0
  50. package/dist/lib/terrain-brush.d.ts.map +1 -0
  51. package/dist/lib/terrain-brush.js +359 -0
  52. package/dist/lib/terrain-codec.d.ts +51 -0
  53. package/dist/lib/terrain-codec.d.ts.map +1 -0
  54. package/dist/lib/terrain-codec.js +167 -0
  55. package/dist/lib/terrain-field.d.ts +150 -0
  56. package/dist/lib/terrain-field.d.ts.map +1 -0
  57. package/dist/lib/terrain-field.js +248 -0
  58. package/dist/lib/terrain-raycast.d.ts +44 -0
  59. package/dist/lib/terrain-raycast.d.ts.map +1 -0
  60. package/dist/lib/terrain-raycast.js +188 -0
  61. package/dist/lib/terrain-source.d.ts +60 -0
  62. package/dist/lib/terrain-source.d.ts.map +1 -0
  63. package/dist/lib/terrain-source.js +90 -0
  64. package/dist/lib/terrain-support.d.ts +60 -0
  65. package/dist/lib/terrain-support.d.ts.map +1 -0
  66. package/dist/lib/terrain-support.js +150 -0
  67. package/dist/lib/wall-distance.d.ts +60 -0
  68. package/dist/lib/wall-distance.d.ts.map +1 -0
  69. package/dist/lib/wall-distance.js +85 -0
  70. package/dist/lib/zone-quantities.d.ts +21 -0
  71. package/dist/lib/zone-quantities.d.ts.map +1 -0
  72. package/dist/lib/zone-quantities.js +428 -0
  73. package/dist/material-library.d.ts +28 -1
  74. package/dist/material-library.d.ts.map +1 -1
  75. package/dist/material-library.js +2233 -441
  76. package/dist/registry/handles.d.ts +91 -3
  77. package/dist/registry/handles.d.ts.map +1 -1
  78. package/dist/registry/index.d.ts +3 -3
  79. package/dist/registry/index.d.ts.map +1 -1
  80. package/dist/registry/index.js +1 -1
  81. package/dist/registry/registry.d.ts +46 -3
  82. package/dist/registry/registry.d.ts.map +1 -1
  83. package/dist/registry/registry.js +82 -1
  84. package/dist/registry/subtree.d.ts.map +1 -1
  85. package/dist/registry/subtree.js +8 -1
  86. package/dist/registry/types.d.ts +781 -39
  87. package/dist/registry/types.d.ts.map +1 -1
  88. package/dist/schema/index.d.ts +27 -8
  89. package/dist/schema/index.d.ts.map +1 -1
  90. package/dist/schema/index.js +23 -6
  91. package/dist/schema/material.d.ts +3 -2
  92. package/dist/schema/material.d.ts.map +1 -1
  93. package/dist/schema/material.js +7 -5
  94. package/dist/schema/nodes/box-vent.d.ts +2 -2
  95. package/dist/schema/nodes/cabinet.d.ts +536 -0
  96. package/dist/schema/nodes/cabinet.d.ts.map +1 -0
  97. package/dist/schema/nodes/cabinet.js +139 -0
  98. package/dist/schema/nodes/ceiling.d.ts +4 -3
  99. package/dist/schema/nodes/ceiling.d.ts.map +1 -1
  100. package/dist/schema/nodes/ceiling.js +11 -1
  101. package/dist/schema/nodes/chimney.d.ts +4 -4
  102. package/dist/schema/nodes/column.d.ts +4 -2
  103. package/dist/schema/nodes/column.d.ts.map +1 -1
  104. package/dist/schema/nodes/column.js +5 -0
  105. package/dist/schema/nodes/construction-dimension.d.ts +195 -0
  106. package/dist/schema/nodes/construction-dimension.d.ts.map +1 -0
  107. package/dist/schema/nodes/construction-dimension.js +151 -0
  108. package/dist/schema/nodes/cupola.d.ts +2 -2
  109. package/dist/schema/nodes/door.d.ts +42 -5
  110. package/dist/schema/nodes/door.d.ts.map +1 -1
  111. package/dist/schema/nodes/door.js +32 -0
  112. package/dist/schema/nodes/dormer.d.ts +8 -8
  113. package/dist/schema/nodes/dormer.js +1 -1
  114. package/dist/schema/nodes/downspout.d.ts +2 -2
  115. package/dist/schema/nodes/duct-fitting.d.ts +91 -0
  116. package/dist/schema/nodes/duct-fitting.d.ts.map +1 -0
  117. package/dist/schema/nodes/duct-fitting.js +92 -0
  118. package/dist/schema/nodes/duct-segment.d.ts +61 -0
  119. package/dist/schema/nodes/duct-segment.d.ts.map +1 -0
  120. package/dist/schema/nodes/duct-segment.js +73 -0
  121. package/dist/schema/nodes/duct-terminal.d.ts +58 -0
  122. package/dist/schema/nodes/duct-terminal.d.ts.map +1 -0
  123. package/dist/schema/nodes/duct-terminal.js +53 -0
  124. package/dist/schema/nodes/elevator.d.ts +3 -2
  125. package/dist/schema/nodes/elevator.d.ts.map +1 -1
  126. package/dist/schema/nodes/elevator.js +3 -0
  127. package/dist/schema/nodes/eyebrow-vent.d.ts +2 -2
  128. package/dist/schema/nodes/fence.d.ts +20 -2
  129. package/dist/schema/nodes/fence.d.ts.map +1 -1
  130. package/dist/schema/nodes/fence.js +33 -2
  131. package/dist/schema/nodes/gutter.d.ts +2 -2
  132. package/dist/schema/nodes/hvac-equipment.d.ts +64 -0
  133. package/dist/schema/nodes/hvac-equipment.d.ts.map +1 -0
  134. package/dist/schema/nodes/hvac-equipment.js +57 -0
  135. package/dist/schema/nodes/item.d.ts +9 -0
  136. package/dist/schema/nodes/item.d.ts.map +1 -1
  137. package/dist/schema/nodes/item.js +24 -0
  138. package/dist/schema/nodes/level.d.ts +2 -1
  139. package/dist/schema/nodes/level.d.ts.map +1 -1
  140. package/dist/schema/nodes/level.js +12 -31
  141. package/dist/schema/nodes/lineset.d.ts +42 -0
  142. package/dist/schema/nodes/lineset.d.ts.map +1 -0
  143. package/dist/schema/nodes/lineset.js +38 -0
  144. package/dist/schema/nodes/liquid-line.d.ts +34 -0
  145. package/dist/schema/nodes/liquid-line.d.ts.map +1 -0
  146. package/dist/schema/nodes/liquid-line.js +24 -0
  147. package/dist/schema/nodes/measurement.d.ts +306 -0
  148. package/dist/schema/nodes/measurement.d.ts.map +1 -0
  149. package/dist/schema/nodes/measurement.js +87 -0
  150. package/dist/schema/nodes/pipe-fitting.d.ts +56 -0
  151. package/dist/schema/nodes/pipe-fitting.d.ts.map +1 -0
  152. package/dist/schema/nodes/pipe-fitting.js +45 -0
  153. package/dist/schema/nodes/pipe-segment.d.ts +48 -0
  154. package/dist/schema/nodes/pipe-segment.d.ts.map +1 -0
  155. package/dist/schema/nodes/pipe-segment.js +36 -0
  156. package/dist/schema/nodes/pipe-trap.d.ts +43 -0
  157. package/dist/schema/nodes/pipe-trap.d.ts.map +1 -0
  158. package/dist/schema/nodes/pipe-trap.js +36 -0
  159. package/dist/schema/nodes/ridge-vent.d.ts +18 -3
  160. package/dist/schema/nodes/ridge-vent.d.ts.map +1 -1
  161. package/dist/schema/nodes/ridge-vent.js +221 -3
  162. package/dist/schema/nodes/roof-segment-shape.d.ts +90 -0
  163. package/dist/schema/nodes/roof-segment-shape.d.ts.map +1 -0
  164. package/dist/schema/nodes/roof-segment-shape.js +318 -0
  165. package/dist/schema/nodes/roof-segment-walls.d.ts +101 -0
  166. package/dist/schema/nodes/roof-segment-walls.d.ts.map +1 -0
  167. package/dist/schema/nodes/roof-segment-walls.js +330 -0
  168. package/dist/schema/nodes/roof-segment.d.ts +84 -8
  169. package/dist/schema/nodes/roof-segment.d.ts.map +1 -1
  170. package/dist/schema/nodes/roof-segment.js +290 -5
  171. package/dist/schema/nodes/roof.d.ts +8 -8
  172. package/dist/schema/nodes/shelf.d.ts +4 -2
  173. package/dist/schema/nodes/shelf.d.ts.map +1 -1
  174. package/dist/schema/nodes/shelf.js +8 -0
  175. package/dist/schema/nodes/site.d.ts +9 -0
  176. package/dist/schema/nodes/site.d.ts.map +1 -1
  177. package/dist/schema/nodes/site.js +8 -6
  178. package/dist/schema/nodes/skylight.d.ts +10 -10
  179. package/dist/schema/nodes/slab.d.ts +8 -2
  180. package/dist/schema/nodes/slab.d.ts.map +1 -1
  181. package/dist/schema/nodes/slab.js +18 -2
  182. package/dist/schema/nodes/solar-panel.d.ts +4 -4
  183. package/dist/schema/nodes/spawn.d.ts +1 -0
  184. package/dist/schema/nodes/spawn.d.ts.map +1 -1
  185. package/dist/schema/nodes/spawn.js +2 -0
  186. package/dist/schema/nodes/stair-segment.d.ts +4 -4
  187. package/dist/schema/nodes/stair.d.ts +16 -13
  188. package/dist/schema/nodes/stair.d.ts.map +1 -1
  189. package/dist/schema/nodes/stair.js +11 -1
  190. package/dist/schema/nodes/structural-grid.d.ts +27 -0
  191. package/dist/schema/nodes/structural-grid.d.ts.map +1 -0
  192. package/dist/schema/nodes/structural-grid.js +17 -0
  193. package/dist/schema/nodes/turbine-vent.d.ts +2 -2
  194. package/dist/schema/nodes/wall.d.ts +248 -6
  195. package/dist/schema/nodes/wall.d.ts.map +1 -1
  196. package/dist/schema/nodes/wall.js +266 -0
  197. package/dist/schema/nodes/window.d.ts +40 -3
  198. package/dist/schema/nodes/window.d.ts.map +1 -1
  199. package/dist/schema/nodes/window.js +30 -0
  200. package/dist/schema/nodes/zone.d.ts +22 -0
  201. package/dist/schema/nodes/zone.d.ts.map +1 -1
  202. package/dist/schema/nodes/zone.js +21 -0
  203. package/dist/schema/scene-material.d.ts +41 -0
  204. package/dist/schema/scene-material.d.ts.map +1 -0
  205. package/dist/schema/scene-material.js +9 -0
  206. package/dist/schema/terrain.d.ts +28 -0
  207. package/dist/schema/terrain.d.ts.map +1 -0
  208. package/dist/schema/terrain.js +30 -0
  209. package/dist/schema/types.d.ts +1300 -97
  210. package/dist/schema/types.d.ts.map +1 -1
  211. package/dist/schema/types.js +27 -0
  212. package/dist/services/__fixtures__/wall-plane-top-boundary-repro.d.ts +80 -0
  213. package/dist/services/__fixtures__/wall-plane-top-boundary-repro.d.ts.map +1 -0
  214. package/dist/services/__fixtures__/wall-plane-top-boundary-repro.js +89 -0
  215. package/dist/services/alignment-anchors.d.ts.map +1 -1
  216. package/dist/services/alignment-anchors.js +30 -1
  217. package/dist/services/alignment.d.ts +5 -0
  218. package/dist/services/alignment.d.ts.map +1 -1
  219. package/dist/services/alignment.js +2 -0
  220. package/dist/services/hosting.d.ts +8 -0
  221. package/dist/services/hosting.d.ts.map +1 -1
  222. package/dist/services/hosting.js +13 -4
  223. package/dist/services/index.d.ts +9 -2
  224. package/dist/services/index.d.ts.map +1 -1
  225. package/dist/services/index.js +9 -2
  226. package/dist/services/level-height.d.ts +27 -0
  227. package/dist/services/level-height.d.ts.map +1 -0
  228. package/dist/services/level-height.js +94 -0
  229. package/dist/services/opening-guides.d.ts +141 -0
  230. package/dist/services/opening-guides.d.ts.map +1 -0
  231. package/dist/services/opening-guides.js +267 -0
  232. package/dist/services/port-connectivity.d.ts +115 -0
  233. package/dist/services/port-connectivity.d.ts.map +1 -0
  234. package/dist/services/port-connectivity.js +300 -0
  235. package/dist/services/riser-diagram.d.ts +40 -0
  236. package/dist/services/riser-diagram.d.ts.map +1 -0
  237. package/dist/services/riser-diagram.js +110 -0
  238. package/dist/services/snap.d.ts +9 -1
  239. package/dist/services/snap.d.ts.map +1 -1
  240. package/dist/services/snap.js +21 -1
  241. package/dist/services/storey.d.ts +103 -0
  242. package/dist/services/storey.d.ts.map +1 -0
  243. package/dist/services/storey.js +296 -0
  244. package/dist/services/system-graph.d.ts +30 -0
  245. package/dist/services/system-graph.d.ts.map +1 -0
  246. package/dist/services/system-graph.js +164 -0
  247. package/dist/services/validate-dwv.d.ts +32 -0
  248. package/dist/services/validate-dwv.d.ts.map +1 -0
  249. package/dist/services/validate-dwv.js +118 -0
  250. package/dist/store/actions/node-actions.d.ts.map +1 -1
  251. package/dist/store/actions/node-actions.js +141 -4
  252. package/dist/store/history-control.d.ts +31 -0
  253. package/dist/store/history-control.d.ts.map +1 -1
  254. package/dist/store/history-control.js +130 -0
  255. package/dist/store/use-live-terrain.d.ts +65 -0
  256. package/dist/store/use-live-terrain.d.ts.map +1 -0
  257. package/dist/store/use-live-terrain.js +31 -0
  258. package/dist/store/use-live-transforms.d.ts +8 -0
  259. package/dist/store/use-live-transforms.d.ts.map +1 -1
  260. package/dist/store/use-scene.d.ts +47 -3
  261. package/dist/store/use-scene.d.ts.map +1 -1
  262. package/dist/store/use-scene.js +992 -55
  263. package/dist/systems/elevator/elevator-opening-system.d.ts +1 -0
  264. package/dist/systems/elevator/elevator-opening-system.d.ts.map +1 -1
  265. package/dist/systems/elevator/elevator-opening-system.js +27 -21
  266. package/dist/systems/elevator/elevator-service.d.ts +0 -2
  267. package/dist/systems/elevator/elevator-service.d.ts.map +1 -1
  268. package/dist/systems/elevator/elevator-service.js +2 -24
  269. package/dist/systems/fence/fence-centerline.d.ts +12 -0
  270. package/dist/systems/fence/fence-centerline.d.ts.map +1 -0
  271. package/dist/systems/fence/fence-centerline.js +37 -0
  272. package/dist/systems/fence/fence-spline.d.ts +39 -0
  273. package/dist/systems/fence/fence-spline.d.ts.map +1 -0
  274. package/dist/systems/fence/fence-spline.js +196 -0
  275. package/dist/systems/slab/slab-placement.d.ts +11 -0
  276. package/dist/systems/slab/slab-placement.d.ts.map +1 -0
  277. package/dist/systems/slab/slab-placement.js +14 -0
  278. package/dist/systems/slab/slab-support.d.ts +137 -0
  279. package/dist/systems/slab/slab-support.d.ts.map +1 -0
  280. package/dist/systems/slab/slab-support.js +557 -0
  281. package/dist/systems/stair/stair-footprint.d.ts.map +1 -1
  282. package/dist/systems/stair/stair-footprint.js +21 -11
  283. package/dist/systems/stair/stair-opening-preview.d.ts +1300 -505
  284. package/dist/systems/stair/stair-opening-preview.d.ts.map +1 -1
  285. package/dist/systems/stair/stair-opening-sync.d.ts.map +1 -1
  286. package/dist/systems/stair/stair-opening-sync.js +19 -33
  287. package/dist/systems/stair/stair-opening-system.d.ts.map +1 -1
  288. package/dist/systems/stair/stair-opening-system.js +32 -4
  289. package/dist/systems/stair/stair-rise.d.ts +22 -0
  290. package/dist/systems/stair/stair-rise.d.ts.map +1 -0
  291. package/dist/systems/stair/stair-rise.js +79 -0
  292. package/dist/systems/wall/wall-curve.d.ts +10 -0
  293. package/dist/systems/wall/wall-curve.d.ts.map +1 -1
  294. package/dist/systems/wall/wall-curve.js +1 -1
  295. package/dist/systems/wall/wall-mitering.d.ts.map +1 -1
  296. package/dist/systems/wall/wall-mitering.js +44 -8
  297. package/dist/systems/wall/wall-top.d.ts +40 -0
  298. package/dist/systems/wall/wall-top.d.ts.map +1 -0
  299. package/dist/systems/wall/wall-top.js +46 -0
  300. package/dist/utils/clone-scene-graph.d.ts +1 -0
  301. package/dist/utils/clone-scene-graph.d.ts.map +1 -1
  302. package/dist/utils/clone-scene-graph.js +56 -5
  303. package/dist/utils/heal-scene-graph.d.ts +18 -0
  304. package/dist/utils/heal-scene-graph.d.ts.map +1 -0
  305. package/dist/utils/heal-scene-graph.js +106 -0
  306. package/dist/validation/validate-build-json.d.ts +3 -0
  307. package/dist/validation/validate-build-json.d.ts.map +1 -1
  308. package/dist/validation/validate-build-json.js +90 -5
  309. package/package.json +4 -4
  310. package/dist/hooks/spatial-grid/floor-placed-elevation.test.d.ts +0 -2
  311. package/dist/hooks/spatial-grid/floor-placed-elevation.test.d.ts.map +0 -1
  312. package/dist/hooks/spatial-grid/floor-placed-elevation.test.js +0 -273
  313. package/dist/lib/space-detection-pause.test.d.ts +0 -2
  314. package/dist/lib/space-detection-pause.test.d.ts.map +0 -1
  315. package/dist/lib/space-detection-pause.test.js +0 -42
  316. package/dist/lib/space-detection.test.d.ts +0 -2
  317. package/dist/lib/space-detection.test.d.ts.map +0 -1
  318. package/dist/lib/space-detection.test.js +0 -77
  319. package/dist/registry/registry.test.d.ts +0 -2
  320. package/dist/registry/registry.test.d.ts.map +0 -1
  321. package/dist/registry/registry.test.js +0 -183
  322. package/dist/registry/relations-resolver.test.d.ts +0 -2
  323. package/dist/registry/relations-resolver.test.d.ts.map +0 -1
  324. package/dist/registry/relations-resolver.test.js +0 -183
  325. package/dist/registry/scene-api.test.d.ts +0 -2
  326. package/dist/registry/scene-api.test.d.ts.map +0 -1
  327. package/dist/registry/scene-api.test.js +0 -183
  328. package/dist/registry/subtree.test.d.ts +0 -2
  329. package/dist/registry/subtree.test.d.ts.map +0 -1
  330. package/dist/registry/subtree.test.js +0 -133
  331. package/dist/schema/asset-url.test.d.ts +0 -2
  332. package/dist/schema/asset-url.test.d.ts.map +0 -1
  333. package/dist/schema/asset-url.test.js +0 -134
  334. package/dist/services/alignment-anchors.test.d.ts +0 -2
  335. package/dist/services/alignment-anchors.test.d.ts.map +0 -1
  336. package/dist/services/alignment-anchors.test.js +0 -383
  337. package/dist/services/alignment.test.d.ts +0 -2
  338. package/dist/services/alignment.test.d.ts.map +0 -1
  339. package/dist/services/alignment.test.js +0 -92
  340. package/dist/services/drag-session.test.d.ts +0 -2
  341. package/dist/services/drag-session.test.d.ts.map +0 -1
  342. package/dist/services/drag-session.test.js +0 -219
  343. package/dist/services/hosting.test.d.ts +0 -2
  344. package/dist/services/hosting.test.d.ts.map +0 -1
  345. package/dist/services/hosting.test.js +0 -199
  346. package/dist/services/movement.test.d.ts +0 -2
  347. package/dist/services/movement.test.d.ts.map +0 -1
  348. package/dist/services/movement.test.js +0 -133
  349. package/dist/services/single-undo-dance.test.d.ts +0 -2
  350. package/dist/services/single-undo-dance.test.d.ts.map +0 -1
  351. package/dist/services/single-undo-dance.test.js +0 -210
  352. package/dist/services/snap.test.d.ts +0 -2
  353. package/dist/services/snap.test.d.ts.map +0 -1
  354. package/dist/services/snap.test.js +0 -95
  355. package/dist/store/actions/node-mutation-sanitize.test.d.ts +0 -2
  356. package/dist/store/actions/node-mutation-sanitize.test.d.ts.map +0 -1
  357. package/dist/store/actions/node-mutation-sanitize.test.js +0 -147
  358. package/dist/store/actions/reparent.test.d.ts +0 -2
  359. package/dist/store/actions/reparent.test.d.ts.map +0 -1
  360. package/dist/store/actions/reparent.test.js +0 -212
  361. package/dist/store/use-scene-elevator-migration.test.d.ts +0 -2
  362. package/dist/store/use-scene-elevator-migration.test.d.ts.map +0 -1
  363. package/dist/store/use-scene-elevator-migration.test.js +0 -109
  364. package/dist/systems/elevator/elevator-opening-sync.test.d.ts +0 -2
  365. package/dist/systems/elevator/elevator-opening-sync.test.d.ts.map +0 -1
  366. package/dist/systems/elevator/elevator-opening-sync.test.js +0 -146
  367. package/dist/systems/elevator/elevator-runtime.test.d.ts +0 -2
  368. package/dist/systems/elevator/elevator-runtime.test.d.ts.map +0 -1
  369. package/dist/systems/elevator/elevator-runtime.test.js +0 -64
  370. package/dist/systems/stair/stair-opening-preview.test.d.ts +0 -2
  371. package/dist/systems/stair/stair-opening-preview.test.d.ts.map +0 -1
  372. package/dist/systems/stair/stair-opening-preview.test.js +0 -80
  373. package/dist/systems/stair/stair-opening-sync.test.d.ts +0 -2
  374. package/dist/systems/stair/stair-opening-sync.test.d.ts.map +0 -1
  375. package/dist/systems/stair/stair-opening-sync.test.js +0 -446
  376. package/dist/utils/clone-scene-graph.test.d.ts +0 -2
  377. package/dist/utils/clone-scene-graph.test.d.ts.map +0 -1
  378. package/dist/utils/clone-scene-graph.test.js +0 -59
@@ -29,20 +29,46 @@ const ROOF_TARGETS = [
29
29
  MaterialTargetSchema.enum.dormer,
30
30
  ];
31
31
  const CEILING_TARGETS = [MaterialTargetSchema.enum.ceiling];
32
- export const MATERIAL_CATEGORIES = ['wood', 'flooring', 'roof', 'other'];
32
+ export const MATERIAL_CATEGORIES = [
33
+ 'colors',
34
+ 'wood',
35
+ 'stone',
36
+ 'brick',
37
+ 'tile',
38
+ 'wallpaper',
39
+ 'concrete',
40
+ 'metal',
41
+ 'plastic',
42
+ 'fabric',
43
+ 'carpet',
44
+ 'leather',
45
+ 'roofing',
46
+ 'ground',
47
+ 'glass',
48
+ 'other',
49
+ ];
50
+ export const MATERIAL_SURFACES = [
51
+ 'floor',
52
+ 'wall',
53
+ 'ceiling',
54
+ 'roof',
55
+ 'furniture',
56
+ 'outdoor',
57
+ ];
33
58
  export const MATERIAL_CATALOG = [
34
59
  {
35
60
  id: 'wood-finewood27',
36
61
  label: 'Finewood 27',
37
62
  category: 'wood',
63
+ surfaces: ['floor', 'wall', 'furniture'],
38
64
  description: 'Fine wood finish',
39
- previewThumbnailUrl: '/material/wood/finewood_27/finewood_27_basecolor.webp',
65
+ previewThumbnailUrl: '/material/wood/finewood_27/finewood_27_thumb.webp',
40
66
  preset: {
41
67
  maps: {
42
- albedoMap: '/material/wood/finewood_27/finewood_27_basecolor.webp',
43
- aoMap: '/material/wood/finewood_27/finewood_27_ambientocclusion.webp',
44
- normalMap: '/material/wood/finewood_27/finewood_27_normal.webp',
45
- roughnessMap: '/material/wood/finewood_27/finewood_27_roughness.webp',
68
+ albedoMap: '/material/wood/finewood_27/finewood_27_basecolor_512.ktx2',
69
+ aoMap: '/material/wood/finewood_27/finewood_27_ao_512.ktx2',
70
+ normalMap: '/material/wood/finewood_27/finewood_27_normal_512.ktx2',
71
+ roughnessMap: '/material/wood/finewood_27/finewood_27_roughness_512.ktx2',
46
72
  },
47
73
  mapProperties: {
48
74
  color: '#ffffff',
@@ -58,7 +84,7 @@ export const MATERIAL_CATALOG = [
58
84
  emissiveIntensity: 1,
59
85
  displacementScale: 0,
60
86
  transparent: false,
61
- flipY: true,
87
+ flipY: false,
62
88
  bumpScale: 1,
63
89
  emissiveColor: '#000000',
64
90
  aoMapIntensity: 1,
@@ -72,14 +98,14 @@ export const MATERIAL_CATALOG = [
72
98
  id: 'wood-floorplank1',
73
99
  label: 'Floor Plank 1',
74
100
  category: 'wood',
101
+ surfaces: ['floor'],
75
102
  description: 'Wood plank finish',
76
- previewThumbnailUrl: '/material/wood/floor_plank_1/floor_plank-diffuse.webp',
103
+ previewThumbnailUrl: '/material/wood/floor_plank_1/floor_plank_1_thumb.webp',
77
104
  preset: {
78
105
  maps: {
79
- albedoMap: '/material/wood/floor_plank_1/floor_plank-diffuse.webp',
80
- aoMap: '/material/wood/floor_plank_1/floor_plank-ao.webp',
81
- metalnessMap: '/material/wood/floor_plank_1/floor_plank-specular.webp',
82
- normalMap: '/material/wood/floor_plank_1/floor_plank-normal.webp',
106
+ albedoMap: '/material/wood/floor_plank_1/floor_plank_1_basecolor_512.ktx2',
107
+ aoMap: '/material/wood/floor_plank_1/floor_plank_1_ao_512.ktx2',
108
+ normalMap: '/material/wood/floor_plank_1/floor_plank_1_normal_512.ktx2',
83
109
  },
84
110
  mapProperties: {
85
111
  color: '#ffffff',
@@ -95,7 +121,7 @@ export const MATERIAL_CATALOG = [
95
121
  emissiveIntensity: 1,
96
122
  displacementScale: 0,
97
123
  transparent: false,
98
- flipY: true,
124
+ flipY: false,
99
125
  bumpScale: 1,
100
126
  emissiveColor: '#000000',
101
127
  aoMapIntensity: 1,
@@ -109,14 +135,14 @@ export const MATERIAL_CATALOG = [
109
135
  id: 'wood-hungarianparquet10',
110
136
  label: 'Hungarian Parquet 10',
111
137
  category: 'wood',
138
+ surfaces: ['floor'],
112
139
  description: 'Parquet wood finish',
113
- previewThumbnailUrl: '/material/wood/hungarian_parquet_10/Hungarian Parquet_10_baseColor.webp',
140
+ previewThumbnailUrl: '/material/wood/hungarian_parquet_10/hungarian_parquet_10_thumb.webp',
114
141
  preset: {
115
142
  maps: {
116
- albedoMap: '/material/wood/hungarian_parquet_10/Hungarian Parquet_10_baseColor.webp',
117
- metalnessMap: '/material/wood/hungarian_parquet_10/Hungarian Parquet_10_specularLevel.webp',
118
- normalMap: '/material/wood/hungarian_parquet_10/Hungarian Parquet_10_normal.webp',
119
- roughnessMap: '/material/wood/hungarian_parquet_10/Hungarian Parquet_10_roughness.webp',
143
+ albedoMap: '/material/wood/hungarian_parquet_10/hungarian_parquet_10_basecolor_512.ktx2',
144
+ normalMap: '/material/wood/hungarian_parquet_10/hungarian_parquet_10_normal_512.ktx2',
145
+ roughnessMap: '/material/wood/hungarian_parquet_10/hungarian_parquet_10_roughness_512.ktx2',
120
146
  },
121
147
  mapProperties: {
122
148
  color: '#ffffff',
@@ -132,7 +158,7 @@ export const MATERIAL_CATALOG = [
132
158
  emissiveIntensity: 1,
133
159
  displacementScale: 0,
134
160
  transparent: false,
135
- flipY: true,
161
+ flipY: false,
136
162
  bumpScale: 1,
137
163
  emissiveColor: '#000000',
138
164
  aoMapIntensity: 1,
@@ -146,14 +172,14 @@ export const MATERIAL_CATALOG = [
146
172
  id: 'wood-hungarianparquet2',
147
173
  label: 'Hungarian Parquet 2',
148
174
  category: 'wood',
175
+ surfaces: ['floor'],
149
176
  description: 'Parquet wood finish',
150
- previewThumbnailUrl: '/material/wood/hungarian_parquet_2/Hungarian Parquet_2_baseColor.webp',
177
+ previewThumbnailUrl: '/material/wood/hungarian_parquet_2/hungarian_parquet_2_thumb.webp',
151
178
  preset: {
152
179
  maps: {
153
- albedoMap: '/material/wood/hungarian_parquet_2/Hungarian Parquet_2_baseColor.webp',
154
- metalnessMap: '/material/wood/hungarian_parquet_2/Hungarian Parquet_2_specularLevel.webp',
155
- normalMap: '/material/wood/hungarian_parquet_2/Hungarian Parquet_2_normal.webp',
156
- roughnessMap: '/material/wood/hungarian_parquet_2/Hungarian Parquet_2_roughness.webp',
180
+ albedoMap: '/material/wood/hungarian_parquet_2/hungarian_parquet_2_basecolor_512.ktx2',
181
+ normalMap: '/material/wood/hungarian_parquet_2/hungarian_parquet_2_normal_512.ktx2',
182
+ roughnessMap: '/material/wood/hungarian_parquet_2/hungarian_parquet_2_roughness_512.ktx2',
157
183
  },
158
184
  mapProperties: {
159
185
  color: '#ffffff',
@@ -169,7 +195,7 @@ export const MATERIAL_CATALOG = [
169
195
  emissiveIntensity: 1,
170
196
  displacementScale: 0,
171
197
  transparent: false,
172
- flipY: true,
198
+ flipY: false,
173
199
  bumpScale: 1,
174
200
  emissiveColor: '#000000',
175
201
  aoMapIntensity: 1,
@@ -183,14 +209,14 @@ export const MATERIAL_CATALOG = [
183
209
  id: 'wood-squareparquet21',
184
210
  label: 'Square Parquet 21',
185
211
  category: 'wood',
212
+ surfaces: ['floor'],
186
213
  description: 'Parquet wood finish',
187
- previewThumbnailUrl: '/material/wood/square_parquet_21/Square Pattern Parquet_21_baseColor.webp',
214
+ previewThumbnailUrl: '/material/wood/square_parquet_21/square_parquet_21_thumb.webp',
188
215
  preset: {
189
216
  maps: {
190
- albedoMap: '/material/wood/square_parquet_21/Square Pattern Parquet_21_baseColor.webp',
191
- metalnessMap: '/material/wood/square_parquet_21/Square Pattern Parquet_21_specularLevel.webp',
192
- normalMap: '/material/wood/square_parquet_21/Square Pattern Parquet_21_normal.webp',
193
- roughnessMap: '/material/wood/square_parquet_21/Square Pattern Parquet_21_roughness.webp',
217
+ albedoMap: '/material/wood/square_parquet_21/square_parquet_21_basecolor_512.ktx2',
218
+ normalMap: '/material/wood/square_parquet_21/square_parquet_21_normal_512.ktx2',
219
+ roughnessMap: '/material/wood/square_parquet_21/square_parquet_21_roughness_512.ktx2',
194
220
  },
195
221
  mapProperties: {
196
222
  color: '#ffffff',
@@ -206,7 +232,7 @@ export const MATERIAL_CATALOG = [
206
232
  emissiveIntensity: 1,
207
233
  displacementScale: 0,
208
234
  transparent: false,
209
- flipY: true,
235
+ flipY: false,
210
236
  bumpScale: 1,
211
237
  emissiveColor: '#000000',
212
238
  aoMapIntensity: 1,
@@ -220,14 +246,14 @@ export const MATERIAL_CATALOG = [
220
246
  id: 'wood-squareparquet23',
221
247
  label: 'Square Parquet 23',
222
248
  category: 'wood',
249
+ surfaces: ['floor'],
223
250
  description: 'Parquet wood finish',
224
- previewThumbnailUrl: '/material/wood/square_wood_parquet_23/Square Pattern Parquet_23_baseColor.webp',
251
+ previewThumbnailUrl: '/material/wood/square_wood_parquet_23/square_wood_parquet_23_thumb.webp',
225
252
  preset: {
226
253
  maps: {
227
- albedoMap: '/material/wood/square_wood_parquet_23/Square Pattern Parquet_23_baseColor.webp',
228
- metalnessMap: '/material/wood/square_wood_parquet_23/Square Pattern Parquet_23_specularLevel.webp',
229
- normalMap: '/material/wood/square_wood_parquet_23/Square Pattern Parquet_23_normal.webp',
230
- roughnessMap: '/material/wood/square_wood_parquet_23/Square Pattern Parquet_23_roughness.webp',
254
+ albedoMap: '/material/wood/square_wood_parquet_23/square_wood_parquet_23_basecolor_512.ktx2',
255
+ normalMap: '/material/wood/square_wood_parquet_23/square_wood_parquet_23_normal_512.ktx2',
256
+ roughnessMap: '/material/wood/square_wood_parquet_23/square_wood_parquet_23_roughness_512.ktx2',
231
257
  },
232
258
  mapProperties: {
233
259
  color: '#ffffff',
@@ -243,7 +269,7 @@ export const MATERIAL_CATALOG = [
243
269
  emissiveIntensity: 1,
244
270
  displacementScale: 0,
245
271
  transparent: false,
246
- flipY: true,
272
+ flipY: false,
247
273
  bumpScale: 1,
248
274
  emissiveColor: '#000000',
249
275
  aoMapIntensity: 1,
@@ -257,14 +283,14 @@ export const MATERIAL_CATALOG = [
257
283
  id: 'wood-woodfine1',
258
284
  label: 'Wood Fine 1',
259
285
  category: 'wood',
286
+ surfaces: ['floor', 'wall', 'furniture'],
260
287
  description: 'Fine wood finish',
261
- previewThumbnailUrl: '/material/wood/wood_fine/wood_fine_1-diffuse.webp',
288
+ previewThumbnailUrl: '/material/wood/wood_fine/wood_fine_thumb.webp',
262
289
  preset: {
263
290
  maps: {
264
- albedoMap: '/material/wood/wood_fine/wood_fine_1-diffuse.webp',
265
- aoMap: '/material/wood/wood_fine/wood_fine_1-ao.webp',
266
- metalnessMap: '/material/wood/wood_fine/wood_fine_1-specular.webp',
267
- normalMap: '/material/wood/wood_fine/wood_fine_1-normal.webp',
291
+ albedoMap: '/material/wood/wood_fine/wood_fine_basecolor_512.ktx2',
292
+ aoMap: '/material/wood/wood_fine/wood_fine_ao_512.ktx2',
293
+ normalMap: '/material/wood/wood_fine/wood_fine_normal_512.ktx2',
268
294
  },
269
295
  mapProperties: {
270
296
  color: '#ffffff',
@@ -280,7 +306,7 @@ export const MATERIAL_CATALOG = [
280
306
  emissiveIntensity: 1,
281
307
  displacementScale: 0,
282
308
  transparent: false,
283
- flipY: true,
309
+ flipY: false,
284
310
  bumpScale: 1,
285
311
  emissiveColor: '#000000',
286
312
  aoMapIntensity: 1,
@@ -294,14 +320,14 @@ export const MATERIAL_CATALOG = [
294
320
  id: 'wood-woodfine11',
295
321
  label: 'Wood Fine 11',
296
322
  category: 'wood',
323
+ surfaces: ['floor', 'wall', 'furniture'],
297
324
  description: 'Fine wood finish',
298
- previewThumbnailUrl: '/material/wood/wood_fine_11/wood_fine_11-diffuse.webp',
325
+ previewThumbnailUrl: '/material/wood/wood_fine_11/wood_fine_11_thumb.webp',
299
326
  preset: {
300
327
  maps: {
301
- albedoMap: '/material/wood/wood_fine_11/wood_fine_11-diffuse.webp',
302
- aoMap: '/material/wood/wood_fine_11/wood_fine_11-ao.webp',
303
- metalnessMap: '/material/wood/wood_fine_11/wood_fine_11-specular.webp',
304
- normalMap: '/material/wood/wood_fine_11/wood_fine_11-normal.webp',
328
+ albedoMap: '/material/wood/wood_fine_11/wood_fine_11_basecolor_512.ktx2',
329
+ aoMap: '/material/wood/wood_fine_11/wood_fine_11_ao_512.ktx2',
330
+ normalMap: '/material/wood/wood_fine_11/wood_fine_11_normal_512.ktx2',
305
331
  },
306
332
  mapProperties: {
307
333
  color: '#ffffff',
@@ -317,7 +343,7 @@ export const MATERIAL_CATALOG = [
317
343
  emissiveIntensity: 1,
318
344
  displacementScale: 0,
319
345
  transparent: false,
320
- flipY: true,
346
+ flipY: false,
321
347
  bumpScale: 1,
322
348
  emissiveColor: '#000000',
323
349
  aoMapIntensity: 1,
@@ -331,14 +357,14 @@ export const MATERIAL_CATALOG = [
331
357
  id: 'wood-woodfine13',
332
358
  label: 'Wood Fine 13',
333
359
  category: 'wood',
360
+ surfaces: ['floor', 'wall', 'furniture'],
334
361
  description: 'Fine wood finish',
335
- previewThumbnailUrl: '/material/wood/wood_fine_13/wood_fine_13-diffuse.webp',
362
+ previewThumbnailUrl: '/material/wood/wood_fine_13/wood_fine_13_thumb.webp',
336
363
  preset: {
337
364
  maps: {
338
- albedoMap: '/material/wood/wood_fine_13/wood_fine_13-diffuse.webp',
339
- aoMap: '/material/wood/wood_fine_13/wood_fine_13-ao.webp',
340
- metalnessMap: '/material/wood/wood_fine_13/wood_fine_13-specular.webp',
341
- normalMap: '/material/wood/wood_fine_13/wood_fine_13-normal.webp',
365
+ albedoMap: '/material/wood/wood_fine_13/wood_fine_13_basecolor_512.ktx2',
366
+ aoMap: '/material/wood/wood_fine_13/wood_fine_13_ao_512.ktx2',
367
+ normalMap: '/material/wood/wood_fine_13/wood_fine_13_normal_512.ktx2',
342
368
  },
343
369
  mapProperties: {
344
370
  color: '#ffffff',
@@ -354,7 +380,7 @@ export const MATERIAL_CATALOG = [
354
380
  emissiveIntensity: 1,
355
381
  displacementScale: 0,
356
382
  transparent: false,
357
- flipY: true,
383
+ flipY: false,
358
384
  bumpScale: 1,
359
385
  emissiveColor: '#000000',
360
386
  aoMapIntensity: 1,
@@ -368,14 +394,14 @@ export const MATERIAL_CATALOG = [
368
394
  id: 'wood-woodfine2',
369
395
  label: 'Wood Fine 2',
370
396
  category: 'wood',
397
+ surfaces: ['floor', 'wall', 'furniture'],
371
398
  description: 'Fine wood finish',
372
- previewThumbnailUrl: '/material/wood/wood_fine_2/wood_fine_2-diffuse.webp',
399
+ previewThumbnailUrl: '/material/wood/wood_fine_2/wood_fine_2_thumb.webp',
373
400
  preset: {
374
401
  maps: {
375
- albedoMap: '/material/wood/wood_fine_2/wood_fine_2-diffuse.webp',
376
- aoMap: '/material/wood/wood_fine_2/wood_fine_2-ao.webp',
377
- metalnessMap: '/material/wood/wood_fine_2/wood_fine_2-specular.webp',
378
- normalMap: '/material/wood/wood_fine_2/wood_fine_2-normal.webp',
402
+ albedoMap: '/material/wood/wood_fine_2/wood_fine_2_basecolor_512.ktx2',
403
+ aoMap: '/material/wood/wood_fine_2/wood_fine_2_ao_512.ktx2',
404
+ normalMap: '/material/wood/wood_fine_2/wood_fine_2_normal_512.ktx2',
379
405
  },
380
406
  mapProperties: {
381
407
  color: '#ffffff',
@@ -391,7 +417,7 @@ export const MATERIAL_CATALOG = [
391
417
  emissiveIntensity: 1,
392
418
  displacementScale: 0,
393
419
  transparent: false,
394
- flipY: true,
420
+ flipY: false,
395
421
  bumpScale: 1,
396
422
  emissiveColor: '#000000',
397
423
  aoMapIntensity: 1,
@@ -405,14 +431,14 @@ export const MATERIAL_CATALOG = [
405
431
  id: 'wood-woodfine22',
406
432
  label: 'Wood Fine 22',
407
433
  category: 'wood',
434
+ surfaces: ['floor', 'wall', 'furniture'],
408
435
  description: 'Fine wood finish',
409
- previewThumbnailUrl: '/material/wood/wood_fine_22/wood_fine_22-diffuse.webp',
436
+ previewThumbnailUrl: '/material/wood/wood_fine_22/wood_fine_22_thumb.webp',
410
437
  preset: {
411
438
  maps: {
412
- albedoMap: '/material/wood/wood_fine_22/wood_fine_22-diffuse.webp',
413
- aoMap: '/material/wood/wood_fine_22/wood_fine_22-ao.webp',
414
- metalnessMap: '/material/wood/wood_fine_22/wood_fine_22-specular.webp',
415
- normalMap: '/material/wood/wood_fine_22/wood_fine_22-normal.webp',
439
+ albedoMap: '/material/wood/wood_fine_22/wood_fine_22_basecolor_512.ktx2',
440
+ aoMap: '/material/wood/wood_fine_22/wood_fine_22_ao_512.ktx2',
441
+ normalMap: '/material/wood/wood_fine_22/wood_fine_22_normal_512.ktx2',
416
442
  },
417
443
  mapProperties: {
418
444
  color: '#ffffff',
@@ -428,7 +454,7 @@ export const MATERIAL_CATALOG = [
428
454
  emissiveIntensity: 1,
429
455
  displacementScale: 0,
430
456
  transparent: false,
431
- flipY: true,
457
+ flipY: false,
432
458
  bumpScale: 1,
433
459
  emissiveColor: '#000000',
434
460
  aoMapIntensity: 1,
@@ -442,14 +468,14 @@ export const MATERIAL_CATALOG = [
442
468
  id: 'wood-woodfine24',
443
469
  label: 'Wood Fine 24',
444
470
  category: 'wood',
471
+ surfaces: ['floor', 'wall', 'furniture'],
445
472
  description: 'Fine wood finish',
446
- previewThumbnailUrl: '/material/wood/wood_fine_24/wood_fine_24-diffuse.webp',
473
+ previewThumbnailUrl: '/material/wood/wood_fine_24/wood_fine_24_thumb.webp',
447
474
  preset: {
448
475
  maps: {
449
- albedoMap: '/material/wood/wood_fine_24/wood_fine_24-diffuse.webp',
450
- aoMap: '/material/wood/wood_fine_24/wood_fine_24-ao.webp',
451
- metalnessMap: '/material/wood/wood_fine_24/wood_fine_24-specular.webp',
452
- normalMap: '/material/wood/wood_fine_24/wood_fine_24-normal.webp',
476
+ albedoMap: '/material/wood/wood_fine_24/wood_fine_24_basecolor_512.ktx2',
477
+ aoMap: '/material/wood/wood_fine_24/wood_fine_24_ao_512.ktx2',
478
+ normalMap: '/material/wood/wood_fine_24/wood_fine_24_normal_512.ktx2',
453
479
  },
454
480
  mapProperties: {
455
481
  color: '#ffffff',
@@ -465,7 +491,7 @@ export const MATERIAL_CATALOG = [
465
491
  emissiveIntensity: 1,
466
492
  displacementScale: 0,
467
493
  transparent: false,
468
- flipY: true,
494
+ flipY: false,
469
495
  bumpScale: 1,
470
496
  emissiveColor: '#000000',
471
497
  aoMapIntensity: 1,
@@ -479,15 +505,16 @@ export const MATERIAL_CATALOG = [
479
505
  id: 'wood-woodparquet14',
480
506
  label: 'Wood Parquet 14',
481
507
  category: 'wood',
508
+ surfaces: ['floor'],
482
509
  description: 'Parquet wood finish',
483
- previewThumbnailUrl: '/material/wood/wood_parquet_14/woodparquet_14_basecolor.webp',
510
+ previewThumbnailUrl: '/material/wood/wood_parquet_14/wood_parquet_14_thumb.webp',
484
511
  preset: {
485
512
  maps: {
486
- albedoMap: '/material/wood/wood_parquet_14/woodparquet_14_basecolor.webp',
487
- aoMap: '/material/wood/wood_parquet_14/woodparquet_14_ambientocclusion.webp',
488
- metalnessMap: '/material/wood/wood_parquet_14/woodparquet_14_metallic.webp',
489
- normalMap: '/material/wood/wood_parquet_14/woodparquet_14_normal.webp',
490
- roughnessMap: '/material/wood/wood_parquet_14/woodparquet_14_roughness.webp',
513
+ albedoMap: '/material/wood/wood_parquet_14/wood_parquet_14_basecolor_512.ktx2',
514
+ aoMap: '/material/wood/wood_parquet_14/wood_parquet_14_ao_512.ktx2',
515
+ metalnessMap: '/material/wood/wood_parquet_14/wood_parquet_14_metallic_512.ktx2',
516
+ normalMap: '/material/wood/wood_parquet_14/wood_parquet_14_normal_512.ktx2',
517
+ roughnessMap: '/material/wood/wood_parquet_14/wood_parquet_14_roughness_512.ktx2',
491
518
  },
492
519
  mapProperties: {
493
520
  color: '#ffffff',
@@ -503,7 +530,7 @@ export const MATERIAL_CATALOG = [
503
530
  emissiveIntensity: 1,
504
531
  displacementScale: 0,
505
532
  transparent: false,
506
- flipY: true,
533
+ flipY: false,
507
534
  bumpScale: 1,
508
535
  emissiveColor: '#000000',
509
536
  aoMapIntensity: 1,
@@ -517,14 +544,14 @@ export const MATERIAL_CATALOG = [
517
544
  id: 'wood-woodenparquet11',
518
545
  label: 'Wooden Parquet 11',
519
546
  category: 'wood',
547
+ surfaces: ['floor'],
520
548
  description: 'Parquet wood finish',
521
- previewThumbnailUrl: '/material/wood/wooden_parquet_11/Classic Parquet_11_baseColor.webp',
549
+ previewThumbnailUrl: '/material/wood/wooden_parquet_11/wooden_parquet_11_thumb.webp',
522
550
  preset: {
523
551
  maps: {
524
- albedoMap: '/material/wood/wooden_parquet_11/Classic Parquet_11_baseColor.webp',
525
- metalnessMap: '/material/wood/wooden_parquet_11/Classic Parquet_11_specularLevel.webp',
526
- normalMap: '/material/wood/wooden_parquet_11/Classic Parquet_11_normal.webp',
527
- roughnessMap: '/material/wood/wooden_parquet_11/Classic Parquet_11_roughness.webp',
552
+ albedoMap: '/material/wood/wooden_parquet_11/wooden_parquet_11_basecolor_512.ktx2',
553
+ normalMap: '/material/wood/wooden_parquet_11/wooden_parquet_11_normal_512.ktx2',
554
+ roughnessMap: '/material/wood/wooden_parquet_11/wooden_parquet_11_roughness_512.ktx2',
528
555
  },
529
556
  mapProperties: {
530
557
  color: '#ffffff',
@@ -540,7 +567,7 @@ export const MATERIAL_CATALOG = [
540
567
  emissiveIntensity: 1,
541
568
  displacementScale: 0,
542
569
  transparent: false,
543
- flipY: true,
570
+ flipY: false,
544
571
  bumpScale: 1,
545
572
  emissiveColor: '#000000',
546
573
  aoMapIntensity: 1,
@@ -554,14 +581,15 @@ export const MATERIAL_CATALOG = [
554
581
  id: 'wood-woodparquet121',
555
582
  label: 'Wood Parquet 121',
556
583
  category: 'wood',
584
+ surfaces: ['floor'],
557
585
  description: 'Parquet wood finish',
558
- previewThumbnailUrl: '/material/wood/woodparquet_121/woodparquet_121_basecolor.webp',
586
+ previewThumbnailUrl: '/material/wood/woodparquet_121/woodparquet_121_thumb.webp',
559
587
  preset: {
560
588
  maps: {
561
- albedoMap: '/material/wood/woodparquet_121/woodparquet_121_basecolor.webp',
562
- aoMap: '/material/wood/woodparquet_121/woodparquet_121_ambientocclusion.webp',
563
- normalMap: '/material/wood/woodparquet_121/woodparquet_121_normal.webp',
564
- roughnessMap: '/material/wood/woodparquet_121/woodparquet_121_roughness.webp',
589
+ albedoMap: '/material/wood/woodparquet_121/woodparquet_121_basecolor_512.ktx2',
590
+ aoMap: '/material/wood/woodparquet_121/woodparquet_121_ao_512.ktx2',
591
+ normalMap: '/material/wood/woodparquet_121/woodparquet_121_normal_512.ktx2',
592
+ roughnessMap: '/material/wood/woodparquet_121/woodparquet_121_roughness_512.ktx2',
565
593
  },
566
594
  mapProperties: {
567
595
  color: '#ffffff',
@@ -577,7 +605,7 @@ export const MATERIAL_CATALOG = [
577
605
  emissiveIntensity: 1,
578
606
  displacementScale: 0,
579
607
  transparent: false,
580
- flipY: true,
608
+ flipY: false,
581
609
  bumpScale: 1,
582
610
  emissiveColor: '#000000',
583
611
  aoMapIntensity: 1,
@@ -591,15 +619,16 @@ export const MATERIAL_CATALOG = [
591
619
  id: 'wood-woodparquet56',
592
620
  label: 'Wood Parquet 56',
593
621
  category: 'wood',
622
+ surfaces: ['floor'],
594
623
  description: 'Parquet wood finish',
595
- previewThumbnailUrl: '/material/wood/woodparquet_56/woodparquet_56_basecolor.webp',
624
+ previewThumbnailUrl: '/material/wood/woodparquet_56/woodparquet_56_thumb.webp',
596
625
  preset: {
597
626
  maps: {
598
- albedoMap: '/material/wood/woodparquet_56/woodparquet_56_basecolor.webp',
599
- aoMap: '/material/wood/woodparquet_56/woodparquet_56_ambientocclusion.webp',
600
- metalnessMap: '/material/wood/woodparquet_56/woodparquet_56_metallic.webp',
601
- normalMap: '/material/wood/woodparquet_56/woodparquet_56_normal.webp',
602
- roughnessMap: '/material/wood/woodparquet_56/woodparquet_56_roughness.webp',
627
+ albedoMap: '/material/wood/woodparquet_56/woodparquet_56_basecolor_512.ktx2',
628
+ aoMap: '/material/wood/woodparquet_56/woodparquet_56_ao_512.ktx2',
629
+ metalnessMap: '/material/wood/woodparquet_56/woodparquet_56_metallic_512.ktx2',
630
+ normalMap: '/material/wood/woodparquet_56/woodparquet_56_normal_512.ktx2',
631
+ roughnessMap: '/material/wood/woodparquet_56/woodparquet_56_roughness_512.ktx2',
603
632
  },
604
633
  mapProperties: {
605
634
  color: '#ffffff',
@@ -615,7 +644,7 @@ export const MATERIAL_CATALOG = [
615
644
  emissiveIntensity: 1,
616
645
  displacementScale: 0,
617
646
  transparent: false,
618
- flipY: true,
647
+ flipY: false,
619
648
  bumpScale: 1,
620
649
  emissiveColor: '#000000',
621
650
  aoMapIntensity: 1,
@@ -629,15 +658,16 @@ export const MATERIAL_CATALOG = [
629
658
  id: 'wood-woodparquet65',
630
659
  label: 'Wood Parquet 65',
631
660
  category: 'wood',
661
+ surfaces: ['floor'],
632
662
  description: 'Parquet wood finish',
633
- previewThumbnailUrl: '/material/wood/woodparquet_65/woodparquet_65_BaseColor.webp',
663
+ previewThumbnailUrl: '/material/wood/woodparquet_65/woodparquet_65_thumb.webp',
634
664
  preset: {
635
665
  maps: {
636
- albedoMap: '/material/wood/woodparquet_65/woodparquet_65_BaseColor.webp',
637
- aoMap: '/material/wood/woodparquet_65/woodparquet_65_AmbientOcclusion.webp',
638
- metalnessMap: '/material/wood/woodparquet_65/woodparquet_65_Metallic.webp',
639
- normalMap: '/material/wood/woodparquet_65/woodparquet_65_Normal.webp',
640
- roughnessMap: '/material/wood/woodparquet_65/woodparquet_65_Roughness.webp',
666
+ albedoMap: '/material/wood/woodparquet_65/woodparquet_65_basecolor_512.ktx2',
667
+ aoMap: '/material/wood/woodparquet_65/woodparquet_65_ao_512.ktx2',
668
+ metalnessMap: '/material/wood/woodparquet_65/woodparquet_65_metallic_512.ktx2',
669
+ normalMap: '/material/wood/woodparquet_65/woodparquet_65_normal_512.ktx2',
670
+ roughnessMap: '/material/wood/woodparquet_65/woodparquet_65_roughness_512.ktx2',
641
671
  },
642
672
  mapProperties: {
643
673
  color: '#ffffff',
@@ -653,7 +683,7 @@ export const MATERIAL_CATALOG = [
653
683
  emissiveIntensity: 1,
654
684
  displacementScale: 0,
655
685
  transparent: false,
656
- flipY: true,
686
+ flipY: false,
657
687
  bumpScale: 1,
658
688
  emissiveColor: '#000000',
659
689
  aoMapIntensity: 1,
@@ -667,15 +697,16 @@ export const MATERIAL_CATALOG = [
667
697
  id: 'wood-woodparquet99',
668
698
  label: 'Wood Parquet 99',
669
699
  category: 'wood',
700
+ surfaces: ['floor'],
670
701
  description: 'Parquet wood finish',
671
- previewThumbnailUrl: '/material/wood/woodparquet_99/woodparquet_99_basecolor.webp',
702
+ previewThumbnailUrl: '/material/wood/woodparquet_99/woodparquet_99_thumb.webp',
672
703
  preset: {
673
704
  maps: {
674
- albedoMap: '/material/wood/woodparquet_99/woodparquet_99_basecolor.webp',
675
- aoMap: '/material/wood/woodparquet_99/woodparquet_99_ambientocclusion.webp',
676
- metalnessMap: '/material/wood/woodparquet_99/woodparquet_99_metallic.webp',
677
- normalMap: '/material/wood/woodparquet_99/woodparquet_99_normal.webp',
678
- roughnessMap: '/material/wood/woodparquet_99/woodparquet_99_roughness.webp',
705
+ albedoMap: '/material/wood/woodparquet_99/woodparquet_99_basecolor_512.ktx2',
706
+ aoMap: '/material/wood/woodparquet_99/woodparquet_99_ao_512.ktx2',
707
+ metalnessMap: '/material/wood/woodparquet_99/woodparquet_99_metallic_512.ktx2',
708
+ normalMap: '/material/wood/woodparquet_99/woodparquet_99_normal_512.ktx2',
709
+ roughnessMap: '/material/wood/woodparquet_99/woodparquet_99_roughness_512.ktx2',
679
710
  },
680
711
  mapProperties: {
681
712
  color: '#ffffff',
@@ -691,7 +722,7 @@ export const MATERIAL_CATALOG = [
691
722
  emissiveIntensity: 1,
692
723
  displacementScale: 0,
693
724
  transparent: false,
694
- flipY: true,
725
+ flipY: false,
695
726
  bumpScale: 1,
696
727
  emissiveColor: '#000000',
697
728
  aoMapIntensity: 1,
@@ -705,14 +736,15 @@ export const MATERIAL_CATALOG = [
705
736
  id: 'wood-woodplank19',
706
737
  label: 'Wood Plank 19',
707
738
  category: 'wood',
739
+ surfaces: ['floor', 'wall'],
708
740
  description: 'Wood plank finish',
709
- previewThumbnailUrl: '/material/wood/woodplank_19/woodplank_19_basecolor.webp',
741
+ previewThumbnailUrl: '/material/wood/woodplank_19/woodplank_19_thumb.webp',
710
742
  preset: {
711
743
  maps: {
712
- albedoMap: '/material/wood/woodplank_19/woodplank_19_basecolor.webp',
713
- aoMap: '/material/wood/woodplank_19/woodplank_19_ambientocclusion.webp',
714
- normalMap: '/material/wood/woodplank_19/woodplank_19_normal.webp',
715
- roughnessMap: '/material/wood/woodplank_19/woodplank_19_roughness.webp',
744
+ albedoMap: '/material/wood/woodplank_19/woodplank_19_basecolor_512.ktx2',
745
+ aoMap: '/material/wood/woodplank_19/woodplank_19_ao_512.ktx2',
746
+ normalMap: '/material/wood/woodplank_19/woodplank_19_normal_512.ktx2',
747
+ roughnessMap: '/material/wood/woodplank_19/woodplank_19_roughness_512.ktx2',
716
748
  },
717
749
  mapProperties: {
718
750
  color: '#ffffff',
@@ -728,7 +760,7 @@ export const MATERIAL_CATALOG = [
728
760
  emissiveIntensity: 1,
729
761
  displacementScale: 0,
730
762
  transparent: false,
731
- flipY: true,
763
+ flipY: false,
732
764
  bumpScale: 1,
733
765
  emissiveColor: '#000000',
734
766
  aoMapIntensity: 1,
@@ -742,14 +774,15 @@ export const MATERIAL_CATALOG = [
742
774
  id: 'wood-woodplank48',
743
775
  label: 'Wood Plank 48',
744
776
  category: 'wood',
777
+ surfaces: ['floor', 'wall'],
745
778
  description: 'Wood plank finish',
746
- previewThumbnailUrl: '/material/wood/woodplank_48/woodplank_48_BaseColor.webp',
779
+ previewThumbnailUrl: '/material/wood/woodplank_48/woodplank_48_thumb.webp',
747
780
  preset: {
748
781
  maps: {
749
- albedoMap: '/material/wood/woodplank_48/woodplank_48_BaseColor.webp',
750
- aoMap: '/material/wood/woodplank_48/woodplank_48_AmbientOcclusion.webp',
751
- normalMap: '/material/wood/woodplank_48/woodplank_48_Normal.webp',
752
- roughnessMap: '/material/wood/woodplank_48/woodplank_48_Roughness.webp',
782
+ albedoMap: '/material/wood/woodplank_48/woodplank_48_basecolor_512.ktx2',
783
+ aoMap: '/material/wood/woodplank_48/woodplank_48_ao_512.ktx2',
784
+ normalMap: '/material/wood/woodplank_48/woodplank_48_normal_512.ktx2',
785
+ roughnessMap: '/material/wood/woodplank_48/woodplank_48_roughness_512.ktx2',
753
786
  },
754
787
  mapProperties: {
755
788
  color: '#ffffff',
@@ -765,7 +798,7 @@ export const MATERIAL_CATALOG = [
765
798
  emissiveIntensity: 1,
766
799
  displacementScale: 0,
767
800
  transparent: false,
768
- flipY: true,
801
+ flipY: false,
769
802
  bumpScale: 1,
770
803
  emissiveColor: '#000000',
771
804
  aoMapIntensity: 1,
@@ -778,15 +811,16 @@ export const MATERIAL_CATALOG = [
778
811
  {
779
812
  id: 'flooring-tile85a',
780
813
  label: 'Quarry Tile',
781
- category: 'flooring',
814
+ category: 'tile',
815
+ surfaces: ['floor'],
782
816
  description: 'Floor tile finish',
783
- previewThumbnailUrl: '/material/flooring/tile_quarry/tile_quarry_basecolor.webp',
817
+ previewThumbnailUrl: '/material/flooring/tile_quarry/tile_quarry_thumb.webp',
784
818
  preset: {
785
819
  maps: {
786
- albedoMap: '/material/flooring/tile_quarry/tile_quarry_basecolor.webp',
787
- aoMap: '/material/flooring/tile_quarry/tile_quarry_ambientocclusion.webp',
788
- normalMap: '/material/flooring/tile_quarry/tile_quarry_normal.webp',
789
- roughnessMap: '/material/flooring/tile_quarry/tile_quarry_roughness.webp',
820
+ albedoMap: '/material/flooring/tile_quarry/tile_quarry_basecolor_512.ktx2',
821
+ aoMap: '/material/flooring/tile_quarry/tile_quarry_ao_512.ktx2',
822
+ normalMap: '/material/flooring/tile_quarry/tile_quarry_normal_512.ktx2',
823
+ roughnessMap: '/material/flooring/tile_quarry/tile_quarry_roughness_512.ktx2',
790
824
  },
791
825
  mapProperties: {
792
826
  color: '#ffffff',
@@ -802,7 +836,7 @@ export const MATERIAL_CATALOG = [
802
836
  emissiveIntensity: 1,
803
837
  displacementScale: 0,
804
838
  transparent: false,
805
- flipY: true,
839
+ flipY: false,
806
840
  bumpScale: 1,
807
841
  emissiveColor: '#000000',
808
842
  aoMapIntensity: 1,
@@ -815,16 +849,17 @@ export const MATERIAL_CATALOG = [
815
849
  {
816
850
  id: 'flooring-rusticbrick',
817
851
  label: 'Rustic Brick',
818
- category: 'flooring',
852
+ category: 'brick',
853
+ surfaces: ['wall', 'floor', 'outdoor'],
819
854
  description: 'Brick finish',
820
- previewThumbnailUrl: '/material/flooring/brick_wall_rustic/brick_wall_rustic_basecolor.jpg',
855
+ previewThumbnailUrl: '/material/flooring/brick_wall_rustic/brick_wall_rustic_thumb.webp',
821
856
  preset: {
822
857
  maps: {
823
- albedoMap: '/material/flooring/brick_wall_rustic/brick_wall_rustic_basecolor.jpg',
824
- aoMap: '/material/flooring/brick_wall_rustic/brick_wall_rustic_ambientocclusion.jpg',
825
- metalnessMap: '/material/flooring/brick_wall_rustic/brick_wall_rustic_metallic.jpg',
826
- normalMap: '/material/flooring/brick_wall_rustic/brick_wall_rustic_normal.jpg',
827
- roughnessMap: '/material/flooring/brick_wall_rustic/brick_wall_rustic_roughness.jpg',
858
+ albedoMap: '/material/flooring/brick_wall_rustic/brick_wall_rustic_basecolor_512.ktx2',
859
+ aoMap: '/material/flooring/brick_wall_rustic/brick_wall_rustic_ao_512.ktx2',
860
+ metalnessMap: '/material/flooring/brick_wall_rustic/brick_wall_rustic_metallic_512.ktx2',
861
+ normalMap: '/material/flooring/brick_wall_rustic/brick_wall_rustic_normal_512.ktx2',
862
+ roughnessMap: '/material/flooring/brick_wall_rustic/brick_wall_rustic_roughness_512.ktx2',
828
863
  },
829
864
  mapProperties: {
830
865
  color: '#ffffff',
@@ -840,7 +875,7 @@ export const MATERIAL_CATALOG = [
840
875
  emissiveIntensity: 1,
841
876
  displacementScale: 0,
842
877
  transparent: false,
843
- flipY: true,
878
+ flipY: false,
844
879
  bumpScale: 1,
845
880
  emissiveColor: '#000000',
846
881
  aoMapIntensity: 1,
@@ -853,16 +888,17 @@ export const MATERIAL_CATALOG = [
853
888
  {
854
889
  id: 'flooring-agedbrick',
855
890
  label: 'Aged Brick',
856
- category: 'flooring',
891
+ category: 'brick',
892
+ surfaces: ['wall', 'floor', 'outdoor'],
857
893
  description: 'Brick finish',
858
- previewThumbnailUrl: '/material/flooring/brick_wall_aged/brick_wall_aged_basecolor.jpg',
894
+ previewThumbnailUrl: '/material/flooring/brick_wall_aged/brick_wall_aged_thumb.webp',
859
895
  preset: {
860
896
  maps: {
861
- albedoMap: '/material/flooring/brick_wall_aged/brick_wall_aged_basecolor.jpg',
862
- aoMap: '/material/flooring/brick_wall_aged/brick_wall_aged_ambientocclusion.jpg',
863
- metalnessMap: '/material/flooring/brick_wall_aged/brick_wall_aged_metallic.jpg',
864
- normalMap: '/material/flooring/brick_wall_aged/brick_wall_aged_normal.jpg',
865
- roughnessMap: '/material/flooring/brick_wall_aged/brick_wall_aged_roughness.jpg',
897
+ albedoMap: '/material/flooring/brick_wall_aged/brick_wall_aged_basecolor_512.ktx2',
898
+ aoMap: '/material/flooring/brick_wall_aged/brick_wall_aged_ao_512.ktx2',
899
+ metalnessMap: '/material/flooring/brick_wall_aged/brick_wall_aged_metallic_512.ktx2',
900
+ normalMap: '/material/flooring/brick_wall_aged/brick_wall_aged_normal_512.ktx2',
901
+ roughnessMap: '/material/flooring/brick_wall_aged/brick_wall_aged_roughness_512.ktx2',
866
902
  },
867
903
  mapProperties: {
868
904
  color: '#ffffff',
@@ -878,7 +914,7 @@ export const MATERIAL_CATALOG = [
878
914
  emissiveIntensity: 1,
879
915
  displacementScale: 0,
880
916
  transparent: false,
881
- flipY: true,
917
+ flipY: false,
882
918
  bumpScale: 1,
883
919
  emissiveColor: '#000000',
884
920
  aoMapIntensity: 1,
@@ -891,15 +927,16 @@ export const MATERIAL_CATALOG = [
891
927
  {
892
928
  id: 'flooring-weatheredbrick',
893
929
  label: 'Weathered Brick',
894
- category: 'flooring',
930
+ category: 'brick',
931
+ surfaces: ['wall', 'floor', 'outdoor'],
895
932
  description: 'Brick finish',
896
- previewThumbnailUrl: '/material/flooring/brick_wall_weathered/brick_wall_weathered_basecolor.jpg',
933
+ previewThumbnailUrl: '/material/flooring/brick_wall_weathered/brick_wall_weathered_thumb.webp',
897
934
  preset: {
898
935
  maps: {
899
- albedoMap: '/material/flooring/brick_wall_weathered/brick_wall_weathered_basecolor.jpg',
900
- aoMap: '/material/flooring/brick_wall_weathered/brick_wall_weathered_ambientocclusion.jpg',
901
- normalMap: '/material/flooring/brick_wall_weathered/brick_wall_weathered_normal.jpg',
902
- roughnessMap: '/material/flooring/brick_wall_weathered/brick_wall_weathered_roughness.jpg',
936
+ albedoMap: '/material/flooring/brick_wall_weathered/brick_wall_weathered_basecolor_512.ktx2',
937
+ aoMap: '/material/flooring/brick_wall_weathered/brick_wall_weathered_ao_512.ktx2',
938
+ normalMap: '/material/flooring/brick_wall_weathered/brick_wall_weathered_normal_512.ktx2',
939
+ roughnessMap: '/material/flooring/brick_wall_weathered/brick_wall_weathered_roughness_512.ktx2',
903
940
  },
904
941
  mapProperties: {
905
942
  color: '#ffffff',
@@ -915,7 +952,7 @@ export const MATERIAL_CATALOG = [
915
952
  emissiveIntensity: 1,
916
953
  displacementScale: 0,
917
954
  transparent: false,
918
- flipY: true,
955
+ flipY: false,
919
956
  bumpScale: 1,
920
957
  emissiveColor: '#000000',
921
958
  aoMapIntensity: 1,
@@ -928,15 +965,15 @@ export const MATERIAL_CATALOG = [
928
965
  {
929
966
  id: 'flooring-garagedoor',
930
967
  label: 'Garage Panel',
931
- category: 'flooring',
968
+ category: 'metal',
969
+ surfaces: ['wall', 'furniture'],
932
970
  description: 'Panel finish',
933
- previewThumbnailUrl: '/material/flooring/garage_panel/garage_panel_diffuse.jpg',
971
+ previewThumbnailUrl: '/material/flooring/garage_panel/garage_panel_thumb.webp',
934
972
  preset: {
935
973
  maps: {
936
- albedoMap: '/material/flooring/garage_panel/garage_panel_diffuse.jpg',
937
- aoMap: '/material/flooring/garage_panel/garage_panel_ao.jpg',
938
- metalnessMap: '/material/flooring/garage_panel/garage_panel_specular.jpg',
939
- normalMap: '/material/flooring/garage_panel/garage_panel_normal.jpg',
974
+ albedoMap: '/material/flooring/garage_panel/garage_panel_basecolor_512.ktx2',
975
+ aoMap: '/material/flooring/garage_panel/garage_panel_ao_512.ktx2',
976
+ normalMap: '/material/flooring/garage_panel/garage_panel_normal_512.ktx2',
940
977
  },
941
978
  mapProperties: {
942
979
  color: '#ffffff',
@@ -952,7 +989,7 @@ export const MATERIAL_CATALOG = [
952
989
  emissiveIntensity: 1,
953
990
  displacementScale: 0,
954
991
  transparent: false,
955
- flipY: true,
992
+ flipY: false,
956
993
  bumpScale: 1,
957
994
  emissiveColor: '#000000',
958
995
  aoMapIntensity: 1,
@@ -965,15 +1002,15 @@ export const MATERIAL_CATALOG = [
965
1002
  {
966
1003
  id: 'flooring-greenlabradorite',
967
1004
  label: 'Green Labradorite',
968
- category: 'flooring',
1005
+ category: 'stone',
1006
+ surfaces: ['floor', 'wall'],
969
1007
  description: 'Stone flooring finish',
970
- previewThumbnailUrl: '/material/flooring/green_labradorite/green_labradorite_diffuse.jpg',
1008
+ previewThumbnailUrl: '/material/flooring/green_labradorite/green_labradorite_thumb.webp',
971
1009
  preset: {
972
1010
  maps: {
973
- albedoMap: '/material/flooring/green_labradorite/green_labradorite_diffuse.jpg',
974
- aoMap: '/material/flooring/green_labradorite/green_labradorite_ao.jpg',
975
- metalnessMap: '/material/flooring/green_labradorite/green_labradorite_specular.jpg',
976
- normalMap: '/material/flooring/green_labradorite/green_labradorite_normal.jpg',
1011
+ albedoMap: '/material/flooring/green_labradorite/green_labradorite_basecolor_512.ktx2',
1012
+ aoMap: '/material/flooring/green_labradorite/green_labradorite_ao_512.ktx2',
1013
+ normalMap: '/material/flooring/green_labradorite/green_labradorite_normal_512.ktx2',
977
1014
  },
978
1015
  mapProperties: {
979
1016
  color: '#ffffff',
@@ -989,7 +1026,7 @@ export const MATERIAL_CATALOG = [
989
1026
  emissiveIntensity: 1,
990
1027
  displacementScale: 0,
991
1028
  transparent: false,
992
- flipY: true,
1029
+ flipY: false,
993
1030
  bumpScale: 1,
994
1031
  emissiveColor: '#000000',
995
1032
  aoMapIntensity: 1,
@@ -1002,16 +1039,17 @@ export const MATERIAL_CATALOG = [
1002
1039
  {
1003
1040
  id: 'flooring-ground13',
1004
1041
  label: 'Earth Ground',
1005
- category: 'flooring',
1042
+ category: 'ground',
1043
+ surfaces: ['outdoor', 'floor'],
1006
1044
  description: 'Ground surface finish',
1007
- previewThumbnailUrl: '/material/flooring/ground_earth/ground_earth_basecolor.jpg',
1045
+ previewThumbnailUrl: '/material/flooring/ground_earth/ground_earth_thumb.webp',
1008
1046
  preset: {
1009
1047
  maps: {
1010
- albedoMap: '/material/flooring/ground_earth/ground_earth_basecolor.jpg',
1011
- aoMap: '/material/flooring/ground_earth/ground_earth_ambientocclusion.jpg',
1012
- metalnessMap: '/material/flooring/ground_earth/ground_earth_metallic.jpg',
1013
- normalMap: '/material/flooring/ground_earth/ground_earth_normal.jpg',
1014
- roughnessMap: '/material/flooring/ground_earth/ground_earth_roughness.jpg',
1048
+ albedoMap: '/material/flooring/ground_earth/ground_earth_basecolor_512.ktx2',
1049
+ aoMap: '/material/flooring/ground_earth/ground_earth_ao_512.ktx2',
1050
+ metalnessMap: '/material/flooring/ground_earth/ground_earth_metallic_512.ktx2',
1051
+ normalMap: '/material/flooring/ground_earth/ground_earth_normal_512.ktx2',
1052
+ roughnessMap: '/material/flooring/ground_earth/ground_earth_roughness_512.ktx2',
1015
1053
  },
1016
1054
  mapProperties: {
1017
1055
  color: '#ffffff',
@@ -1027,7 +1065,7 @@ export const MATERIAL_CATALOG = [
1027
1065
  emissiveIntensity: 1,
1028
1066
  displacementScale: 0,
1029
1067
  transparent: false,
1030
- flipY: true,
1068
+ flipY: false,
1031
1069
  bumpScale: 1,
1032
1070
  emissiveColor: '#000000',
1033
1071
  aoMapIntensity: 1,
@@ -1040,15 +1078,15 @@ export const MATERIAL_CATALOG = [
1040
1078
  {
1041
1079
  id: 'flooring-pooltiles',
1042
1080
  label: 'Pool Tiles',
1043
- category: 'flooring',
1081
+ category: 'tile',
1082
+ surfaces: ['floor', 'outdoor'],
1044
1083
  description: 'Pool tile finish',
1045
- previewThumbnailUrl: '/material/flooring/pool_tiles/pool_tiles_diffuse.jpg',
1084
+ previewThumbnailUrl: '/material/flooring/pool_tiles/pool_tiles_thumb.webp',
1046
1085
  preset: {
1047
1086
  maps: {
1048
- albedoMap: '/material/flooring/pool_tiles/pool_tiles_diffuse.jpg',
1049
- aoMap: '/material/flooring/pool_tiles/pool_tiles_ao.jpg',
1050
- metalnessMap: '/material/flooring/pool_tiles/pool_tiles_specular.jpg',
1051
- normalMap: '/material/flooring/pool_tiles/pool_tiles_normal.jpg',
1087
+ albedoMap: '/material/flooring/pool_tiles/pool_tiles_basecolor_512.ktx2',
1088
+ aoMap: '/material/flooring/pool_tiles/pool_tiles_ao_512.ktx2',
1089
+ normalMap: '/material/flooring/pool_tiles/pool_tiles_normal_512.ktx2',
1052
1090
  },
1053
1091
  mapProperties: {
1054
1092
  color: '#ffffff',
@@ -1064,7 +1102,7 @@ export const MATERIAL_CATALOG = [
1064
1102
  emissiveIntensity: 1,
1065
1103
  displacementScale: 0,
1066
1104
  transparent: false,
1067
- flipY: true,
1105
+ flipY: false,
1068
1106
  bumpScale: 1,
1069
1107
  emissiveColor: '#000000',
1070
1108
  aoMapIntensity: 1,
@@ -1077,15 +1115,15 @@ export const MATERIAL_CATALOG = [
1077
1115
  {
1078
1116
  id: 'flooring-tiles3',
1079
1117
  label: 'Checker Tiles',
1080
- category: 'flooring',
1118
+ category: 'tile',
1119
+ surfaces: ['floor'],
1081
1120
  description: 'Tile flooring finish',
1082
- previewThumbnailUrl: '/material/flooring/tiles_checker/tiles_checker_diffuse.jpg',
1121
+ previewThumbnailUrl: '/material/flooring/tiles_checker/tiles_checker_thumb.webp',
1083
1122
  preset: {
1084
1123
  maps: {
1085
- albedoMap: '/material/flooring/tiles_checker/tiles_checker_diffuse.jpg',
1086
- aoMap: '/material/flooring/tiles_checker/tiles_checker_ao.jpg',
1087
- metalnessMap: '/material/flooring/tiles_checker/tiles_checker_specular.jpg',
1088
- normalMap: '/material/flooring/tiles_checker/tiles_checker_normal.jpg',
1124
+ albedoMap: '/material/flooring/tiles_checker/tiles_checker_basecolor_512.ktx2',
1125
+ aoMap: '/material/flooring/tiles_checker/tiles_checker_ao_512.ktx2',
1126
+ normalMap: '/material/flooring/tiles_checker/tiles_checker_normal_512.ktx2',
1089
1127
  },
1090
1128
  mapProperties: {
1091
1129
  color: '#ffffff',
@@ -1101,7 +1139,7 @@ export const MATERIAL_CATALOG = [
1101
1139
  emissiveIntensity: 1,
1102
1140
  displacementScale: 0,
1103
1141
  transparent: false,
1104
- flipY: true,
1142
+ flipY: false,
1105
1143
  bumpScale: 1,
1106
1144
  emissiveColor: '#000000',
1107
1145
  aoMapIntensity: 1,
@@ -1114,15 +1152,15 @@ export const MATERIAL_CATALOG = [
1114
1152
  {
1115
1153
  id: 'flooring-tiles4',
1116
1154
  label: 'Grid Tiles',
1117
- category: 'flooring',
1155
+ category: 'tile',
1156
+ surfaces: ['floor'],
1118
1157
  description: 'Tile flooring finish',
1119
- previewThumbnailUrl: '/material/flooring/tiles_grid/tiles_grid_diffuse.jpg',
1158
+ previewThumbnailUrl: '/material/flooring/tiles_grid/tiles_grid_thumb.webp',
1120
1159
  preset: {
1121
1160
  maps: {
1122
- albedoMap: '/material/flooring/tiles_grid/tiles_grid_diffuse.jpg',
1123
- aoMap: '/material/flooring/tiles_grid/tiles_grid_ao.jpg',
1124
- metalnessMap: '/material/flooring/tiles_grid/tiles_grid_specular.jpg',
1125
- normalMap: '/material/flooring/tiles_grid/tiles_grid_normal.jpg',
1161
+ albedoMap: '/material/flooring/tiles_grid/tiles_grid_basecolor_512.ktx2',
1162
+ aoMap: '/material/flooring/tiles_grid/tiles_grid_ao_512.ktx2',
1163
+ normalMap: '/material/flooring/tiles_grid/tiles_grid_normal_512.ktx2',
1126
1164
  },
1127
1165
  mapProperties: {
1128
1166
  color: '#ffffff',
@@ -1138,7 +1176,7 @@ export const MATERIAL_CATALOG = [
1138
1176
  emissiveIntensity: 1,
1139
1177
  displacementScale: 0,
1140
1178
  transparent: false,
1141
- flipY: true,
1179
+ flipY: false,
1142
1180
  bumpScale: 1,
1143
1181
  emissiveColor: '#000000',
1144
1182
  aoMapIntensity: 1,
@@ -1151,15 +1189,15 @@ export const MATERIAL_CATALOG = [
1151
1189
  {
1152
1190
  id: 'flooring-wallstone1',
1153
1191
  label: 'Stone Wall',
1154
- category: 'flooring',
1192
+ category: 'stone',
1193
+ surfaces: ['wall', 'floor', 'outdoor'],
1155
1194
  description: 'Stone finish',
1156
- previewThumbnailUrl: '/material/flooring/stone_wall/stone_wall_diffuse.webp',
1195
+ previewThumbnailUrl: '/material/flooring/stone_wall/stone_wall_thumb.webp',
1157
1196
  preset: {
1158
1197
  maps: {
1159
- albedoMap: '/material/flooring/stone_wall/stone_wall_diffuse.webp',
1160
- aoMap: '/material/flooring/stone_wall/stone_wall_ao.webp',
1161
- metalnessMap: '/material/flooring/stone_wall/stone_wall_specular.webp',
1162
- normalMap: '/material/flooring/stone_wall/stone_wall_normal.webp',
1198
+ albedoMap: '/material/flooring/stone_wall/stone_wall_basecolor_512.ktx2',
1199
+ aoMap: '/material/flooring/stone_wall/stone_wall_ao_512.ktx2',
1200
+ normalMap: '/material/flooring/stone_wall/stone_wall_normal_512.ktx2',
1163
1201
  },
1164
1202
  mapProperties: {
1165
1203
  color: '#ffffff',
@@ -1175,7 +1213,7 @@ export const MATERIAL_CATALOG = [
1175
1213
  emissiveIntensity: 1,
1176
1214
  displacementScale: 0,
1177
1215
  transparent: false,
1178
- flipY: true,
1216
+ flipY: false,
1179
1217
  bumpScale: 1,
1180
1218
  emissiveColor: '#000000',
1181
1219
  aoMapIntensity: 1,
@@ -1188,15 +1226,15 @@ export const MATERIAL_CATALOG = [
1188
1226
  {
1189
1227
  id: 'flooring-woodenceramic3',
1190
1228
  label: 'Wooden Ceramic 3',
1191
- category: 'flooring',
1229
+ category: 'tile',
1230
+ surfaces: ['floor'],
1192
1231
  description: 'Wood-look ceramic flooring finish',
1193
- previewThumbnailUrl: '/material/flooring/wooden_ceramic_3/wooden_ceramic-diffuse.webp',
1232
+ previewThumbnailUrl: '/material/flooring/wooden_ceramic_3/wooden_ceramic_3_thumb.webp',
1194
1233
  preset: {
1195
1234
  maps: {
1196
- albedoMap: '/material/flooring/wooden_ceramic_3/wooden_ceramic-diffuse.webp',
1197
- aoMap: '/material/flooring/wooden_ceramic_3/wooden_ceramic-ao.webp',
1198
- metalnessMap: '/material/flooring/wooden_ceramic_3/wooden_ceramic-specular.webp',
1199
- normalMap: '/material/flooring/wooden_ceramic_3/wooden_ceramic-normal.webp',
1235
+ albedoMap: '/material/flooring/wooden_ceramic_3/wooden_ceramic_3_basecolor_512.ktx2',
1236
+ aoMap: '/material/flooring/wooden_ceramic_3/wooden_ceramic_3_ao_512.ktx2',
1237
+ normalMap: '/material/flooring/wooden_ceramic_3/wooden_ceramic_3_normal_512.ktx2',
1200
1238
  },
1201
1239
  mapProperties: {
1202
1240
  color: '#ffffff',
@@ -1212,7 +1250,7 @@ export const MATERIAL_CATALOG = [
1212
1250
  emissiveIntensity: 1,
1213
1251
  displacementScale: 0,
1214
1252
  transparent: false,
1215
- flipY: true,
1253
+ flipY: false,
1216
1254
  bumpScale: 1,
1217
1255
  emissiveColor: '#000000',
1218
1256
  aoMapIntensity: 1,
@@ -1225,16 +1263,17 @@ export const MATERIAL_CATALOG = [
1225
1263
  {
1226
1264
  id: 'flooring-ceramic53',
1227
1265
  label: 'Ceramic Mosaic',
1228
- category: 'flooring',
1266
+ category: 'tile',
1267
+ surfaces: ['floor', 'wall'],
1229
1268
  description: 'Ceramic flooring finish',
1230
- previewThumbnailUrl: '/material/flooring/ceramic_mosaic/ceramic_mosaic_basecolor.jpg',
1269
+ previewThumbnailUrl: '/material/flooring/ceramic_mosaic/ceramic_mosaic_thumb.webp',
1231
1270
  preset: {
1232
1271
  maps: {
1233
- albedoMap: '/material/flooring/ceramic_mosaic/ceramic_mosaic_basecolor.jpg',
1234
- aoMap: '/material/flooring/ceramic_mosaic/ceramic_mosaic_ambientocclusion.jpg',
1235
- metalnessMap: '/material/flooring/ceramic_mosaic/ceramic_mosaic_metallic.jpg',
1236
- normalMap: '/material/flooring/ceramic_mosaic/ceramic_mosaic_normal.png',
1237
- roughnessMap: '/material/flooring/ceramic_mosaic/ceramic_mosaic_roughness.jpg',
1272
+ albedoMap: '/material/flooring/ceramic_mosaic/ceramic_mosaic_basecolor_512.ktx2',
1273
+ aoMap: '/material/flooring/ceramic_mosaic/ceramic_mosaic_ao_512.ktx2',
1274
+ metalnessMap: '/material/flooring/ceramic_mosaic/ceramic_mosaic_metallic_512.ktx2',
1275
+ normalMap: '/material/flooring/ceramic_mosaic/ceramic_mosaic_normal_512.ktx2',
1276
+ roughnessMap: '/material/flooring/ceramic_mosaic/ceramic_mosaic_roughness_512.ktx2',
1238
1277
  },
1239
1278
  mapProperties: {
1240
1279
  color: '#ffffff',
@@ -1250,7 +1289,7 @@ export const MATERIAL_CATALOG = [
1250
1289
  emissiveIntensity: 1,
1251
1290
  displacementScale: 0,
1252
1291
  transparent: false,
1253
- flipY: true,
1292
+ flipY: false,
1254
1293
  bumpScale: 1,
1255
1294
  emissiveColor: '#000000',
1256
1295
  aoMapIntensity: 1,
@@ -1263,15 +1302,16 @@ export const MATERIAL_CATALOG = [
1263
1302
  {
1264
1303
  id: 'flooring-terrazzo19',
1265
1304
  label: 'Terrazzo',
1266
- category: 'flooring',
1305
+ category: 'stone',
1306
+ surfaces: ['floor', 'wall'],
1267
1307
  description: 'Terrazzo flooring finish',
1268
- previewThumbnailUrl: '/material/flooring/terrazzo/terrazzo_basecolor.jpg',
1308
+ previewThumbnailUrl: '/material/flooring/terrazzo/terrazzo_thumb.webp',
1269
1309
  preset: {
1270
1310
  maps: {
1271
- albedoMap: '/material/flooring/terrazzo/terrazzo_basecolor.jpg',
1272
- metalnessMap: '/material/flooring/terrazzo/terrazzo_metallic.jpg',
1273
- normalMap: '/material/flooring/terrazzo/terrazzo_normal.jpg',
1274
- roughnessMap: '/material/flooring/terrazzo/terrazzo_roughness.jpg',
1311
+ albedoMap: '/material/flooring/terrazzo/terrazzo_basecolor_512.ktx2',
1312
+ metalnessMap: '/material/flooring/terrazzo/terrazzo_metallic_512.ktx2',
1313
+ normalMap: '/material/flooring/terrazzo/terrazzo_normal_512.ktx2',
1314
+ roughnessMap: '/material/flooring/terrazzo/terrazzo_roughness_512.ktx2',
1275
1315
  },
1276
1316
  mapProperties: {
1277
1317
  color: '#ffffff',
@@ -1287,7 +1327,7 @@ export const MATERIAL_CATALOG = [
1287
1327
  emissiveIntensity: 1,
1288
1328
  displacementScale: 0,
1289
1329
  transparent: false,
1290
- flipY: true,
1330
+ flipY: false,
1291
1331
  bumpScale: 1,
1292
1332
  emissiveColor: '#000000',
1293
1333
  aoMapIntensity: 1,
@@ -1300,15 +1340,16 @@ export const MATERIAL_CATALOG = [
1300
1340
  {
1301
1341
  id: 'flooring-tile79',
1302
1342
  label: 'Stone Tile',
1303
- category: 'flooring',
1343
+ category: 'stone',
1344
+ surfaces: ['floor', 'wall'],
1304
1345
  description: 'Floor tile finish',
1305
- previewThumbnailUrl: '/material/flooring/tile_stone/tile_stone_basecolor.webp',
1346
+ previewThumbnailUrl: '/material/flooring/tile_stone/tile_stone_thumb.webp',
1306
1347
  preset: {
1307
1348
  maps: {
1308
- albedoMap: '/material/flooring/tile_stone/tile_stone_basecolor.webp',
1309
- aoMap: '/material/flooring/tile_stone/tile_stone_ambientocclusion.webp',
1310
- normalMap: '/material/flooring/tile_stone/tile_stone_normal.webp',
1311
- roughnessMap: '/material/flooring/tile_stone/tile_stone_roughness.webp',
1349
+ albedoMap: '/material/flooring/tile_stone/tile_stone_basecolor_512.ktx2',
1350
+ aoMap: '/material/flooring/tile_stone/tile_stone_ao_512.ktx2',
1351
+ normalMap: '/material/flooring/tile_stone/tile_stone_normal_512.ktx2',
1352
+ roughnessMap: '/material/flooring/tile_stone/tile_stone_roughness_512.ktx2',
1312
1353
  },
1313
1354
  mapProperties: {
1314
1355
  color: '#ffffff',
@@ -1324,7 +1365,7 @@ export const MATERIAL_CATALOG = [
1324
1365
  emissiveIntensity: 1,
1325
1366
  displacementScale: 0,
1326
1367
  transparent: false,
1327
- flipY: true,
1368
+ flipY: false,
1328
1369
  bumpScale: 1,
1329
1370
  emissiveColor: '#000000',
1330
1371
  aoMapIntensity: 1,
@@ -1337,15 +1378,16 @@ export const MATERIAL_CATALOG = [
1337
1378
  {
1338
1379
  id: 'flooring-tile86',
1339
1380
  label: 'Terracotta Tile',
1340
- category: 'flooring',
1381
+ category: 'tile',
1382
+ surfaces: ['floor'],
1341
1383
  description: 'Floor tile finish',
1342
- previewThumbnailUrl: '/material/flooring/tile_terracotta/tile_terracotta_basecolor.webp',
1384
+ previewThumbnailUrl: '/material/flooring/tile_terracotta/tile_terracotta_thumb.webp',
1343
1385
  preset: {
1344
1386
  maps: {
1345
- albedoMap: '/material/flooring/tile_terracotta/tile_terracotta_basecolor.webp',
1346
- aoMap: '/material/flooring/tile_terracotta/tile_terracotta_ambientocclusion.webp',
1347
- normalMap: '/material/flooring/tile_terracotta/tile_terracotta_normal.webp',
1348
- roughnessMap: '/material/flooring/tile_terracotta/tile_terracotta_roughness.webp',
1387
+ albedoMap: '/material/flooring/tile_terracotta/tile_terracotta_basecolor_512.ktx2',
1388
+ aoMap: '/material/flooring/tile_terracotta/tile_terracotta_ao_512.ktx2',
1389
+ normalMap: '/material/flooring/tile_terracotta/tile_terracotta_normal_512.ktx2',
1390
+ roughnessMap: '/material/flooring/tile_terracotta/tile_terracotta_roughness_512.ktx2',
1349
1391
  },
1350
1392
  mapProperties: {
1351
1393
  color: '#ffffff',
@@ -1361,7 +1403,7 @@ export const MATERIAL_CATALOG = [
1361
1403
  emissiveIntensity: 1,
1362
1404
  displacementScale: 0,
1363
1405
  transparent: false,
1364
- flipY: true,
1406
+ flipY: false,
1365
1407
  bumpScale: 1,
1366
1408
  emissiveColor: '#000000',
1367
1409
  aoMapIntensity: 1,
@@ -1374,15 +1416,15 @@ export const MATERIAL_CATALOG = [
1374
1416
  {
1375
1417
  id: 'flooring-greenquartzitea',
1376
1418
  label: 'Green Quartzite A',
1377
- category: 'flooring',
1419
+ category: 'stone',
1420
+ surfaces: ['floor', 'wall'],
1378
1421
  description: 'Green quartzite flooring finish',
1379
- previewThumbnailUrl: '/material/flooring/green_glass_quartzite/green_glass_quartzite_diffuse.jpg',
1422
+ previewThumbnailUrl: '/material/flooring/green_glass_quartzite/green_glass_quartzite_thumb.webp',
1380
1423
  preset: {
1381
1424
  maps: {
1382
- albedoMap: '/material/flooring/green_glass_quartzite/green_glass_quartzite_diffuse.jpg',
1383
- aoMap: '/material/flooring/green_glass_quartzite/green_glass_quartzite_ao.jpg',
1384
- metalnessMap: '/material/flooring/green_glass_quartzite/green_glass_quartzite_specular.jpg',
1385
- normalMap: '/material/flooring/green_glass_quartzite/green_glass_quartzite_normal.jpg',
1425
+ albedoMap: '/material/flooring/green_glass_quartzite/green_glass_quartzite_basecolor_512.ktx2',
1426
+ aoMap: '/material/flooring/green_glass_quartzite/green_glass_quartzite_ao_512.ktx2',
1427
+ normalMap: '/material/flooring/green_glass_quartzite/green_glass_quartzite_normal_512.ktx2',
1386
1428
  },
1387
1429
  mapProperties: {
1388
1430
  color: '#ffffff',
@@ -1398,7 +1440,7 @@ export const MATERIAL_CATALOG = [
1398
1440
  emissiveIntensity: 1,
1399
1441
  displacementScale: 0,
1400
1442
  transparent: false,
1401
- flipY: true,
1443
+ flipY: false,
1402
1444
  bumpScale: 1,
1403
1445
  emissiveColor: '#000000',
1404
1446
  aoMapIntensity: 1,
@@ -1411,16 +1453,17 @@ export const MATERIAL_CATALOG = [
1411
1453
  {
1412
1454
  id: 'flooring-darkceramic22',
1413
1455
  label: 'Dark Ceramic Grunge',
1414
- category: 'flooring',
1456
+ category: 'tile',
1457
+ surfaces: ['floor'],
1415
1458
  description: 'Dark ceramic flooring finish',
1416
- previewThumbnailUrl: '/material/flooring/dark_ceramic_grunge/dark_ceramic_grunge_basecolor.jpg',
1459
+ previewThumbnailUrl: '/material/flooring/dark_ceramic_grunge/dark_ceramic_grunge_thumb.webp',
1417
1460
  preset: {
1418
1461
  maps: {
1419
- albedoMap: '/material/flooring/dark_ceramic_grunge/dark_ceramic_grunge_basecolor.jpg',
1420
- aoMap: '/material/flooring/dark_ceramic_grunge/dark_ceramic_grunge_ambientocclusion.jpg',
1421
- metalnessMap: '/material/flooring/dark_ceramic_grunge/dark_ceramic_grunge_metallic.jpg',
1422
- normalMap: '/material/flooring/dark_ceramic_grunge/dark_ceramic_grunge_normal.jpg',
1423
- roughnessMap: '/material/flooring/dark_ceramic_grunge/dark_ceramic_grunge_roughness.jpg',
1462
+ albedoMap: '/material/flooring/dark_ceramic_grunge/dark_ceramic_grunge_basecolor_512.ktx2',
1463
+ aoMap: '/material/flooring/dark_ceramic_grunge/dark_ceramic_grunge_ao_512.ktx2',
1464
+ metalnessMap: '/material/flooring/dark_ceramic_grunge/dark_ceramic_grunge_metallic_512.ktx2',
1465
+ normalMap: '/material/flooring/dark_ceramic_grunge/dark_ceramic_grunge_normal_512.ktx2',
1466
+ roughnessMap: '/material/flooring/dark_ceramic_grunge/dark_ceramic_grunge_roughness_512.ktx2',
1424
1467
  },
1425
1468
  mapProperties: {
1426
1469
  color: '#ffffff',
@@ -1436,7 +1479,7 @@ export const MATERIAL_CATALOG = [
1436
1479
  emissiveIntensity: 1,
1437
1480
  displacementScale: 0,
1438
1481
  transparent: false,
1439
- flipY: true,
1482
+ flipY: false,
1440
1483
  bumpScale: 1,
1441
1484
  emissiveColor: '#000000',
1442
1485
  aoMapIntensity: 1,
@@ -1449,16 +1492,17 @@ export const MATERIAL_CATALOG = [
1449
1492
  {
1450
1493
  id: 'flooring-lightceramic24',
1451
1494
  label: 'Light Ceramic Grunge',
1452
- category: 'flooring',
1495
+ category: 'tile',
1496
+ surfaces: ['floor'],
1453
1497
  description: 'Light ceramic flooring finish',
1454
- previewThumbnailUrl: '/material/flooring/light_ceramic_grunge/light_ceramic_grunge_basecolor.jpg',
1498
+ previewThumbnailUrl: '/material/flooring/light_ceramic_grunge/light_ceramic_grunge_thumb.webp',
1455
1499
  preset: {
1456
1500
  maps: {
1457
- albedoMap: '/material/flooring/light_ceramic_grunge/light_ceramic_grunge_basecolor.jpg',
1458
- aoMap: '/material/flooring/light_ceramic_grunge/light_ceramic_grunge_ambientocclusion.jpg',
1459
- metalnessMap: '/material/flooring/light_ceramic_grunge/light_ceramic_grunge_metallic.jpg',
1460
- normalMap: '/material/flooring/light_ceramic_grunge/light_ceramic_grunge_normal.jpg',
1461
- roughnessMap: '/material/flooring/light_ceramic_grunge/light_ceramic_grunge_roughness.jpg',
1501
+ albedoMap: '/material/flooring/light_ceramic_grunge/light_ceramic_grunge_basecolor_512.ktx2',
1502
+ aoMap: '/material/flooring/light_ceramic_grunge/light_ceramic_grunge_ao_512.ktx2',
1503
+ metalnessMap: '/material/flooring/light_ceramic_grunge/light_ceramic_grunge_metallic_512.ktx2',
1504
+ normalMap: '/material/flooring/light_ceramic_grunge/light_ceramic_grunge_normal_512.ktx2',
1505
+ roughnessMap: '/material/flooring/light_ceramic_grunge/light_ceramic_grunge_roughness_512.ktx2',
1462
1506
  },
1463
1507
  mapProperties: {
1464
1508
  color: '#ffffff',
@@ -1474,7 +1518,7 @@ export const MATERIAL_CATALOG = [
1474
1518
  emissiveIntensity: 1,
1475
1519
  displacementScale: 0,
1476
1520
  transparent: false,
1477
- flipY: true,
1521
+ flipY: false,
1478
1522
  bumpScale: 1,
1479
1523
  emissiveColor: '#000000',
1480
1524
  aoMapIntensity: 1,
@@ -1487,15 +1531,15 @@ export const MATERIAL_CATALOG = [
1487
1531
  {
1488
1532
  id: 'flooring-statuarettowhite',
1489
1533
  label: 'Statuaretto White',
1490
- category: 'flooring',
1534
+ category: 'stone',
1535
+ surfaces: ['floor', 'wall'],
1491
1536
  description: 'White marble flooring finish',
1492
- previewThumbnailUrl: '/material/flooring/statuaretto/statuaretto_diffuse.jpg',
1537
+ previewThumbnailUrl: '/material/flooring/statuaretto/statuaretto_thumb.webp',
1493
1538
  preset: {
1494
1539
  maps: {
1495
- albedoMap: '/material/flooring/statuaretto/statuaretto_diffuse.jpg',
1496
- aoMap: '/material/flooring/statuaretto/statuaretto_ao.jpg',
1497
- metalnessMap: '/material/flooring/statuaretto/statuaretto_specular.jpg',
1498
- normalMap: '/material/flooring/statuaretto/statuaretto_normal.jpg',
1540
+ albedoMap: '/material/flooring/statuaretto/statuaretto_basecolor_512.ktx2',
1541
+ aoMap: '/material/flooring/statuaretto/statuaretto_ao_512.ktx2',
1542
+ normalMap: '/material/flooring/statuaretto/statuaretto_normal_512.ktx2',
1499
1543
  },
1500
1544
  mapProperties: {
1501
1545
  color: '#ffffff',
@@ -1511,7 +1555,7 @@ export const MATERIAL_CATALOG = [
1511
1555
  emissiveIntensity: 1,
1512
1556
  displacementScale: 0,
1513
1557
  transparent: false,
1514
- flipY: true,
1558
+ flipY: false,
1515
1559
  bumpScale: 1,
1516
1560
  emissiveColor: '#000000',
1517
1561
  aoMapIntensity: 1,
@@ -1524,16 +1568,17 @@ export const MATERIAL_CATALOG = [
1524
1568
  {
1525
1569
  id: 'flooring-tile20',
1526
1570
  label: 'Mosaic Tile',
1527
- category: 'flooring',
1571
+ category: 'tile',
1572
+ surfaces: ['floor', 'wall'],
1528
1573
  description: 'Floor tile finish',
1529
- previewThumbnailUrl: '/material/flooring/tile_mosaic/tile_mosaic_basecolor.webp',
1574
+ previewThumbnailUrl: '/material/flooring/tile_mosaic/tile_mosaic_thumb.webp',
1530
1575
  preset: {
1531
1576
  maps: {
1532
- albedoMap: '/material/flooring/tile_mosaic/tile_mosaic_basecolor.webp',
1533
- aoMap: '/material/flooring/tile_mosaic/tile_mosaic_ambientocclusion.webp',
1534
- metalnessMap: '/material/flooring/tile_mosaic/tile_mosaic_metallic.webp',
1535
- normalMap: '/material/flooring/tile_mosaic/tile_mosaic_normal.webp',
1536
- roughnessMap: '/material/flooring/tile_mosaic/tile_mosaic_roughness.webp',
1577
+ albedoMap: '/material/flooring/tile_mosaic/tile_mosaic_basecolor_512.ktx2',
1578
+ aoMap: '/material/flooring/tile_mosaic/tile_mosaic_ao_512.ktx2',
1579
+ metalnessMap: '/material/flooring/tile_mosaic/tile_mosaic_metallic_512.ktx2',
1580
+ normalMap: '/material/flooring/tile_mosaic/tile_mosaic_normal_512.ktx2',
1581
+ roughnessMap: '/material/flooring/tile_mosaic/tile_mosaic_roughness_512.ktx2',
1537
1582
  },
1538
1583
  mapProperties: {
1539
1584
  color: '#ffffff',
@@ -1549,7 +1594,7 @@ export const MATERIAL_CATALOG = [
1549
1594
  emissiveIntensity: 1,
1550
1595
  displacementScale: 0,
1551
1596
  transparent: false,
1552
- flipY: true,
1597
+ flipY: false,
1553
1598
  bumpScale: 1,
1554
1599
  emissiveColor: '#000000',
1555
1600
  aoMapIntensity: 1,
@@ -1562,16 +1607,17 @@ export const MATERIAL_CATALOG = [
1562
1607
  {
1563
1608
  id: 'flooring-tile68',
1564
1609
  label: 'Pattern Tile',
1565
- category: 'flooring',
1610
+ category: 'tile',
1611
+ surfaces: ['floor', 'wall'],
1566
1612
  description: 'Floor tile finish',
1567
- previewThumbnailUrl: '/material/flooring/tile_pattern/tile_pattern_basecolor.webp',
1613
+ previewThumbnailUrl: '/material/flooring/tile_pattern/tile_pattern_thumb.webp',
1568
1614
  preset: {
1569
1615
  maps: {
1570
- albedoMap: '/material/flooring/tile_pattern/tile_pattern_basecolor.webp',
1571
- aoMap: '/material/flooring/tile_pattern/tile_pattern_ambientocclusion.webp',
1572
- metalnessMap: '/material/flooring/tile_pattern/tile_pattern_metallic.webp',
1573
- normalMap: '/material/flooring/tile_pattern/tile_pattern_normal.webp',
1574
- roughnessMap: '/material/flooring/tile_pattern/tile_pattern_roughness.webp',
1616
+ albedoMap: '/material/flooring/tile_pattern/tile_pattern_basecolor_512.ktx2',
1617
+ aoMap: '/material/flooring/tile_pattern/tile_pattern_ao_512.ktx2',
1618
+ metalnessMap: '/material/flooring/tile_pattern/tile_pattern_metallic_512.ktx2',
1619
+ normalMap: '/material/flooring/tile_pattern/tile_pattern_normal_512.ktx2',
1620
+ roughnessMap: '/material/flooring/tile_pattern/tile_pattern_roughness_512.ktx2',
1575
1621
  },
1576
1622
  mapProperties: {
1577
1623
  color: '#ffffff',
@@ -1587,7 +1633,7 @@ export const MATERIAL_CATALOG = [
1587
1633
  emissiveIntensity: 1,
1588
1634
  displacementScale: 0,
1589
1635
  transparent: false,
1590
- flipY: true,
1636
+ flipY: false,
1591
1637
  bumpScale: 1,
1592
1638
  emissiveColor: '#000000',
1593
1639
  aoMapIntensity: 1,
@@ -1600,15 +1646,15 @@ export const MATERIAL_CATALOG = [
1600
1646
  {
1601
1647
  id: 'flooring-woodenceramic2',
1602
1648
  label: 'Wooden Ceramic 2',
1603
- category: 'flooring',
1649
+ category: 'tile',
1650
+ surfaces: ['floor'],
1604
1651
  description: 'Wood-look ceramic flooring finish',
1605
- previewThumbnailUrl: '/material/flooring/wooden_ceramic_2/wooden_ceramic-diffuse.webp',
1652
+ previewThumbnailUrl: '/material/flooring/wooden_ceramic_2/wooden_ceramic_2_thumb.webp',
1606
1653
  preset: {
1607
1654
  maps: {
1608
- albedoMap: '/material/flooring/wooden_ceramic_2/wooden_ceramic-diffuse.webp',
1609
- aoMap: '/material/flooring/wooden_ceramic_2/wooden_ceramic-ao.webp',
1610
- metalnessMap: '/material/flooring/wooden_ceramic_2/wooden_ceramic-specular.webp',
1611
- normalMap: '/material/flooring/wooden_ceramic_2/wooden_ceramic-normal.webp',
1655
+ albedoMap: '/material/flooring/wooden_ceramic_2/wooden_ceramic_2_basecolor_512.ktx2',
1656
+ aoMap: '/material/flooring/wooden_ceramic_2/wooden_ceramic_2_ao_512.ktx2',
1657
+ normalMap: '/material/flooring/wooden_ceramic_2/wooden_ceramic_2_normal_512.ktx2',
1612
1658
  },
1613
1659
  mapProperties: {
1614
1660
  color: '#ffffff',
@@ -1624,7 +1670,7 @@ export const MATERIAL_CATALOG = [
1624
1670
  emissiveIntensity: 1,
1625
1671
  displacementScale: 0,
1626
1672
  transparent: false,
1627
- flipY: true,
1673
+ flipY: false,
1628
1674
  bumpScale: 1,
1629
1675
  emissiveColor: '#000000',
1630
1676
  aoMapIntensity: 1,
@@ -1637,16 +1683,17 @@ export const MATERIAL_CATALOG = [
1637
1683
  {
1638
1684
  id: 'flooring-woodparquet76',
1639
1685
  label: 'Wood Parquet',
1640
- category: 'flooring',
1686
+ category: 'wood',
1687
+ surfaces: ['floor'],
1641
1688
  description: 'Wood parquet flooring finish',
1642
- previewThumbnailUrl: '/material/flooring/woodparquet/woodparquet_basecolor.webp',
1689
+ previewThumbnailUrl: '/material/flooring/woodparquet/woodparquet_thumb.webp',
1643
1690
  preset: {
1644
1691
  maps: {
1645
- albedoMap: '/material/flooring/woodparquet/woodparquet_basecolor.webp',
1646
- aoMap: '/material/flooring/woodparquet/woodparquet_ambientocclusion.webp',
1647
- metalnessMap: '/material/flooring/woodparquet/woodparquet_metallic.webp',
1648
- normalMap: '/material/flooring/woodparquet/woodparquet_normal.webp',
1649
- roughnessMap: '/material/flooring/woodparquet/woodparquet_roughness.webp',
1692
+ albedoMap: '/material/flooring/woodparquet/woodparquet_basecolor_512.ktx2',
1693
+ aoMap: '/material/flooring/woodparquet/woodparquet_ao_512.ktx2',
1694
+ metalnessMap: '/material/flooring/woodparquet/woodparquet_metallic_512.ktx2',
1695
+ normalMap: '/material/flooring/woodparquet/woodparquet_normal_512.ktx2',
1696
+ roughnessMap: '/material/flooring/woodparquet/woodparquet_roughness_512.ktx2',
1650
1697
  },
1651
1698
  mapProperties: {
1652
1699
  color: '#ffffff',
@@ -1662,7 +1709,7 @@ export const MATERIAL_CATALOG = [
1662
1709
  emissiveIntensity: 1,
1663
1710
  displacementScale: 0,
1664
1711
  transparent: false,
1665
- flipY: true,
1712
+ flipY: false,
1666
1713
  bumpScale: 1,
1667
1714
  emissiveColor: '#000000',
1668
1715
  aoMapIntensity: 1,
@@ -1675,16 +1722,17 @@ export const MATERIAL_CATALOG = [
1675
1722
  {
1676
1723
  id: 'roof-classicshingles',
1677
1724
  label: 'Classic Shingles',
1678
- category: 'roof',
1725
+ category: 'roofing',
1726
+ surfaces: ['roof'],
1679
1727
  description: 'Classic roof shingle finish',
1680
- previewThumbnailUrl: '/material/roofing/roof_shingles_classic/roof_shingles_classic_basecolor.webp',
1728
+ previewThumbnailUrl: '/material/roofing/roof_shingles_classic/roof_shingles_classic_thumb.webp',
1681
1729
  preset: {
1682
1730
  maps: {
1683
- albedoMap: '/material/roofing/roof_shingles_classic/roof_shingles_classic_basecolor.webp',
1684
- aoMap: '/material/roofing/roof_shingles_classic/roof_shingles_classic_ambientocclusion.webp',
1685
- metalnessMap: '/material/roofing/roof_shingles_classic/roof_shingles_classic_metallic.webp',
1686
- normalMap: '/material/roofing/roof_shingles_classic/roof_shingles_classic_normal.webp',
1687
- roughnessMap: '/material/roofing/roof_shingles_classic/roof_shingles_classic_roughness.webp',
1731
+ albedoMap: '/material/roofing/roof_shingles_classic/roof_shingles_classic_basecolor_512.ktx2',
1732
+ aoMap: '/material/roofing/roof_shingles_classic/roof_shingles_classic_ao_512.ktx2',
1733
+ metalnessMap: '/material/roofing/roof_shingles_classic/roof_shingles_classic_metallic_512.ktx2',
1734
+ normalMap: '/material/roofing/roof_shingles_classic/roof_shingles_classic_normal_512.ktx2',
1735
+ roughnessMap: '/material/roofing/roof_shingles_classic/roof_shingles_classic_roughness_512.ktx2',
1688
1736
  },
1689
1737
  mapProperties: {
1690
1738
  color: '#ffffff',
@@ -1700,7 +1748,7 @@ export const MATERIAL_CATALOG = [
1700
1748
  emissiveIntensity: 1,
1701
1749
  displacementScale: 0,
1702
1750
  transparent: false,
1703
- flipY: true,
1751
+ flipY: false,
1704
1752
  bumpScale: 1,
1705
1753
  emissiveColor: '#000000',
1706
1754
  aoMapIntensity: 1,
@@ -1713,16 +1761,17 @@ export const MATERIAL_CATALOG = [
1713
1761
  {
1714
1762
  id: 'roof-claytiles',
1715
1763
  label: 'Clay Tiles',
1716
- category: 'roof',
1764
+ category: 'roofing',
1765
+ surfaces: ['roof'],
1717
1766
  description: 'Clay roof tile finish',
1718
- previewThumbnailUrl: '/material/roofing/roof_tiles_clay/roof_tiles_clay_basecolor.webp',
1767
+ previewThumbnailUrl: '/material/roofing/roof_tiles_clay/roof_tiles_clay_thumb.webp',
1719
1768
  preset: {
1720
1769
  maps: {
1721
- albedoMap: '/material/roofing/roof_tiles_clay/roof_tiles_clay_basecolor.webp',
1722
- aoMap: '/material/roofing/roof_tiles_clay/roof_tiles_clay_ambientocclusion.webp',
1723
- metalnessMap: '/material/roofing/roof_tiles_clay/roof_tiles_clay_metallic.png',
1724
- normalMap: '/material/roofing/roof_tiles_clay/roof_tiles_clay_normal.webp',
1725
- roughnessMap: '/material/roofing/roof_tiles_clay/roof_tiles_clay_roughness.webp',
1770
+ albedoMap: '/material/roofing/roof_tiles_clay/roof_tiles_clay_basecolor_512.ktx2',
1771
+ aoMap: '/material/roofing/roof_tiles_clay/roof_tiles_clay_ao_512.ktx2',
1772
+ metalnessMap: '/material/roofing/roof_tiles_clay/roof_tiles_clay_metallic_512.ktx2',
1773
+ normalMap: '/material/roofing/roof_tiles_clay/roof_tiles_clay_normal_512.ktx2',
1774
+ roughnessMap: '/material/roofing/roof_tiles_clay/roof_tiles_clay_roughness_512.ktx2',
1726
1775
  },
1727
1776
  mapProperties: {
1728
1777
  color: '#ffffff',
@@ -1738,7 +1787,7 @@ export const MATERIAL_CATALOG = [
1738
1787
  emissiveIntensity: 1,
1739
1788
  displacementScale: 0,
1740
1789
  transparent: false,
1741
- flipY: true,
1790
+ flipY: false,
1742
1791
  bumpScale: 1,
1743
1792
  emissiveColor: '#000000',
1744
1793
  aoMapIntensity: 1,
@@ -1751,16 +1800,17 @@ export const MATERIAL_CATALOG = [
1751
1800
  {
1752
1801
  id: 'roof-terracottatiles',
1753
1802
  label: 'Terracotta Tiles',
1754
- category: 'roof',
1803
+ category: 'roofing',
1804
+ surfaces: ['roof'],
1755
1805
  description: 'Terracotta roof tile finish',
1756
- previewThumbnailUrl: '/material/roofing/roof_tiles_terracotta/roof_tiles_terracotta_basecolor.webp',
1806
+ previewThumbnailUrl: '/material/roofing/roof_tiles_terracotta/roof_tiles_terracotta_thumb.webp',
1757
1807
  preset: {
1758
1808
  maps: {
1759
- albedoMap: '/material/roofing/roof_tiles_terracotta/roof_tiles_terracotta_basecolor.webp',
1760
- aoMap: '/material/roofing/roof_tiles_terracotta/roof_tiles_terracotta_ambientocclusion.webp',
1761
- metalnessMap: '/material/roofing/roof_tiles_terracotta/roof_tiles_terracotta_metallic.webp',
1762
- normalMap: '/material/roofing/roof_tiles_terracotta/roof_tiles_terracotta_normal.webp',
1763
- roughnessMap: '/material/roofing/roof_tiles_terracotta/roof_tiles_terracotta_roughness.webp',
1809
+ albedoMap: '/material/roofing/roof_tiles_terracotta/roof_tiles_terracotta_basecolor_512.ktx2',
1810
+ aoMap: '/material/roofing/roof_tiles_terracotta/roof_tiles_terracotta_ao_512.ktx2',
1811
+ metalnessMap: '/material/roofing/roof_tiles_terracotta/roof_tiles_terracotta_metallic_512.ktx2',
1812
+ normalMap: '/material/roofing/roof_tiles_terracotta/roof_tiles_terracotta_normal_512.ktx2',
1813
+ roughnessMap: '/material/roofing/roof_tiles_terracotta/roof_tiles_terracotta_roughness_512.ktx2',
1764
1814
  },
1765
1815
  mapProperties: {
1766
1816
  color: '#ffffff',
@@ -1776,7 +1826,7 @@ export const MATERIAL_CATALOG = [
1776
1826
  emissiveIntensity: 1,
1777
1827
  displacementScale: 0,
1778
1828
  transparent: false,
1779
- flipY: true,
1829
+ flipY: false,
1780
1830
  bumpScale: 1,
1781
1831
  emissiveColor: '#000000',
1782
1832
  aoMapIntensity: 1,
@@ -1789,16 +1839,17 @@ export const MATERIAL_CATALOG = [
1789
1839
  {
1790
1840
  id: 'roof-weatheredshingles',
1791
1841
  label: 'Weathered Shingles',
1792
- category: 'roof',
1842
+ category: 'roofing',
1843
+ surfaces: ['roof'],
1793
1844
  description: 'Weathered roof shingle finish',
1794
- previewThumbnailUrl: '/material/roofing/roof_shingles_weathered/roof_shingles_weathered_basecolor.webp',
1845
+ previewThumbnailUrl: '/material/roofing/roof_shingles_weathered/roof_shingles_weathered_thumb.webp',
1795
1846
  preset: {
1796
1847
  maps: {
1797
- albedoMap: '/material/roofing/roof_shingles_weathered/roof_shingles_weathered_basecolor.webp',
1798
- aoMap: '/material/roofing/roof_shingles_weathered/roof_shingles_weathered_ambientocclusion.webp',
1799
- metalnessMap: '/material/roofing/roof_shingles_weathered/roof_shingles_weathered_metallic.webp',
1800
- normalMap: '/material/roofing/roof_shingles_weathered/roof_shingles_weathered_normal.webp',
1801
- roughnessMap: '/material/roofing/roof_shingles_weathered/roof_shingles_weathered_roughness.webp',
1848
+ albedoMap: '/material/roofing/roof_shingles_weathered/roof_shingles_weathered_basecolor_512.ktx2',
1849
+ aoMap: '/material/roofing/roof_shingles_weathered/roof_shingles_weathered_ao_512.ktx2',
1850
+ metalnessMap: '/material/roofing/roof_shingles_weathered/roof_shingles_weathered_metallic_512.ktx2',
1851
+ normalMap: '/material/roofing/roof_shingles_weathered/roof_shingles_weathered_normal_512.ktx2',
1852
+ roughnessMap: '/material/roofing/roof_shingles_weathered/roof_shingles_weathered_roughness_512.ktx2',
1802
1853
  },
1803
1854
  mapProperties: {
1804
1855
  color: '#ffffff',
@@ -1814,7 +1865,7 @@ export const MATERIAL_CATALOG = [
1814
1865
  emissiveIntensity: 1,
1815
1866
  displacementScale: 0,
1816
1867
  transparent: false,
1817
- flipY: true,
1868
+ flipY: false,
1818
1869
  bumpScale: 1,
1819
1870
  emissiveColor: '#000000',
1820
1871
  aoMapIntensity: 1,
@@ -1827,13 +1878,15 @@ export const MATERIAL_CATALOG = [
1827
1878
  {
1828
1879
  id: 'preset-white',
1829
1880
  label: 'White',
1830
- category: 'other',
1881
+ category: 'colors',
1831
1882
  description: 'Clean painted finish',
1832
- previewColor: '#ffffff',
1883
+ // Real white paint reflects ~80%; a literal #ffffff albedo kills GI/shadow
1884
+ // contrast, so "white" is clamped to ≈0.83 linear.
1885
+ previewColor: '#e9e9e9',
1833
1886
  preset: {
1834
1887
  maps: {},
1835
1888
  mapProperties: {
1836
- color: '#ffffff',
1889
+ color: '#e9e9e9',
1837
1890
  roughness: 0.9,
1838
1891
  metalness: 0,
1839
1892
  repeatX: 1,
@@ -1859,13 +1912,13 @@ export const MATERIAL_CATALOG = [
1859
1912
  {
1860
1913
  id: 'preset-softwhite',
1861
1914
  label: 'Soft White',
1862
- category: 'other',
1915
+ category: 'colors',
1863
1916
  description: 'Warm off-white painted finish',
1864
- previewColor: '#f2eee6',
1917
+ previewColor: '#ebe7df',
1865
1918
  preset: {
1866
1919
  maps: {},
1867
1920
  mapProperties: {
1868
- color: '#f2eee6',
1921
+ color: '#ebe7df',
1869
1922
  roughness: 0.9,
1870
1923
  metalness: 0,
1871
1924
  repeatX: 1,
@@ -1891,7 +1944,7 @@ export const MATERIAL_CATALOG = [
1891
1944
  {
1892
1945
  id: 'preset-cream',
1893
1946
  label: 'Cream',
1894
- category: 'other',
1947
+ category: 'colors',
1895
1948
  description: 'Soft cream painted finish',
1896
1949
  previewColor: '#efe3cc',
1897
1950
  preset: {
@@ -1923,7 +1976,7 @@ export const MATERIAL_CATALOG = [
1923
1976
  {
1924
1977
  id: 'preset-beige',
1925
1978
  label: 'Beige',
1926
- category: 'other',
1979
+ category: 'colors',
1927
1980
  description: 'Balanced beige painted finish',
1928
1981
  previewColor: '#d9c7ad',
1929
1982
  preset: {
@@ -1952,10 +2005,42 @@ export const MATERIAL_CATALOG = [
1952
2005
  },
1953
2006
  },
1954
2007
  },
2008
+ {
2009
+ id: 'preset-lightgrey',
2010
+ label: 'Light grey',
2011
+ category: 'colors',
2012
+ description: 'Cool light grey painted finish',
2013
+ previewColor: '#d8d6d1',
2014
+ preset: {
2015
+ maps: {},
2016
+ mapProperties: {
2017
+ color: '#d8d6d1',
2018
+ roughness: 0.9,
2019
+ metalness: 0,
2020
+ repeatX: 1,
2021
+ repeatY: 1,
2022
+ rotation: 0,
2023
+ wrapS: 'Repeat',
2024
+ wrapT: 'Repeat',
2025
+ normalScaleX: 1,
2026
+ normalScaleY: 1,
2027
+ emissiveIntensity: 1,
2028
+ displacementScale: 0.02,
2029
+ transparent: false,
2030
+ flipY: true,
2031
+ bumpScale: 1,
2032
+ emissiveColor: '#000000',
2033
+ aoMapIntensity: 1,
2034
+ side: 0,
2035
+ opacity: 1,
2036
+ lightMapIntensity: 1,
2037
+ },
2038
+ },
2039
+ },
1955
2040
  {
1956
2041
  id: 'preset-greige',
1957
2042
  label: 'Greige',
1958
- category: 'other',
2043
+ category: 'colors',
1959
2044
  description: 'Neutral greige painted finish',
1960
2045
  previewColor: '#c8c1b8',
1961
2046
  preset: {
@@ -1985,15 +2070,15 @@ export const MATERIAL_CATALOG = [
1985
2070
  },
1986
2071
  },
1987
2072
  {
1988
- id: 'preset-sage',
1989
- label: 'Sage',
1990
- category: 'other',
1991
- description: 'Muted sage painted finish',
1992
- previewColor: '#bcc5b2',
2073
+ id: 'preset-midgrey',
2074
+ label: 'Mid grey',
2075
+ category: 'colors',
2076
+ description: 'Neutral mid grey painted finish',
2077
+ previewColor: '#8b8a86',
1993
2078
  preset: {
1994
2079
  maps: {},
1995
2080
  mapProperties: {
1996
- color: '#bcc5b2',
2081
+ color: '#8b8a86',
1997
2082
  roughness: 0.9,
1998
2083
  metalness: 0,
1999
2084
  repeatX: 1,
@@ -2017,15 +2102,15 @@ export const MATERIAL_CATALOG = [
2017
2102
  },
2018
2103
  },
2019
2104
  {
2020
- id: 'preset-softblue',
2021
- label: 'Soft Blue',
2022
- category: 'other',
2023
- description: 'Muted blue painted finish',
2024
- previewColor: '#c7d6e3',
2105
+ id: 'preset-charcoal',
2106
+ label: 'Charcoal',
2107
+ category: 'colors',
2108
+ description: 'Dark charcoal painted finish',
2109
+ previewColor: '#4e5257',
2025
2110
  preset: {
2026
2111
  maps: {},
2027
2112
  mapProperties: {
2028
- color: '#c7d6e3',
2113
+ color: '#4e5257',
2029
2114
  roughness: 0.9,
2030
2115
  metalness: 0,
2031
2116
  repeatX: 1,
@@ -2049,15 +2134,15 @@ export const MATERIAL_CATALOG = [
2049
2134
  },
2050
2135
  },
2051
2136
  {
2052
- id: 'preset-terracotta',
2053
- label: 'Terracotta',
2054
- category: 'other',
2055
- description: 'Warm terracotta painted finish',
2056
- previewColor: '#c86f4c',
2137
+ id: 'preset-nearblack',
2138
+ label: 'Near-black',
2139
+ category: 'colors',
2140
+ description: 'Soft near-black painted finish',
2141
+ previewColor: '#232322',
2057
2142
  preset: {
2058
2143
  maps: {},
2059
2144
  mapProperties: {
2060
- color: '#c86f4c',
2145
+ color: '#232322',
2061
2146
  roughness: 0.9,
2062
2147
  metalness: 0,
2063
2148
  repeatX: 1,
@@ -2081,15 +2166,15 @@ export const MATERIAL_CATALOG = [
2081
2166
  },
2082
2167
  },
2083
2168
  {
2084
- id: 'preset-dustyrose',
2085
- label: 'Dusty Rose',
2086
- category: 'other',
2087
- description: 'Muted rose painted finish',
2088
- previewColor: '#c48a8d',
2169
+ id: 'preset-blush',
2170
+ label: 'Blush',
2171
+ category: 'colors',
2172
+ description: 'Pale blush painted finish',
2173
+ previewColor: '#e8c6c0',
2089
2174
  preset: {
2090
2175
  maps: {},
2091
2176
  mapProperties: {
2092
- color: '#c48a8d',
2177
+ color: '#e8c6c0',
2093
2178
  roughness: 0.9,
2094
2179
  metalness: 0,
2095
2180
  repeatX: 1,
@@ -2113,15 +2198,15 @@ export const MATERIAL_CATALOG = [
2113
2198
  },
2114
2199
  },
2115
2200
  {
2116
- id: 'preset-olive',
2117
- label: 'Olive',
2118
- category: 'other',
2119
- description: 'Natural olive painted finish',
2120
- previewColor: '#8d9368',
2201
+ id: 'preset-tomato',
2202
+ label: 'Tomato',
2203
+ category: 'colors',
2204
+ description: 'Warm tomato red painted finish',
2205
+ previewColor: '#c0594f',
2121
2206
  preset: {
2122
2207
  maps: {},
2123
2208
  mapProperties: {
2124
- color: '#8d9368',
2209
+ color: '#c0594f',
2125
2210
  roughness: 0.9,
2126
2211
  metalness: 0,
2127
2212
  repeatX: 1,
@@ -2145,15 +2230,15 @@ export const MATERIAL_CATALOG = [
2145
2230
  },
2146
2231
  },
2147
2232
  {
2148
- id: 'preset-forest',
2149
- label: 'Forest',
2150
- category: 'other',
2151
- description: 'Deep forest green painted finish',
2152
- previewColor: '#4f6b57',
2233
+ id: 'preset-brickred',
2234
+ label: 'Brick red',
2235
+ category: 'colors',
2236
+ description: 'Deep brick red painted finish',
2237
+ previewColor: '#9e3b34',
2153
2238
  preset: {
2154
2239
  maps: {},
2155
2240
  mapProperties: {
2156
- color: '#4f6b57',
2241
+ color: '#9e3b34',
2157
2242
  roughness: 0.9,
2158
2243
  metalness: 0,
2159
2244
  repeatX: 1,
@@ -2177,15 +2262,15 @@ export const MATERIAL_CATALOG = [
2177
2262
  },
2178
2263
  },
2179
2264
  {
2180
- id: 'preset-slateblue',
2181
- label: 'Slate Blue',
2182
- category: 'other',
2183
- description: 'Muted slate blue painted finish',
2184
- previewColor: '#6f87a4',
2265
+ id: 'preset-oxblood',
2266
+ label: 'Oxblood',
2267
+ category: 'colors',
2268
+ description: 'Dark oxblood painted finish',
2269
+ previewColor: '#6f2c2a',
2185
2270
  preset: {
2186
2271
  maps: {},
2187
2272
  mapProperties: {
2188
- color: '#6f87a4',
2273
+ color: '#6f2c2a',
2189
2274
  roughness: 0.9,
2190
2275
  metalness: 0,
2191
2276
  repeatX: 1,
@@ -2209,15 +2294,15 @@ export const MATERIAL_CATALOG = [
2209
2294
  },
2210
2295
  },
2211
2296
  {
2212
- id: 'preset-navy',
2213
- label: 'Navy',
2214
- category: 'other',
2215
- description: 'Classic navy painted finish',
2216
- previewColor: '#2f4865',
2297
+ id: 'preset-peach',
2298
+ label: 'Peach',
2299
+ category: 'colors',
2300
+ description: 'Soft peach painted finish',
2301
+ previewColor: '#f0c3a0',
2217
2302
  preset: {
2218
2303
  maps: {},
2219
2304
  mapProperties: {
2220
- color: '#2f4865',
2305
+ color: '#f0c3a0',
2221
2306
  roughness: 0.9,
2222
2307
  metalness: 0,
2223
2308
  repeatX: 1,
@@ -2241,15 +2326,15 @@ export const MATERIAL_CATALOG = [
2241
2326
  },
2242
2327
  },
2243
2328
  {
2244
- id: 'preset-mustard',
2245
- label: 'Mustard',
2246
- category: 'other',
2247
- description: 'Warm mustard painted finish',
2248
- previewColor: '#c8a449',
2329
+ id: 'preset-terracotta',
2330
+ label: 'Terracotta',
2331
+ category: 'colors',
2332
+ description: 'Warm terracotta painted finish',
2333
+ previewColor: '#c86f4c',
2249
2334
  preset: {
2250
2335
  maps: {},
2251
2336
  mapProperties: {
2252
- color: '#c8a449',
2337
+ color: '#c86f4c',
2253
2338
  roughness: 0.9,
2254
2339
  metalness: 0,
2255
2340
  repeatX: 1,
@@ -2273,15 +2358,15 @@ export const MATERIAL_CATALOG = [
2273
2358
  },
2274
2359
  },
2275
2360
  {
2276
- id: 'preset-charcoal',
2277
- label: 'Charcoal',
2278
- category: 'other',
2279
- description: 'Dark charcoal painted finish',
2280
- previewColor: '#4e5257',
2361
+ id: 'preset-burntorange',
2362
+ label: 'Burnt orange',
2363
+ category: 'colors',
2364
+ description: 'Burnt orange painted finish',
2365
+ previewColor: '#b25a2c',
2281
2366
  preset: {
2282
2367
  maps: {},
2283
2368
  mapProperties: {
2284
- color: '#4e5257',
2369
+ color: '#b25a2c',
2285
2370
  roughness: 0.9,
2286
2371
  metalness: 0,
2287
2372
  repeatX: 1,
@@ -2305,17 +2390,17 @@ export const MATERIAL_CATALOG = [
2305
2390
  },
2306
2391
  },
2307
2392
  {
2308
- id: 'preset-metal',
2309
- label: 'Metal',
2310
- category: 'other',
2311
- description: 'Brushed metal finish',
2312
- previewColor: '#c0c0c0',
2393
+ id: 'preset-clay',
2394
+ label: 'Clay',
2395
+ category: 'colors',
2396
+ description: 'Deep clay painted finish',
2397
+ previewColor: '#8f4a2e',
2313
2398
  preset: {
2314
2399
  maps: {},
2315
2400
  mapProperties: {
2316
- color: '#c7ccd2',
2317
- roughness: 0.26,
2318
- metalness: 0.82,
2401
+ color: '#8f4a2e',
2402
+ roughness: 0.9,
2403
+ metalness: 0,
2319
2404
  repeatX: 1,
2320
2405
  repeatY: 1,
2321
2406
  rotation: 0,
@@ -2337,17 +2422,17 @@ export const MATERIAL_CATALOG = [
2337
2422
  },
2338
2423
  },
2339
2424
  {
2340
- id: 'preset-glass',
2341
- label: 'Glass',
2342
- category: 'other',
2343
- description: 'Light glass finish',
2344
- previewColor: '#87ceeb',
2425
+ id: 'preset-paleyellow',
2426
+ label: 'Pale yellow',
2427
+ category: 'colors',
2428
+ description: 'Pale yellow painted finish',
2429
+ previewColor: '#f2e3b3',
2345
2430
  preset: {
2346
2431
  maps: {},
2347
2432
  mapProperties: {
2348
- color: '#87ceeb',
2349
- roughness: 0.1,
2350
- metalness: 0.1,
2433
+ color: '#f2e3b3',
2434
+ roughness: 0.9,
2435
+ metalness: 0,
2351
2436
  repeatX: 1,
2352
2437
  repeatY: 1,
2353
2438
  rotation: 0,
@@ -2357,36 +2442,1743 @@ export const MATERIAL_CATALOG = [
2357
2442
  normalScaleY: 1,
2358
2443
  emissiveIntensity: 1,
2359
2444
  displacementScale: 0.02,
2360
- transparent: true,
2445
+ transparent: false,
2361
2446
  flipY: true,
2362
2447
  bumpScale: 1,
2363
2448
  emissiveColor: '#000000',
2364
2449
  aoMapIntensity: 1,
2365
- side: 2,
2366
- opacity: 0.3,
2450
+ side: 0,
2451
+ opacity: 1,
2367
2452
  lightMapIntensity: 1,
2368
2453
  },
2369
2454
  },
2370
2455
  },
2371
- ];
2372
- export function getMaterialsForCategory(category) {
2373
- return MATERIAL_CATALOG.filter((item) => item.category === category);
2374
- }
2375
- export function getCatalogMaterialById(id) {
2376
- if (!id)
2377
- return undefined;
2378
- return MATERIAL_CATALOG.find((item) => item.id === id);
2379
- }
2380
- export const LIBRARY_MATERIAL_REF_PREFIX = 'library:';
2381
- export function toLibraryMaterialRef(id) {
2382
- return `${LIBRARY_MATERIAL_REF_PREFIX}${id}`;
2383
- }
2384
- export function getLibraryMaterialIdFromRef(materialRef) {
2385
- if (!materialRef)
2386
- return null;
2387
- if (!materialRef.startsWith(LIBRARY_MATERIAL_REF_PREFIX))
2388
- return null;
2389
- return materialRef.slice(LIBRARY_MATERIAL_REF_PREFIX.length);
2456
+ {
2457
+ id: 'preset-mustard',
2458
+ label: 'Mustard',
2459
+ category: 'colors',
2460
+ description: 'Warm mustard painted finish',
2461
+ previewColor: '#c8a449',
2462
+ preset: {
2463
+ maps: {},
2464
+ mapProperties: {
2465
+ color: '#c8a449',
2466
+ roughness: 0.9,
2467
+ metalness: 0,
2468
+ repeatX: 1,
2469
+ repeatY: 1,
2470
+ rotation: 0,
2471
+ wrapS: 'Repeat',
2472
+ wrapT: 'Repeat',
2473
+ normalScaleX: 1,
2474
+ normalScaleY: 1,
2475
+ emissiveIntensity: 1,
2476
+ displacementScale: 0.02,
2477
+ transparent: false,
2478
+ flipY: true,
2479
+ bumpScale: 1,
2480
+ emissiveColor: '#000000',
2481
+ aoMapIntensity: 1,
2482
+ side: 0,
2483
+ opacity: 1,
2484
+ lightMapIntensity: 1,
2485
+ },
2486
+ },
2487
+ },
2488
+ {
2489
+ id: 'preset-ochre',
2490
+ label: 'Ochre',
2491
+ category: 'colors',
2492
+ description: 'Warm ochre painted finish',
2493
+ previewColor: '#b8852f',
2494
+ preset: {
2495
+ maps: {},
2496
+ mapProperties: {
2497
+ color: '#b8852f',
2498
+ roughness: 0.9,
2499
+ metalness: 0,
2500
+ repeatX: 1,
2501
+ repeatY: 1,
2502
+ rotation: 0,
2503
+ wrapS: 'Repeat',
2504
+ wrapT: 'Repeat',
2505
+ normalScaleX: 1,
2506
+ normalScaleY: 1,
2507
+ emissiveIntensity: 1,
2508
+ displacementScale: 0.02,
2509
+ transparent: false,
2510
+ flipY: true,
2511
+ bumpScale: 1,
2512
+ emissiveColor: '#000000',
2513
+ aoMapIntensity: 1,
2514
+ side: 0,
2515
+ opacity: 1,
2516
+ lightMapIntensity: 1,
2517
+ },
2518
+ },
2519
+ },
2520
+ {
2521
+ id: 'preset-gold',
2522
+ label: 'Gold',
2523
+ category: 'colors',
2524
+ description: 'Deep gold painted finish',
2525
+ previewColor: '#9c7320',
2526
+ preset: {
2527
+ maps: {},
2528
+ mapProperties: {
2529
+ color: '#9c7320',
2530
+ roughness: 0.9,
2531
+ metalness: 0,
2532
+ repeatX: 1,
2533
+ repeatY: 1,
2534
+ rotation: 0,
2535
+ wrapS: 'Repeat',
2536
+ wrapT: 'Repeat',
2537
+ normalScaleX: 1,
2538
+ normalScaleY: 1,
2539
+ emissiveIntensity: 1,
2540
+ displacementScale: 0.02,
2541
+ transparent: false,
2542
+ flipY: true,
2543
+ bumpScale: 1,
2544
+ emissiveColor: '#000000',
2545
+ aoMapIntensity: 1,
2546
+ side: 0,
2547
+ opacity: 1,
2548
+ lightMapIntensity: 1,
2549
+ },
2550
+ },
2551
+ },
2552
+ {
2553
+ id: 'preset-mint',
2554
+ label: 'Mint',
2555
+ category: 'colors',
2556
+ description: 'Soft mint painted finish',
2557
+ previewColor: '#cfe0cf',
2558
+ preset: {
2559
+ maps: {},
2560
+ mapProperties: {
2561
+ color: '#cfe0cf',
2562
+ roughness: 0.9,
2563
+ metalness: 0,
2564
+ repeatX: 1,
2565
+ repeatY: 1,
2566
+ rotation: 0,
2567
+ wrapS: 'Repeat',
2568
+ wrapT: 'Repeat',
2569
+ normalScaleX: 1,
2570
+ normalScaleY: 1,
2571
+ emissiveIntensity: 1,
2572
+ displacementScale: 0.02,
2573
+ transparent: false,
2574
+ flipY: true,
2575
+ bumpScale: 1,
2576
+ emissiveColor: '#000000',
2577
+ aoMapIntensity: 1,
2578
+ side: 0,
2579
+ opacity: 1,
2580
+ lightMapIntensity: 1,
2581
+ },
2582
+ },
2583
+ },
2584
+ {
2585
+ id: 'preset-sage',
2586
+ label: 'Sage',
2587
+ category: 'colors',
2588
+ description: 'Muted sage painted finish',
2589
+ previewColor: '#bcc5b2',
2590
+ preset: {
2591
+ maps: {},
2592
+ mapProperties: {
2593
+ color: '#bcc5b2',
2594
+ roughness: 0.9,
2595
+ metalness: 0,
2596
+ repeatX: 1,
2597
+ repeatY: 1,
2598
+ rotation: 0,
2599
+ wrapS: 'Repeat',
2600
+ wrapT: 'Repeat',
2601
+ normalScaleX: 1,
2602
+ normalScaleY: 1,
2603
+ emissiveIntensity: 1,
2604
+ displacementScale: 0.02,
2605
+ transparent: false,
2606
+ flipY: true,
2607
+ bumpScale: 1,
2608
+ emissiveColor: '#000000',
2609
+ aoMapIntensity: 1,
2610
+ side: 0,
2611
+ opacity: 1,
2612
+ lightMapIntensity: 1,
2613
+ },
2614
+ },
2615
+ },
2616
+ {
2617
+ id: 'preset-olive',
2618
+ label: 'Olive',
2619
+ category: 'colors',
2620
+ description: 'Natural olive painted finish',
2621
+ previewColor: '#8d9368',
2622
+ preset: {
2623
+ maps: {},
2624
+ mapProperties: {
2625
+ color: '#8d9368',
2626
+ roughness: 0.9,
2627
+ metalness: 0,
2628
+ repeatX: 1,
2629
+ repeatY: 1,
2630
+ rotation: 0,
2631
+ wrapS: 'Repeat',
2632
+ wrapT: 'Repeat',
2633
+ normalScaleX: 1,
2634
+ normalScaleY: 1,
2635
+ emissiveIntensity: 1,
2636
+ displacementScale: 0.02,
2637
+ transparent: false,
2638
+ flipY: true,
2639
+ bumpScale: 1,
2640
+ emissiveColor: '#000000',
2641
+ aoMapIntensity: 1,
2642
+ side: 0,
2643
+ opacity: 1,
2644
+ lightMapIntensity: 1,
2645
+ },
2646
+ },
2647
+ },
2648
+ {
2649
+ id: 'preset-forest',
2650
+ label: 'Forest',
2651
+ category: 'colors',
2652
+ description: 'Deep forest green painted finish',
2653
+ previewColor: '#4f6b57',
2654
+ preset: {
2655
+ maps: {},
2656
+ mapProperties: {
2657
+ color: '#4f6b57',
2658
+ roughness: 0.9,
2659
+ metalness: 0,
2660
+ repeatX: 1,
2661
+ repeatY: 1,
2662
+ rotation: 0,
2663
+ wrapS: 'Repeat',
2664
+ wrapT: 'Repeat',
2665
+ normalScaleX: 1,
2666
+ normalScaleY: 1,
2667
+ emissiveIntensity: 1,
2668
+ displacementScale: 0.02,
2669
+ transparent: false,
2670
+ flipY: true,
2671
+ bumpScale: 1,
2672
+ emissiveColor: '#000000',
2673
+ aoMapIntensity: 1,
2674
+ side: 0,
2675
+ opacity: 1,
2676
+ lightMapIntensity: 1,
2677
+ },
2678
+ },
2679
+ },
2680
+ {
2681
+ id: 'preset-paleteal',
2682
+ label: 'Pale teal',
2683
+ category: 'colors',
2684
+ description: 'Pale teal painted finish',
2685
+ previewColor: '#b9d2cf',
2686
+ preset: {
2687
+ maps: {},
2688
+ mapProperties: {
2689
+ color: '#b9d2cf',
2690
+ roughness: 0.9,
2691
+ metalness: 0,
2692
+ repeatX: 1,
2693
+ repeatY: 1,
2694
+ rotation: 0,
2695
+ wrapS: 'Repeat',
2696
+ wrapT: 'Repeat',
2697
+ normalScaleX: 1,
2698
+ normalScaleY: 1,
2699
+ emissiveIntensity: 1,
2700
+ displacementScale: 0.02,
2701
+ transparent: false,
2702
+ flipY: true,
2703
+ bumpScale: 1,
2704
+ emissiveColor: '#000000',
2705
+ aoMapIntensity: 1,
2706
+ side: 0,
2707
+ opacity: 1,
2708
+ lightMapIntensity: 1,
2709
+ },
2710
+ },
2711
+ },
2712
+ {
2713
+ id: 'preset-teal',
2714
+ label: 'Teal',
2715
+ category: 'colors',
2716
+ description: 'Balanced teal painted finish',
2717
+ previewColor: '#4f8a86',
2718
+ preset: {
2719
+ maps: {},
2720
+ mapProperties: {
2721
+ color: '#4f8a86',
2722
+ roughness: 0.9,
2723
+ metalness: 0,
2724
+ repeatX: 1,
2725
+ repeatY: 1,
2726
+ rotation: 0,
2727
+ wrapS: 'Repeat',
2728
+ wrapT: 'Repeat',
2729
+ normalScaleX: 1,
2730
+ normalScaleY: 1,
2731
+ emissiveIntensity: 1,
2732
+ displacementScale: 0.02,
2733
+ transparent: false,
2734
+ flipY: true,
2735
+ bumpScale: 1,
2736
+ emissiveColor: '#000000',
2737
+ aoMapIntensity: 1,
2738
+ side: 0,
2739
+ opacity: 1,
2740
+ lightMapIntensity: 1,
2741
+ },
2742
+ },
2743
+ },
2744
+ {
2745
+ id: 'preset-deepteal',
2746
+ label: 'Deep teal',
2747
+ category: 'colors',
2748
+ description: 'Deep teal painted finish',
2749
+ previewColor: '#2f5f5c',
2750
+ preset: {
2751
+ maps: {},
2752
+ mapProperties: {
2753
+ color: '#2f5f5c',
2754
+ roughness: 0.9,
2755
+ metalness: 0,
2756
+ repeatX: 1,
2757
+ repeatY: 1,
2758
+ rotation: 0,
2759
+ wrapS: 'Repeat',
2760
+ wrapT: 'Repeat',
2761
+ normalScaleX: 1,
2762
+ normalScaleY: 1,
2763
+ emissiveIntensity: 1,
2764
+ displacementScale: 0.02,
2765
+ transparent: false,
2766
+ flipY: true,
2767
+ bumpScale: 1,
2768
+ emissiveColor: '#000000',
2769
+ aoMapIntensity: 1,
2770
+ side: 0,
2771
+ opacity: 1,
2772
+ lightMapIntensity: 1,
2773
+ },
2774
+ },
2775
+ },
2776
+ {
2777
+ id: 'preset-powderblue',
2778
+ label: 'Powder blue',
2779
+ category: 'colors',
2780
+ description: 'Powder blue painted finish',
2781
+ previewColor: '#cddce8',
2782
+ preset: {
2783
+ maps: {},
2784
+ mapProperties: {
2785
+ color: '#cddce8',
2786
+ roughness: 0.9,
2787
+ metalness: 0,
2788
+ repeatX: 1,
2789
+ repeatY: 1,
2790
+ rotation: 0,
2791
+ wrapS: 'Repeat',
2792
+ wrapT: 'Repeat',
2793
+ normalScaleX: 1,
2794
+ normalScaleY: 1,
2795
+ emissiveIntensity: 1,
2796
+ displacementScale: 0.02,
2797
+ transparent: false,
2798
+ flipY: true,
2799
+ bumpScale: 1,
2800
+ emissiveColor: '#000000',
2801
+ aoMapIntensity: 1,
2802
+ side: 0,
2803
+ opacity: 1,
2804
+ lightMapIntensity: 1,
2805
+ },
2806
+ },
2807
+ },
2808
+ {
2809
+ id: 'preset-softblue',
2810
+ label: 'Soft Blue',
2811
+ category: 'colors',
2812
+ description: 'Muted blue painted finish',
2813
+ previewColor: '#c7d6e3',
2814
+ preset: {
2815
+ maps: {},
2816
+ mapProperties: {
2817
+ color: '#c7d6e3',
2818
+ roughness: 0.9,
2819
+ metalness: 0,
2820
+ repeatX: 1,
2821
+ repeatY: 1,
2822
+ rotation: 0,
2823
+ wrapS: 'Repeat',
2824
+ wrapT: 'Repeat',
2825
+ normalScaleX: 1,
2826
+ normalScaleY: 1,
2827
+ emissiveIntensity: 1,
2828
+ displacementScale: 0.02,
2829
+ transparent: false,
2830
+ flipY: true,
2831
+ bumpScale: 1,
2832
+ emissiveColor: '#000000',
2833
+ aoMapIntensity: 1,
2834
+ side: 0,
2835
+ opacity: 1,
2836
+ lightMapIntensity: 1,
2837
+ },
2838
+ },
2839
+ },
2840
+ {
2841
+ id: 'preset-sky',
2842
+ label: 'Sky',
2843
+ category: 'colors',
2844
+ description: 'Sky blue painted finish',
2845
+ previewColor: '#8fb4d4',
2846
+ preset: {
2847
+ maps: {},
2848
+ mapProperties: {
2849
+ color: '#8fb4d4',
2850
+ roughness: 0.9,
2851
+ metalness: 0,
2852
+ repeatX: 1,
2853
+ repeatY: 1,
2854
+ rotation: 0,
2855
+ wrapS: 'Repeat',
2856
+ wrapT: 'Repeat',
2857
+ normalScaleX: 1,
2858
+ normalScaleY: 1,
2859
+ emissiveIntensity: 1,
2860
+ displacementScale: 0.02,
2861
+ transparent: false,
2862
+ flipY: true,
2863
+ bumpScale: 1,
2864
+ emissiveColor: '#000000',
2865
+ aoMapIntensity: 1,
2866
+ side: 0,
2867
+ opacity: 1,
2868
+ lightMapIntensity: 1,
2869
+ },
2870
+ },
2871
+ },
2872
+ {
2873
+ id: 'preset-slateblue',
2874
+ label: 'Slate Blue',
2875
+ category: 'colors',
2876
+ description: 'Muted slate blue painted finish',
2877
+ previewColor: '#6f87a4',
2878
+ preset: {
2879
+ maps: {},
2880
+ mapProperties: {
2881
+ color: '#6f87a4',
2882
+ roughness: 0.9,
2883
+ metalness: 0,
2884
+ repeatX: 1,
2885
+ repeatY: 1,
2886
+ rotation: 0,
2887
+ wrapS: 'Repeat',
2888
+ wrapT: 'Repeat',
2889
+ normalScaleX: 1,
2890
+ normalScaleY: 1,
2891
+ emissiveIntensity: 1,
2892
+ displacementScale: 0.02,
2893
+ transparent: false,
2894
+ flipY: true,
2895
+ bumpScale: 1,
2896
+ emissiveColor: '#000000',
2897
+ aoMapIntensity: 1,
2898
+ side: 0,
2899
+ opacity: 1,
2900
+ lightMapIntensity: 1,
2901
+ },
2902
+ },
2903
+ },
2904
+ {
2905
+ id: 'preset-royalblue',
2906
+ label: 'Royal blue',
2907
+ category: 'colors',
2908
+ description: 'Royal blue painted finish',
2909
+ previewColor: '#3a5a9c',
2910
+ preset: {
2911
+ maps: {},
2912
+ mapProperties: {
2913
+ color: '#3a5a9c',
2914
+ roughness: 0.9,
2915
+ metalness: 0,
2916
+ repeatX: 1,
2917
+ repeatY: 1,
2918
+ rotation: 0,
2919
+ wrapS: 'Repeat',
2920
+ wrapT: 'Repeat',
2921
+ normalScaleX: 1,
2922
+ normalScaleY: 1,
2923
+ emissiveIntensity: 1,
2924
+ displacementScale: 0.02,
2925
+ transparent: false,
2926
+ flipY: true,
2927
+ bumpScale: 1,
2928
+ emissiveColor: '#000000',
2929
+ aoMapIntensity: 1,
2930
+ side: 0,
2931
+ opacity: 1,
2932
+ lightMapIntensity: 1,
2933
+ },
2934
+ },
2935
+ },
2936
+ {
2937
+ id: 'preset-navy',
2938
+ label: 'Navy',
2939
+ category: 'colors',
2940
+ description: 'Classic navy painted finish',
2941
+ previewColor: '#2f4865',
2942
+ preset: {
2943
+ maps: {},
2944
+ mapProperties: {
2945
+ color: '#2f4865',
2946
+ roughness: 0.9,
2947
+ metalness: 0,
2948
+ repeatX: 1,
2949
+ repeatY: 1,
2950
+ rotation: 0,
2951
+ wrapS: 'Repeat',
2952
+ wrapT: 'Repeat',
2953
+ normalScaleX: 1,
2954
+ normalScaleY: 1,
2955
+ emissiveIntensity: 1,
2956
+ displacementScale: 0.02,
2957
+ transparent: false,
2958
+ flipY: true,
2959
+ bumpScale: 1,
2960
+ emissiveColor: '#000000',
2961
+ aoMapIntensity: 1,
2962
+ side: 0,
2963
+ opacity: 1,
2964
+ lightMapIntensity: 1,
2965
+ },
2966
+ },
2967
+ },
2968
+ {
2969
+ id: 'preset-lavender',
2970
+ label: 'Lavender',
2971
+ category: 'colors',
2972
+ description: 'Soft lavender painted finish',
2973
+ previewColor: '#c9c2da',
2974
+ preset: {
2975
+ maps: {},
2976
+ mapProperties: {
2977
+ color: '#c9c2da',
2978
+ roughness: 0.9,
2979
+ metalness: 0,
2980
+ repeatX: 1,
2981
+ repeatY: 1,
2982
+ rotation: 0,
2983
+ wrapS: 'Repeat',
2984
+ wrapT: 'Repeat',
2985
+ normalScaleX: 1,
2986
+ normalScaleY: 1,
2987
+ emissiveIntensity: 1,
2988
+ displacementScale: 0.02,
2989
+ transparent: false,
2990
+ flipY: true,
2991
+ bumpScale: 1,
2992
+ emissiveColor: '#000000',
2993
+ aoMapIntensity: 1,
2994
+ side: 0,
2995
+ opacity: 1,
2996
+ lightMapIntensity: 1,
2997
+ },
2998
+ },
2999
+ },
3000
+ {
3001
+ id: 'preset-plum',
3002
+ label: 'Plum',
3003
+ category: 'colors',
3004
+ description: 'Muted plum painted finish',
3005
+ previewColor: '#6d4a63',
3006
+ preset: {
3007
+ maps: {},
3008
+ mapProperties: {
3009
+ color: '#6d4a63',
3010
+ roughness: 0.9,
3011
+ metalness: 0,
3012
+ repeatX: 1,
3013
+ repeatY: 1,
3014
+ rotation: 0,
3015
+ wrapS: 'Repeat',
3016
+ wrapT: 'Repeat',
3017
+ normalScaleX: 1,
3018
+ normalScaleY: 1,
3019
+ emissiveIntensity: 1,
3020
+ displacementScale: 0.02,
3021
+ transparent: false,
3022
+ flipY: true,
3023
+ bumpScale: 1,
3024
+ emissiveColor: '#000000',
3025
+ aoMapIntensity: 1,
3026
+ side: 0,
3027
+ opacity: 1,
3028
+ lightMapIntensity: 1,
3029
+ },
3030
+ },
3031
+ },
3032
+ {
3033
+ id: 'preset-aubergine',
3034
+ label: 'Aubergine',
3035
+ category: 'colors',
3036
+ description: 'Deep aubergine painted finish',
3037
+ previewColor: '#594354',
3038
+ preset: {
3039
+ maps: {},
3040
+ mapProperties: {
3041
+ color: '#594354',
3042
+ roughness: 0.9,
3043
+ metalness: 0,
3044
+ repeatX: 1,
3045
+ repeatY: 1,
3046
+ rotation: 0,
3047
+ wrapS: 'Repeat',
3048
+ wrapT: 'Repeat',
3049
+ normalScaleX: 1,
3050
+ normalScaleY: 1,
3051
+ emissiveIntensity: 1,
3052
+ displacementScale: 0.02,
3053
+ transparent: false,
3054
+ flipY: true,
3055
+ bumpScale: 1,
3056
+ emissiveColor: '#000000',
3057
+ aoMapIntensity: 1,
3058
+ side: 0,
3059
+ opacity: 1,
3060
+ lightMapIntensity: 1,
3061
+ },
3062
+ },
3063
+ },
3064
+ {
3065
+ id: 'preset-petal',
3066
+ label: 'Petal',
3067
+ category: 'colors',
3068
+ description: 'Pale petal pink painted finish',
3069
+ previewColor: '#f0d3da',
3070
+ preset: {
3071
+ maps: {},
3072
+ mapProperties: {
3073
+ color: '#f0d3da',
3074
+ roughness: 0.9,
3075
+ metalness: 0,
3076
+ repeatX: 1,
3077
+ repeatY: 1,
3078
+ rotation: 0,
3079
+ wrapS: 'Repeat',
3080
+ wrapT: 'Repeat',
3081
+ normalScaleX: 1,
3082
+ normalScaleY: 1,
3083
+ emissiveIntensity: 1,
3084
+ displacementScale: 0.02,
3085
+ transparent: false,
3086
+ flipY: true,
3087
+ bumpScale: 1,
3088
+ emissiveColor: '#000000',
3089
+ aoMapIntensity: 1,
3090
+ side: 0,
3091
+ opacity: 1,
3092
+ lightMapIntensity: 1,
3093
+ },
3094
+ },
3095
+ },
3096
+ {
3097
+ id: 'preset-rose',
3098
+ label: 'Rose',
3099
+ category: 'colors',
3100
+ description: 'Muted rose painted finish',
3101
+ previewColor: '#cf8fa6',
3102
+ preset: {
3103
+ maps: {},
3104
+ mapProperties: {
3105
+ color: '#cf8fa6',
3106
+ roughness: 0.9,
3107
+ metalness: 0,
3108
+ repeatX: 1,
3109
+ repeatY: 1,
3110
+ rotation: 0,
3111
+ wrapS: 'Repeat',
3112
+ wrapT: 'Repeat',
3113
+ normalScaleX: 1,
3114
+ normalScaleY: 1,
3115
+ emissiveIntensity: 1,
3116
+ displacementScale: 0.02,
3117
+ transparent: false,
3118
+ flipY: true,
3119
+ bumpScale: 1,
3120
+ emissiveColor: '#000000',
3121
+ aoMapIntensity: 1,
3122
+ side: 0,
3123
+ opacity: 1,
3124
+ lightMapIntensity: 1,
3125
+ },
3126
+ },
3127
+ },
3128
+ {
3129
+ id: 'preset-dustyrose',
3130
+ label: 'Dusty Rose',
3131
+ category: 'colors',
3132
+ description: 'Muted rose painted finish',
3133
+ previewColor: '#c48a8d',
3134
+ preset: {
3135
+ maps: {},
3136
+ mapProperties: {
3137
+ color: '#c48a8d',
3138
+ roughness: 0.9,
3139
+ metalness: 0,
3140
+ repeatX: 1,
3141
+ repeatY: 1,
3142
+ rotation: 0,
3143
+ wrapS: 'Repeat',
3144
+ wrapT: 'Repeat',
3145
+ normalScaleX: 1,
3146
+ normalScaleY: 1,
3147
+ emissiveIntensity: 1,
3148
+ displacementScale: 0.02,
3149
+ transparent: false,
3150
+ flipY: true,
3151
+ bumpScale: 1,
3152
+ emissiveColor: '#000000',
3153
+ aoMapIntensity: 1,
3154
+ side: 0,
3155
+ opacity: 1,
3156
+ lightMapIntensity: 1,
3157
+ },
3158
+ },
3159
+ },
3160
+ {
3161
+ id: 'preset-berry',
3162
+ label: 'Berry',
3163
+ category: 'colors',
3164
+ description: 'Deep berry painted finish',
3165
+ previewColor: '#8f4a5a',
3166
+ preset: {
3167
+ maps: {},
3168
+ mapProperties: {
3169
+ color: '#8f4a5a',
3170
+ roughness: 0.9,
3171
+ metalness: 0,
3172
+ repeatX: 1,
3173
+ repeatY: 1,
3174
+ rotation: 0,
3175
+ wrapS: 'Repeat',
3176
+ wrapT: 'Repeat',
3177
+ normalScaleX: 1,
3178
+ normalScaleY: 1,
3179
+ emissiveIntensity: 1,
3180
+ displacementScale: 0.02,
3181
+ transparent: false,
3182
+ flipY: true,
3183
+ bumpScale: 1,
3184
+ emissiveColor: '#000000',
3185
+ aoMapIntensity: 1,
3186
+ side: 0,
3187
+ opacity: 1,
3188
+ lightMapIntensity: 1,
3189
+ },
3190
+ },
3191
+ },
3192
+ {
3193
+ id: 'preset-sand',
3194
+ label: 'Sand',
3195
+ category: 'colors',
3196
+ description: 'Warm sand painted finish',
3197
+ previewColor: '#ddccae',
3198
+ preset: {
3199
+ maps: {},
3200
+ mapProperties: {
3201
+ color: '#ddccae',
3202
+ roughness: 0.9,
3203
+ metalness: 0,
3204
+ repeatX: 1,
3205
+ repeatY: 1,
3206
+ rotation: 0,
3207
+ wrapS: 'Repeat',
3208
+ wrapT: 'Repeat',
3209
+ normalScaleX: 1,
3210
+ normalScaleY: 1,
3211
+ emissiveIntensity: 1,
3212
+ displacementScale: 0.02,
3213
+ transparent: false,
3214
+ flipY: true,
3215
+ bumpScale: 1,
3216
+ emissiveColor: '#000000',
3217
+ aoMapIntensity: 1,
3218
+ side: 0,
3219
+ opacity: 1,
3220
+ lightMapIntensity: 1,
3221
+ },
3222
+ },
3223
+ },
3224
+ {
3225
+ id: 'preset-tan',
3226
+ label: 'Tan',
3227
+ category: 'colors',
3228
+ description: 'Natural tan painted finish',
3229
+ previewColor: '#c4a87f',
3230
+ preset: {
3231
+ maps: {},
3232
+ mapProperties: {
3233
+ color: '#c4a87f',
3234
+ roughness: 0.9,
3235
+ metalness: 0,
3236
+ repeatX: 1,
3237
+ repeatY: 1,
3238
+ rotation: 0,
3239
+ wrapS: 'Repeat',
3240
+ wrapT: 'Repeat',
3241
+ normalScaleX: 1,
3242
+ normalScaleY: 1,
3243
+ emissiveIntensity: 1,
3244
+ displacementScale: 0.02,
3245
+ transparent: false,
3246
+ flipY: true,
3247
+ bumpScale: 1,
3248
+ emissiveColor: '#000000',
3249
+ aoMapIntensity: 1,
3250
+ side: 0,
3251
+ opacity: 1,
3252
+ lightMapIntensity: 1,
3253
+ },
3254
+ },
3255
+ },
3256
+ {
3257
+ id: 'preset-taupe',
3258
+ label: 'Taupe',
3259
+ category: 'colors',
3260
+ description: 'Earthy taupe painted finish',
3261
+ previewColor: '#8f7a64',
3262
+ preset: {
3263
+ maps: {},
3264
+ mapProperties: {
3265
+ color: '#8f7a64',
3266
+ roughness: 0.9,
3267
+ metalness: 0,
3268
+ repeatX: 1,
3269
+ repeatY: 1,
3270
+ rotation: 0,
3271
+ wrapS: 'Repeat',
3272
+ wrapT: 'Repeat',
3273
+ normalScaleX: 1,
3274
+ normalScaleY: 1,
3275
+ emissiveIntensity: 1,
3276
+ displacementScale: 0.02,
3277
+ transparent: false,
3278
+ flipY: true,
3279
+ bumpScale: 1,
3280
+ emissiveColor: '#000000',
3281
+ aoMapIntensity: 1,
3282
+ side: 0,
3283
+ opacity: 1,
3284
+ lightMapIntensity: 1,
3285
+ },
3286
+ },
3287
+ },
3288
+ {
3289
+ id: 'preset-espresso',
3290
+ label: 'Espresso',
3291
+ category: 'colors',
3292
+ description: 'Dark espresso painted finish',
3293
+ previewColor: '#4a382c',
3294
+ preset: {
3295
+ maps: {},
3296
+ mapProperties: {
3297
+ color: '#4a382c',
3298
+ roughness: 0.9,
3299
+ metalness: 0,
3300
+ repeatX: 1,
3301
+ repeatY: 1,
3302
+ rotation: 0,
3303
+ wrapS: 'Repeat',
3304
+ wrapT: 'Repeat',
3305
+ normalScaleX: 1,
3306
+ normalScaleY: 1,
3307
+ emissiveIntensity: 1,
3308
+ displacementScale: 0.02,
3309
+ transparent: false,
3310
+ flipY: true,
3311
+ bumpScale: 1,
3312
+ emissiveColor: '#000000',
3313
+ aoMapIntensity: 1,
3314
+ side: 0,
3315
+ opacity: 1,
3316
+ lightMapIntensity: 1,
3317
+ },
3318
+ },
3319
+ },
3320
+ {
3321
+ id: 'preset-metal',
3322
+ label: 'Metal',
3323
+ category: 'metal',
3324
+ surfaces: ['furniture', 'wall'],
3325
+ description: 'Brushed metal finish',
3326
+ previewColor: '#c0c0c0',
3327
+ preset: {
3328
+ maps: {},
3329
+ mapProperties: {
3330
+ color: '#c7ccd2',
3331
+ roughness: 0.26,
3332
+ metalness: 0.82,
3333
+ repeatX: 1,
3334
+ repeatY: 1,
3335
+ rotation: 0,
3336
+ wrapS: 'Repeat',
3337
+ wrapT: 'Repeat',
3338
+ normalScaleX: 1,
3339
+ normalScaleY: 1,
3340
+ emissiveIntensity: 1,
3341
+ displacementScale: 0.02,
3342
+ transparent: false,
3343
+ flipY: true,
3344
+ bumpScale: 1,
3345
+ emissiveColor: '#000000',
3346
+ aoMapIntensity: 1,
3347
+ side: 0,
3348
+ opacity: 1,
3349
+ lightMapIntensity: 1,
3350
+ },
3351
+ },
3352
+ },
3353
+ {
3354
+ id: 'preset-glass',
3355
+ label: 'Glass',
3356
+ category: 'glass',
3357
+ description: 'Light glass finish',
3358
+ previewColor: '#87ceeb',
3359
+ preset: {
3360
+ maps: {},
3361
+ mapProperties: {
3362
+ color: '#87ceeb',
3363
+ roughness: 0.1,
3364
+ metalness: 0.1,
3365
+ repeatX: 1,
3366
+ repeatY: 1,
3367
+ rotation: 0,
3368
+ wrapS: 'Repeat',
3369
+ wrapT: 'Repeat',
3370
+ normalScaleX: 1,
3371
+ normalScaleY: 1,
3372
+ emissiveIntensity: 1,
3373
+ displacementScale: 0.02,
3374
+ transparent: true,
3375
+ flipY: true,
3376
+ bumpScale: 1,
3377
+ emissiveColor: '#000000',
3378
+ aoMapIntensity: 1,
3379
+ // FrontSide — DoubleSide on a NodeMaterial poisons the WebGPU MRT scene
3380
+ // pass (window/door glass relies on this). It's the only glass we use.
3381
+ side: 0,
3382
+ opacity: 0.3,
3383
+ lightMapIntensity: 1,
3384
+ },
3385
+ },
3386
+ },
3387
+ {
3388
+ id: 'fabric-linen',
3389
+ label: 'Linen',
3390
+ category: 'fabric',
3391
+ surfaces: ['furniture', 'wall'],
3392
+ description: 'Natural linen weave',
3393
+ previewThumbnailUrl: '/material/fabric/linen_hikari_fabric/linen_hikari_fabric_thumb.webp',
3394
+ preset: {
3395
+ maps: {
3396
+ albedoMap: '/material/fabric/linen_hikari_fabric/linen_hikari_fabric_basecolor_512.ktx2',
3397
+ normalMap: '/material/fabric/linen_hikari_fabric/linen_hikari_fabric_normal_512.ktx2',
3398
+ },
3399
+ mapProperties: {
3400
+ color: '#ffffff',
3401
+ roughness: 0.85,
3402
+ metalness: 0,
3403
+ repeatX: 2,
3404
+ repeatY: 2,
3405
+ rotation: 0,
3406
+ wrapS: 'Repeat',
3407
+ wrapT: 'Repeat',
3408
+ normalScaleX: 1,
3409
+ normalScaleY: 1,
3410
+ emissiveIntensity: 1,
3411
+ displacementScale: 0,
3412
+ transparent: false,
3413
+ flipY: false,
3414
+ bumpScale: 1,
3415
+ emissiveColor: '#000000',
3416
+ aoMapIntensity: 1,
3417
+ side: 0,
3418
+ opacity: 1,
3419
+ lightMapIntensity: 1,
3420
+ },
3421
+ },
3422
+ },
3423
+ {
3424
+ id: 'fabric-cotton',
3425
+ label: 'Cotton',
3426
+ category: 'fabric',
3427
+ surfaces: ['furniture', 'wall'],
3428
+ description: 'Plain cotton weave',
3429
+ previewThumbnailUrl: '/material/fabric/blue_cotton/blue_cotton_thumb.webp',
3430
+ preset: {
3431
+ maps: {
3432
+ albedoMap: '/material/fabric/blue_cotton/blue_cotton_basecolor_512.ktx2',
3433
+ normalMap: '/material/fabric/blue_cotton/blue_cotton_normal_512.ktx2',
3434
+ roughnessMap: '/material/fabric/blue_cotton/blue_cotton_roughness_512.ktx2',
3435
+ aoMap: '/material/fabric/blue_cotton/blue_cotton_ao_512.ktx2',
3436
+ },
3437
+ mapProperties: {
3438
+ color: '#ffffff',
3439
+ roughness: 0.85,
3440
+ metalness: 0,
3441
+ repeatX: 2,
3442
+ repeatY: 2,
3443
+ rotation: 0,
3444
+ wrapS: 'Repeat',
3445
+ wrapT: 'Repeat',
3446
+ normalScaleX: 1,
3447
+ normalScaleY: 1,
3448
+ emissiveIntensity: 1,
3449
+ displacementScale: 0,
3450
+ transparent: false,
3451
+ flipY: false,
3452
+ bumpScale: 1,
3453
+ emissiveColor: '#000000',
3454
+ aoMapIntensity: 1,
3455
+ side: 0,
3456
+ opacity: 1,
3457
+ lightMapIntensity: 1,
3458
+ },
3459
+ },
3460
+ },
3461
+ {
3462
+ id: 'fabric-velvet',
3463
+ label: 'Velvet',
3464
+ category: 'fabric',
3465
+ surfaces: ['furniture'],
3466
+ description: 'Velvet with a soft sheen',
3467
+ previewThumbnailUrl: '/material/fabric/red_velvet/red_velvet_thumb.webp',
3468
+ preset: {
3469
+ maps: {
3470
+ albedoMap: '/material/fabric/red_velvet/red_velvet_basecolor_512.ktx2',
3471
+ normalMap: '/material/fabric/red_velvet/red_velvet_normal_512.ktx2',
3472
+ roughnessMap: '/material/fabric/red_velvet/red_velvet_roughness_512.ktx2',
3473
+ aoMap: '/material/fabric/red_velvet/red_velvet_ao_512.ktx2',
3474
+ },
3475
+ mapProperties: {
3476
+ color: '#ffffff',
3477
+ roughness: 0.6,
3478
+ metalness: 0,
3479
+ repeatX: 2.5,
3480
+ repeatY: 2.5,
3481
+ rotation: 0,
3482
+ wrapS: 'Repeat',
3483
+ wrapT: 'Repeat',
3484
+ normalScaleX: 1,
3485
+ normalScaleY: 1,
3486
+ emissiveIntensity: 1,
3487
+ displacementScale: 0,
3488
+ transparent: false,
3489
+ flipY: false,
3490
+ bumpScale: 1,
3491
+ emissiveColor: '#000000',
3492
+ aoMapIntensity: 1,
3493
+ side: 0,
3494
+ opacity: 1,
3495
+ lightMapIntensity: 1,
3496
+ },
3497
+ },
3498
+ },
3499
+ {
3500
+ id: 'fabric-wool',
3501
+ label: 'Wool',
3502
+ category: 'fabric',
3503
+ surfaces: ['furniture'],
3504
+ description: 'Matte wool felt',
3505
+ previewThumbnailUrl: '/material/fabric/white_wool/white_wool_thumb.webp',
3506
+ preset: {
3507
+ maps: {
3508
+ albedoMap: '/material/fabric/white_wool/white_wool_basecolor_512.ktx2',
3509
+ normalMap: '/material/fabric/white_wool/white_wool_normal_512.ktx2',
3510
+ roughnessMap: '/material/fabric/white_wool/white_wool_roughness_512.ktx2',
3511
+ aoMap: '/material/fabric/white_wool/white_wool_ao_512.ktx2',
3512
+ },
3513
+ mapProperties: {
3514
+ color: '#ffffff',
3515
+ roughness: 0.9,
3516
+ metalness: 0,
3517
+ repeatX: 2.5,
3518
+ repeatY: 2.5,
3519
+ rotation: 0,
3520
+ wrapS: 'Repeat',
3521
+ wrapT: 'Repeat',
3522
+ normalScaleX: 1,
3523
+ normalScaleY: 1,
3524
+ emissiveIntensity: 1,
3525
+ displacementScale: 0,
3526
+ transparent: false,
3527
+ flipY: false,
3528
+ bumpScale: 1,
3529
+ emissiveColor: '#000000',
3530
+ aoMapIntensity: 1,
3531
+ side: 0,
3532
+ opacity: 1,
3533
+ lightMapIntensity: 1,
3534
+ },
3535
+ },
3536
+ },
3537
+ {
3538
+ id: 'fabric-suede',
3539
+ label: 'Suede',
3540
+ category: 'fabric',
3541
+ surfaces: ['furniture'],
3542
+ description: 'Matte suede nap',
3543
+ previewThumbnailUrl: '/material/fabric/suede/suede_thumb.webp',
3544
+ preset: {
3545
+ maps: {
3546
+ albedoMap: '/material/fabric/suede/suede_basecolor_512.ktx2',
3547
+ normalMap: '/material/fabric/suede/suede_normal_512.ktx2',
3548
+ roughnessMap: '/material/fabric/suede/suede_roughness_512.ktx2',
3549
+ aoMap: '/material/fabric/suede/suede_ao_512.ktx2',
3550
+ },
3551
+ mapProperties: {
3552
+ color: '#ffffff',
3553
+ roughness: 0.9,
3554
+ metalness: 0,
3555
+ repeatX: 2,
3556
+ repeatY: 2,
3557
+ rotation: 0,
3558
+ wrapS: 'Repeat',
3559
+ wrapT: 'Repeat',
3560
+ normalScaleX: 1,
3561
+ normalScaleY: 1,
3562
+ emissiveIntensity: 1,
3563
+ displacementScale: 0,
3564
+ transparent: false,
3565
+ flipY: false,
3566
+ bumpScale: 1,
3567
+ emissiveColor: '#000000',
3568
+ aoMapIntensity: 1,
3569
+ side: 0,
3570
+ opacity: 1,
3571
+ lightMapIntensity: 1,
3572
+ },
3573
+ },
3574
+ },
3575
+ {
3576
+ id: 'fabric-boucle',
3577
+ label: 'Bouclé',
3578
+ category: 'fabric',
3579
+ surfaces: ['furniture'],
3580
+ description: 'Looped bouclé upholstery',
3581
+ previewThumbnailUrl: '/material/fabric/wool_boucle/wool_boucle_thumb.webp',
3582
+ preset: {
3583
+ maps: {
3584
+ albedoMap: '/material/fabric/wool_boucle/wool_boucle_basecolor_512.ktx2',
3585
+ normalMap: '/material/fabric/wool_boucle/wool_boucle_normal_512.ktx2',
3586
+ },
3587
+ mapProperties: {
3588
+ color: '#ffffff',
3589
+ roughness: 0.9,
3590
+ metalness: 0,
3591
+ repeatX: 3.3,
3592
+ repeatY: 3.3,
3593
+ rotation: 0,
3594
+ wrapS: 'Repeat',
3595
+ wrapT: 'Repeat',
3596
+ normalScaleX: 1,
3597
+ normalScaleY: 1,
3598
+ emissiveIntensity: 1,
3599
+ displacementScale: 0,
3600
+ transparent: false,
3601
+ flipY: false,
3602
+ bumpScale: 1,
3603
+ emissiveColor: '#000000',
3604
+ aoMapIntensity: 1,
3605
+ side: 0,
3606
+ opacity: 1,
3607
+ lightMapIntensity: 1,
3608
+ },
3609
+ },
3610
+ },
3611
+ {
3612
+ id: 'leather-black',
3613
+ label: 'Black Leather',
3614
+ category: 'leather',
3615
+ surfaces: ['furniture'],
3616
+ description: 'Smooth black leather',
3617
+ previewThumbnailUrl: '/material/leather/black_leather/black_leather_thumb.webp',
3618
+ preset: {
3619
+ maps: {
3620
+ albedoMap: '/material/leather/black_leather/black_leather_basecolor_512.ktx2',
3621
+ normalMap: '/material/leather/black_leather/black_leather_normal_512.ktx2',
3622
+ roughnessMap: '/material/leather/black_leather/black_leather_roughness_512.ktx2',
3623
+ },
3624
+ mapProperties: {
3625
+ color: '#ffffff',
3626
+ roughness: 0.5,
3627
+ metalness: 0,
3628
+ repeatX: 1.67,
3629
+ repeatY: 1.67,
3630
+ rotation: 0,
3631
+ wrapS: 'Repeat',
3632
+ wrapT: 'Repeat',
3633
+ normalScaleX: 1,
3634
+ normalScaleY: 1,
3635
+ emissiveIntensity: 1,
3636
+ displacementScale: 0,
3637
+ transparent: false,
3638
+ flipY: false,
3639
+ bumpScale: 1,
3640
+ emissiveColor: '#000000',
3641
+ aoMapIntensity: 1,
3642
+ side: 0,
3643
+ opacity: 1,
3644
+ lightMapIntensity: 1,
3645
+ },
3646
+ },
3647
+ },
3648
+ {
3649
+ id: 'leather-calf',
3650
+ label: 'Calf Leather',
3651
+ category: 'leather',
3652
+ surfaces: ['furniture'],
3653
+ description: 'Pebbled calf leather',
3654
+ previewThumbnailUrl: '/material/leather/calf_leather/calf_leather_thumb.webp',
3655
+ preset: {
3656
+ maps: {
3657
+ albedoMap: '/material/leather/calf_leather/calf_leather_basecolor_512.ktx2',
3658
+ normalMap: '/material/leather/calf_leather/calf_leather_normal_512.ktx2',
3659
+ roughnessMap: '/material/leather/calf_leather/calf_leather_roughness_512.ktx2',
3660
+ aoMap: '/material/leather/calf_leather/calf_leather_ao_512.ktx2',
3661
+ },
3662
+ mapProperties: {
3663
+ color: '#ffffff',
3664
+ roughness: 0.5,
3665
+ metalness: 0,
3666
+ repeatX: 2,
3667
+ repeatY: 2,
3668
+ rotation: 0,
3669
+ wrapS: 'Repeat',
3670
+ wrapT: 'Repeat',
3671
+ normalScaleX: 1,
3672
+ normalScaleY: 1,
3673
+ emissiveIntensity: 1,
3674
+ displacementScale: 0,
3675
+ transparent: false,
3676
+ flipY: false,
3677
+ bumpScale: 1,
3678
+ emissiveColor: '#000000',
3679
+ aoMapIntensity: 1,
3680
+ side: 0,
3681
+ opacity: 1,
3682
+ lightMapIntensity: 1,
3683
+ },
3684
+ },
3685
+ },
3686
+ {
3687
+ id: 'concrete-plaster',
3688
+ label: 'Painted Plaster',
3689
+ category: 'concrete',
3690
+ surfaces: ['wall', 'ceiling'],
3691
+ description: 'Smooth painted plaster wall',
3692
+ previewThumbnailUrl: '/material/concrete/plaster_painted/plaster_painted_thumb.webp',
3693
+ preset: {
3694
+ maps: {
3695
+ albedoMap: '/material/concrete/plaster_painted/plaster_painted_basecolor_512.ktx2',
3696
+ normalMap: '/material/concrete/plaster_painted/plaster_painted_normal_512.ktx2',
3697
+ roughnessMap: '/material/concrete/plaster_painted/plaster_painted_roughness_512.ktx2',
3698
+ aoMap: '/material/concrete/plaster_painted/plaster_painted_ao_512.ktx2',
3699
+ },
3700
+ mapProperties: {
3701
+ color: '#ffffff',
3702
+ roughness: 0.85,
3703
+ metalness: 0,
3704
+ repeatX: 0.67,
3705
+ repeatY: 0.67,
3706
+ rotation: 0,
3707
+ wrapS: 'Repeat',
3708
+ wrapT: 'Repeat',
3709
+ normalScaleX: 1,
3710
+ normalScaleY: 1,
3711
+ emissiveIntensity: 1,
3712
+ displacementScale: 0,
3713
+ transparent: false,
3714
+ flipY: false,
3715
+ bumpScale: 1,
3716
+ emissiveColor: '#000000',
3717
+ aoMapIntensity: 1,
3718
+ side: 0,
3719
+ opacity: 1,
3720
+ lightMapIntensity: 1,
3721
+ },
3722
+ },
3723
+ },
3724
+ {
3725
+ id: 'concrete-polished',
3726
+ label: 'Polished Concrete',
3727
+ category: 'concrete',
3728
+ surfaces: ['floor', 'wall'],
3729
+ description: 'Polished concrete floor',
3730
+ previewThumbnailUrl: '/material/concrete/concrete_polished/concrete_polished_thumb.webp',
3731
+ preset: {
3732
+ maps: {
3733
+ albedoMap: '/material/concrete/concrete_polished/concrete_polished_basecolor_512.ktx2',
3734
+ normalMap: '/material/concrete/concrete_polished/concrete_polished_normal_512.ktx2',
3735
+ roughnessMap: '/material/concrete/concrete_polished/concrete_polished_roughness_512.ktx2',
3736
+ },
3737
+ mapProperties: {
3738
+ color: '#ffffff',
3739
+ roughness: 0.5,
3740
+ metalness: 0,
3741
+ repeatX: 0.5,
3742
+ repeatY: 0.5,
3743
+ rotation: 0,
3744
+ wrapS: 'Repeat',
3745
+ wrapT: 'Repeat',
3746
+ normalScaleX: 1,
3747
+ normalScaleY: 1,
3748
+ emissiveIntensity: 1,
3749
+ displacementScale: 0,
3750
+ transparent: false,
3751
+ flipY: false,
3752
+ bumpScale: 1,
3753
+ emissiveColor: '#000000',
3754
+ aoMapIntensity: 1,
3755
+ side: 0,
3756
+ opacity: 1,
3757
+ lightMapIntensity: 1,
3758
+ },
3759
+ },
3760
+ },
3761
+ {
3762
+ id: 'concrete-raw',
3763
+ label: 'Raw Concrete',
3764
+ category: 'concrete',
3765
+ surfaces: ['wall', 'floor', 'outdoor'],
3766
+ description: 'Board-formed raw concrete',
3767
+ previewThumbnailUrl: '/material/concrete/concrete_raw/concrete_raw_thumb.webp',
3768
+ preset: {
3769
+ maps: {
3770
+ albedoMap: '/material/concrete/concrete_raw/concrete_raw_basecolor_512.ktx2',
3771
+ normalMap: '/material/concrete/concrete_raw/concrete_raw_normal_512.ktx2',
3772
+ roughnessMap: '/material/concrete/concrete_raw/concrete_raw_roughness_512.ktx2',
3773
+ aoMap: '/material/concrete/concrete_raw/concrete_raw_ao_512.ktx2',
3774
+ },
3775
+ mapProperties: {
3776
+ color: '#ffffff',
3777
+ roughness: 0.8,
3778
+ metalness: 0,
3779
+ repeatX: 0.5,
3780
+ repeatY: 0.5,
3781
+ rotation: 0,
3782
+ wrapS: 'Repeat',
3783
+ wrapT: 'Repeat',
3784
+ normalScaleX: 1,
3785
+ normalScaleY: 1,
3786
+ emissiveIntensity: 1,
3787
+ displacementScale: 0,
3788
+ transparent: false,
3789
+ flipY: false,
3790
+ bumpScale: 1,
3791
+ emissiveColor: '#000000',
3792
+ aoMapIntensity: 1,
3793
+ side: 0,
3794
+ opacity: 1,
3795
+ lightMapIntensity: 1,
3796
+ },
3797
+ },
3798
+ },
3799
+ {
3800
+ id: 'concrete-plate',
3801
+ label: 'Concrete Plate',
3802
+ category: 'concrete',
3803
+ surfaces: ['wall', 'floor'],
3804
+ description: 'Smooth cast concrete plate',
3805
+ previewThumbnailUrl: '/material/concrete/concrete_plate/concrete_plate_thumb.webp',
3806
+ preset: {
3807
+ maps: {
3808
+ albedoMap: '/material/concrete/concrete_plate/concrete_plate_basecolor_512.ktx2',
3809
+ normalMap: '/material/concrete/concrete_plate/concrete_plate_normal_512.ktx2',
3810
+ roughnessMap: '/material/concrete/concrete_plate/concrete_plate_roughness_512.ktx2',
3811
+ aoMap: '/material/concrete/concrete_plate/concrete_plate_ao_512.ktx2',
3812
+ },
3813
+ mapProperties: {
3814
+ color: '#ffffff',
3815
+ roughness: 0.8,
3816
+ metalness: 0,
3817
+ repeatX: 0.5,
3818
+ repeatY: 0.5,
3819
+ rotation: 0,
3820
+ wrapS: 'Repeat',
3821
+ wrapT: 'Repeat',
3822
+ normalScaleX: 1,
3823
+ normalScaleY: 1,
3824
+ emissiveIntensity: 1,
3825
+ displacementScale: 0,
3826
+ transparent: false,
3827
+ flipY: false,
3828
+ bumpScale: 1,
3829
+ emissiveColor: '#000000',
3830
+ aoMapIntensity: 1,
3831
+ side: 0,
3832
+ opacity: 1,
3833
+ lightMapIntensity: 1,
3834
+ },
3835
+ },
3836
+ },
3837
+ {
3838
+ id: 'concrete-stucco',
3839
+ label: 'White Stucco',
3840
+ category: 'concrete',
3841
+ surfaces: ['wall', 'outdoor'],
3842
+ description: 'Exterior stucco render',
3843
+ previewThumbnailUrl: '/material/concrete/white_stucco/white_stucco_thumb.webp',
3844
+ preset: {
3845
+ maps: {
3846
+ albedoMap: '/material/concrete/white_stucco/white_stucco_basecolor_512.ktx2',
3847
+ normalMap: '/material/concrete/white_stucco/white_stucco_normal_512.ktx2',
3848
+ roughnessMap: '/material/concrete/white_stucco/white_stucco_roughness_512.ktx2',
3849
+ aoMap: '/material/concrete/white_stucco/white_stucco_ao_512.ktx2',
3850
+ },
3851
+ mapProperties: {
3852
+ color: '#ffffff',
3853
+ roughness: 0.9,
3854
+ metalness: 0,
3855
+ repeatX: 1,
3856
+ repeatY: 1,
3857
+ rotation: 0,
3858
+ wrapS: 'Repeat',
3859
+ wrapT: 'Repeat',
3860
+ normalScaleX: 1,
3861
+ normalScaleY: 1,
3862
+ emissiveIntensity: 1,
3863
+ displacementScale: 0,
3864
+ transparent: false,
3865
+ flipY: false,
3866
+ bumpScale: 1,
3867
+ emissiveColor: '#000000',
3868
+ aoMapIntensity: 1,
3869
+ side: 0,
3870
+ opacity: 1,
3871
+ lightMapIntensity: 1,
3872
+ },
3873
+ },
3874
+ },
3875
+ {
3876
+ id: 'concrete-drywall',
3877
+ label: 'Prepared Drywall',
3878
+ category: 'concrete',
3879
+ surfaces: ['wall', 'ceiling'],
3880
+ description: 'Smooth prepared drywall ready for paint',
3881
+ previewThumbnailUrl: '/material/concrete/prepared_drywall/prepared_drywall_thumb.webp',
3882
+ preset: {
3883
+ maps: {
3884
+ albedoMap: '/material/concrete/prepared_drywall/prepared_drywall_basecolor_512.ktx2',
3885
+ normalMap: '/material/concrete/prepared_drywall/prepared_drywall_normal_512.ktx2',
3886
+ roughnessMap: '/material/concrete/prepared_drywall/prepared_drywall_roughness_512.ktx2',
3887
+ aoMap: '/material/concrete/prepared_drywall/prepared_drywall_ao_512.ktx2',
3888
+ },
3889
+ mapProperties: {
3890
+ color: '#ffffff',
3891
+ roughness: 0.9,
3892
+ metalness: 0,
3893
+ repeatX: 0.5,
3894
+ repeatY: 0.5,
3895
+ rotation: 0,
3896
+ wrapS: 'Repeat',
3897
+ wrapT: 'Repeat',
3898
+ normalScaleX: 1,
3899
+ normalScaleY: 1,
3900
+ emissiveIntensity: 1,
3901
+ displacementScale: 0,
3902
+ transparent: false,
3903
+ flipY: false,
3904
+ bumpScale: 1,
3905
+ emissiveColor: '#000000',
3906
+ aoMapIntensity: 1,
3907
+ side: 0,
3908
+ opacity: 1,
3909
+ lightMapIntensity: 1,
3910
+ },
3911
+ },
3912
+ },
3913
+ {
3914
+ id: 'metal-copper',
3915
+ label: 'Copper',
3916
+ category: 'metal',
3917
+ surfaces: ['furniture', 'wall'],
3918
+ description: 'Warm copper',
3919
+ previewThumbnailUrl: '/material/metal/copper_metal/copper_metal_thumb.webp',
3920
+ preset: {
3921
+ maps: {
3922
+ albedoMap: '/material/metal/copper_metal/copper_metal_basecolor_512.ktx2',
3923
+ normalMap: '/material/metal/copper_metal/copper_metal_normal_512.ktx2',
3924
+ roughnessMap: '/material/metal/copper_metal/copper_metal_roughness_512.ktx2',
3925
+ metalnessMap: '/material/metal/copper_metal/copper_metal_metallic_512.ktx2',
3926
+ },
3927
+ mapProperties: {
3928
+ color: '#ffffff',
3929
+ roughness: 0.4,
3930
+ metalness: 0.6,
3931
+ repeatX: 1,
3932
+ repeatY: 1,
3933
+ rotation: 0,
3934
+ wrapS: 'Repeat',
3935
+ wrapT: 'Repeat',
3936
+ normalScaleX: 1,
3937
+ normalScaleY: 1,
3938
+ emissiveIntensity: 1,
3939
+ displacementScale: 0,
3940
+ transparent: false,
3941
+ flipY: false,
3942
+ bumpScale: 1,
3943
+ emissiveColor: '#000000',
3944
+ aoMapIntensity: 1,
3945
+ side: 0,
3946
+ opacity: 1,
3947
+ lightMapIntensity: 1,
3948
+ },
3949
+ },
3950
+ },
3951
+ {
3952
+ id: 'metal-polished',
3953
+ label: 'Polished Metal',
3954
+ category: 'metal',
3955
+ surfaces: ['furniture', 'wall'],
3956
+ description: 'Polished stainless steel',
3957
+ previewThumbnailUrl: '/material/metal/polished_metal/polished_metal_thumb.webp',
3958
+ preset: {
3959
+ maps: {
3960
+ albedoMap: '/material/metal/polished_metal/polished_metal_basecolor_512.ktx2',
3961
+ normalMap: '/material/metal/polished_metal/polished_metal_normal_512.ktx2',
3962
+ roughnessMap: '/material/metal/polished_metal/polished_metal_roughness_512.ktx2',
3963
+ aoMap: '/material/metal/polished_metal/polished_metal_ao_512.ktx2',
3964
+ metalnessMap: '/material/metal/polished_metal/polished_metal_metallic_512.ktx2',
3965
+ },
3966
+ mapProperties: {
3967
+ color: '#ffffff',
3968
+ roughness: 0.3,
3969
+ metalness: 0.6,
3970
+ repeatX: 1,
3971
+ repeatY: 1,
3972
+ rotation: 0,
3973
+ wrapS: 'Repeat',
3974
+ wrapT: 'Repeat',
3975
+ normalScaleX: 1,
3976
+ normalScaleY: 1,
3977
+ emissiveIntensity: 1,
3978
+ displacementScale: 0,
3979
+ transparent: false,
3980
+ flipY: false,
3981
+ bumpScale: 1,
3982
+ emissiveColor: '#000000',
3983
+ aoMapIntensity: 1,
3984
+ side: 0,
3985
+ opacity: 1,
3986
+ lightMapIntensity: 1,
3987
+ },
3988
+ },
3989
+ },
3990
+ {
3991
+ id: 'metal-steel',
3992
+ label: 'Brushed Steel',
3993
+ category: 'metal',
3994
+ surfaces: ['furniture', 'wall'],
3995
+ description: 'Brushed stainless steel',
3996
+ previewThumbnailUrl: '/material/metal/stainless_steel_brushed/stainless_steel_brushed_thumb.webp',
3997
+ preset: {
3998
+ maps: {
3999
+ albedoMap: '/material/metal/stainless_steel_brushed/stainless_steel_brushed_basecolor_512.ktx2',
4000
+ normalMap: '/material/metal/stainless_steel_brushed/stainless_steel_brushed_normal_512.ktx2',
4001
+ roughnessMap: '/material/metal/stainless_steel_brushed/stainless_steel_brushed_roughness_512.ktx2',
4002
+ },
4003
+ mapProperties: {
4004
+ color: '#ffffff',
4005
+ roughness: 0.45,
4006
+ metalness: 0.6,
4007
+ repeatX: 1,
4008
+ repeatY: 1,
4009
+ rotation: 0,
4010
+ wrapS: 'Repeat',
4011
+ wrapT: 'Repeat',
4012
+ normalScaleX: 1,
4013
+ normalScaleY: 1,
4014
+ emissiveIntensity: 1,
4015
+ displacementScale: 0,
4016
+ transparent: false,
4017
+ flipY: false,
4018
+ bumpScale: 1,
4019
+ emissiveColor: '#000000',
4020
+ aoMapIntensity: 1,
4021
+ side: 0,
4022
+ opacity: 1,
4023
+ lightMapIntensity: 1,
4024
+ },
4025
+ },
4026
+ },
4027
+ {
4028
+ // Parameter-only metal (no texture maps) — a worked example of a non-PBR
4029
+ // catalog finish driven purely by three.js material settings.
4030
+ id: 'metal-brass',
4031
+ label: 'Brass',
4032
+ category: 'metal',
4033
+ surfaces: ['furniture', 'wall'],
4034
+ description: 'Polished brass (flat metal, no maps)',
4035
+ previewColor: '#b08d57',
4036
+ preset: {
4037
+ maps: {},
4038
+ mapProperties: {
4039
+ color: '#b08d57',
4040
+ roughness: 0.35,
4041
+ metalness: 0.9,
4042
+ repeatX: 1,
4043
+ repeatY: 1,
4044
+ rotation: 0,
4045
+ wrapS: 'Repeat',
4046
+ wrapT: 'Repeat',
4047
+ normalScaleX: 1,
4048
+ normalScaleY: 1,
4049
+ emissiveIntensity: 1,
4050
+ displacementScale: 0,
4051
+ transparent: false,
4052
+ flipY: false,
4053
+ bumpScale: 1,
4054
+ emissiveColor: '#000000',
4055
+ aoMapIntensity: 1,
4056
+ side: 0,
4057
+ opacity: 1,
4058
+ lightMapIntensity: 1,
4059
+ },
4060
+ },
4061
+ },
4062
+ {
4063
+ // Parameter-only chrome (no texture maps) — moderate metalness so it reads
4064
+ // as bright metal under direct/ambient light without needing an env map.
4065
+ id: 'metal-chrome',
4066
+ label: 'Chrome',
4067
+ category: 'metal',
4068
+ surfaces: ['furniture', 'wall'],
4069
+ description: 'Polished chrome (flat metal, no maps)',
4070
+ previewColor: '#c8ccce',
4071
+ preset: {
4072
+ maps: {},
4073
+ mapProperties: {
4074
+ color: '#c8ccce',
4075
+ roughness: 0.2,
4076
+ metalness: 0.6,
4077
+ repeatX: 1,
4078
+ repeatY: 1,
4079
+ rotation: 0,
4080
+ wrapS: 'Repeat',
4081
+ wrapT: 'Repeat',
4082
+ normalScaleX: 1,
4083
+ normalScaleY: 1,
4084
+ emissiveIntensity: 1,
4085
+ displacementScale: 0,
4086
+ transparent: false,
4087
+ flipY: false,
4088
+ bumpScale: 1,
4089
+ emissiveColor: '#000000',
4090
+ aoMapIntensity: 1,
4091
+ side: 0,
4092
+ opacity: 1,
4093
+ lightMapIntensity: 1,
4094
+ },
4095
+ },
4096
+ },
4097
+ ];
4098
+ const STATIC_CATALOG_IDS = new Set(MATERIAL_CATALOG.map((item) => item.id));
4099
+ // Embedder-registered library materials (user/community/workspace). Core stays
4100
+ // passive: hosts push entries in; nothing here fetches. Static catalog entries
4101
+ // win on id collision so a registration can never shadow a built-in.
4102
+ const dynamicLibraryMaterials = new Map();
4103
+ const dynamicLibraryListeners = new Set();
4104
+ let dynamicLibraryVersion = 0;
4105
+ function notifyDynamicLibraryChange() {
4106
+ dynamicLibraryVersion += 1;
4107
+ for (const listener of [...dynamicLibraryListeners]) {
4108
+ listener();
4109
+ }
4110
+ }
4111
+ export function registerLibraryMaterials(items) {
4112
+ if (items.length === 0)
4113
+ return;
4114
+ for (const item of items) {
4115
+ dynamicLibraryMaterials.set(item.id, item);
4116
+ }
4117
+ notifyDynamicLibraryChange();
4118
+ }
4119
+ export function unregisterLibraryMaterials(ids) {
4120
+ let changed = false;
4121
+ for (const id of ids) {
4122
+ changed = dynamicLibraryMaterials.delete(id) || changed;
4123
+ }
4124
+ if (changed)
4125
+ notifyDynamicLibraryChange();
4126
+ }
4127
+ export function getDynamicLibraryMaterials() {
4128
+ return [...dynamicLibraryMaterials.values()];
4129
+ }
4130
+ export function subscribeLibraryMaterials(listener) {
4131
+ dynamicLibraryListeners.add(listener);
4132
+ return () => {
4133
+ dynamicLibraryListeners.delete(listener);
4134
+ };
4135
+ }
4136
+ export function getLibraryMaterialsVersion() {
4137
+ return dynamicLibraryVersion;
4138
+ }
4139
+ export function getMaterialsForCategory(category) {
4140
+ const items = MATERIAL_CATALOG.filter((item) => item.category === category);
4141
+ for (const item of dynamicLibraryMaterials.values()) {
4142
+ if (item.category === category && !STATIC_CATALOG_IDS.has(item.id))
4143
+ items.push(item);
4144
+ }
4145
+ return items;
4146
+ }
4147
+ export function getCatalogMaterialById(id) {
4148
+ if (!id)
4149
+ return undefined;
4150
+ return MATERIAL_CATALOG.find((item) => item.id === id) ?? dynamicLibraryMaterials.get(id);
4151
+ }
4152
+ export const LIBRARY_MATERIAL_REF_PREFIX = 'library:';
4153
+ export const SCENE_MATERIAL_REF_PREFIX = 'scene:';
4154
+ export function toLibraryMaterialRef(id) {
4155
+ return `${LIBRARY_MATERIAL_REF_PREFIX}${id}`;
4156
+ }
4157
+ export function toSceneMaterialRef(id) {
4158
+ return `${SCENE_MATERIAL_REF_PREFIX}${id}`;
4159
+ }
4160
+ export function getLibraryMaterialIdFromRef(materialRef) {
4161
+ if (typeof materialRef !== 'string')
4162
+ return null;
4163
+ if (!materialRef.startsWith(LIBRARY_MATERIAL_REF_PREFIX))
4164
+ return null;
4165
+ return materialRef.slice(LIBRARY_MATERIAL_REF_PREFIX.length);
4166
+ }
4167
+ export function getSceneMaterialIdFromRef(materialRef) {
4168
+ if (typeof materialRef !== 'string')
4169
+ return null;
4170
+ if (!materialRef.startsWith(SCENE_MATERIAL_REF_PREFIX))
4171
+ return null;
4172
+ return materialRef.slice(SCENE_MATERIAL_REF_PREFIX.length);
4173
+ }
4174
+ export function parseMaterialRef(ref) {
4175
+ const lib = getLibraryMaterialIdFromRef(ref);
4176
+ if (lib)
4177
+ return { kind: 'library', id: lib };
4178
+ const scene = getSceneMaterialIdFromRef(ref);
4179
+ if (scene)
4180
+ return { kind: 'scene', id: scene };
4181
+ return null;
2390
4182
  }
2391
4183
  export function getMaterialPresetByRef(materialRef) {
2392
4184
  const materialId = getLibraryMaterialIdFromRef(materialRef);