@pascal-app/core 0.8.0 → 0.9.2

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