@base2datadesign/viewer-kit 0.2.13 → 0.2.15

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.
@@ -0,0 +1,28 @@
1
+ import * as THREE from "three";
2
+ export type CameraFrameMode = "iso" | "interior";
3
+ export type CameraFrameConfig = {
4
+ mode?: CameraFrameMode;
5
+ padding?: number;
6
+ direction?: [number, number, number];
7
+ };
8
+ export type CameraNormalizationConfig = {
9
+ recenter?: boolean;
10
+ floorToZero?: boolean;
11
+ normalizePlan?: {
12
+ target?: number;
13
+ maxScale?: number;
14
+ };
15
+ };
16
+ export type CameraNormalizationResult = {
17
+ bounds: THREE.Box3;
18
+ center: THREE.Vector3;
19
+ size: THREE.Vector3;
20
+ scale: number;
21
+ offset: THREE.Vector3;
22
+ };
23
+ export declare const normalizeObject3d: (object: THREE.Object3D, config?: CameraNormalizationConfig) => CameraNormalizationResult;
24
+ export declare const computeCameraFrame: (bounds: THREE.Box3, fovDegrees: number, config?: CameraFrameConfig) => {
25
+ position: THREE.Vector3;
26
+ target: THREE.Vector3;
27
+ };
28
+ //# sourceMappingURL=camera.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"camera.d.ts","sourceRoot":"","sources":["../src/camera.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,MAAM,MAAM,eAAe,GAAG,KAAK,GAAG,UAAU,CAAC;AAEjD,MAAM,MAAM,iBAAiB,GAAG;IAC9B,IAAI,CAAC,EAAE,eAAe,CAAC;IACvB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;CACtC,CAAC;AAEF,MAAM,MAAM,yBAAyB,GAAG;IACtC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,aAAa,CAAC,EAAE;QACd,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB,CAAC;CACH,CAAC;AAEF,MAAM,MAAM,yBAAyB,GAAG;IACtC,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC;IACnB,MAAM,EAAE,KAAK,CAAC,OAAO,CAAC;IACtB,IAAI,EAAE,KAAK,CAAC,OAAO,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,KAAK,CAAC,OAAO,CAAC;CACvB,CAAC;AAKF,eAAO,MAAM,iBAAiB,GAC5B,QAAQ,KAAK,CAAC,QAAQ,EACtB,SAAS,yBAAyB,KACjC,yBA8CF,CAAC;AAEF,eAAO,MAAM,kBAAkB,GAC7B,QAAQ,KAAK,CAAC,IAAI,EAClB,YAAY,MAAM,EAClB,SAAS,iBAAiB,KACzB;IAAE,QAAQ,EAAE,KAAK,CAAC,OAAO,CAAC;IAAC,MAAM,EAAE,KAAK,CAAC,OAAO,CAAA;CAmBlD,CAAC"}
package/dist/camera.js ADDED
@@ -0,0 +1,62 @@
1
+ import * as THREE from "three";
2
+ const DEFAULT_FRAME_PADDING = 1.22;
3
+ const DEFAULT_FRAME_DIRECTION = [1, 0.7, 1];
4
+ export const normalizeObject3d = (object, config) => {
5
+ const resolved = config ?? {};
6
+ const offset = new THREE.Vector3();
7
+ let scale = 1;
8
+ object.updateMatrixWorld(true);
9
+ let bounds = new THREE.Box3().setFromObject(object);
10
+ let size = new THREE.Vector3();
11
+ let center = new THREE.Vector3();
12
+ bounds.getSize(size);
13
+ bounds.getCenter(center);
14
+ const targetPlan = resolved.normalizePlan?.target;
15
+ if (typeof targetPlan === "number" && Number.isFinite(targetPlan) && targetPlan > 0) {
16
+ const planMax = Math.max(size.x, size.z);
17
+ if (planMax > 1e-6) {
18
+ const maxScale = resolved.normalizePlan?.maxScale ?? 3;
19
+ scale = Math.min(maxScale, targetPlan / planMax);
20
+ if (Number.isFinite(scale) && scale > 0 && scale !== 1) {
21
+ object.scale.multiplyScalar(scale);
22
+ object.updateMatrixWorld(true);
23
+ bounds = new THREE.Box3().setFromObject(object);
24
+ bounds.getSize(size);
25
+ bounds.getCenter(center);
26
+ }
27
+ }
28
+ }
29
+ if (resolved.recenter) {
30
+ offset.x -= center.x;
31
+ offset.z -= center.z;
32
+ }
33
+ if (resolved.floorToZero) {
34
+ offset.y -= bounds.min.y;
35
+ }
36
+ if (offset.lengthSq() > 0) {
37
+ object.position.add(offset);
38
+ object.updateMatrixWorld(true);
39
+ bounds = new THREE.Box3().setFromObject(object);
40
+ bounds.getSize(size);
41
+ bounds.getCenter(center);
42
+ }
43
+ return { bounds, center, size, scale, offset };
44
+ };
45
+ export const computeCameraFrame = (bounds, fovDegrees, config) => {
46
+ const size = new THREE.Vector3();
47
+ const center = new THREE.Vector3();
48
+ bounds.getSize(size);
49
+ bounds.getCenter(center);
50
+ const mode = config?.mode ?? "iso";
51
+ if (mode === "interior") {
52
+ const position = new THREE.Vector3(center.x, center.y + size.y * 0.2, center.z + size.z * 0.2);
53
+ return { position, target: center };
54
+ }
55
+ const padding = config?.padding ?? DEFAULT_FRAME_PADDING;
56
+ const direction = new THREE.Vector3(...(config?.direction ?? DEFAULT_FRAME_DIRECTION)).normalize();
57
+ const radius = Math.max(0.5, size.length() * 0.5);
58
+ const vFov = THREE.MathUtils.degToRad(fovDegrees);
59
+ const distance = (radius / Math.sin(vFov / 2)) * padding;
60
+ const position = center.clone().add(direction.multiplyScalar(distance));
61
+ return { position, target: center };
62
+ };
package/dist/index.d.ts CHANGED
@@ -1,5 +1,7 @@
1
1
  export type { ViewerCreateOptions, ViewerHandle, ViewerSnapshot, CameraState, RenderPresetDefinition, PresetCatalog, LightingRigConfig, PostFxConfig, SceneExtrasConfig, SkyDefinition, SkyHdrConfig, SkyCubeConfig, ViewerDebugInfo, } from "./engine/types";
2
+ export type { CameraFrameConfig, CameraFrameMode, CameraNormalizationConfig, CameraNormalizationResult, } from "./camera";
2
3
  export { createViewer } from "./engine/createViewer";
4
+ export { computeCameraFrame, normalizeObject3d } from "./camera";
3
5
  export { DEFAULT_PRESET_ID, DEFAULT_PRESETS } from "./presets/defaults";
4
6
  export { SCIENCE_PRESETS, SCIENCE_PRESET_SUMMARIES, SCIENCE_DEFAULT_PRESET_ID, buildViewerPresets, buildSciencePresets, } from "./presets/sciencePresets";
5
7
  export { listScienceSkyOptions, getScienceSkyOption } from "./sky/scienceSky";
@@ -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,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"}
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,YAAY,EACV,iBAAiB,EACjB,eAAe,EACf,yBAAyB,EACzB,yBAAyB,GAC1B,MAAM,UAAU,CAAC;AAClB,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AACjE,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,4 +1,5 @@
1
1
  export { createViewer } from "./engine/createViewer";
2
+ export { computeCameraFrame, normalizeObject3d } from "./camera";
2
3
  export { DEFAULT_PRESET_ID, DEFAULT_PRESETS } from "./presets/defaults";
3
4
  export { SCIENCE_PRESETS, SCIENCE_PRESET_SUMMARIES, SCIENCE_DEFAULT_PRESET_ID, buildViewerPresets, buildSciencePresets, } from "./presets/sciencePresets";
4
5
  export { listScienceSkyOptions, getScienceSkyOption } from "./sky/scienceSky";
@@ -19,6 +19,7 @@ export declare class PostFxSystem {
19
19
  apply(config?: PostFxConfig): void;
20
20
  render(): void;
21
21
  resize(width: number, height: number): void;
22
+ private getDrawingBufferSize;
22
23
  dispose(): void;
23
24
  invalidate(): void;
24
25
  getState(): {
@@ -1 +1 @@
1
- {"version":3,"file":"postfxSystem.d.ts","sourceRoot":"","sources":["../../src/systems/postfxSystem.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAG/B,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAEpD,qBAAa,YAAY;IACvB,OAAO,CAAC,QAAQ,CAAsB;IACtC,OAAO,CAAC,KAAK,CAAc;IAC3B,OAAO,CAAC,MAAM,CAA0B;IACxC,OAAO,CAAC,QAAQ,CAA+B;IAC/C,OAAO,CAAC,UAAU,CAA2B;IAC7C,OAAO,CAAC,MAAM,CAA6B;IAC3C,OAAO,CAAC,UAAU,CAA2B;IAC7C,OAAO,CAAC,WAAW,CAA4B;IAC/C,OAAO,CAAC,cAAc,CAA+B;IACrD,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,SAAS,CAAK;IACtB,OAAO,CAAC,UAAU,CAAK;IACvB,OAAO,CAAC,aAAa,CAA6B;IAClD,OAAO,CAAC,aAAa,CAA6B;gBAEtC,QAAQ,EAAE,KAAK,CAAC,aAAa,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,iBAAiB;IAM9F,KAAK,CAAC,MAAM,CAAC,EAAE,YAAY,GAAG,IAAI;IA+GlC,MAAM,IAAI,IAAI;IAoBd,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI;IAwB3C,OAAO,IAAI,IAAI;IAaf,UAAU,IAAI,IAAI;IAqBlB,QAAQ,IAAI;QAAE,SAAS,EAAE,OAAO,CAAC;QAAC,YAAY,EAAE,OAAO,CAAC;QAAC,eAAe,EAAE,OAAO,CAAA;KAAE;CAOpF"}
1
+ {"version":3,"file":"postfxSystem.d.ts","sourceRoot":"","sources":["../../src/systems/postfxSystem.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAG/B,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAEpD,qBAAa,YAAY;IACvB,OAAO,CAAC,QAAQ,CAAsB;IACtC,OAAO,CAAC,KAAK,CAAc;IAC3B,OAAO,CAAC,MAAM,CAA0B;IACxC,OAAO,CAAC,QAAQ,CAA+B;IAC/C,OAAO,CAAC,UAAU,CAA2B;IAC7C,OAAO,CAAC,MAAM,CAA6B;IAC3C,OAAO,CAAC,UAAU,CAA2B;IAC7C,OAAO,CAAC,WAAW,CAA4B;IAC/C,OAAO,CAAC,cAAc,CAA+B;IACrD,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,SAAS,CAAK;IACtB,OAAO,CAAC,UAAU,CAAK;IACvB,OAAO,CAAC,aAAa,CAA6B;IAClD,OAAO,CAAC,aAAa,CAA6B;gBAEtC,QAAQ,EAAE,KAAK,CAAC,aAAa,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,iBAAiB;IAM9F,KAAK,CAAC,MAAM,CAAC,EAAE,YAAY,GAAG,IAAI;IAkHlC,MAAM,IAAI,IAAI;IAoBd,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI;IA2B3C,OAAO,CAAC,oBAAoB;IAS5B,OAAO,IAAI,IAAI;IAaf,UAAU,IAAI,IAAI;IAqBlB,QAAQ,IAAI;QAAE,SAAS,EAAE,OAAO,CAAC;QAAC,YAAY,EAAE,OAAO,CAAC;QAAC,eAAe,EAAE,OAAO,CAAA;KAAE;CAOpF"}
@@ -46,15 +46,18 @@ export class PostFxSystem {
46
46
  this.renderPass = new RenderPass(this.scene, this.camera);
47
47
  this.renderPass.clearPass && (this.renderPass.clearPass.overrideClearAlpha = 1);
48
48
  this.composer.addPass(this.renderPass);
49
- this.composer.setSize(this.lastWidth, this.lastHeight);
49
+ const buffer = this.getDrawingBufferSize();
50
+ this.composer.setSize(buffer.width, buffer.height);
50
51
  }
51
52
  this.composer.autoRenderToScreen = false;
52
53
  if (!this.aoPass) {
53
- this.aoPass = new N8AOPostPass(this.scene, this.camera, this.lastWidth, this.lastHeight);
54
+ const buffer = this.getDrawingBufferSize();
55
+ this.aoPass = new N8AOPostPass(this.scene, this.camera, buffer.width, buffer.height);
54
56
  this.composer.addPass(this.aoPass);
55
57
  }
56
58
  else {
57
- this.aoPass.setSize(this.lastWidth, this.lastHeight);
59
+ const buffer = this.getDrawingBufferSize();
60
+ this.aoPass.setSize(buffer.width, buffer.height);
58
61
  }
59
62
  if (!this.bloomEffect) {
60
63
  this.bloomEffect = new BloomEffect({
@@ -157,6 +160,9 @@ export class PostFxSystem {
157
160
  this.effectPass = null;
158
161
  this.enabled = false;
159
162
  }
163
+ const buffer = this.getDrawingBufferSize();
164
+ this.lastWidth = buffer.width;
165
+ this.lastHeight = buffer.height;
160
166
  if (this.currentConfig) {
161
167
  const config = this.currentConfig;
162
168
  this.currentConfig = null;
@@ -168,6 +174,14 @@ export class PostFxSystem {
168
174
  this.apply(pending);
169
175
  }
170
176
  }
177
+ getDrawingBufferSize() {
178
+ const size = new THREE.Vector2();
179
+ this.renderer.getDrawingBufferSize(size);
180
+ return {
181
+ width: Math.max(1, Math.round(size.x)),
182
+ height: Math.max(1, Math.round(size.y)),
183
+ };
184
+ }
171
185
  dispose() {
172
186
  if (this.composer) {
173
187
  this.composer.dispose();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@base2datadesign/viewer-kit",
3
- "version": "0.2.13",
3
+ "version": "0.2.15",
4
4
  "type": "module",
5
5
  "license": "UNLICENSED",
6
6
  "main": "./dist/index.js",