@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.
- package/dist/camera.d.ts +28 -0
- package/dist/camera.d.ts.map +1 -0
- package/dist/camera.js +62 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/systems/postfxSystem.d.ts +1 -0
- package/dist/systems/postfxSystem.d.ts.map +1 -1
- package/dist/systems/postfxSystem.js +17 -3
- package/package.json +1 -1
package/dist/camera.d.ts
ADDED
|
@@ -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";
|
package/dist/index.d.ts.map
CHANGED
|
@@ -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";
|
|
@@ -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;
|
|
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.
|
|
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
|
-
|
|
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.
|
|
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();
|