@base2datadesign/viewer-kit 0.1.3 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (65) hide show
  1. package/dist/engine/ViewerEngine.d.ts +5 -1
  2. package/dist/engine/ViewerEngine.d.ts.map +1 -1
  3. package/dist/engine/ViewerEngine.js +89 -6
  4. package/dist/engine/types.d.ts +57 -0
  5. package/dist/engine/types.d.ts.map +1 -1
  6. package/dist/exports/download.d.ts +2 -0
  7. package/dist/exports/download.d.ts.map +1 -0
  8. package/dist/exports/download.js +10 -0
  9. package/dist/exports/three-export.d.ts +4 -0
  10. package/dist/exports/three-export.d.ts.map +1 -0
  11. package/dist/exports/three-export.js +25 -0
  12. package/dist/index.d.ts +13 -1
  13. package/dist/index.d.ts.map +1 -1
  14. package/dist/index.js +9 -0
  15. package/dist/materials/architectural.d.ts +6 -0
  16. package/dist/materials/architectural.d.ts.map +1 -0
  17. package/dist/materials/architectural.js +169 -0
  18. package/dist/materials/catalogue-data.d.ts +149 -0
  19. package/dist/materials/catalogue-data.d.ts.map +1 -0
  20. package/dist/materials/catalogue-data.js +158 -0
  21. package/dist/materials/catalogue.d.ts +5 -0
  22. package/dist/materials/catalogue.d.ts.map +1 -0
  23. package/dist/materials/catalogue.js +23 -0
  24. package/dist/materials/presets.d.ts +21 -0
  25. package/dist/materials/presets.d.ts.map +1 -0
  26. package/dist/materials/presets.js +217 -0
  27. package/dist/materials/renderMetadata.d.ts +15 -0
  28. package/dist/materials/renderMetadata.d.ts.map +1 -0
  29. package/dist/materials/renderMetadata.js +64 -0
  30. package/dist/materials/types.d.ts +50 -0
  31. package/dist/materials/types.d.ts.map +1 -0
  32. package/dist/materials/types.js +1 -0
  33. package/dist/presets/sciencePresets.d.ts +7 -0
  34. package/dist/presets/sciencePresets.d.ts.map +1 -0
  35. package/dist/presets/sciencePresets.js +473 -0
  36. package/dist/sky/scienceSky.d.ts +10 -0
  37. package/dist/sky/scienceSky.d.ts.map +1 -0
  38. package/dist/sky/scienceSky.js +68 -0
  39. package/dist/systems/debugSystem.d.ts.map +1 -1
  40. package/dist/systems/debugSystem.js +188 -35
  41. package/dist/systems/environmentSystem.d.ts +1 -0
  42. package/dist/systems/environmentSystem.d.ts.map +1 -1
  43. package/dist/systems/environmentSystem.js +26 -5
  44. package/dist/systems/lightingSystem.d.ts +2 -0
  45. package/dist/systems/lightingSystem.d.ts.map +1 -1
  46. package/dist/systems/lightingSystem.js +15 -0
  47. package/dist/systems/postfxSystem.d.ts +3 -0
  48. package/dist/systems/postfxSystem.d.ts.map +1 -1
  49. package/dist/systems/postfxSystem.js +44 -6
  50. package/dist/uploads/grasshopper.d.ts +12 -0
  51. package/dist/uploads/grasshopper.d.ts.map +1 -0
  52. package/dist/uploads/grasshopper.js +113 -0
  53. package/dist/uploads/index.d.ts +8 -0
  54. package/dist/uploads/index.d.ts.map +1 -0
  55. package/dist/uploads/index.js +29 -0
  56. package/dist/uploads/mesh.d.ts +8 -0
  57. package/dist/uploads/mesh.d.ts.map +1 -0
  58. package/dist/uploads/mesh.js +109 -0
  59. package/dist/uploads/rhino3dm.d.ts +7 -0
  60. package/dist/uploads/rhino3dm.d.ts.map +1 -0
  61. package/dist/uploads/rhino3dm.js +33 -0
  62. package/dist/uploads/types.d.ts +67 -0
  63. package/dist/uploads/types.d.ts.map +1 -0
  64. package/dist/uploads/types.js +1 -0
  65. package/package.json +4 -1
@@ -1,5 +1,6 @@
1
- import type { CameraState, ViewerCreateOptions, ViewerHandle, ViewerSnapshot } from "./types";
1
+ import type { CameraState, RenderPresetDefinition, ViewerCreateOptions, ViewerHandle, ViewerSnapshot } from "./types";
2
2
  export declare class ViewerEngine {
3
+ private static readonly RUNTIME_PRESET_ID;
3
4
  private container;
4
5
  private renderer;
5
6
  private scene;
@@ -10,6 +11,7 @@ export declare class ViewerEngine {
10
11
  private lightingSystem;
11
12
  private postFxSystem;
12
13
  private debugSystem;
14
+ private usePostprocessing;
13
15
  private presets;
14
16
  private presetId;
15
17
  private running;
@@ -21,11 +23,13 @@ export declare class ViewerEngine {
21
23
  resize(): void;
22
24
  dispose(): void;
23
25
  setPreset(presetId: string): void;
26
+ setRuntimePreset(preset: RenderPresetDefinition): void;
24
27
  setSceneRoot(root: unknown): void;
25
28
  setCamera(state: Partial<CameraState>): void;
26
29
  getCameraState(): CameraState;
27
30
  capturePng(): Promise<Blob>;
28
31
  getSnapshot(): ViewerSnapshot;
32
+ private getDebugInfo;
29
33
  private applyPreset;
30
34
  private resolvePreset;
31
35
  }
@@ -1 +1 @@
1
- {"version":3,"file":"ViewerEngine.d.ts","sourceRoot":"","sources":["../../src/engine/ViewerEngine.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAiB,WAAW,EAAyC,mBAAmB,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAQpJ,qBAAa,YAAY;IACvB,OAAO,CAAC,SAAS,CAAc;IAC/B,OAAO,CAAC,QAAQ,CAAsB;IACtC,OAAO,CAAC,KAAK,CAAc;IAC3B,OAAO,CAAC,MAAM,CAA0B;IACxC,OAAO,CAAC,QAAQ,CAAgB;IAChC,OAAO,CAAC,SAAS,CAAc;IAE/B,OAAO,CAAC,iBAAiB,CAAoB;IAC7C,OAAO,CAAC,cAAc,CAAiB;IACvC,OAAO,CAAC,YAAY,CAAe;IACnC,OAAO,CAAC,WAAW,CAAc;IAEjC,OAAO,CAAC,OAAO,CAAgB;IAC/B,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,cAAc,CAAuB;gBAEjC,OAAO,EAAE,mBAAmB;IA6CxC,SAAS,IAAI,YAAY;IAezB,KAAK,IAAI,IAAI;IAYb,IAAI,IAAI,IAAI;IAQZ,MAAM,IAAI,IAAI;IASd,OAAO,IAAI,IAAI;IAef,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAIjC,YAAY,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI;IAOjC,SAAS,CAAC,KAAK,EAAE,OAAO,CAAC,WAAW,CAAC,GAAG,IAAI;IAc5C,cAAc,IAAI,WAAW;IAQvB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAmCjC,WAAW,IAAI,cAAc;IAe7B,OAAO,CAAC,WAAW;IAWnB,OAAO,CAAC,aAAa;CAKtB"}
1
+ {"version":3,"file":"ViewerEngine.d.ts","sourceRoot":"","sources":["../../src/engine/ViewerEngine.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAiB,WAAW,EAAiB,sBAAsB,EAAE,mBAAmB,EAAmB,YAAY,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAQrK,qBAAa,YAAY;IACvB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,iBAAiB,CAAiB;IAE1D,OAAO,CAAC,SAAS,CAAc;IAC/B,OAAO,CAAC,QAAQ,CAAsB;IACtC,OAAO,CAAC,KAAK,CAAc;IAC3B,OAAO,CAAC,MAAM,CAA0B;IACxC,OAAO,CAAC,QAAQ,CAAgB;IAChC,OAAO,CAAC,SAAS,CAAc;IAE/B,OAAO,CAAC,iBAAiB,CAAoB;IAC7C,OAAO,CAAC,cAAc,CAAiB;IACvC,OAAO,CAAC,YAAY,CAAe;IACnC,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,iBAAiB,CAAU;IAEnC,OAAO,CAAC,OAAO,CAAgB;IAC/B,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,cAAc,CAAuB;gBAEjC,OAAO,EAAE,mBAAmB;IAgDxC,SAAS,IAAI,YAAY;IAkBzB,KAAK,IAAI,IAAI;IAgBb,IAAI,IAAI,IAAI;IAQZ,MAAM,IAAI,IAAI;IASd,OAAO,IAAI,IAAI;IAef,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAIjC,gBAAgB,CAAC,MAAM,EAAE,sBAAsB,GAAG,IAAI;IAStD,YAAY,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI;IAuBjC,SAAS,CAAC,KAAK,EAAE,OAAO,CAAC,WAAW,CAAC,GAAG,IAAI;IAc5C,cAAc,IAAI,WAAW;IAQvB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAmCjC,WAAW,IAAI,cAAc;IAe7B,OAAO,CAAC,YAAY;IAuCpB,OAAO,CAAC,WAAW;IAoBnB,OAAO,CAAC,aAAa;CAKtB"}
@@ -7,6 +7,7 @@ import { LightingSystem } from "../systems/lightingSystem";
7
7
  import { PostFxSystem } from "../systems/postfxSystem";
8
8
  import { DebugSystem } from "../systems/debugSystem";
9
9
  export class ViewerEngine {
10
+ static RUNTIME_PRESET_ID = "__runtime__";
10
11
  container;
11
12
  renderer;
12
13
  scene;
@@ -17,13 +18,15 @@ export class ViewerEngine {
17
18
  lightingSystem;
18
19
  postFxSystem;
19
20
  debugSystem;
21
+ usePostprocessing;
20
22
  presets;
21
23
  presetId;
22
24
  running = false;
23
25
  animationFrame = null;
24
26
  constructor(options) {
25
27
  this.container = options.container;
26
- this.presets = options.presets ?? DEFAULT_PRESETS;
28
+ const basePresets = options.presets ?? DEFAULT_PRESETS;
29
+ this.presets = { ...basePresets };
27
30
  this.presetId = options.presetId ?? DEFAULT_PRESET_ID;
28
31
  const width = this.container.clientWidth || 1;
29
32
  const height = this.container.clientHeight || 1;
@@ -51,6 +54,8 @@ export class ViewerEngine {
51
54
  this.lightingSystem = new LightingSystem(this.scene);
52
55
  this.postFxSystem = new PostFxSystem(this.renderer, this.scene, this.camera);
53
56
  this.debugSystem = new DebugSystem(this.scene);
57
+ this.usePostprocessing = options.usePostprocessing ?? true;
58
+ this.postFxSystem.resize(width, height);
54
59
  this.applyPreset(this.presetId);
55
60
  }
56
61
  getHandle() {
@@ -60,11 +65,14 @@ export class ViewerEngine {
60
65
  resize: () => this.resize(),
61
66
  dispose: () => this.dispose(),
62
67
  setPreset: (presetId) => this.setPreset(presetId),
68
+ setRuntimePreset: (preset) => this.setRuntimePreset(preset),
63
69
  setSceneRoot: (root) => this.setSceneRoot(root),
64
70
  setCamera: (state) => this.setCamera(state),
65
71
  getCameraState: () => this.getCameraState(),
66
72
  capturePng: () => this.capturePng(),
67
73
  getSnapshot: () => this.getSnapshot(),
74
+ getDebugInfo: () => this.getDebugInfo(),
75
+ getCanvas: () => this.renderer.domElement,
68
76
  };
69
77
  }
70
78
  start() {
@@ -75,7 +83,12 @@ export class ViewerEngine {
75
83
  if (!this.running)
76
84
  return;
77
85
  this.controls.update();
78
- this.postFxSystem.render();
86
+ if (this.usePostprocessing) {
87
+ this.postFxSystem.render();
88
+ }
89
+ else {
90
+ this.renderer.render(this.scene, this.camera);
91
+ }
79
92
  this.animationFrame = requestAnimationFrame(loop);
80
93
  };
81
94
  this.animationFrame = requestAnimationFrame(loop);
@@ -111,11 +124,35 @@ export class ViewerEngine {
111
124
  setPreset(presetId) {
112
125
  this.applyPreset(presetId);
113
126
  }
127
+ setRuntimePreset(preset) {
128
+ const normalized = {
129
+ ...preset,
130
+ id: ViewerEngine.RUNTIME_PRESET_ID,
131
+ };
132
+ this.presets[ViewerEngine.RUNTIME_PRESET_ID] = normalized;
133
+ this.applyPreset(ViewerEngine.RUNTIME_PRESET_ID);
134
+ }
114
135
  setSceneRoot(root) {
115
136
  this.rootGroup.clear();
116
- if (root && root instanceof THREE.Object3D) {
117
- this.rootGroup.add(root);
137
+ const object3d = root;
138
+ if (object3d && object3d.isObject3D) {
139
+ this.rootGroup.add(object3d);
140
+ const bounds = new THREE.Box3().setFromObject(object3d);
141
+ if (!bounds.isEmpty()) {
142
+ const size = new THREE.Vector3();
143
+ bounds.getSize(size);
144
+ const maxDim = Math.max(size.x, size.y, size.z);
145
+ if (Number.isFinite(maxDim) && maxDim > 0) {
146
+ const far = Math.max(500, maxDim * 10);
147
+ if (this.camera.far !== far) {
148
+ this.camera.far = far;
149
+ this.camera.updateProjectionMatrix();
150
+ }
151
+ }
152
+ }
118
153
  }
154
+ // Ensure the render loop is running after a scene update.
155
+ this.start();
119
156
  }
120
157
  setCamera(state) {
121
158
  if (state.position) {
@@ -182,13 +219,59 @@ export class ViewerEngine {
182
219
  postfx: this.postFxSystem.getState(),
183
220
  };
184
221
  }
222
+ getDebugInfo() {
223
+ const envState = this.environmentSystem.getState();
224
+ const postfxState = this.postFxSystem.getState();
225
+ const renderInfo = this.renderer.info.render;
226
+ const clearColor = new THREE.Color();
227
+ this.renderer.getClearColor(clearColor);
228
+ return {
229
+ presetId: this.presetId,
230
+ camera: this.getCameraState(),
231
+ canvas: {
232
+ width: this.renderer.domElement.width,
233
+ height: this.renderer.domElement.height,
234
+ clientWidth: this.renderer.domElement.clientWidth,
235
+ clientHeight: this.renderer.domElement.clientHeight,
236
+ },
237
+ renderer: {
238
+ toneMapping: String(this.renderer.toneMapping),
239
+ toneMappingExposure: this.renderer.toneMappingExposure,
240
+ outputColorSpace: String(this.renderer.outputColorSpace),
241
+ pixelRatio: this.renderer.getPixelRatio(),
242
+ clearColor: `#${clearColor.getHexString()}`,
243
+ clearAlpha: this.renderer.getClearAlpha(),
244
+ },
245
+ renderInfo: {
246
+ calls: renderInfo.calls,
247
+ triangles: renderInfo.triangles,
248
+ lines: renderInfo.lines,
249
+ points: renderInfo.points,
250
+ },
251
+ scene: {
252
+ children: this.scene.children.length,
253
+ rootChildren: this.rootGroup.children.length,
254
+ lights: this.scene.children.filter((child) => child?.isLight).length,
255
+ },
256
+ environment: envState,
257
+ postfx: postfxState,
258
+ };
259
+ }
185
260
  applyPreset(presetId) {
186
261
  const preset = this.resolvePreset(presetId);
187
262
  this.presetId = preset.id;
188
- applyRendererConfig(this.renderer, preset.renderer);
263
+ const exposureOverride = preset.sky?.mode === "hdr"
264
+ ? preset.sky.hdr?.exposure
265
+ : preset.sky?.mode === "cube"
266
+ ? preset.sky.cube?.exposure
267
+ : undefined;
268
+ const rendererConfig = exposureOverride !== undefined
269
+ ? { ...preset.renderer, toneMappingExposure: exposureOverride }
270
+ : preset.renderer;
271
+ applyRendererConfig(this.renderer, rendererConfig);
189
272
  void this.environmentSystem.apply(preset);
190
273
  this.lightingSystem.apply(preset);
191
- this.postFxSystem.apply(preset.postfx);
274
+ this.postFxSystem.apply(this.usePostprocessing ? preset.postfx : undefined);
192
275
  this.debugSystem.apply(preset);
193
276
  }
194
277
  resolvePreset(presetId) {
@@ -108,6 +108,8 @@ export type PostFxConfig = {
108
108
  radius?: number;
109
109
  distanceFalloff?: number;
110
110
  halfRes?: boolean;
111
+ quality?: "low" | "medium" | "high";
112
+ color?: string;
111
113
  };
112
114
  bloom?: {
113
115
  enabled: boolean;
@@ -127,6 +129,7 @@ export type SceneExtrasConfig = {
127
129
  ground?: boolean;
128
130
  axes?: boolean;
129
131
  origin?: boolean;
132
+ lightTarget?: [number, number, number];
130
133
  groundColor?: number;
131
134
  groundRoughness?: number;
132
135
  groundMetalness?: number;
@@ -137,6 +140,17 @@ export type SceneExtrasConfig = {
137
140
  gridDivisions?: number;
138
141
  gridSize?: number;
139
142
  gridHeightOffset?: number;
143
+ originHighlight?: boolean;
144
+ originLineColor?: number;
145
+ originLineLength?: number;
146
+ originLineThickness?: number;
147
+ axisLabelScale?: number;
148
+ axesLabels?: {
149
+ lowerCase?: boolean;
150
+ upperCase?: boolean;
151
+ offset?: number;
152
+ secondaryOffset?: number;
153
+ };
140
154
  originColor?: number;
141
155
  originSize?: number;
142
156
  axesPosition?: [number, number, number];
@@ -144,6 +158,7 @@ export type SceneExtrasConfig = {
144
158
  export type RenderPresetDefinition = {
145
159
  id: string;
146
160
  label?: string;
161
+ materialsPresetId?: string;
147
162
  renderer?: RendererConfig;
148
163
  sky?: SkyDefinition;
149
164
  lighting?: LightingRigConfig;
@@ -176,6 +191,45 @@ export type ViewerSnapshot = {
176
191
  vignetteEnabled: boolean;
177
192
  };
178
193
  };
194
+ export type ViewerDebugInfo = {
195
+ presetId: string;
196
+ camera: CameraState;
197
+ canvas: {
198
+ width: number;
199
+ height: number;
200
+ clientWidth: number;
201
+ clientHeight: number;
202
+ };
203
+ renderer: {
204
+ toneMapping: string;
205
+ toneMappingExposure: number;
206
+ outputColorSpace: string;
207
+ pixelRatio: number;
208
+ clearColor: string;
209
+ clearAlpha: number;
210
+ };
211
+ renderInfo: {
212
+ calls: number;
213
+ triangles: number;
214
+ lines: number;
215
+ points: number;
216
+ };
217
+ scene: {
218
+ children: number;
219
+ rootChildren: number;
220
+ lights: number;
221
+ };
222
+ environment: {
223
+ mode: "none" | "gradient" | "hdr" | "cube";
224
+ backgroundEnabled: boolean;
225
+ lightingEnabled: boolean;
226
+ };
227
+ postfx: {
228
+ aoEnabled: boolean;
229
+ bloomEnabled: boolean;
230
+ vignetteEnabled: boolean;
231
+ };
232
+ };
179
233
  export type CameraState = {
180
234
  position: [number, number, number];
181
235
  target: [number, number, number];
@@ -210,10 +264,13 @@ export type ViewerHandle = {
210
264
  resize(): void;
211
265
  dispose(): void;
212
266
  setPreset(presetId: string): void;
267
+ setRuntimePreset(preset: RenderPresetDefinition): void;
213
268
  setSceneRoot(root: unknown): void;
214
269
  setCamera(state: Partial<CameraState>): void;
215
270
  getCameraState(): CameraState;
216
271
  capturePng(): Promise<Blob>;
217
272
  getSnapshot(): ViewerSnapshot;
273
+ getDebugInfo?: () => ViewerDebugInfo;
274
+ getCanvas?: () => HTMLCanvasElement;
218
275
  };
219
276
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/engine/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/engine/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function downloadBlob(blob: Blob, filename: string): void;
2
+ //# sourceMappingURL=download.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"download.d.ts","sourceRoot":"","sources":["../../src/exports/download.ts"],"names":[],"mappings":"AAAA,wBAAgB,YAAY,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,QASxD"}
@@ -0,0 +1,10 @@
1
+ export function downloadBlob(blob, filename) {
2
+ const url = URL.createObjectURL(blob);
3
+ const link = document.createElement("a");
4
+ link.href = url;
5
+ link.download = filename;
6
+ document.body.appendChild(link);
7
+ link.click();
8
+ link.remove();
9
+ setTimeout(() => URL.revokeObjectURL(url), 0);
10
+ }
@@ -0,0 +1,4 @@
1
+ import * as THREE from "three";
2
+ export type ExportFormat = "glb" | "obj";
3
+ export declare function exportObject(object: THREE.Object3D, format: ExportFormat): Promise<Blob>;
4
+ //# sourceMappingURL=three-export.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"three-export.d.ts","sourceRoot":"","sources":["../../src/exports/three-export.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,MAAM,MAAM,YAAY,GAAG,KAAK,GAAG,KAAK,CAAC;AAEzC,wBAAsB,YAAY,CAAC,MAAM,EAAE,KAAK,CAAC,QAAQ,EAAE,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CA6B9F"}
@@ -0,0 +1,25 @@
1
+ export async function exportObject(object, format) {
2
+ if (format === "glb") {
3
+ const { GLTFExporter } = await import("three/examples/jsm/exporters/GLTFExporter.js");
4
+ const exporter = new GLTFExporter();
5
+ const arrayBuffer = await new Promise((resolve, reject) => {
6
+ exporter.parse(object, (result) => {
7
+ if (result instanceof ArrayBuffer) {
8
+ resolve(result);
9
+ return;
10
+ }
11
+ try {
12
+ resolve(new TextEncoder().encode(JSON.stringify(result)).buffer);
13
+ }
14
+ catch (error) {
15
+ reject(error);
16
+ }
17
+ }, (error) => reject(error), { binary: true });
18
+ });
19
+ return new Blob([arrayBuffer], { type: "model/gltf-binary" });
20
+ }
21
+ const { OBJExporter } = await import("three/examples/jsm/exporters/OBJExporter.js");
22
+ const exporter = new OBJExporter();
23
+ const text = exporter.parse(object);
24
+ return new Blob([text], { type: "text/plain" });
25
+ }
package/dist/index.d.ts CHANGED
@@ -1,4 +1,16 @@
1
- export type { ViewerCreateOptions, ViewerHandle, ViewerSnapshot, CameraState, RenderPresetDefinition, PresetCatalog, LightingRigConfig, PostFxConfig, SceneExtrasConfig, SkyDefinition, SkyHdrConfig, SkyCubeConfig, } from "./engine/types";
1
+ export type { ViewerCreateOptions, ViewerHandle, ViewerSnapshot, CameraState, RenderPresetDefinition, PresetCatalog, LightingRigConfig, PostFxConfig, SceneExtrasConfig, SkyDefinition, SkyHdrConfig, SkyCubeConfig, ViewerDebugInfo, } from "./engine/types";
2
2
  export { createViewer } from "./engine/createViewer";
3
3
  export { DEFAULT_PRESET_ID, DEFAULT_PRESETS } from "./presets/defaults";
4
+ export { SCIENCE_PRESETS, SCIENCE_PRESET_SUMMARIES, SCIENCE_DEFAULT_PRESET_ID, buildViewerPresets, buildSciencePresets, } from "./presets/sciencePresets";
5
+ export { listScienceSkyOptions, getScienceSkyOption } from "./sky/scienceSky";
6
+ export type { ScienceSkyOption } from "./sky/scienceSky";
7
+ export type { MaterialCatalogue, MaterialDefinition, MaterialId, MaterialColor, SurfaceMaterialConfig, MaterialsConfig, } from "./materials/types";
8
+ export { getMaterialCatalogue, findMaterial, listMaterialsByCategory } from "./materials/catalogue";
9
+ export { getRenderMaterialMetadata } from "./materials/renderMetadata";
10
+ export { BASELINE_MATERIAL_PRESET_ID, MATERIAL_PRESET_DATA, listMaterialPresets, getMaterialPreset, resolveMaterialSlot, resolveMaterialPresetMaterials, } from "./materials/presets";
11
+ export { applyMaterialsToGroup, buildSurfaceMaterial, buildCatalogMaterial } from "./materials/architectural";
12
+ export * from "./uploads";
13
+ export { exportObject } from "./exports/three-export";
14
+ export type { ExportFormat } from "./exports/three-export";
15
+ export { downloadBlob } from "./exports/download";
4
16
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,mBAAmB,EACnB,YAAY,EACZ,cAAc,EACd,WAAW,EACX,sBAAsB,EACtB,aAAa,EACb,iBAAiB,EACjB,YAAY,EACZ,iBAAiB,EACjB,aAAa,EACb,YAAY,EACZ,aAAa,GACd,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,mBAAmB,EACnB,YAAY,EACZ,cAAc,EACd,WAAW,EACX,sBAAsB,EACtB,aAAa,EACb,iBAAiB,EACjB,YAAY,EACZ,iBAAiB,EACjB,aAAa,EACb,YAAY,EACZ,aAAa,EACb,eAAe,GAChB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACxE,OAAO,EACL,eAAe,EACf,wBAAwB,EACxB,yBAAyB,EACzB,kBAAkB,EAClB,mBAAmB,GACpB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,qBAAqB,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAC9E,YAAY,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACzD,YAAY,EACV,iBAAiB,EACjB,kBAAkB,EAClB,UAAU,EACV,aAAa,EACb,qBAAqB,EACrB,eAAe,GAChB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,oBAAoB,EAAE,YAAY,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AACpG,OAAO,EAAE,yBAAyB,EAAE,MAAM,4BAA4B,CAAC;AACvE,OAAO,EACL,2BAA2B,EAC3B,oBAAoB,EACpB,mBAAmB,EACnB,iBAAiB,EACjB,mBAAmB,EACnB,8BAA8B,GAC/B,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AAC9G,cAAc,WAAW,CAAC;AAC1B,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACtD,YAAY,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC"}
package/dist/index.js CHANGED
@@ -1,2 +1,11 @@
1
1
  export { createViewer } from "./engine/createViewer";
2
2
  export { DEFAULT_PRESET_ID, DEFAULT_PRESETS } from "./presets/defaults";
3
+ export { SCIENCE_PRESETS, SCIENCE_PRESET_SUMMARIES, SCIENCE_DEFAULT_PRESET_ID, buildViewerPresets, buildSciencePresets, } from "./presets/sciencePresets";
4
+ export { listScienceSkyOptions, getScienceSkyOption } from "./sky/scienceSky";
5
+ export { getMaterialCatalogue, findMaterial, listMaterialsByCategory } from "./materials/catalogue";
6
+ export { getRenderMaterialMetadata } from "./materials/renderMetadata";
7
+ export { BASELINE_MATERIAL_PRESET_ID, MATERIAL_PRESET_DATA, listMaterialPresets, getMaterialPreset, resolveMaterialSlot, resolveMaterialPresetMaterials, } from "./materials/presets";
8
+ export { applyMaterialsToGroup, buildSurfaceMaterial, buildCatalogMaterial } from "./materials/architectural";
9
+ export * from "./uploads";
10
+ export { exportObject } from "./exports/three-export";
11
+ export { downloadBlob } from "./exports/download";
@@ -0,0 +1,6 @@
1
+ import * as THREE from "three";
2
+ import type { MaterialId, MaterialsConfig, SurfaceMaterialConfig } from "./types";
3
+ export declare function buildSurfaceMaterial(surface: "walls" | "floor" | "ceiling", config: SurfaceMaterialConfig): THREE.MeshStandardMaterial;
4
+ export declare function buildCatalogMaterial(materialId: MaterialId, overrides?: Partial<SurfaceMaterialConfig>): THREE.MeshStandardMaterial;
5
+ export declare function applyMaterialsToGroup(group: THREE.Group, materialsConfig?: MaterialsConfig | null, floorLevel?: number, ceilingHeight?: number): void;
6
+ //# sourceMappingURL=architectural.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"architectural.d.ts","sourceRoot":"","sources":["../../src/materials/architectural.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,KAAK,EAAE,UAAU,EAAE,eAAe,EAAE,qBAAqB,EAAE,MAAM,SAAS,CAAC;AA6GlF,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,GAAG,SAAS,EAAE,MAAM,EAAE,qBAAqB,8BAEzG;AAED,wBAAgB,oBAAoB,CAAC,UAAU,EAAE,UAAU,EAAE,SAAS,CAAC,EAAE,OAAO,CAAC,qBAAqB,CAAC,8BAiBtG;AA4BD,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,KAAK,CAAC,KAAK,EAClB,eAAe,CAAC,EAAE,eAAe,GAAG,IAAI,EACxC,UAAU,CAAC,EAAE,MAAM,EACnB,aAAa,CAAC,EAAE,MAAM,GACrB,IAAI,CA+BN"}
@@ -0,0 +1,169 @@
1
+ import * as THREE from "three";
2
+ import { findMaterial } from "./catalogue";
3
+ import { getRenderMaterialMetadata } from "./renderMetadata";
4
+ const clamp01 = (value) => Math.min(Math.max(value, 0), 1);
5
+ const colorFromRGB = (rgb) => new THREE.Color(rgb.r / 255, rgb.g / 255, rgb.b / 255);
6
+ const textureLoader = new THREE.TextureLoader();
7
+ const textureCache = new Map();
8
+ const loadTexture = (path, scale) => {
9
+ if (!path)
10
+ return undefined;
11
+ const cached = textureCache.get(path);
12
+ if (cached)
13
+ return cached;
14
+ const texture = textureLoader.load(path, () => {
15
+ texture.needsUpdate = true;
16
+ });
17
+ texture.wrapS = THREE.RepeatWrapping;
18
+ texture.wrapT = THREE.RepeatWrapping;
19
+ if (scale) {
20
+ texture.repeat.set(scale[0], scale[1]);
21
+ }
22
+ texture.flipY = false;
23
+ textureCache.set(path, texture);
24
+ return texture;
25
+ };
26
+ const applyTexturesToMaterial = (material, textures) => {
27
+ if (!textures)
28
+ return;
29
+ let changed = false;
30
+ if (textures.albedo) {
31
+ const map = loadTexture(textures.albedo, textures.scale);
32
+ if (map) {
33
+ map.colorSpace = THREE.SRGBColorSpace;
34
+ material.map = map;
35
+ changed = true;
36
+ }
37
+ }
38
+ if (textures.normal) {
39
+ const map = loadTexture(textures.normal, textures.scale);
40
+ if (map) {
41
+ map.colorSpace = THREE.LinearSRGBColorSpace;
42
+ material.normalMap = map;
43
+ changed = true;
44
+ }
45
+ }
46
+ if (textures.roughness) {
47
+ const map = loadTexture(textures.roughness, textures.scale);
48
+ if (map) {
49
+ map.colorSpace = THREE.LinearSRGBColorSpace;
50
+ material.roughnessMap = map;
51
+ changed = true;
52
+ }
53
+ }
54
+ if (textures.ao) {
55
+ const map = loadTexture(textures.ao, textures.scale);
56
+ if (map) {
57
+ map.colorSpace = THREE.LinearSRGBColorSpace;
58
+ material.aoMap = map;
59
+ changed = true;
60
+ }
61
+ }
62
+ if (changed) {
63
+ material.needsUpdate = true;
64
+ }
65
+ };
66
+ const buildMaterial = (surface, config) => {
67
+ const isCustom = config.type === "custom";
68
+ const catalogueMaterial = !isCustom ? findMaterial(config.type) : undefined;
69
+ const renderMetadata = !isCustom ? getRenderMaterialMetadata(config.type) : undefined;
70
+ const hasAlbedoTexture = Boolean(renderMetadata?.textures?.albedo) || Boolean(catalogueMaterial?.pbr?.texture);
71
+ const baseColor = catalogueMaterial && hasAlbedoTexture
72
+ ? new THREE.Color(catalogueMaterial.pbr.baseColor)
73
+ : colorFromRGB(config.color);
74
+ const material = new THREE.MeshStandardMaterial({
75
+ color: baseColor.clone(),
76
+ roughness: clamp01(config.roughness ?? catalogueMaterial?.pbr.roughness ?? 0.6),
77
+ metalness: clamp01(catalogueMaterial?.pbr.metalness ?? 0),
78
+ emissive: new THREE.Color(catalogueMaterial?.pbr.emissive ?? "#ffffff"),
79
+ emissiveIntensity: clamp01(catalogueMaterial?.pbr.emissiveIntensity ?? 0.05),
80
+ depthWrite: true,
81
+ depthTest: true,
82
+ side: THREE.DoubleSide,
83
+ });
84
+ material.envMapIntensity = clamp01(config.reflectance ?? 0.5);
85
+ if (catalogueMaterial?.pbr.transparent || typeof catalogueMaterial?.pbr.opacity === "number") {
86
+ material.transparent = catalogueMaterial?.pbr.transparent ?? true;
87
+ material.opacity = clamp01(catalogueMaterial?.pbr.opacity ?? 1);
88
+ material.depthWrite = false;
89
+ }
90
+ if (!isCustom) {
91
+ if (renderMetadata?.doubleSided === false) {
92
+ material.side = THREE.FrontSide;
93
+ }
94
+ applyTexturesToMaterial(material, renderMetadata?.textures);
95
+ }
96
+ material.name = `${surface}-material`;
97
+ return material;
98
+ };
99
+ export function buildSurfaceMaterial(surface, config) {
100
+ return buildMaterial(surface, config);
101
+ }
102
+ export function buildCatalogMaterial(materialId, overrides) {
103
+ const definition = findMaterial(materialId);
104
+ const fallbackColor = definition?.baseline?.color ?? "#ffffff";
105
+ const color = overrides?.color ?? {
106
+ r: parseInt(fallbackColor.slice(1, 3), 16),
107
+ g: parseInt(fallbackColor.slice(3, 5), 16),
108
+ b: parseInt(fallbackColor.slice(5, 7), 16),
109
+ };
110
+ const config = {
111
+ type: materialId,
112
+ color,
113
+ reflectance: overrides?.reflectance ?? 0.5,
114
+ roughness: overrides?.roughness ?? definition?.pbr?.roughness ?? 0.6,
115
+ pattern: overrides?.pattern,
116
+ patternScale: overrides?.patternScale,
117
+ };
118
+ return buildMaterial(materialId, config);
119
+ }
120
+ const classifySurfaceWorld = (bboxWorld, floorY, ceilingY) => {
121
+ const dx = bboxWorld.max.x - bboxWorld.min.x;
122
+ const dy = bboxWorld.max.y - bboxWorld.min.y;
123
+ const dz = bboxWorld.max.z - bboxWorld.min.z;
124
+ const centerY = (bboxWorld.min.y + bboxWorld.max.y) / 2;
125
+ const midY = (floorY + ceilingY) / 2;
126
+ const isBroadHorizontal = dy <= 0.35 && dx >= 0.8 && dz >= 0.8;
127
+ if (isBroadHorizontal) {
128
+ return centerY <= midY ? "floor" : "ceiling";
129
+ }
130
+ const isSlabLike = dy <= 1.0 && dx >= 0.8 && dz >= 0.8;
131
+ if (isSlabLike) {
132
+ if (bboxWorld.max.y <= floorY + 0.6)
133
+ return "floor";
134
+ if (bboxWorld.min.y >= ceilingY - 0.6)
135
+ return "ceiling";
136
+ return centerY <= midY ? "floor" : "ceiling";
137
+ }
138
+ return "walls";
139
+ };
140
+ export function applyMaterialsToGroup(group, materialsConfig, floorLevel, ceilingHeight) {
141
+ const floorY = typeof floorLevel === "number" ? floorLevel : 0;
142
+ const ceilingY = typeof ceilingHeight === "number" ? floorY + ceilingHeight : undefined;
143
+ const materialSet = materialsConfig
144
+ ? {
145
+ walls: buildSurfaceMaterial("walls", materialsConfig.walls),
146
+ floor: buildSurfaceMaterial("floor", materialsConfig.floor),
147
+ ceiling: buildSurfaceMaterial("ceiling", materialsConfig.ceiling),
148
+ }
149
+ : null;
150
+ group.updateMatrixWorld(true);
151
+ group.traverse((child) => {
152
+ if (!child?.isMesh)
153
+ return;
154
+ child.castShadow = true;
155
+ child.receiveShadow = true;
156
+ child.geometry.computeBoundingBox();
157
+ const bbox = child.geometry.boundingBox;
158
+ const taggedMaterialId = typeof child.userData?.material === "string" ? child.userData.material : null;
159
+ if (taggedMaterialId && findMaterial(taggedMaterialId)) {
160
+ child.material = buildCatalogMaterial(taggedMaterialId);
161
+ }
162
+ else if (bbox && materialSet && typeof ceilingY === "number") {
163
+ const bboxWorld = bbox.clone().applyMatrix4(child.matrixWorld);
164
+ const surface = classifySurfaceWorld(bboxWorld, floorY, ceilingY);
165
+ child.material = materialSet[surface].clone();
166
+ }
167
+ child.geometry.computeVertexNormals();
168
+ });
169
+ }