@needle-tools/engine 4.9.3 → 4.10.0-beta.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.
- 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-6so_os_w.umd.cjs} +179 -145
- package/dist/{needle-engine.bundle-BAsxNKpA.js → needle-engine.bundle-Dj2DYdMY.js} +7699 -7235
- package/dist/needle-engine.bundle-Djy6H4lx.min.js +1650 -0
- package/dist/needle-engine.js +460 -456
- 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 +6 -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.d.ts +7 -1
- package/lib/engine/engine_camera.fit.d.ts +68 -0
- package/lib/engine/engine_camera.fit.js +166 -0
- package/lib/engine/engine_camera.fit.js.map +1 -0
- package/lib/engine/engine_camera.js +46 -6
- package/lib/engine/engine_camera.js.map +1 -1
- package/lib/engine/engine_context.d.ts +6 -0
- package/lib/engine/engine_context.js +48 -9
- package/lib/engine/engine_context.js.map +1 -1
- 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/logo-element.d.ts +1 -1
- package/lib/engine/webcomponents/logo-element.js +29 -5
- package/lib/engine/webcomponents/logo-element.js.map +1 -1
- package/lib/engine/webcomponents/needle menu/needle-menu.js +4 -3
- package/lib/engine/webcomponents/needle menu/needle-menu.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.d.ts +0 -1
- package/lib/engine/webcomponents/needle-engine.loading.js +62 -59
- 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 +7 -47
- package/lib/engine-components/OrbitControls.js +25 -149
- package/lib/engine-components/OrbitControls.js.map +1 -1
- package/lib/engine-components/Renderer.d.ts +2 -2
- package/lib/engine-components/Renderer.js +10 -5
- 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 +3 -0
- package/lib/engine-components/codegen/components.js +3 -0
- package/lib/engine-components/codegen/components.js.map +1 -1
- package/lib/engine-components/timeline/PlayableDirector.d.ts +35 -6
- package/lib/engine-components/timeline/PlayableDirector.js +67 -26
- package/lib/engine-components/timeline/PlayableDirector.js.map +1 -1
- package/lib/engine-components/timeline/TimelineModels.d.ts +11 -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 +23 -2
- package/lib/engine-components/timeline/TimelineTracks.js.map +1 -1
- package/lib/engine-components/utils/LookAt.js +5 -1
- package/lib/engine-components/utils/LookAt.js.map +1 -1
- package/lib/engine-components/web/Clickthrough.d.ts +3 -0
- package/lib/engine-components/web/Clickthrough.js +13 -2
- 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 +40 -4
- package/lib/engine-components/web/ScrollFollow.js +256 -27
- package/lib/engine-components/web/ScrollFollow.js.map +1 -1
- package/lib/engine-components/web/ViewBox.d.ts +16 -0
- package/lib/engine-components/web/ViewBox.js +183 -0
- package/lib/engine-components/web/ViewBox.js.map +1 -0
- package/lib/engine-components/web/index.d.ts +2 -0
- package/lib/engine-components/web/index.js +2 -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 +6 -0
- package/src/engine/engine_animation.ts +69 -1
- package/src/engine/engine_camera.fit.ts +258 -0
- package/src/engine/engine_camera.ts +62 -8
- package/src/engine/engine_context.ts +50 -10
- package/src/engine/engine_gizmos.ts +2 -2
- package/src/engine/engine_physics.ts +6 -3
- package/src/engine/webcomponents/logo-element.ts +29 -4
- package/src/engine/webcomponents/needle menu/needle-menu.ts +4 -3
- package/src/engine/webcomponents/needle-engine.loading.ts +95 -56
- 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 +36 -206
- package/src/engine-components/Renderer.ts +10 -5
- package/src/engine-components/api.ts +0 -1
- package/src/engine-components/codegen/components.ts +3 -0
- package/src/engine-components/timeline/PlayableDirector.ts +88 -34
- package/src/engine-components/timeline/TimelineModels.ts +11 -0
- package/src/engine-components/timeline/TimelineTracks.ts +26 -2
- package/src/engine-components/utils/LookAt.ts +5 -1
- package/src/engine-components/web/Clickthrough.ts +14 -2
- 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 +316 -25
- package/src/engine-components/web/ViewBox.ts +199 -0
- package/src/engine-components/web/index.ts +3 -1
- package/dist/needle-engine.bundle-ugr1bBtk.min.js +0 -1616
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
import { Camera, PerspectiveCamera, Vector2, Vector3 } from "three";
|
|
2
|
+
import { serializable } from "../../engine/engine_serialization_decorator.js";
|
|
3
|
+
import { registerType } from "../../engine/engine_typestore.js";
|
|
4
|
+
import { getTempVector } from "../../engine/engine_three_utils.js";
|
|
5
|
+
import { Behaviour } from "../Component.js";
|
|
6
|
+
import { isDevEnvironment } from "../../engine/debug/debug.js";
|
|
7
|
+
import { getParam } from "../../engine/engine_utils.js";
|
|
8
|
+
|
|
9
|
+
const debugParam = getParam("debugviewbox");
|
|
10
|
+
|
|
11
|
+
@registerType
|
|
12
|
+
export class ViewBox extends Behaviour {
|
|
13
|
+
|
|
14
|
+
static instances: ViewBox[] = [];
|
|
15
|
+
|
|
16
|
+
@serializable()
|
|
17
|
+
referenceFieldOfView: number = 60;
|
|
18
|
+
|
|
19
|
+
@serializable()
|
|
20
|
+
debug: boolean = false;
|
|
21
|
+
|
|
22
|
+
awake() {
|
|
23
|
+
// this.referenceFieldOfView = (this.context.mainCamera as PerspectiveCamera)?.fov || 60;
|
|
24
|
+
// setInterval(()=>{
|
|
25
|
+
// this.enabled = !this.enabled
|
|
26
|
+
// }, 1000)
|
|
27
|
+
}
|
|
28
|
+
onEnable(): void {
|
|
29
|
+
if (debugParam || this.debug || isDevEnvironment()) console.debug("[ViewBox] Using camera fov:", this.referenceFieldOfView);
|
|
30
|
+
ViewBox.instances.push(this);
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
onDisable(): void {
|
|
34
|
+
const idx = ViewBox.instances.indexOf(this);
|
|
35
|
+
if (idx !== -1) ViewBox.instances.splice(idx, 1);
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
onBeforeRender() {
|
|
39
|
+
if (this.context.isInXR) return;
|
|
40
|
+
const isActive = ViewBox.instances[ViewBox.instances.length - 1] === this;
|
|
41
|
+
if (!isActive) return;
|
|
42
|
+
|
|
43
|
+
// calculate box size to fit the camera frustrum size at the current position (just scale)
|
|
44
|
+
const camera = this.context.mainCamera;
|
|
45
|
+
if (!camera) return;
|
|
46
|
+
if (!(camera instanceof PerspectiveCamera)) {
|
|
47
|
+
// TODO: support orthographic camera
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
if (this.referenceFieldOfView === undefined || this.referenceFieldOfView <= 0) {
|
|
52
|
+
if (debugParam || this.debug) console.warn("[ViewBox] No valid referenceFieldOfView set, cannot adjust box size:", this.referenceFieldOfView);
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
const domRect = this.context.domElement.getBoundingClientRect();
|
|
57
|
+
const domX = domRect.x;
|
|
58
|
+
const domY = domRect.y;
|
|
59
|
+
const domWidth = domRect.width;
|
|
60
|
+
const domHeight = domRect.height;
|
|
61
|
+
|
|
62
|
+
let rectPosX = 0;
|
|
63
|
+
let rectPosY = 0;
|
|
64
|
+
let rectWidth = domWidth;
|
|
65
|
+
let rectHeight = domHeight;
|
|
66
|
+
let diffWidth = 1;
|
|
67
|
+
let diffHeight = 1;
|
|
68
|
+
// use focus rect if available
|
|
69
|
+
const focusRectSize = this.context.focusRectSize;
|
|
70
|
+
if (focusRectSize) {
|
|
71
|
+
// console.log(focusRectSize)
|
|
72
|
+
rectPosX = focusRectSize.x;
|
|
73
|
+
rectPosY = focusRectSize.y;
|
|
74
|
+
rectWidth = focusRectSize.width;
|
|
75
|
+
rectHeight = focusRectSize.height;
|
|
76
|
+
diffWidth = domWidth / rectWidth;
|
|
77
|
+
diffHeight = domHeight / rectHeight;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
// const view = camera.view;
|
|
81
|
+
const view = camera.view;
|
|
82
|
+
const zoom = camera.zoom;
|
|
83
|
+
const aspect = camera.aspect;
|
|
84
|
+
const fov = camera.fov;
|
|
85
|
+
camera.view = null;
|
|
86
|
+
camera.zoom = 1;
|
|
87
|
+
// camera.aspect = rectWidth / rectHeight;
|
|
88
|
+
camera.fov = this.referenceFieldOfView;
|
|
89
|
+
camera.updateProjectionMatrix();
|
|
90
|
+
|
|
91
|
+
const boxPosition = this.gameObject.worldPosition;
|
|
92
|
+
const boxScale = this.gameObject.worldScale;
|
|
93
|
+
|
|
94
|
+
|
|
95
|
+
|
|
96
|
+
// const fov = this.referenceFieldOfView
|
|
97
|
+
const distance = camera.worldPosition.distanceTo(boxPosition);
|
|
98
|
+
const vFOV = this.referenceFieldOfView * Math.PI / 180; // convert vertical fov to radians
|
|
99
|
+
const height = 2 * Math.tan(vFOV / 2) * distance; // visible height
|
|
100
|
+
const width = height * camera.aspect; // visible width
|
|
101
|
+
|
|
102
|
+
const projectedBox = this.projectBoxIntoCamera(boxPosition, boxScale, camera, height * .5);
|
|
103
|
+
const boxWidth = (projectedBox.maxX - projectedBox.minX);
|
|
104
|
+
const boxHeight = (projectedBox.maxY - projectedBox.minY);
|
|
105
|
+
|
|
106
|
+
// TODO: take the rect size different into account
|
|
107
|
+
const scale = this.fit(
|
|
108
|
+
boxWidth * camera.aspect,
|
|
109
|
+
boxHeight,
|
|
110
|
+
width / diffWidth,
|
|
111
|
+
height / diffHeight
|
|
112
|
+
);
|
|
113
|
+
const vec = getTempVector(boxPosition);
|
|
114
|
+
vec.project(camera);
|
|
115
|
+
this.context.focusRectSettings.offsetX = vec.x;
|
|
116
|
+
this.context.focusRectSettings.offsetY = vec.y;
|
|
117
|
+
this.context.focusRectSettings.zoom = scale;
|
|
118
|
+
// if we don't have a focus rect yet, set it to the dom element
|
|
119
|
+
if (!this.context.focusRect) this.context.setCameraFocusRect(this.context.domElement);
|
|
120
|
+
|
|
121
|
+
// Reset values
|
|
122
|
+
camera.view = view;
|
|
123
|
+
camera.zoom = zoom;
|
|
124
|
+
camera.aspect = aspect;
|
|
125
|
+
camera.fov = fov;
|
|
126
|
+
// camera.updateProjectionMatrix();
|
|
127
|
+
|
|
128
|
+
|
|
129
|
+
// BACKLOG: some code for box scale of an object (different component)
|
|
130
|
+
// this.gameObject.worldScale = getTempVector(width, height, worldscale.z);
|
|
131
|
+
// this.gameObject.scale.multiplyScalar(.98)
|
|
132
|
+
// const minscale = Math.min(width, height);
|
|
133
|
+
// console.log(width, height);
|
|
134
|
+
// this.gameObject.worldScale = getTempVector(scale, scale, scale);
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
|
|
138
|
+
/**
|
|
139
|
+
* Cover fit
|
|
140
|
+
*/
|
|
141
|
+
private fit(width1: number, height1: number, width2: number, height2: number) {
|
|
142
|
+
const scaleX = width2 / width1;
|
|
143
|
+
const scaleY = height2 / height1;
|
|
144
|
+
return Math.min(scaleX, scaleY);
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
|
|
148
|
+
|
|
149
|
+
private projectBoxIntoCamera(position: Vector3, scale: Vector3, camera: Camera, diff: number) {
|
|
150
|
+
|
|
151
|
+
const factor = .5 * diff;
|
|
152
|
+
|
|
153
|
+
const corners = [
|
|
154
|
+
getTempVector(-scale.x * factor, -scale.y * factor, -scale.z * factor),
|
|
155
|
+
getTempVector(scale.x * factor, -scale.y * factor, -scale.z * factor),
|
|
156
|
+
getTempVector(-scale.x * factor, scale.y * factor, -scale.z * factor),
|
|
157
|
+
getTempVector(scale.x * factor, scale.y * factor, -scale.z * factor),
|
|
158
|
+
getTempVector(-scale.x * factor, -scale.y * factor, scale.z * factor),
|
|
159
|
+
getTempVector(scale.x * factor, -scale.y * factor, scale.z * factor),
|
|
160
|
+
getTempVector(-scale.x * factor, scale.y * factor, scale.z * factor),
|
|
161
|
+
getTempVector(scale.x * factor, scale.y * factor, scale.z * factor),
|
|
162
|
+
];
|
|
163
|
+
let minX = Number.POSITIVE_INFINITY;
|
|
164
|
+
let maxX = Number.NEGATIVE_INFINITY;
|
|
165
|
+
let minY = Number.POSITIVE_INFINITY;
|
|
166
|
+
let maxY = Number.NEGATIVE_INFINITY;
|
|
167
|
+
for (let i = 0; i < corners.length; i++) {
|
|
168
|
+
const c = corners[i];
|
|
169
|
+
c.add(position);
|
|
170
|
+
c.project(camera);
|
|
171
|
+
if (c.x < minX) minX = c.x;
|
|
172
|
+
if (c.x > maxX) maxX = c.x;
|
|
173
|
+
if (c.y < minY) minY = c.y;
|
|
174
|
+
if (c.y > maxY) maxY = c.y;
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
// if(!this._projectedBoxElement) {
|
|
178
|
+
// this._projectedBoxElement = document.createElement("div");
|
|
179
|
+
// this.context.domElement.appendChild(this._projectedBoxElement);
|
|
180
|
+
// }
|
|
181
|
+
// this._projectedBoxElement.style.position = "fixed";
|
|
182
|
+
// this._projectedBoxElement.style.outline = "10px solid red";
|
|
183
|
+
// this._projectedBoxElement.style.left = ((minX * .5 + .5) * this.context.domWidth) + "px";
|
|
184
|
+
// this._projectedBoxElement.style.top = ((-maxY * .5 + .5) * this.context.domHeight) + "px";
|
|
185
|
+
// this._projectedBoxElement.style.width = ((maxX - minX) * .5 * this.context.domWidth) + "px";
|
|
186
|
+
// this._projectedBoxElement.style.height = ((maxY - minY) * .5 * this.context.domHeight) + "px";
|
|
187
|
+
// this._projectedBoxElement.style.pointerEvents = "none";
|
|
188
|
+
// this._projectedBoxElement.style.zIndex = "1000";
|
|
189
|
+
|
|
190
|
+
|
|
191
|
+
return { minX, maxX, minY, maxY };
|
|
192
|
+
|
|
193
|
+
}
|
|
194
|
+
private _projectedBoxElement: HTMLElement | null = null;
|
|
195
|
+
|
|
196
|
+
|
|
197
|
+
|
|
198
|
+
|
|
199
|
+
}
|