@needle-tools/engine 4.9.3 → 4.10.0-beta
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/CHANGELOG.md +9 -0
- package/components.needle.json +1 -1
- package/dist/{gltf-progressive-DhE1A6hX.min.js → gltf-progressive-CoZbSfPR.min.js} +1 -1
- package/dist/{gltf-progressive-egsMzRdv.js → gltf-progressive-DUR9TuAH.js} +3 -3
- package/dist/{gltf-progressive-DWiyqrwB.umd.cjs → gltf-progressive-Iy7aSAPk.umd.cjs} +1 -1
- package/dist/{needle-engine.bundle-C7LSzO5L.umd.cjs → needle-engine.bundle-42AmEGfk.umd.cjs} +160 -137
- package/dist/needle-engine.bundle-C6zhyLF5.min.js +1639 -0
- package/dist/{needle-engine.bundle-BAsxNKpA.js → needle-engine.bundle-Dj6faVbC.js} +7665 -7380
- package/dist/needle-engine.js +447 -444
- package/dist/needle-engine.min.js +1 -1
- package/dist/needle-engine.umd.cjs +1 -1
- package/dist/{postprocessing-BZOSD1ln.min.js → postprocessing-BHMVuZQ1.min.js} +1 -1
- package/dist/{postprocessing-Bb5StX0o.umd.cjs → postprocessing-BsnRNRRS.umd.cjs} +1 -1
- package/dist/{postprocessing-BzFF7i-7.js → postprocessing-DQ2pynXW.js} +2 -2
- package/dist/{three-BK56xWDs.umd.cjs → three-B-jwTHao.umd.cjs} +11 -11
- package/dist/{three-CsHK73Zc.js → three-CJSAehtG.js} +1 -0
- package/dist/{three-examples-Bph291U2.min.js → three-examples-BivkhnvN.min.js} +1 -1
- package/dist/{three-examples-C9WfZu-X.umd.cjs → three-examples-Deqc1bNw.umd.cjs} +1 -1
- package/dist/{three-examples-BvMpKSun.js → three-examples-Doq0rvFU.js} +1 -1
- package/dist/{three-mesh-ui-CN6aRT7i.js → three-mesh-ui-CktOi6oI.js} +1 -1
- package/dist/{three-mesh-ui-DnxkZWNA.umd.cjs → three-mesh-ui-CsHwj9cJ.umd.cjs} +1 -1
- package/dist/{three-mesh-ui-n_qS2BM-.min.js → three-mesh-ui-DhYXcXZe.min.js} +1 -1
- package/dist/{three-TNFQHSFa.min.js → three-qw28ZtTy.min.js} +10 -10
- package/dist/{vendor-BtJpSuCj.umd.cjs → vendor-D0Yvltn9.umd.cjs} +1 -1
- package/dist/{vendor-k9i6CeGi.js → vendor-DU8tJyl_.js} +1 -1
- package/dist/{vendor-XJ9xiwrv.min.js → vendor-JyrX4DVM.min.js} +1 -1
- package/lib/engine/api.d.ts +1 -0
- package/lib/engine/api.js +1 -0
- package/lib/engine/api.js.map +1 -1
- package/lib/engine/codegen/register_types.js +4 -0
- package/lib/engine/codegen/register_types.js.map +1 -1
- package/lib/engine/engine_animation.d.ts +21 -1
- package/lib/engine/engine_animation.js +32 -1
- package/lib/engine/engine_animation.js.map +1 -1
- package/lib/engine/engine_camera.fit.d.ts +68 -0
- package/lib/engine/engine_camera.fit.js +193 -0
- package/lib/engine/engine_camera.fit.js.map +1 -0
- package/lib/engine/engine_gizmos.d.ts +2 -2
- package/lib/engine/engine_gizmos.js +2 -2
- package/lib/engine/engine_physics.js +6 -3
- package/lib/engine/engine_physics.js.map +1 -1
- package/lib/engine/webcomponents/needle-engine.d.ts +1 -0
- package/lib/engine/webcomponents/needle-engine.js +6 -0
- package/lib/engine/webcomponents/needle-engine.js.map +1 -1
- package/lib/engine/webcomponents/needle-engine.loading.js +59 -23
- package/lib/engine/webcomponents/needle-engine.loading.js.map +1 -1
- package/lib/engine-components/AnimatorController.js +16 -0
- package/lib/engine-components/AnimatorController.js.map +1 -1
- package/lib/engine-components/CameraUtils.js +8 -9
- package/lib/engine-components/CameraUtils.js.map +1 -1
- package/lib/engine-components/OrbitControls.d.ts +4 -47
- package/lib/engine-components/OrbitControls.js +30 -178
- package/lib/engine-components/OrbitControls.js.map +1 -1
- package/lib/engine-components/Renderer.d.ts +2 -2
- package/lib/engine-components/Renderer.js +6 -4
- package/lib/engine-components/Renderer.js.map +1 -1
- package/lib/engine-components/api.d.ts +0 -1
- package/lib/engine-components/api.js.map +1 -1
- package/lib/engine-components/codegen/components.d.ts +2 -0
- package/lib/engine-components/codegen/components.js +2 -0
- package/lib/engine-components/codegen/components.js.map +1 -1
- package/lib/engine-components/timeline/PlayableDirector.d.ts +28 -6
- package/lib/engine-components/timeline/PlayableDirector.js +60 -26
- package/lib/engine-components/timeline/PlayableDirector.js.map +1 -1
- package/lib/engine-components/timeline/TimelineModels.d.ts +3 -0
- package/lib/engine-components/timeline/TimelineModels.js.map +1 -1
- package/lib/engine-components/timeline/TimelineTracks.d.ts +7 -0
- package/lib/engine-components/timeline/TimelineTracks.js +19 -0
- package/lib/engine-components/timeline/TimelineTracks.js.map +1 -1
- package/lib/engine-components/web/Clickthrough.d.ts +3 -0
- package/lib/engine-components/web/Clickthrough.js +3 -0
- package/lib/engine-components/web/Clickthrough.js.map +1 -1
- package/lib/engine-components/web/CursorFollow.d.ts +3 -0
- package/lib/engine-components/web/CursorFollow.js +3 -0
- package/lib/engine-components/web/CursorFollow.js.map +1 -1
- package/lib/engine-components/web/HoverAnimation.d.ts +44 -0
- package/lib/engine-components/web/HoverAnimation.js +105 -0
- package/lib/engine-components/web/HoverAnimation.js.map +1 -0
- package/lib/engine-components/web/ScrollFollow.d.ts +18 -4
- package/lib/engine-components/web/ScrollFollow.js +143 -25
- package/lib/engine-components/web/ScrollFollow.js.map +1 -1
- package/lib/engine-components/web/index.d.ts +1 -0
- package/lib/engine-components/web/index.js +1 -0
- package/lib/engine-components/web/index.js.map +1 -1
- package/package.json +1 -1
- package/plugins/vite/alias.js +5 -3
- package/plugins/vite/poster-client.js +22 -21
- package/src/engine/api.ts +2 -1
- package/src/engine/codegen/register_types.ts +4 -0
- package/src/engine/engine_animation.ts +69 -1
- package/src/engine/engine_camera.fit.ts +288 -0
- package/src/engine/engine_gizmos.ts +2 -2
- package/src/engine/engine_physics.ts +6 -3
- package/src/engine/webcomponents/needle-engine.loading.ts +63 -24
- package/src/engine/webcomponents/needle-engine.ts +6 -1
- package/src/engine-components/AnimatorController.ts +21 -2
- package/src/engine-components/CameraUtils.ts +8 -9
- package/src/engine-components/OrbitControls.ts +30 -239
- package/src/engine-components/Renderer.ts +6 -4
- package/src/engine-components/api.ts +0 -1
- package/src/engine-components/codegen/components.ts +2 -0
- package/src/engine-components/timeline/PlayableDirector.ts +79 -34
- package/src/engine-components/timeline/TimelineModels.ts +3 -0
- package/src/engine-components/timeline/TimelineTracks.ts +22 -0
- package/src/engine-components/web/Clickthrough.ts +3 -0
- package/src/engine-components/web/CursorFollow.ts +3 -0
- package/src/engine-components/web/HoverAnimation.ts +99 -0
- package/src/engine-components/web/ScrollFollow.ts +181 -24
- package/src/engine-components/web/index.ts +1 -0
- package/dist/needle-engine.bundle-ugr1bBtk.min.js +0 -1616
|
@@ -9,6 +9,9 @@ import { getTempVector } from "../../engine/engine_three_utils.js";
|
|
|
9
9
|
import { Behaviour } from "../Component.js";
|
|
10
10
|
/**
|
|
11
11
|
* The CursorFollow component makes the object follow the cursor (or touch) position on screen.
|
|
12
|
+
* @category Web
|
|
13
|
+
* @group Components
|
|
14
|
+
* @component
|
|
12
15
|
*/
|
|
13
16
|
export class CursorFollow extends Behaviour {
|
|
14
17
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CursorFollow.js","sourceRoot":"","sources":["../../../src/engine-components/web/CursorFollow.ts"],"names":[],"mappings":";;;;;;AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,gDAAgD,CAAC;AAC9E,OAAO,EAAE,aAAa,EAAE,MAAM,oCAAoC,CAAC;AACnE,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE5C
|
|
1
|
+
{"version":3,"file":"CursorFollow.js","sourceRoot":"","sources":["../../../src/engine-components/web/CursorFollow.ts"],"names":[],"mappings":";;;;;;AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,gDAAgD,CAAC;AAC9E,OAAO,EAAE,aAAa,EAAE,MAAM,oCAAoC,CAAC;AACnE,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE5C;;;;;GAKG;AACH,MAAM,OAAO,YAAa,SAAQ,SAAS;IAEvC;;;OAGG;IAEH,OAAO,GAAW,CAAC,CAAC;IAEpB;;;OAGG;IAEH,YAAY,GAAY,IAAI,CAAC;IAE7B,KAAK;QACD,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC;IACxB,CAAC;IAEO,SAAS,GAAW,CAAC,CAAC,CAAC;IAE/B,cAAc;QACV,IAAI,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,SAAS,KAAK,CAAC,CAAC,EAAE;YAC5C,OAAO;SACV;QACD,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;IACrG,CAAC;IAED,gBAAgB;IAChB,MAAM;QACF,8DAA8D;QAC9D,IAAI,CAAC,cAAc,EAAE,CAAC;QAEtB,yEAAyE;QACzE,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,eAAe,CAAC;QAClD,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC;QACvC,MAAM,cAAc,GAAG,MAAM,CAAC,aAAa,CAAC;QAE5C,iDAAiD;QACjD,MAAM,YAAY,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QAC5E,YAAY,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,SAAS,EAAE,CAAC;QAE7C,oDAAoD;QACpD,MAAM,WAAW,GAAG,YAAY,CAAC,cAAc,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;QACpF,IAAI,IAAI,CAAC,OAAO,GAAG,CAAC,EAAE;YAClB,MAAM,GAAG,GAAG,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC;YAC1C,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC;YAClE,IAAI,CAAC,UAAU,CAAC,aAAa,GAAG,GAAG,CAAC;SACvC;aACI;YACD,IAAI,CAAC,UAAU,CAAC,aAAa,GAAG,WAAW,CAAC;SAC/C;IAEL,CAAC;CAEJ;AAjDG;IADC,YAAY,EAAE;6CACK;AAOpB;IADC,YAAY,EAAE;kDACc"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { AnimationClip } from "three";
|
|
2
|
+
import { ScaleClipType } from "../../engine/engine_animation.js";
|
|
3
|
+
import { Behaviour } from "../Component.js";
|
|
4
|
+
/**
|
|
5
|
+
* @category Web
|
|
6
|
+
* @group Components
|
|
7
|
+
* @component
|
|
8
|
+
*/
|
|
9
|
+
export declare class HoverAnimation extends Behaviour {
|
|
10
|
+
/**
|
|
11
|
+
* Default hover animation type if no custom clip is provided.
|
|
12
|
+
* **Node**: This is only used if no custom hover animation clip is provided.
|
|
13
|
+
* @default "linear"
|
|
14
|
+
*/
|
|
15
|
+
type: ScaleClipType;
|
|
16
|
+
/**
|
|
17
|
+
* Duration of the hover animation in seconds.
|
|
18
|
+
* **Node**: This is only used if no custom hover animation clip is provided.
|
|
19
|
+
* @default 0.1
|
|
20
|
+
*/
|
|
21
|
+
duration: number;
|
|
22
|
+
/**
|
|
23
|
+
* Scale factor to apply when hovering.
|
|
24
|
+
* **Node**: This is only used if no custom hover animation clip is provided.
|
|
25
|
+
* @default 1.1
|
|
26
|
+
*/
|
|
27
|
+
scaleFactor: number;
|
|
28
|
+
/**
|
|
29
|
+
* Animation clip to play when hovering. If null, a default scale-up animation is used.
|
|
30
|
+
*/
|
|
31
|
+
hovered: AnimationClip | null;
|
|
32
|
+
/**
|
|
33
|
+
* Animation clip to play when not hovering. If null, an empty clip is used.
|
|
34
|
+
*/
|
|
35
|
+
idle: AnimationClip | null;
|
|
36
|
+
private animation;
|
|
37
|
+
start(): void;
|
|
38
|
+
onEnable(): void;
|
|
39
|
+
onDisable(): void;
|
|
40
|
+
onPointerEnter(): void;
|
|
41
|
+
onPointerExit(): void;
|
|
42
|
+
private playIdle;
|
|
43
|
+
private playHover;
|
|
44
|
+
}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
import { AnimationClip } from "three";
|
|
8
|
+
import { AnimationUtils } from "../../engine/engine_animation.js";
|
|
9
|
+
import { serializable } from "../../engine/engine_serialization_decorator.js";
|
|
10
|
+
import { registerType } from "../../engine/engine_typestore.js";
|
|
11
|
+
import { Animation } from "../Animation.js";
|
|
12
|
+
import { Behaviour } from "../Component.js";
|
|
13
|
+
/**
|
|
14
|
+
* @category Web
|
|
15
|
+
* @group Components
|
|
16
|
+
* @component
|
|
17
|
+
*/
|
|
18
|
+
let HoverAnimation = class HoverAnimation extends Behaviour {
|
|
19
|
+
/**
|
|
20
|
+
* Default hover animation type if no custom clip is provided.
|
|
21
|
+
* **Node**: This is only used if no custom hover animation clip is provided.
|
|
22
|
+
* @default "linear"
|
|
23
|
+
*/
|
|
24
|
+
type = "linear";
|
|
25
|
+
/**
|
|
26
|
+
* Duration of the hover animation in seconds.
|
|
27
|
+
* **Node**: This is only used if no custom hover animation clip is provided.
|
|
28
|
+
* @default 0.1
|
|
29
|
+
*/
|
|
30
|
+
duration = 0.1;
|
|
31
|
+
/**
|
|
32
|
+
* Scale factor to apply when hovering.
|
|
33
|
+
* **Node**: This is only used if no custom hover animation clip is provided.
|
|
34
|
+
* @default 1.1
|
|
35
|
+
*/
|
|
36
|
+
scaleFactor = 1.1;
|
|
37
|
+
/**
|
|
38
|
+
* Animation clip to play when hovering. If null, a default scale-up animation is used.
|
|
39
|
+
*/
|
|
40
|
+
hovered = null;
|
|
41
|
+
/**
|
|
42
|
+
* Animation clip to play when not hovering. If null, an empty clip is used.
|
|
43
|
+
*/
|
|
44
|
+
idle = null;
|
|
45
|
+
animation = null;
|
|
46
|
+
start() {
|
|
47
|
+
if (!this.idle)
|
|
48
|
+
this.idle = AnimationUtils.emptyClip();
|
|
49
|
+
if (!this.hovered) {
|
|
50
|
+
this.hovered = AnimationUtils.createScaleClip({
|
|
51
|
+
type: "linear",
|
|
52
|
+
duration: this.duration || 0.1,
|
|
53
|
+
scale: this.gameObject.scale,
|
|
54
|
+
scaleFactor: this.scaleFactor || 1.1,
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
this.animation ??= this.gameObject.addComponent(Animation);
|
|
58
|
+
this.animation.playAutomatically = false;
|
|
59
|
+
this.playIdle();
|
|
60
|
+
}
|
|
61
|
+
onEnable() {
|
|
62
|
+
if (this.animation)
|
|
63
|
+
this.animation.enabled = true;
|
|
64
|
+
this.playIdle();
|
|
65
|
+
}
|
|
66
|
+
onDisable() {
|
|
67
|
+
if (this.animation)
|
|
68
|
+
this.animation.enabled = false;
|
|
69
|
+
this.playIdle();
|
|
70
|
+
}
|
|
71
|
+
onPointerEnter() {
|
|
72
|
+
this.playHover();
|
|
73
|
+
}
|
|
74
|
+
onPointerExit() {
|
|
75
|
+
this.playIdle();
|
|
76
|
+
}
|
|
77
|
+
playIdle() {
|
|
78
|
+
if (this.idle)
|
|
79
|
+
this.animation?.play(this.idle, { exclusive: true, fadeDuration: .1, loop: true });
|
|
80
|
+
}
|
|
81
|
+
playHover() {
|
|
82
|
+
if (this.hovered)
|
|
83
|
+
this.animation?.play(this.hovered, { exclusive: true, fadeDuration: .1, loop: false, clampWhenFinished: true });
|
|
84
|
+
}
|
|
85
|
+
};
|
|
86
|
+
__decorate([
|
|
87
|
+
serializable()
|
|
88
|
+
], HoverAnimation.prototype, "type", void 0);
|
|
89
|
+
__decorate([
|
|
90
|
+
serializable()
|
|
91
|
+
], HoverAnimation.prototype, "duration", void 0);
|
|
92
|
+
__decorate([
|
|
93
|
+
serializable()
|
|
94
|
+
], HoverAnimation.prototype, "scaleFactor", void 0);
|
|
95
|
+
__decorate([
|
|
96
|
+
serializable(AnimationClip)
|
|
97
|
+
], HoverAnimation.prototype, "hovered", void 0);
|
|
98
|
+
__decorate([
|
|
99
|
+
serializable(AnimationClip)
|
|
100
|
+
], HoverAnimation.prototype, "idle", void 0);
|
|
101
|
+
HoverAnimation = __decorate([
|
|
102
|
+
registerType
|
|
103
|
+
], HoverAnimation);
|
|
104
|
+
export { HoverAnimation };
|
|
105
|
+
//# sourceMappingURL=HoverAnimation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"HoverAnimation.js","sourceRoot":"","sources":["../../../src/engine-components/web/HoverAnimation.ts"],"names":[],"mappings":";;;;;;AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAGtC,OAAO,EAAE,cAAc,EAAE,MAAM,kCAAkC,CAAC;AAClE,OAAO,EAAE,YAAY,EAAE,MAAM,gDAAgD,CAAC;AAC9E,OAAO,EAAE,YAAY,EAAE,MAAM,kCAAkC,CAAC;AAChE,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAG5C;;;;GAIG;AAEI,IAAM,cAAc,GAApB,MAAM,cAAe,SAAQ,SAAS;IAEzC;;;;OAIG;IAEH,IAAI,GAAkB,QAAQ,CAAC;IAE/B;;;;OAIG;IAEH,QAAQ,GAAW,GAAG,CAAC;IAEvB;;;;OAIG;IAEH,WAAW,GAAW,GAAG,CAAC;IAG1B;;OAEG;IAEH,OAAO,GAAyB,IAAI,CAAC;IAErC;;OAEG;IAEH,IAAI,GAAyB,IAAI,CAAC;IAE1B,SAAS,GAAqB,IAAI,CAAC;IAE3C,KAAK;QACD,IAAI,CAAC,IAAI,CAAC,IAAI;YAAE,IAAI,CAAC,IAAI,GAAG,cAAc,CAAC,SAAS,EAAE,CAAC;QAEvD,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE;YACf,IAAI,CAAC,OAAO,GAAG,cAAc,CAAC,eAAe,CAAC;gBAC1C,IAAI,EAAE,QAAQ;gBACd,QAAQ,EAAE,IAAI,CAAC,QAAQ,IAAI,GAAG;gBAC9B,KAAK,EAAE,IAAI,CAAC,UAAU,CAAC,KAAK;gBAC5B,WAAW,EAAE,IAAI,CAAC,WAAW,IAAI,GAAG;aACvC,CAAC,CAAC;SACN;QAED,IAAI,CAAC,SAAS,KAAK,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;QAC3D,IAAI,CAAC,SAAS,CAAC,iBAAiB,GAAG,KAAK,CAAC;QACzC,IAAI,CAAC,QAAQ,EAAE,CAAC;IACpB,CAAC;IAED,QAAQ;QACJ,IAAI,IAAI,CAAC,SAAS;YAAE,IAAI,CAAC,SAAS,CAAC,OAAO,GAAG,IAAI,CAAC;QAClD,IAAI,CAAC,QAAQ,EAAE,CAAC;IACpB,CAAC;IACD,SAAS;QACL,IAAI,IAAI,CAAC,SAAS;YAAE,IAAI,CAAC,SAAS,CAAC,OAAO,GAAG,KAAK,CAAC;QACnD,IAAI,CAAC,QAAQ,EAAE,CAAC;IACpB,CAAC;IAED,cAAc;QACV,IAAI,CAAC,SAAS,EAAE,CAAC;IACrB,CAAC;IAED,aAAa;QACT,IAAI,CAAC,QAAQ,EAAE,CAAC;IACpB,CAAC;IAEO,QAAQ;QACZ,IAAI,IAAI,CAAC,IAAI;YAAE,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,YAAY,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;IACtG,CAAC;IACO,SAAS;QACb,IAAI,IAAI,CAAC,OAAO;YAAE,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,YAAY,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,iBAAiB,EAAE,IAAI,EAAE,CAAC,CAAC;IACtI,CAAC;CAEJ,CAAA;AA1EG;IADC,YAAY,EAAE;4CACgB;AAQ/B;IADC,YAAY,EAAE;gDACQ;AAQvB;IADC,YAAY,EAAE;mDACW;AAO1B;IADC,YAAY,CAAC,aAAa,CAAC;+CACS;AAMrC;IADC,YAAY,CAAC,aAAa,CAAC;4CACM;AArCzB,cAAc;IAD1B,YAAY;GACA,cAAc,CAkF1B;SAlFY,cAAc"}
|
|
@@ -31,6 +31,10 @@ type ScrollFollowEvent = {
|
|
|
31
31
|
* 2. Add a ScrollFollow component to the same GameObject or another GameObject in the scene.
|
|
32
32
|
* 3. Assign the PlayableDirector component to the ScrollFollow's target property.
|
|
33
33
|
* 4. The timeline will now scrub based on the scroll position of the page.
|
|
34
|
+
*
|
|
35
|
+
* @category Web
|
|
36
|
+
* @group Components
|
|
37
|
+
* @component
|
|
34
38
|
*/
|
|
35
39
|
export declare class ScrollFollow extends Behaviour {
|
|
36
40
|
/**
|
|
@@ -58,6 +62,7 @@ export declare class ScrollFollow extends Behaviour {
|
|
|
58
62
|
*/
|
|
59
63
|
invert: boolean;
|
|
60
64
|
/**
|
|
65
|
+
* **Experimental - might change in future updates**
|
|
61
66
|
* If set, the scroll position will be read from the specified element instead of the window.
|
|
62
67
|
* Use a CSS selector to specify the element, e.g. `#my-scrollable-div` or `.scroll-container`.
|
|
63
68
|
* @default null
|
|
@@ -72,9 +77,13 @@ export declare class ScrollFollow extends Behaviour {
|
|
|
72
77
|
* Current scroll value in "pages" (0 = top of page, 1 = bottom of page)
|
|
73
78
|
*/
|
|
74
79
|
get currentValue(): number;
|
|
75
|
-
private
|
|
76
|
-
private
|
|
77
|
-
private
|
|
80
|
+
private _current_value;
|
|
81
|
+
private _target_value;
|
|
82
|
+
private _appliedValue;
|
|
83
|
+
private _scrollStart;
|
|
84
|
+
private _scrollEnd;
|
|
85
|
+
private _scrollValue;
|
|
86
|
+
private _scrollContainerHeight;
|
|
78
87
|
/** @internal */
|
|
79
88
|
onEnable(): void;
|
|
80
89
|
/** @internal */
|
|
@@ -83,7 +92,12 @@ export declare class ScrollFollow extends Behaviour {
|
|
|
83
92
|
lateUpdate(): void;
|
|
84
93
|
private _lastSelectorValue;
|
|
85
94
|
private _lastSelectorElement;
|
|
95
|
+
/** Top y */
|
|
96
|
+
private _rangeStartValue;
|
|
97
|
+
/** Bottom y */
|
|
98
|
+
private _rangeEndValue;
|
|
86
99
|
private updateCurrentScrollValue;
|
|
87
|
-
private
|
|
100
|
+
private applyScroll;
|
|
101
|
+
private handleTimelineTarget;
|
|
88
102
|
}
|
|
89
103
|
export {};
|
|
@@ -8,6 +8,7 @@ import { Object3D } from "three";
|
|
|
8
8
|
import { Mathf } from "../../engine/engine_math.js";
|
|
9
9
|
import { serializable } from "../../engine/engine_serialization.js";
|
|
10
10
|
import { getBoundingBox } from "../../engine/engine_three_utils.js";
|
|
11
|
+
import { getParam } from "../../engine/engine_utils.js";
|
|
11
12
|
import { Animation } from "../Animation.js";
|
|
12
13
|
import { Animator } from "../Animator.js";
|
|
13
14
|
import { AudioSource } from "../AudioSource.js";
|
|
@@ -16,6 +17,7 @@ import { EventList } from "../EventList.js";
|
|
|
16
17
|
import { Light } from "../Light.js";
|
|
17
18
|
import { SplineWalker } from "../splines/SplineWalker.js";
|
|
18
19
|
import { PlayableDirector } from "../timeline/PlayableDirector.js";
|
|
20
|
+
const debug = getParam("debugscroll");
|
|
19
21
|
/**
|
|
20
22
|
* The ScrollFollow component allows you to link the scroll position of the page (or a specific element) to one or more target objects.
|
|
21
23
|
* This can be used to create scroll-based animations, audio playback, or other effects. For example you can link the scroll position to a timeline (PlayableDirector) to create scroll-based storytelling effects or to an Animator component to change the animation state based on scroll.
|
|
@@ -36,6 +38,10 @@ import { PlayableDirector } from "../timeline/PlayableDirector.js";
|
|
|
36
38
|
* 2. Add a ScrollFollow component to the same GameObject or another GameObject in the scene.
|
|
37
39
|
* 3. Assign the PlayableDirector component to the ScrollFollow's target property.
|
|
38
40
|
* 4. The timeline will now scrub based on the scroll position of the page.
|
|
41
|
+
*
|
|
42
|
+
* @category Web
|
|
43
|
+
* @group Components
|
|
44
|
+
* @component
|
|
39
45
|
*/
|
|
40
46
|
export class ScrollFollow extends Behaviour {
|
|
41
47
|
/**
|
|
@@ -63,6 +69,7 @@ export class ScrollFollow extends Behaviour {
|
|
|
63
69
|
*/
|
|
64
70
|
invert = false;
|
|
65
71
|
/**
|
|
72
|
+
* **Experimental - might change in future updates**
|
|
66
73
|
* If set, the scroll position will be read from the specified element instead of the window.
|
|
67
74
|
* Use a CSS selector to specify the element, e.g. `#my-scrollable-div` or `.scroll-container`.
|
|
68
75
|
* @default null
|
|
@@ -77,15 +84,19 @@ export class ScrollFollow extends Behaviour {
|
|
|
77
84
|
* Current scroll value in "pages" (0 = top of page, 1 = bottom of page)
|
|
78
85
|
*/
|
|
79
86
|
get currentValue() {
|
|
80
|
-
return this.
|
|
87
|
+
return this._current_value;
|
|
81
88
|
}
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
89
|
+
_current_value = 0;
|
|
90
|
+
_target_value = 0;
|
|
91
|
+
_appliedValue = -1;
|
|
92
|
+
_scrollStart = 0;
|
|
93
|
+
_scrollEnd = 0;
|
|
94
|
+
_scrollValue = 0;
|
|
95
|
+
_scrollContainerHeight = 0;
|
|
85
96
|
/** @internal */
|
|
86
97
|
onEnable() {
|
|
87
98
|
window.addEventListener("wheel", this.updateCurrentScrollValue, { passive: true });
|
|
88
|
-
this.
|
|
99
|
+
this._appliedValue = -1;
|
|
89
100
|
}
|
|
90
101
|
/** @internal */
|
|
91
102
|
onDisable() {
|
|
@@ -94,21 +105,25 @@ export class ScrollFollow extends Behaviour {
|
|
|
94
105
|
/** @internal */
|
|
95
106
|
lateUpdate() {
|
|
96
107
|
this.updateCurrentScrollValue();
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
108
|
+
if (this._target_value >= 0) {
|
|
109
|
+
if (this.damping > 0) { // apply damping
|
|
110
|
+
this._current_value = Mathf.lerp(this._current_value, this._target_value, this.context.time.deltaTime / this.damping);
|
|
111
|
+
if (Math.abs(this._current_value - this._target_value) < 0.001) {
|
|
112
|
+
this._current_value = this._target_value;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
else {
|
|
116
|
+
this._current_value = this._target_value;
|
|
117
|
+
}
|
|
103
118
|
}
|
|
104
|
-
if (this.
|
|
105
|
-
this.
|
|
119
|
+
if (this._current_value !== this._appliedValue) {
|
|
120
|
+
this._appliedValue = this._current_value;
|
|
106
121
|
let defaultPrevented = false;
|
|
107
122
|
if (this.changed.listenerCount > 0) {
|
|
108
123
|
// fire change event
|
|
109
124
|
const event = {
|
|
110
125
|
type: "change",
|
|
111
|
-
value: this.
|
|
126
|
+
value: this._current_value,
|
|
112
127
|
component: this,
|
|
113
128
|
preventDefault: () => { event.defaultPrevented = true; },
|
|
114
129
|
defaultPrevented: false,
|
|
@@ -118,19 +133,28 @@ export class ScrollFollow extends Behaviour {
|
|
|
118
133
|
}
|
|
119
134
|
// if not prevented apply scroll
|
|
120
135
|
if (!defaultPrevented) {
|
|
121
|
-
const value = this.invert ? 1 - this.
|
|
136
|
+
const value = this.invert ? 1 - this._current_value : this._current_value;
|
|
137
|
+
const height = this._rangeEndValue - this._rangeStartValue;
|
|
138
|
+
const pixelValue = this._rangeStartValue + value * height;
|
|
122
139
|
// apply scroll to target(s)
|
|
123
140
|
if (Array.isArray(this.target)) {
|
|
124
|
-
this.target.forEach(t => t &&
|
|
141
|
+
this.target.forEach(t => t && this.applyScroll(t, value));
|
|
125
142
|
}
|
|
126
143
|
else if (this.target) {
|
|
127
|
-
|
|
144
|
+
this.applyScroll(this.target, value);
|
|
145
|
+
}
|
|
146
|
+
if (debug && this.context.time.frame % 30 === 0) {
|
|
147
|
+
console.debug(`[ScrollFollow] ${this._current_value.toFixed(5)} — ${(this._target_value * 100).toFixed(0)}%`);
|
|
128
148
|
}
|
|
129
149
|
}
|
|
130
150
|
}
|
|
131
151
|
}
|
|
132
152
|
_lastSelectorValue = null;
|
|
133
153
|
_lastSelectorElement = null;
|
|
154
|
+
/** Top y */
|
|
155
|
+
_rangeStartValue = 0;
|
|
156
|
+
/** Bottom y */
|
|
157
|
+
_rangeEndValue = 0;
|
|
134
158
|
updateCurrentScrollValue = () => {
|
|
135
159
|
switch (this.mode) {
|
|
136
160
|
case "window":
|
|
@@ -141,25 +165,35 @@ export class ScrollFollow extends Behaviour {
|
|
|
141
165
|
}
|
|
142
166
|
if (this._lastSelectorElement) {
|
|
143
167
|
const rect = this._lastSelectorElement.getBoundingClientRect();
|
|
144
|
-
this.
|
|
145
|
-
|
|
146
|
-
|
|
168
|
+
this._scrollStart = rect.top + window.scrollY;
|
|
169
|
+
this._scrollEnd = rect.height - window.innerHeight;
|
|
170
|
+
this._scrollValue = -rect.top;
|
|
171
|
+
this._target_value = -rect.top / (rect.height - window.innerHeight);
|
|
172
|
+
this._rangeStartValue = rect.top + window.scrollY;
|
|
173
|
+
this._rangeEndValue = this._rangeStartValue + rect.height - window.innerHeight;
|
|
174
|
+
this._scrollContainerHeight = rect.height;
|
|
147
175
|
break;
|
|
148
176
|
}
|
|
149
177
|
}
|
|
150
178
|
else {
|
|
151
|
-
this.
|
|
179
|
+
this._scrollStart = 0;
|
|
180
|
+
this._scrollEnd = window.document.body.scrollHeight - window.innerHeight;
|
|
181
|
+
this._scrollValue = window.scrollY;
|
|
182
|
+
this._target_value = this._scrollValue / (this._scrollEnd || 1);
|
|
183
|
+
this._rangeStartValue = 0;
|
|
184
|
+
this._rangeEndValue = document.body.scrollHeight;
|
|
185
|
+
this._scrollContainerHeight = window.innerHeight;
|
|
152
186
|
}
|
|
153
|
-
if (isNaN(this.target_value) || !isFinite(this.target_value))
|
|
154
|
-
this.target_value = 0;
|
|
155
187
|
break;
|
|
156
188
|
}
|
|
189
|
+
if (isNaN(this._target_value) || !isFinite(this._target_value))
|
|
190
|
+
this._target_value = -1;
|
|
157
191
|
};
|
|
158
|
-
|
|
192
|
+
applyScroll(target, value) {
|
|
159
193
|
if (!target)
|
|
160
194
|
return;
|
|
161
195
|
if (target instanceof PlayableDirector) {
|
|
162
|
-
target
|
|
196
|
+
this.handleTimelineTarget(target, value);
|
|
163
197
|
if (!target.isPlaying)
|
|
164
198
|
target.evaluate();
|
|
165
199
|
}
|
|
@@ -200,6 +234,88 @@ export class ScrollFollow extends Behaviour {
|
|
|
200
234
|
}
|
|
201
235
|
}
|
|
202
236
|
}
|
|
237
|
+
handleTimelineTarget(director, value) {
|
|
238
|
+
const duration = director.duration;
|
|
239
|
+
let scrollRegionStart = Infinity;
|
|
240
|
+
let scrollRegionEnd = 0;
|
|
241
|
+
markersArray.length = 0;
|
|
242
|
+
for (const marker of director.foreachMarker("ScrollMarker")) {
|
|
243
|
+
// Get marker elements from DOM
|
|
244
|
+
if (marker.selector?.length && (marker.element === undefined || marker.needsUpdate === true || /** element is not in DOM anymore? */ (!marker.element?.parentNode))) {
|
|
245
|
+
marker.needsUpdate = false;
|
|
246
|
+
try {
|
|
247
|
+
marker.element = document.querySelector(marker.selector) || null;
|
|
248
|
+
if (debug)
|
|
249
|
+
console.debug("ScrollMarker found on page", marker.element, marker.selector);
|
|
250
|
+
}
|
|
251
|
+
catch (error) {
|
|
252
|
+
marker.element = null;
|
|
253
|
+
console.error("ScrollMarker selector is not valid: " + marker.selector + "\n", error);
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
// skip markers without element (e.g. if the selector didn't return any element)
|
|
257
|
+
if (!marker.element)
|
|
258
|
+
continue;
|
|
259
|
+
markersArray.push(marker);
|
|
260
|
+
const top = marker.element.offsetTop;
|
|
261
|
+
const height = marker.element.offsetHeight;
|
|
262
|
+
const bottom = top + height;
|
|
263
|
+
if (top < scrollRegionStart) {
|
|
264
|
+
scrollRegionStart = top;
|
|
265
|
+
}
|
|
266
|
+
if (bottom > scrollRegionEnd) {
|
|
267
|
+
scrollRegionEnd = bottom;
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
const currentTop = this._scrollValue;
|
|
271
|
+
const currentBottom = currentTop + this._scrollContainerHeight;
|
|
272
|
+
weightsArray.length = 0;
|
|
273
|
+
let sum = 0;
|
|
274
|
+
let markerCount = 0;
|
|
275
|
+
for (const marker of markersArray) {
|
|
276
|
+
if (!marker.element)
|
|
277
|
+
continue;
|
|
278
|
+
const top = marker.element.offsetTop;
|
|
279
|
+
const height = marker.element.offsetHeight;
|
|
280
|
+
const bottom = top + height;
|
|
281
|
+
let overlap = 0;
|
|
282
|
+
// TODO: if we have two marker sections where no HTML overlaps (vor example because some large section is between them) we probably want to still virtually interpolate between them slowly in that region
|
|
283
|
+
if (bottom < currentTop) {
|
|
284
|
+
// marker is above scroll region
|
|
285
|
+
overlap = 0;
|
|
286
|
+
}
|
|
287
|
+
else if (top > currentBottom) {
|
|
288
|
+
// marker is below scroll region
|
|
289
|
+
overlap = 0;
|
|
290
|
+
}
|
|
291
|
+
else {
|
|
292
|
+
// calculate overlap in pixels
|
|
293
|
+
const overlapTop = Math.max(top, currentTop);
|
|
294
|
+
const overlapBottom = Math.min(bottom, currentBottom);
|
|
295
|
+
overlap = Math.max(0, overlapBottom - overlapTop);
|
|
296
|
+
// console.log(marker.element.className, overlap)
|
|
297
|
+
}
|
|
298
|
+
markerCount += 1;
|
|
299
|
+
if (overlap > 0) {
|
|
300
|
+
weightsArray.push({ time: marker.time, weight: overlap });
|
|
301
|
+
sum += overlap;
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
if (weightsArray.length <= 0 && markerCount <= 0) {
|
|
305
|
+
director.time = value * duration;
|
|
306
|
+
}
|
|
307
|
+
else if (weightsArray.length > 0) {
|
|
308
|
+
// normalize and calculate weighted time
|
|
309
|
+
let time = weightsArray[0].time;
|
|
310
|
+
for (const o of weightsArray) {
|
|
311
|
+
const weight = o.weight / Math.max(0.00001, sum);
|
|
312
|
+
// lerp time based on weight
|
|
313
|
+
const diff = Math.abs(o.time - time);
|
|
314
|
+
time += diff * weight;
|
|
315
|
+
}
|
|
316
|
+
director.time = time;
|
|
317
|
+
}
|
|
318
|
+
}
|
|
203
319
|
}
|
|
204
320
|
__decorate([
|
|
205
321
|
serializable([Behaviour, Object3D])
|
|
@@ -219,4 +335,6 @@ __decorate([
|
|
|
219
335
|
__decorate([
|
|
220
336
|
serializable(EventList)
|
|
221
337
|
], ScrollFollow.prototype, "changed", void 0);
|
|
338
|
+
const weightsArray = [];
|
|
339
|
+
const markersArray = [];
|
|
222
340
|
//# sourceMappingURL=ScrollFollow.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ScrollFollow.js","sourceRoot":"","sources":["../../../src/engine-components/web/ScrollFollow.ts"],"names":[],"mappings":";;;;;;AAAA,OAAO,EAAQ,QAAQ,EAAE,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"ScrollFollow.js","sourceRoot":"","sources":["../../../src/engine-components/web/ScrollFollow.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/engine-components/web/index.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/engine-components/web/index.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,qBAAqB,CAAC;AACpC,cAAc,mBAAmB,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@needle-tools/engine",
|
|
3
|
-
"version": "4.
|
|
3
|
+
"version": "4.10.0-beta",
|
|
4
4
|
"description": "Needle Engine is a web-based runtime for 3D apps. It runs on your machine for development with great integrations into editors like Unity or Blender - and can be deployed onto any device! It is flexible, extensible and networking and XR are built-in.",
|
|
5
5
|
"main": "dist/needle-engine.min.js",
|
|
6
6
|
"exports": {
|
package/plugins/vite/alias.js
CHANGED
|
@@ -113,12 +113,14 @@ export const needleViteAlias = (command, config, userSettings) => {
|
|
|
113
113
|
|
|
114
114
|
// is needle engine a local package?
|
|
115
115
|
// This will cause local changes to not be reflected anymore...
|
|
116
|
-
const localEnginePath = path.resolve(projectDir, 'node_modules/', '@needle-tools/engine', 'node_modules');
|
|
116
|
+
const localEnginePath = path.resolve(projectDir, 'node_modules/', '@needle-tools/engine', 'node_modules', '.package-lock.json');
|
|
117
117
|
if (existsSync(localEnginePath)) {
|
|
118
118
|
config.optimizeDeps ??= {};
|
|
119
119
|
config.optimizeDeps.exclude ??= [];
|
|
120
|
-
config.optimizeDeps.
|
|
121
|
-
|
|
120
|
+
if (!config.optimizeDeps.include?.includes('@needle-tools/engine')) {
|
|
121
|
+
config.optimizeDeps.exclude.push('@needle-tools/engine');
|
|
122
|
+
log("[needle-alias] Detected local @needle-tools/engine package → will exclude it from optimization");
|
|
123
|
+
}
|
|
122
124
|
}
|
|
123
125
|
|
|
124
126
|
|
|
@@ -10,32 +10,33 @@ async function generatePoster() {
|
|
|
10
10
|
const height = 1080;
|
|
11
11
|
|
|
12
12
|
return new Promise(res => {
|
|
13
|
-
|
|
13
|
+
/** @ts-ignore */
|
|
14
|
+
onStart(async (context) => {
|
|
14
15
|
|
|
15
16
|
if (context.lodsManager.manager) {
|
|
16
17
|
await context.lodsManager.manager.awaitLoading({ frames: 5, maxPromisesPerObject: 2, waitForFirstCapture: true });
|
|
17
18
|
}
|
|
18
19
|
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
20
|
+
onStart(() => {
|
|
21
|
+
const mimeType = "image/webp";
|
|
22
|
+
// We're reading back as a blob here because that's async, and doesn't seem
|
|
23
|
+
// to stress the GPU so much on memory-constrained devices.
|
|
24
|
+
screenshot2({ context, width, height, mimeType, type: "blob" })
|
|
25
|
+
// @ts-ignore
|
|
26
|
+
.then(blob => {
|
|
27
|
+
const reader = new FileReader();
|
|
28
|
+
reader.onload = function () {
|
|
29
|
+
res(reader.result);
|
|
30
|
+
};
|
|
31
|
+
reader.onloadend = function () {
|
|
32
|
+
res(null);
|
|
33
|
+
};
|
|
34
|
+
reader.readAsDataURL(blob);
|
|
35
|
+
|
|
36
|
+
})
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
}, { once: true });
|
|
39
40
|
|
|
40
41
|
|
|
41
42
|
}, { once: true });
|
package/src/engine/api.ts
CHANGED
|
@@ -24,7 +24,8 @@ export * from "./engine_addressables.js";
|
|
|
24
24
|
export { AnimationUtils } from "./engine_animation.js";
|
|
25
25
|
export { Application } from "./engine_application.js";
|
|
26
26
|
export * from "./engine_assetdatabase.js";
|
|
27
|
-
export
|
|
27
|
+
export * from "./engine_camera.fit.js";
|
|
28
|
+
export { getCameraController, setAutoFitEnabled, setCameraController, useForAutoFit } from "./engine_camera.js";
|
|
28
29
|
export * from "./engine_components.js";
|
|
29
30
|
export * from "./engine_components_internal.js";
|
|
30
31
|
export * from "./engine_components_internal.js";
|