@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.
Files changed (133) hide show
  1. package/CHANGELOG.md +9 -0
  2. package/components.needle.json +1 -1
  3. package/dist/{gltf-progressive-DhE1A6hX.min.js → gltf-progressive-CoZbSfPR.min.js} +1 -1
  4. package/dist/{gltf-progressive-egsMzRdv.js → gltf-progressive-DUR9TuAH.js} +3 -3
  5. package/dist/{gltf-progressive-DWiyqrwB.umd.cjs → gltf-progressive-Iy7aSAPk.umd.cjs} +1 -1
  6. package/dist/{needle-engine.bundle-C7LSzO5L.umd.cjs → needle-engine.bundle-6so_os_w.umd.cjs} +179 -145
  7. package/dist/{needle-engine.bundle-BAsxNKpA.js → needle-engine.bundle-Dj2DYdMY.js} +7699 -7235
  8. package/dist/needle-engine.bundle-Djy6H4lx.min.js +1650 -0
  9. package/dist/needle-engine.js +460 -456
  10. package/dist/needle-engine.min.js +1 -1
  11. package/dist/needle-engine.umd.cjs +1 -1
  12. package/dist/{postprocessing-BZOSD1ln.min.js → postprocessing-BHMVuZQ1.min.js} +1 -1
  13. package/dist/{postprocessing-Bb5StX0o.umd.cjs → postprocessing-BsnRNRRS.umd.cjs} +1 -1
  14. package/dist/{postprocessing-BzFF7i-7.js → postprocessing-DQ2pynXW.js} +2 -2
  15. package/dist/{three-BK56xWDs.umd.cjs → three-B-jwTHao.umd.cjs} +11 -11
  16. package/dist/{three-CsHK73Zc.js → three-CJSAehtG.js} +1 -0
  17. package/dist/{three-examples-Bph291U2.min.js → three-examples-BivkhnvN.min.js} +1 -1
  18. package/dist/{three-examples-C9WfZu-X.umd.cjs → three-examples-Deqc1bNw.umd.cjs} +1 -1
  19. package/dist/{three-examples-BvMpKSun.js → three-examples-Doq0rvFU.js} +1 -1
  20. package/dist/{three-mesh-ui-CN6aRT7i.js → three-mesh-ui-CktOi6oI.js} +1 -1
  21. package/dist/{three-mesh-ui-DnxkZWNA.umd.cjs → three-mesh-ui-CsHwj9cJ.umd.cjs} +1 -1
  22. package/dist/{three-mesh-ui-n_qS2BM-.min.js → three-mesh-ui-DhYXcXZe.min.js} +1 -1
  23. package/dist/{three-TNFQHSFa.min.js → three-qw28ZtTy.min.js} +10 -10
  24. package/dist/{vendor-BtJpSuCj.umd.cjs → vendor-D0Yvltn9.umd.cjs} +1 -1
  25. package/dist/{vendor-k9i6CeGi.js → vendor-DU8tJyl_.js} +1 -1
  26. package/dist/{vendor-XJ9xiwrv.min.js → vendor-JyrX4DVM.min.js} +1 -1
  27. package/lib/engine/api.d.ts +1 -0
  28. package/lib/engine/api.js +1 -0
  29. package/lib/engine/api.js.map +1 -1
  30. package/lib/engine/codegen/register_types.js +6 -0
  31. package/lib/engine/codegen/register_types.js.map +1 -1
  32. package/lib/engine/engine_animation.d.ts +21 -1
  33. package/lib/engine/engine_animation.js +32 -1
  34. package/lib/engine/engine_animation.js.map +1 -1
  35. package/lib/engine/engine_camera.d.ts +7 -1
  36. package/lib/engine/engine_camera.fit.d.ts +68 -0
  37. package/lib/engine/engine_camera.fit.js +166 -0
  38. package/lib/engine/engine_camera.fit.js.map +1 -0
  39. package/lib/engine/engine_camera.js +46 -6
  40. package/lib/engine/engine_camera.js.map +1 -1
  41. package/lib/engine/engine_context.d.ts +6 -0
  42. package/lib/engine/engine_context.js +48 -9
  43. package/lib/engine/engine_context.js.map +1 -1
  44. package/lib/engine/engine_gizmos.d.ts +2 -2
  45. package/lib/engine/engine_gizmos.js +2 -2
  46. package/lib/engine/engine_physics.js +6 -3
  47. package/lib/engine/engine_physics.js.map +1 -1
  48. package/lib/engine/webcomponents/logo-element.d.ts +1 -1
  49. package/lib/engine/webcomponents/logo-element.js +29 -5
  50. package/lib/engine/webcomponents/logo-element.js.map +1 -1
  51. package/lib/engine/webcomponents/needle menu/needle-menu.js +4 -3
  52. package/lib/engine/webcomponents/needle menu/needle-menu.js.map +1 -1
  53. package/lib/engine/webcomponents/needle-engine.d.ts +1 -0
  54. package/lib/engine/webcomponents/needle-engine.js +6 -0
  55. package/lib/engine/webcomponents/needle-engine.js.map +1 -1
  56. package/lib/engine/webcomponents/needle-engine.loading.d.ts +0 -1
  57. package/lib/engine/webcomponents/needle-engine.loading.js +62 -59
  58. package/lib/engine/webcomponents/needle-engine.loading.js.map +1 -1
  59. package/lib/engine-components/AnimatorController.js +16 -0
  60. package/lib/engine-components/AnimatorController.js.map +1 -1
  61. package/lib/engine-components/CameraUtils.js +8 -9
  62. package/lib/engine-components/CameraUtils.js.map +1 -1
  63. package/lib/engine-components/OrbitControls.d.ts +7 -47
  64. package/lib/engine-components/OrbitControls.js +25 -149
  65. package/lib/engine-components/OrbitControls.js.map +1 -1
  66. package/lib/engine-components/Renderer.d.ts +2 -2
  67. package/lib/engine-components/Renderer.js +10 -5
  68. package/lib/engine-components/Renderer.js.map +1 -1
  69. package/lib/engine-components/api.d.ts +0 -1
  70. package/lib/engine-components/api.js.map +1 -1
  71. package/lib/engine-components/codegen/components.d.ts +3 -0
  72. package/lib/engine-components/codegen/components.js +3 -0
  73. package/lib/engine-components/codegen/components.js.map +1 -1
  74. package/lib/engine-components/timeline/PlayableDirector.d.ts +35 -6
  75. package/lib/engine-components/timeline/PlayableDirector.js +67 -26
  76. package/lib/engine-components/timeline/PlayableDirector.js.map +1 -1
  77. package/lib/engine-components/timeline/TimelineModels.d.ts +11 -0
  78. package/lib/engine-components/timeline/TimelineModels.js.map +1 -1
  79. package/lib/engine-components/timeline/TimelineTracks.d.ts +7 -0
  80. package/lib/engine-components/timeline/TimelineTracks.js +23 -2
  81. package/lib/engine-components/timeline/TimelineTracks.js.map +1 -1
  82. package/lib/engine-components/utils/LookAt.js +5 -1
  83. package/lib/engine-components/utils/LookAt.js.map +1 -1
  84. package/lib/engine-components/web/Clickthrough.d.ts +3 -0
  85. package/lib/engine-components/web/Clickthrough.js +13 -2
  86. package/lib/engine-components/web/Clickthrough.js.map +1 -1
  87. package/lib/engine-components/web/CursorFollow.d.ts +3 -0
  88. package/lib/engine-components/web/CursorFollow.js +3 -0
  89. package/lib/engine-components/web/CursorFollow.js.map +1 -1
  90. package/lib/engine-components/web/HoverAnimation.d.ts +44 -0
  91. package/lib/engine-components/web/HoverAnimation.js +105 -0
  92. package/lib/engine-components/web/HoverAnimation.js.map +1 -0
  93. package/lib/engine-components/web/ScrollFollow.d.ts +40 -4
  94. package/lib/engine-components/web/ScrollFollow.js +256 -27
  95. package/lib/engine-components/web/ScrollFollow.js.map +1 -1
  96. package/lib/engine-components/web/ViewBox.d.ts +16 -0
  97. package/lib/engine-components/web/ViewBox.js +183 -0
  98. package/lib/engine-components/web/ViewBox.js.map +1 -0
  99. package/lib/engine-components/web/index.d.ts +2 -0
  100. package/lib/engine-components/web/index.js +2 -0
  101. package/lib/engine-components/web/index.js.map +1 -1
  102. package/package.json +1 -1
  103. package/plugins/vite/alias.js +5 -3
  104. package/plugins/vite/poster-client.js +22 -21
  105. package/src/engine/api.ts +2 -1
  106. package/src/engine/codegen/register_types.ts +6 -0
  107. package/src/engine/engine_animation.ts +69 -1
  108. package/src/engine/engine_camera.fit.ts +258 -0
  109. package/src/engine/engine_camera.ts +62 -8
  110. package/src/engine/engine_context.ts +50 -10
  111. package/src/engine/engine_gizmos.ts +2 -2
  112. package/src/engine/engine_physics.ts +6 -3
  113. package/src/engine/webcomponents/logo-element.ts +29 -4
  114. package/src/engine/webcomponents/needle menu/needle-menu.ts +4 -3
  115. package/src/engine/webcomponents/needle-engine.loading.ts +95 -56
  116. package/src/engine/webcomponents/needle-engine.ts +6 -1
  117. package/src/engine-components/AnimatorController.ts +21 -2
  118. package/src/engine-components/CameraUtils.ts +8 -9
  119. package/src/engine-components/OrbitControls.ts +36 -206
  120. package/src/engine-components/Renderer.ts +10 -5
  121. package/src/engine-components/api.ts +0 -1
  122. package/src/engine-components/codegen/components.ts +3 -0
  123. package/src/engine-components/timeline/PlayableDirector.ts +88 -34
  124. package/src/engine-components/timeline/TimelineModels.ts +11 -0
  125. package/src/engine-components/timeline/TimelineTracks.ts +26 -2
  126. package/src/engine-components/utils/LookAt.ts +5 -1
  127. package/src/engine-components/web/Clickthrough.ts +14 -2
  128. package/src/engine-components/web/CursorFollow.ts +3 -0
  129. package/src/engine-components/web/HoverAnimation.ts +99 -0
  130. package/src/engine-components/web/ScrollFollow.ts +316 -25
  131. package/src/engine-components/web/ViewBox.ts +199 -0
  132. package/src/engine-components/web/index.ts +3 -1
  133. 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
+ }
@@ -1,3 +1,5 @@
1
1
  export * from "./Clickthrough.js";
2
2
  export * from "./CursorFollow.js";
3
- export * from "./ScrollFollow.js";
3
+ export * from "./HoverAnimation.js";
4
+ export * from "./ScrollFollow.js";
5
+ export * from "./ViewBox.js";