dream-louvre-configurator-core 0.1.0

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 (52) hide show
  1. package/dist/geometry/buildFrameGeometry.d.ts +19 -0
  2. package/dist/geometry/buildFrameGeometry.js +442 -0
  3. package/dist/geometry/buildFrameGeometry.js.map +1 -0
  4. package/dist/geometry/buildRailGeometry.d.ts +8 -0
  5. package/dist/geometry/buildRailGeometry.js +52 -0
  6. package/dist/geometry/buildRailGeometry.js.map +1 -0
  7. package/dist/geometry/profileScaling.d.ts +2 -0
  8. package/dist/geometry/profileScaling.js +44 -0
  9. package/dist/geometry/profileScaling.js.map +1 -0
  10. package/dist/index.d.ts +6 -0
  11. package/dist/index.js +7 -0
  12. package/dist/index.js.map +1 -0
  13. package/dist/plugin/DreamLouvrePlugin.d.ts +110 -0
  14. package/dist/plugin/DreamLouvrePlugin.js +561 -0
  15. package/dist/plugin/DreamLouvrePlugin.js.map +1 -0
  16. package/dist/plugin/publicApi.d.ts +2 -0
  17. package/dist/plugin/publicApi.js +5 -0
  18. package/dist/plugin/publicApi.js.map +1 -0
  19. package/dist/profiles/bevel.d.ts +2 -0
  20. package/dist/profiles/bevel.js +44 -0
  21. package/dist/profiles/bevel.js.map +1 -0
  22. package/dist/profiles/flat.d.ts +2 -0
  23. package/dist/profiles/flat.js +41 -0
  24. package/dist/profiles/flat.js.map +1 -0
  25. package/dist/profiles/floater.d.ts +2 -0
  26. package/dist/profiles/floater.js +40 -0
  27. package/dist/profiles/floater.js.map +1 -0
  28. package/dist/profiles/hidden.d.ts +2 -0
  29. package/dist/profiles/hidden.js +40 -0
  30. package/dist/profiles/hidden.js.map +1 -0
  31. package/dist/profiles/index.d.ts +4 -0
  32. package/dist/profiles/index.js +20 -0
  33. package/dist/profiles/index.js.map +1 -0
  34. package/dist/profiles/shadow.d.ts +2 -0
  35. package/dist/profiles/shadow.js +40 -0
  36. package/dist/profiles/shadow.js.map +1 -0
  37. package/dist/profiles/showcase.d.ts +2 -0
  38. package/dist/profiles/showcase.js +40 -0
  39. package/dist/profiles/showcase.js.map +1 -0
  40. package/dist/profiles/traditional.d.ts +2 -0
  41. package/dist/profiles/traditional.js +44 -0
  42. package/dist/profiles/traditional.js.map +1 -0
  43. package/dist/rendering/camera.d.ts +2 -0
  44. package/dist/rendering/camera.js +10 -0
  45. package/dist/rendering/camera.js.map +1 -0
  46. package/dist/rendering/createRenderer.d.ts +2 -0
  47. package/dist/rendering/createRenderer.js +19 -0
  48. package/dist/rendering/createRenderer.js.map +1 -0
  49. package/dist/rendering/scene.d.ts +2 -0
  50. package/dist/rendering/scene.js +28 -0
  51. package/dist/rendering/scene.js.map +1 -0
  52. package/package.json +28 -0
@@ -0,0 +1,19 @@
1
+ import * as THREE from "three";
2
+ import type { FrameProfileDefinition, FrameProfileParams } from "dream-louvre-shared-types";
3
+ export type BuildFrameOptions = {
4
+ artworkWidthMm: number;
5
+ artworkHeightMm: number;
6
+ artworkDepthMm?: number;
7
+ profile: FrameProfileDefinition;
8
+ params?: Partial<FrameProfileParams>;
9
+ textureRepeatMm?: number;
10
+ material?: THREE.Material;
11
+ artworkMaterial?: THREE.Material;
12
+ matColor?: string | number;
13
+ glassType?: "none" | "standard" | "museum" | "true-vue";
14
+ };
15
+ export declare function hasFrameGlass(profileId: string, glassType?: BuildFrameOptions["glassType"]): boolean;
16
+ export declare function getGlassThicknessMm(frameDepthMm: number): number;
17
+ export declare function getGlassInsetFromFrontMm(frameDepthMm: number): number;
18
+ export declare function calculateMaxArtworkDepthMm(profileId: string, frameDepthMm: number): number;
19
+ export declare function buildFrameGroup(options: BuildFrameOptions): THREE.Group;
@@ -0,0 +1,442 @@
1
+ import * as THREE from "three";
2
+ import { applyProfileParams } from "./profileScaling";
3
+ const ARTWORK_SURFACE_OFFSET_MM = 0.8;
4
+ export function hasFrameGlass(profileId, glassType = "standard") {
5
+ return glassType !== "none" && (profileId === "showcase" || profileId === "traditional" || profileId === "floater");
6
+ }
7
+ export function getGlassThicknessMm(frameDepthMm) {
8
+ return Math.max(3, frameDepthMm * 0.06);
9
+ }
10
+ export function getGlassInsetFromFrontMm(frameDepthMm) {
11
+ return Math.max(2, frameDepthMm * 0.08);
12
+ }
13
+ export function calculateMaxArtworkDepthMm(profileId, frameDepthMm) {
14
+ if (profileId === "hidden")
15
+ return Number.POSITIVE_INFINITY;
16
+ const frameDepth = Math.max(1, frameDepthMm);
17
+ const glassReserve = hasFrameGlass(profileId)
18
+ ? getGlassInsetFromFrontMm(frameDepth) + getGlassThicknessMm(frameDepth) + ARTWORK_SURFACE_OFFSET_MM
19
+ : ARTWORK_SURFACE_OFFSET_MM;
20
+ const floaterBackReserve = profileId === "floater" ? Math.max(6, frameDepth * 0.16) : 0;
21
+ return Math.max(1, frameDepth - glassReserve - floaterBackReserve);
22
+ }
23
+ export function buildFrameGroup(options) {
24
+ const profile = applyProfileParams(options.profile, options.params ?? {});
25
+ const faceWidth = profile.defaultParams.faceWidthMm;
26
+ const depth = profile.defaultParams.depthMm;
27
+ const artworkSurfaceOffset = ARTWORK_SURFACE_OFFSET_MM;
28
+ const artworkDepth = Math.min(Math.max(1, options.artworkDepthMm ?? 20), calculateMaxArtworkDepthMm(profile.id, depth));
29
+ const artworkDisplayWidth = options.artworkWidthMm;
30
+ const artworkDisplayHeight = options.artworkHeightMm;
31
+ const matWidth = Math.max(0, profile.defaultParams.matWidthMm ?? 70);
32
+ const traditionalMatWidth = Math.max(0, profile.defaultParams.matWidthMm ?? 70);
33
+ const traditionalBevelWidth = Math.max(8, Math.min(18, profile.defaultParams.bevelMm ?? faceWidth * 0.18));
34
+ const profileCavityInset = profile.id === "traditional"
35
+ ? traditionalMatWidth + traditionalBevelWidth
36
+ : profile.id === "shadow"
37
+ ? 34
38
+ : profile.id === "floater"
39
+ ? matWidth
40
+ : profile.id === "showcase"
41
+ ? 24
42
+ : 0;
43
+ const cavityWidth = options.artworkWidthMm + profileCavityInset * 2;
44
+ const cavityHeight = options.artworkHeightMm + profileCavityInset * 2;
45
+ const outerWidth = cavityWidth + faceWidth * 2;
46
+ const outerHeight = cavityHeight + faceWidth * 2;
47
+ const material = options.material ??
48
+ new THREE.MeshStandardMaterial({
49
+ color: 0xcaa56f,
50
+ roughness: 0.62,
51
+ metalness: 0
52
+ });
53
+ const glassType = options.glassType ?? "museum";
54
+ const glassSettings = {
55
+ standard: {
56
+ color: 0xf4fdff,
57
+ edgeColor: 0x9ca3a2,
58
+ emissive: 0x9fd8ff,
59
+ emissiveIntensity: 0.035,
60
+ edgeOpacity: 0.22,
61
+ roughness: 0,
62
+ transmission: 0,
63
+ clearcoatRoughness: 0.015,
64
+ reflectivity: 1,
65
+ envMapIntensity: 4.2,
66
+ paneOpacity: 0.32,
67
+ specularIntensity: 1.35
68
+ },
69
+ museum: {
70
+ color: 0xf9ffff,
71
+ edgeColor: 0xb6bdba,
72
+ emissive: 0xbfd8ff,
73
+ emissiveIntensity: 0.012,
74
+ edgeOpacity: 0.14,
75
+ roughness: 0,
76
+ transmission: 0,
77
+ clearcoatRoughness: 0.02,
78
+ reflectivity: 1,
79
+ envMapIntensity: 2.2,
80
+ paneOpacity: 0.16,
81
+ specularIntensity: 0.82
82
+ },
83
+ "true-vue": {
84
+ color: 0xf7fbff,
85
+ edgeColor: 0xaeb8bb,
86
+ emissive: 0x9fbfff,
87
+ emissiveIntensity: 0.02,
88
+ edgeOpacity: 0.18,
89
+ roughness: 0,
90
+ transmission: 0,
91
+ clearcoatRoughness: 0.015,
92
+ reflectivity: 1,
93
+ envMapIntensity: 3.1,
94
+ paneOpacity: 0.24,
95
+ specularIntensity: 1.05
96
+ }
97
+ }[glassType === "none" ? "museum" : glassType];
98
+ const group = new THREE.Group();
99
+ group.name = "DreamLouvreFrame";
100
+ const disableReceivedShadows = (mesh) => {
101
+ mesh.userData.dreamLouvreReceiveShadow = false;
102
+ return mesh;
103
+ };
104
+ const disableCastShadows = (mesh) => {
105
+ mesh.userData.dreamLouvreCastShadow = false;
106
+ return mesh;
107
+ };
108
+ const disableAllShadows = (mesh) => {
109
+ disableReceivedShadows(mesh);
110
+ disableCastShadows(mesh);
111
+ return mesh;
112
+ };
113
+ const glassEdgeMaterial = new THREE.MeshPhysicalMaterial({
114
+ name: "dream-louvre-glass-edge",
115
+ color: glassSettings.edgeColor,
116
+ emissive: glassSettings.emissive,
117
+ emissiveIntensity: glassSettings.emissiveIntensity * 0.2,
118
+ transparent: true,
119
+ opacity: glassSettings.edgeOpacity,
120
+ roughness: glassSettings.roughness,
121
+ metalness: 0,
122
+ transmission: glassSettings.transmission,
123
+ ior: 1.45,
124
+ thickness: 6,
125
+ clearcoat: 1,
126
+ clearcoatRoughness: glassSettings.clearcoatRoughness,
127
+ reflectivity: glassSettings.reflectivity,
128
+ specularIntensity: glassSettings.specularIntensity,
129
+ specularColor: 0xffffff,
130
+ envMapIntensity: glassSettings.envMapIntensity,
131
+ depthWrite: false,
132
+ side: THREE.DoubleSide
133
+ });
134
+ const shadowMaterial = new THREE.MeshStandardMaterial({
135
+ color: 0x2f2419,
136
+ roughness: 0.75,
137
+ metalness: 0
138
+ });
139
+ const glassPaneMaterial = new THREE.MeshPhysicalMaterial({
140
+ name: "dream-louvre-glass-pane",
141
+ color: glassSettings.color,
142
+ emissive: glassSettings.emissive,
143
+ emissiveIntensity: glassSettings.emissiveIntensity * 0.45,
144
+ transparent: true,
145
+ opacity: glassSettings.paneOpacity,
146
+ roughness: glassSettings.roughness,
147
+ metalness: 0.18,
148
+ transmission: glassSettings.transmission,
149
+ ior: 1.45,
150
+ thickness: 2,
151
+ clearcoat: 1,
152
+ clearcoatRoughness: glassSettings.clearcoatRoughness,
153
+ reflectivity: glassSettings.reflectivity,
154
+ specularIntensity: glassSettings.specularIntensity,
155
+ specularColor: 0xffffff,
156
+ envMapIntensity: glassSettings.envMapIntensity,
157
+ depthWrite: false,
158
+ side: THREE.DoubleSide
159
+ });
160
+ const matColor = new THREE.Color(options.matColor ?? 0xf2f0e8);
161
+ const matBevelColor = matColor.clone().multiplyScalar(0.92);
162
+ const matMaterial = new THREE.MeshStandardMaterial({
163
+ color: matColor,
164
+ roughness: 0.8,
165
+ metalness: 0
166
+ });
167
+ const floaterRevealSoftShadowMaterial = new THREE.MeshBasicMaterial({
168
+ color: matColor.clone().multiplyScalar(0.24),
169
+ transparent: true,
170
+ opacity: 0.46,
171
+ depthWrite: false,
172
+ side: THREE.DoubleSide
173
+ });
174
+ const floaterRevealCoreShadowMaterial = new THREE.MeshBasicMaterial({
175
+ color: matColor.clone().multiplyScalar(0.18),
176
+ transparent: true,
177
+ opacity: 0.28,
178
+ depthWrite: false,
179
+ side: THREE.DoubleSide
180
+ });
181
+ const floaterRevealHighlightMaterial = new THREE.MeshBasicMaterial({
182
+ color: matColor.clone().lerp(new THREE.Color(0xffffff), 0.75),
183
+ transparent: true,
184
+ opacity: 0.14,
185
+ depthWrite: false,
186
+ side: THREE.DoubleSide
187
+ });
188
+ const matBevelMaterial = new THREE.MeshStandardMaterial({
189
+ color: matBevelColor,
190
+ roughness: 0.86,
191
+ metalness: 0,
192
+ side: THREE.DoubleSide
193
+ });
194
+ const floaterBackingMaterial = new THREE.MeshStandardMaterial({
195
+ color: 0xf4f6ef,
196
+ roughness: 0.68,
197
+ metalness: 0
198
+ });
199
+ const frontFaceZ = depth / 2;
200
+ const artworkRecessByProfile = {
201
+ floater: 14,
202
+ shadow: 18,
203
+ traditional: 12
204
+ };
205
+ const backFaceZ = -depth / 2;
206
+ const nominalArtworkZ = profile.id === "showcase"
207
+ ? backFaceZ + artworkDepth + 2
208
+ : artworkRecessByProfile[profile.id] !== undefined
209
+ ? frontFaceZ - artworkRecessByProfile[profile.id]
210
+ : frontFaceZ + 0.2;
211
+ const glassSafeZ = frontFaceZ -
212
+ (hasFrameGlass(profile.id, glassType)
213
+ ? getGlassInsetFromFrontMm(depth) + getGlassThicknessMm(depth) + artworkSurfaceOffset
214
+ : artworkSurfaceOffset);
215
+ const artworkZ = Math.min(Math.max(nominalArtworkZ, backFaceZ + artworkDepth + 1), glassSafeZ);
216
+ const artwork = new THREE.Mesh(new THREE.PlaneGeometry(options.artworkWidthMm, options.artworkHeightMm), options.artworkMaterial ??
217
+ new THREE.MeshStandardMaterial({
218
+ color: 0xf8f7f2,
219
+ roughness: 0.7,
220
+ metalness: 0
221
+ }));
222
+ artwork.name = "Artwork";
223
+ artwork.scale.set(artworkDisplayWidth / options.artworkWidthMm, artworkDisplayHeight / options.artworkHeightMm, 1);
224
+ artwork.position.set(0, 0, artworkZ);
225
+ const artworkSlabThickness = artworkDepth;
226
+ const artworkSlab = new THREE.Mesh(new THREE.BoxGeometry(artworkDisplayWidth, artworkDisplayHeight, artworkSlabThickness), profile.id === "floater" ? matMaterial : profile.id === "hidden" ? floaterBackingMaterial : shadowMaterial);
227
+ artworkSlab.name = "Artwork slab";
228
+ artworkSlab.position.set(0, 0, artwork.position.z - artworkSurfaceOffset - artworkSlabThickness / 2);
229
+ const horizontalGeometry = new THREE.BoxGeometry(cavityWidth, faceWidth, depth);
230
+ const verticalGeometry = new THREE.BoxGeometry(faceWidth, outerHeight, depth);
231
+ const top = new THREE.Mesh(horizontalGeometry, material);
232
+ top.name = "Top rail";
233
+ top.position.set(0, cavityHeight / 2 + faceWidth / 2, 0);
234
+ const bottom = new THREE.Mesh(horizontalGeometry.clone(), material);
235
+ bottom.name = "Bottom rail";
236
+ bottom.position.set(0, -cavityHeight / 2 - faceWidth / 2, 0);
237
+ const left = new THREE.Mesh(verticalGeometry, material);
238
+ left.name = "Left rail";
239
+ left.position.set(-cavityWidth / 2 - faceWidth / 2, 0, 0);
240
+ const right = new THREE.Mesh(verticalGeometry.clone(), material);
241
+ right.name = "Right rail";
242
+ right.position.set(cavityWidth / 2 + faceWidth / 2, 0, 0);
243
+ group.add(artworkSlab, artwork, top, bottom, left, right);
244
+ if (profile.id === "hidden") {
245
+ top.visible = false;
246
+ bottom.visible = false;
247
+ left.visible = false;
248
+ right.visible = false;
249
+ const hiddenSupport = new THREE.Mesh(new THREE.BoxGeometry(options.artworkWidthMm * 0.92, options.artworkHeightMm * 0.92, depth), shadowMaterial);
250
+ hiddenSupport.name = "Hidden support";
251
+ hiddenSupport.position.set(0, 0, -depth * 0.3);
252
+ group.add(hiddenSupport);
253
+ artwork.position.z = depth / 2 + 18;
254
+ artworkSlab.position.z = artwork.position.z - artworkSurfaceOffset - artworkSlabThickness / 2;
255
+ }
256
+ if (profile.id === "floater" || profile.id === "shadow" || profile.id === "showcase") {
257
+ const revealOverlapMm = profile.id === "floater" ? Math.max(10, faceWidth * 0.24) : profile.id === "shadow" ? 4 : 2;
258
+ const backing = new THREE.Mesh(new THREE.PlaneGeometry(cavityWidth + revealOverlapMm * 2, cavityHeight + revealOverlapMm * 2), profile.id === "floater" ? matMaterial : shadowMaterial);
259
+ backing.name = `${profile.label} reveal`;
260
+ backing.position.set(0, 0, profile.id === "showcase"
261
+ ? Math.max(backFaceZ + 0.5, artwork.position.z - artworkSurfaceOffset - artworkSlabThickness - 1)
262
+ : artwork.position.z - artworkSurfaceOffset - artworkSlabThickness - 4);
263
+ group.add(backing);
264
+ artworkSlab.position.z = artwork.position.z - artworkSurfaceOffset - artworkSlabThickness / 2;
265
+ if (profile.id === "floater") {
266
+ const linerWidth = Math.min(Math.max(10, faceWidth * 0.3), Math.max(1, profileCavityInset));
267
+ const linerFrontZ = Math.min(frontFaceZ - 1, glassSafeZ - 0.2);
268
+ const linerBackZ = backing.position.z + 0.4;
269
+ const linerDepth = Math.max(1, linerFrontZ - linerBackZ);
270
+ const linerZ = linerBackZ + linerDepth / 2;
271
+ const topLiner = disableAllShadows(new THREE.Mesh(new THREE.BoxGeometry(cavityWidth, linerWidth, linerDepth), matMaterial));
272
+ const bottomLiner = disableAllShadows(new THREE.Mesh(new THREE.BoxGeometry(cavityWidth, linerWidth, linerDepth), matMaterial));
273
+ const leftLiner = disableAllShadows(new THREE.Mesh(new THREE.BoxGeometry(linerWidth, Math.max(1, cavityHeight - linerWidth * 2), linerDepth), matMaterial));
274
+ const rightLiner = disableAllShadows(new THREE.Mesh(new THREE.BoxGeometry(linerWidth, Math.max(1, cavityHeight - linerWidth * 2), linerDepth), matMaterial));
275
+ topLiner.name = "Floater distance frame top";
276
+ bottomLiner.name = "Floater distance frame bottom";
277
+ leftLiner.name = "Floater distance frame left";
278
+ rightLiner.name = "Floater distance frame right";
279
+ topLiner.position.set(0, cavityHeight / 2 - linerWidth / 2, linerZ);
280
+ bottomLiner.position.set(0, -cavityHeight / 2 + linerWidth / 2, linerZ);
281
+ leftLiner.position.set(-cavityWidth / 2 + linerWidth / 2, 0, linerZ);
282
+ rightLiner.position.set(cavityWidth / 2 - linerWidth / 2, 0, linerZ);
283
+ group.add(topLiner, bottomLiner, leftLiner, rightLiner);
284
+ const revealInnerWidth = Math.max(1, cavityWidth - linerWidth * 2);
285
+ const revealInnerHeight = Math.max(1, cavityHeight - linerWidth * 2);
286
+ const revealToneZ = backing.position.z + 0.25;
287
+ const createRectBandGeometry = (rects) => {
288
+ const vertices = [];
289
+ const indices = [];
290
+ rects.forEach(([minX, maxX, minY, maxY], rectIndex) => {
291
+ const vertexOffset = rectIndex * 4;
292
+ vertices.push(minX, minY, 0, maxX, minY, 0, maxX, maxY, 0, minX, maxY, 0);
293
+ indices.push(vertexOffset, vertexOffset + 1, vertexOffset + 2, vertexOffset, vertexOffset + 2, vertexOffset + 3);
294
+ });
295
+ const geometry = new THREE.BufferGeometry();
296
+ geometry.setAttribute("position", new THREE.Float32BufferAttribute(vertices, 3));
297
+ geometry.setIndex(indices);
298
+ geometry.computeVertexNormals();
299
+ return geometry;
300
+ };
301
+ const createRevealShadowL = (name, bandWidth, toneMaterial, zOffset, renderOrder) => {
302
+ const clampedBandWidth = Math.min(bandWidth, revealInnerWidth, revealInnerHeight);
303
+ const halfWidth = revealInnerWidth / 2;
304
+ const halfHeight = revealInnerHeight / 2;
305
+ const shadow = disableAllShadows(new THREE.Mesh(createRectBandGeometry([
306
+ [-halfWidth, halfWidth, halfHeight - clampedBandWidth, halfHeight],
307
+ [halfWidth - clampedBandWidth, halfWidth, -halfHeight, halfHeight - clampedBandWidth]
308
+ ]), toneMaterial));
309
+ shadow.name = name;
310
+ shadow.position.set(0, 0, revealToneZ + zOffset);
311
+ shadow.renderOrder = renderOrder;
312
+ return shadow;
313
+ };
314
+ const createRevealHighlightL = () => {
315
+ const highlightWidth = Math.min(Math.max(3, profileCavityInset * 0.05), revealInnerWidth, revealInnerHeight);
316
+ const halfWidth = revealInnerWidth / 2;
317
+ const halfHeight = revealInnerHeight / 2;
318
+ const highlight = disableAllShadows(new THREE.Mesh(createRectBandGeometry([
319
+ [-halfWidth, -halfWidth + highlightWidth, -halfHeight, halfHeight],
320
+ [-halfWidth + highlightWidth, halfWidth, -halfHeight, -halfHeight + highlightWidth]
321
+ ]), floaterRevealHighlightMaterial));
322
+ highlight.name = "Floater reveal lower left highlight";
323
+ highlight.position.set(0, 0, revealToneZ + 0.03);
324
+ highlight.renderOrder = 2;
325
+ return highlight;
326
+ };
327
+ const softShadowWidth = Math.min(Math.max(32, faceWidth * 0.9, profileCavityInset * 0.32), Math.max(1, profileCavityInset * 0.88));
328
+ const coreShadowWidth = Math.min(Math.max(6, softShadowWidth * 0.22), softShadowWidth);
329
+ group.add(createRevealHighlightL(), createRevealShadowL("Floater reveal soft upper right shadow", softShadowWidth, floaterRevealSoftShadowMaterial, 0.06, 3), createRevealShadowL("Floater reveal core upper right shadow", coreShadowWidth, floaterRevealCoreShadowMaterial, 0.09, 4));
330
+ }
331
+ }
332
+ if (hasFrameGlass(profile.id, glassType)) {
333
+ const edgeWidth = Math.max(3, faceWidth * 0.1);
334
+ const borderGap = Math.max(1.5, faceWidth * 0.035);
335
+ const innerGlassWidth = Math.max(20, cavityWidth - borderGap * 2 - edgeWidth * 2);
336
+ const innerGlassHeight = Math.max(20, cavityHeight - borderGap * 2 - edgeWidth * 2);
337
+ const glassWidth = innerGlassWidth + edgeWidth * 2;
338
+ const glassHeight = innerGlassHeight + edgeWidth * 2;
339
+ const glassThickness = getGlassThicknessMm(depth);
340
+ const glassInsetFromFront = getGlassInsetFromFrontMm(depth);
341
+ const glassZ = frontFaceZ - glassInsetFromFront - glassThickness / 2;
342
+ const topGlass = new THREE.Mesh(new THREE.BoxGeometry(glassWidth, edgeWidth, glassThickness), glassEdgeMaterial);
343
+ const bottomGlass = new THREE.Mesh(new THREE.BoxGeometry(glassWidth, edgeWidth, glassThickness), glassEdgeMaterial);
344
+ const leftGlass = new THREE.Mesh(new THREE.BoxGeometry(edgeWidth, innerGlassHeight, glassThickness), glassEdgeMaterial);
345
+ const rightGlass = new THREE.Mesh(new THREE.BoxGeometry(edgeWidth, innerGlassHeight, glassThickness), glassEdgeMaterial);
346
+ topGlass.name = `${profile.label} glass top edge`;
347
+ bottomGlass.name = `${profile.label} glass bottom edge`;
348
+ leftGlass.name = `${profile.label} glass left edge`;
349
+ rightGlass.name = `${profile.label} glass right edge`;
350
+ topGlass.position.set(0, innerGlassHeight / 2 + edgeWidth / 2, glassZ);
351
+ bottomGlass.position.set(0, -innerGlassHeight / 2 - edgeWidth / 2, glassZ);
352
+ leftGlass.position.set(-innerGlassWidth / 2 - edgeWidth / 2, 0, glassZ);
353
+ rightGlass.position.set(innerGlassWidth / 2 + edgeWidth / 2, 0, glassZ);
354
+ [topGlass, bottomGlass, leftGlass, rightGlass].forEach((glass) => {
355
+ glass.castShadow = false;
356
+ glass.receiveShadow = false;
357
+ });
358
+ const pane = new THREE.Mesh(new THREE.PlaneGeometry(glassWidth, glassHeight, 12, 12), glassPaneMaterial);
359
+ pane.name = `${profile.label} glass pane`;
360
+ pane.position.set(0, 0, glassZ + glassThickness / 2 + 0.2);
361
+ pane.castShadow = false;
362
+ pane.receiveShadow = false;
363
+ pane.renderOrder = 4;
364
+ group.add(topGlass, bottomGlass, leftGlass, rightGlass, pane);
365
+ }
366
+ if (profile.id === "traditional") {
367
+ const matFrameGap = Math.max(1.5, Math.min(4, faceWidth * 0.08));
368
+ const matOuterWidth = Math.max(20, cavityWidth - matFrameGap * 2);
369
+ const matOuterHeight = Math.max(20, cavityHeight - matFrameGap * 2);
370
+ const bevelWidth = Math.min(profileCavityInset - matFrameGap, traditionalBevelWidth);
371
+ const matInnerWidth = Math.min(matOuterWidth - 2, artworkDisplayWidth + bevelWidth * 2);
372
+ const matInnerHeight = Math.min(matOuterHeight - 2, artworkDisplayHeight + bevelWidth * 2);
373
+ const matSideWidth = Math.max(1, (matOuterWidth - matInnerWidth) / 2);
374
+ const matTopHeight = Math.max(1, (matOuterHeight - matInnerHeight) / 2);
375
+ const matZ = Math.min(frontFaceZ - 2, artwork.position.z + 2);
376
+ const topMat = disableReceivedShadows(new THREE.Mesh(new THREE.PlaneGeometry(matOuterWidth, matTopHeight), matMaterial));
377
+ const bottomMat = disableReceivedShadows(new THREE.Mesh(new THREE.PlaneGeometry(matOuterWidth, matTopHeight), matMaterial));
378
+ const leftMat = disableReceivedShadows(new THREE.Mesh(new THREE.PlaneGeometry(matSideWidth, matInnerHeight), matMaterial));
379
+ const rightMat = disableReceivedShadows(new THREE.Mesh(new THREE.PlaneGeometry(matSideWidth, matInnerHeight), matMaterial));
380
+ topMat.name = "Traditional mat top";
381
+ bottomMat.name = "Traditional mat bottom";
382
+ leftMat.name = "Traditional mat left";
383
+ rightMat.name = "Traditional mat right";
384
+ topMat.position.set(0, matInnerHeight / 2 + matTopHeight / 2, matZ);
385
+ bottomMat.position.set(0, -matInnerHeight / 2 - matTopHeight / 2, matZ);
386
+ leftMat.position.set(-matInnerWidth / 2 - matSideWidth / 2, 0, matZ);
387
+ rightMat.position.set(matInnerWidth / 2 + matSideWidth / 2, 0, matZ);
388
+ group.add(topMat, bottomMat, leftMat, rightMat);
389
+ const bevelZ = artwork.position.z + 0.6;
390
+ const outerHalfWidth = matInnerWidth / 2;
391
+ const outerHalfHeight = matInnerHeight / 2;
392
+ const innerHalfWidth = artworkDisplayWidth / 2;
393
+ const innerHalfHeight = artworkDisplayHeight / 2;
394
+ const createBevel = (name, vertices) => {
395
+ const geometry = new THREE.BufferGeometry();
396
+ geometry.setAttribute("position", new THREE.Float32BufferAttribute(vertices.flat(), 3));
397
+ geometry.setIndex([0, 1, 2, 0, 2, 3]);
398
+ geometry.computeVertexNormals();
399
+ const bevel = disableReceivedShadows(new THREE.Mesh(geometry, matBevelMaterial));
400
+ bevel.name = name;
401
+ return bevel;
402
+ };
403
+ if (outerHalfWidth > innerHalfWidth && outerHalfHeight > innerHalfHeight) {
404
+ const topBevel = createBevel("Traditional mat inner bevel top", [
405
+ [-outerHalfWidth, outerHalfHeight, matZ],
406
+ [outerHalfWidth, outerHalfHeight, matZ],
407
+ [innerHalfWidth, innerHalfHeight, bevelZ],
408
+ [-innerHalfWidth, innerHalfHeight, bevelZ]
409
+ ]);
410
+ const bottomBevel = createBevel("Traditional mat inner bevel bottom", [
411
+ [outerHalfWidth, -outerHalfHeight, matZ],
412
+ [-outerHalfWidth, -outerHalfHeight, matZ],
413
+ [-innerHalfWidth, -innerHalfHeight, bevelZ],
414
+ [innerHalfWidth, -innerHalfHeight, bevelZ]
415
+ ]);
416
+ const leftBevel = createBevel("Traditional mat inner bevel left", [
417
+ [-outerHalfWidth, -outerHalfHeight, matZ],
418
+ [-outerHalfWidth, outerHalfHeight, matZ],
419
+ [-innerHalfWidth, innerHalfHeight, bevelZ],
420
+ [-innerHalfWidth, -innerHalfHeight, bevelZ]
421
+ ]);
422
+ const rightBevel = createBevel("Traditional mat inner bevel right", [
423
+ [outerHalfWidth, outerHalfHeight, matZ],
424
+ [outerHalfWidth, -outerHalfHeight, matZ],
425
+ [innerHalfWidth, -innerHalfHeight, bevelZ],
426
+ [innerHalfWidth, innerHalfHeight, bevelZ]
427
+ ]);
428
+ group.add(topBevel, bottomBevel, leftBevel, rightBevel);
429
+ }
430
+ artworkSlab.position.z = artwork.position.z - artworkSurfaceOffset - artworkSlabThickness / 2;
431
+ }
432
+ group.traverse((child) => {
433
+ if (child instanceof THREE.Mesh) {
434
+ const materials = Array.isArray(child.material) ? child.material : [child.material];
435
+ const isGlass = materials.some((material) => material.name.includes("dream-louvre-glass"));
436
+ child.castShadow = !isGlass && child.userData.dreamLouvreCastShadow !== false;
437
+ child.receiveShadow = !isGlass && child.userData.dreamLouvreReceiveShadow !== false;
438
+ }
439
+ });
440
+ return group;
441
+ }
442
+ //# sourceMappingURL=buildFrameGeometry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"buildFrameGeometry.js","sourceRoot":"","sources":["../../src/geometry/buildFrameGeometry.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import * as THREE from "three";
2
+ import type { FrameProfileDefinition } from "dream-louvre-shared-types";
3
+ export type BuildRailGeometryOptions = {
4
+ profile: FrameProfileDefinition;
5
+ lengthMm: number;
6
+ textureRepeatMm?: number;
7
+ };
8
+ export declare function buildRailGeometry({ profile, lengthMm, textureRepeatMm }: BuildRailGeometryOptions): THREE.BufferGeometry;
@@ -0,0 +1,52 @@
1
+ import * as THREE from "three";
2
+ function contourDistances(vertices) {
3
+ const distances = [0];
4
+ for (let index = 1; index < vertices.length; index += 1) {
5
+ const previous = vertices[index - 1].position;
6
+ const current = vertices[index].position;
7
+ distances[index] =
8
+ distances[index - 1] + Math.hypot(current[0] - previous[0], current[1] - previous[1]);
9
+ }
10
+ return distances;
11
+ }
12
+ export function buildRailGeometry({ profile, lengthMm, textureRepeatMm = 420 }) {
13
+ const positions = [];
14
+ const uvs = [];
15
+ const indices = [];
16
+ const vertices = profile.vertices;
17
+ const distances = contourDistances(vertices);
18
+ const totalContour = distances.at(-1) || 1;
19
+ for (const railX of [0, lengthMm]) {
20
+ vertices.forEach((vertex, index) => {
21
+ const [mouldingWidth, depth] = vertex.position;
22
+ positions.push(railX, -mouldingWidth, -depth);
23
+ uvs.push(railX / textureRepeatMm, distances[index] / totalContour);
24
+ });
25
+ }
26
+ const ringSize = vertices.length;
27
+ for (let index = 0; index < ringSize; index += 1) {
28
+ const next = (index + 1) % ringSize;
29
+ indices.push(index, next, ringSize + next);
30
+ indices.push(index, ringSize + next, ringSize + index);
31
+ }
32
+ const startCenter = positions.length / 3;
33
+ positions.push(0, 0, 0);
34
+ uvs.push(0, 0);
35
+ const endCenter = startCenter + 1;
36
+ positions.push(lengthMm, 0, 0);
37
+ uvs.push(lengthMm / textureRepeatMm, 0);
38
+ for (let index = 0; index < ringSize; index += 1) {
39
+ const next = (index + 1) % ringSize;
40
+ indices.push(startCenter, next, index);
41
+ indices.push(endCenter, ringSize + index, ringSize + next);
42
+ }
43
+ const geometry = new THREE.BufferGeometry();
44
+ geometry.setAttribute("position", new THREE.Float32BufferAttribute(positions, 3));
45
+ geometry.setAttribute("uv", new THREE.Float32BufferAttribute(uvs, 2));
46
+ geometry.setIndex(indices);
47
+ geometry.computeVertexNormals();
48
+ geometry.computeBoundingBox();
49
+ geometry.computeBoundingSphere();
50
+ return geometry;
51
+ }
52
+ //# sourceMappingURL=buildRailGeometry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"buildRailGeometry.js","sourceRoot":"","sources":["../../src/geometry/buildRailGeometry.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import type { FrameProfileDefinition, FrameProfileParams } from "dream-louvre-shared-types";
2
+ export declare function applyProfileParams(definition: FrameProfileDefinition, params: Partial<FrameProfileParams>): FrameProfileDefinition;
@@ -0,0 +1,44 @@
1
+ function getBounds(vertices) {
2
+ return vertices.reduce((bounds, vertex) => ({
3
+ maxX: Math.max(bounds.maxX, vertex.position[0]),
4
+ maxY: Math.max(bounds.maxY, vertex.position[1])
5
+ }), { maxX: 0, maxY: 0 });
6
+ }
7
+ export function applyProfileParams(definition, params) {
8
+ const nextParams = { ...definition.defaultParams, ...params };
9
+ const bounds = getBounds(definition.vertices);
10
+ const scaleX = bounds.maxX === 0 ? 1 : nextParams.faceWidthMm / bounds.maxX;
11
+ const scaleY = bounds.maxY === 0 ? 1 : nextParams.depthMm / bounds.maxY;
12
+ const innerX = nextParams.faceWidthMm;
13
+ const backY = nextParams.depthMm;
14
+ const rabbetShelfX = Math.max(0, innerX - nextParams.rabbetWidthMm);
15
+ const rabbetBackY = Math.min(backY, nextParams.lipMm + nextParams.rabbetDepthMm);
16
+ return {
17
+ ...definition,
18
+ defaultParams: nextParams,
19
+ vertices: definition.vertices.map((vertex) => {
20
+ let x = vertex.position[0] * scaleX;
21
+ let y = vertex.position[1] * scaleY;
22
+ if (vertex.lock === "outer")
23
+ x = 0;
24
+ if (vertex.lock === "inner")
25
+ x = innerX;
26
+ if (vertex.lock === "front")
27
+ y = 0;
28
+ if (vertex.lock === "back")
29
+ y = backY;
30
+ if (vertex.region === "rabbet") {
31
+ x = Math.min(x, rabbetShelfX);
32
+ y = Math.max(y, nextParams.lipMm);
33
+ }
34
+ if (vertex.id.toLowerCase().includes("rabbetback")) {
35
+ y = rabbetBackY;
36
+ }
37
+ return {
38
+ ...vertex,
39
+ position: [Number(x.toFixed(3)), Number(y.toFixed(3))]
40
+ };
41
+ })
42
+ };
43
+ }
44
+ //# sourceMappingURL=profileScaling.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"profileScaling.js","sourceRoot":"","sources":["../../src/geometry/profileScaling.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ export * from "./geometry/buildFrameGeometry";
2
+ export * from "./geometry/buildRailGeometry";
3
+ export * from "./geometry/profileScaling";
4
+ export * from "./plugin/DreamLouvrePlugin";
5
+ export * from "./plugin/publicApi";
6
+ export * from "./profiles";