@needle-tools/engine 4.10.0-next.55c0bf9 → 4.10.0-next.870425c

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 (142) hide show
  1. package/CHANGELOG.md +8 -3
  2. package/README.md +2 -1
  3. package/components.needle.json +1 -1
  4. package/dist/{needle-engine.bundle-Cf5H9Zy9.umd.cjs → needle-engine.bundle-0b6rexDr.umd.cjs} +154 -141
  5. package/dist/{needle-engine.bundle-CUo74dPe.js → needle-engine.bundle-B5GtGvbq.js} +8329 -8050
  6. package/dist/needle-engine.bundle-CicGQeCY.min.js +1652 -0
  7. package/dist/needle-engine.js +259 -257
  8. package/dist/needle-engine.min.js +1 -1
  9. package/dist/needle-engine.umd.cjs +1 -1
  10. package/dist/vendor-CPuBPspY.umd.cjs +1121 -0
  11. package/dist/vendor-DPCU8cUF.min.js +1121 -0
  12. package/dist/vendor-MBoqSyFm.js +16240 -0
  13. package/lib/engine/codegen/register_types.js +2 -0
  14. package/lib/engine/codegen/register_types.js.map +1 -1
  15. package/lib/engine/engine_camera.d.ts +7 -1
  16. package/lib/engine/engine_camera.fit.d.ts +1 -1
  17. package/lib/engine/engine_camera.fit.js +3 -30
  18. package/lib/engine/engine_camera.fit.js.map +1 -1
  19. package/lib/engine/engine_camera.js +46 -6
  20. package/lib/engine/engine_camera.js.map +1 -1
  21. package/lib/engine/engine_context.d.ts +6 -0
  22. package/lib/engine/engine_context.js +48 -9
  23. package/lib/engine/engine_context.js.map +1 -1
  24. package/lib/engine/engine_gizmos.d.ts +11 -10
  25. package/lib/engine/engine_gizmos.js +24 -10
  26. package/lib/engine/engine_gizmos.js.map +1 -1
  27. package/lib/engine/engine_license.js +1 -1
  28. package/lib/engine/engine_license.js.map +1 -1
  29. package/lib/engine/engine_lightdata.d.ts +3 -3
  30. package/lib/engine/engine_lightdata.js +10 -10
  31. package/lib/engine/engine_lightdata.js.map +1 -1
  32. package/lib/engine/engine_physics_rapier.js +4 -0
  33. package/lib/engine/engine_physics_rapier.js.map +1 -1
  34. package/lib/engine/engine_scenelighting.d.ts +1 -1
  35. package/lib/engine/engine_scenelighting.js +4 -5
  36. package/lib/engine/engine_scenelighting.js.map +1 -1
  37. package/lib/engine/engine_utils.d.ts +3 -1
  38. package/lib/engine/engine_utils.js +11 -0
  39. package/lib/engine/engine_utils.js.map +1 -1
  40. package/lib/engine/extensions/NEEDLE_lightmaps.js +1 -1
  41. package/lib/engine/extensions/NEEDLE_lightmaps.js.map +1 -1
  42. package/lib/engine/extensions/extension_utils.js +1 -1
  43. package/lib/engine/extensions/extension_utils.js.map +1 -1
  44. package/lib/engine/webcomponents/logo-element.d.ts +1 -1
  45. package/lib/engine/webcomponents/logo-element.js +29 -5
  46. package/lib/engine/webcomponents/logo-element.js.map +1 -1
  47. package/lib/engine/webcomponents/needle menu/needle-menu.js +4 -3
  48. package/lib/engine/webcomponents/needle menu/needle-menu.js.map +1 -1
  49. package/lib/engine/webcomponents/needle-engine.js +22 -0
  50. package/lib/engine/webcomponents/needle-engine.js.map +1 -1
  51. package/lib/engine/webcomponents/needle-engine.loading.d.ts +0 -1
  52. package/lib/engine/webcomponents/needle-engine.loading.js +3 -36
  53. package/lib/engine/webcomponents/needle-engine.loading.js.map +1 -1
  54. package/lib/engine/xr/NeedleXRController.d.ts +3 -3
  55. package/lib/engine/xr/NeedleXRController.js +28 -0
  56. package/lib/engine/xr/NeedleXRController.js.map +1 -1
  57. package/lib/engine-components/Camera.d.ts +1 -1
  58. package/lib/engine-components/Camera.js +1 -1
  59. package/lib/engine-components/CameraUtils.js +2 -1
  60. package/lib/engine-components/CameraUtils.js.map +1 -1
  61. package/lib/engine-components/CharacterController.d.ts +2 -2
  62. package/lib/engine-components/CharacterController.js +2 -2
  63. package/lib/engine-components/OrbitControls.d.ts +5 -2
  64. package/lib/engine-components/OrbitControls.js +31 -7
  65. package/lib/engine-components/OrbitControls.js.map +1 -1
  66. package/lib/engine-components/Renderer.js +6 -1
  67. package/lib/engine-components/Renderer.js.map +1 -1
  68. package/lib/engine-components/Skybox.js +22 -4
  69. package/lib/engine-components/Skybox.js.map +1 -1
  70. package/lib/engine-components/codegen/components.d.ts +1 -0
  71. package/lib/engine-components/codegen/components.js +1 -0
  72. package/lib/engine-components/codegen/components.js.map +1 -1
  73. package/lib/engine-components/debug/LogStats.d.ts +1 -0
  74. package/lib/engine-components/debug/LogStats.js +1 -0
  75. package/lib/engine-components/debug/LogStats.js.map +1 -1
  76. package/lib/engine-components/timeline/PlayableDirector.d.ts +7 -0
  77. package/lib/engine-components/timeline/PlayableDirector.js +8 -1
  78. package/lib/engine-components/timeline/PlayableDirector.js.map +1 -1
  79. package/lib/engine-components/timeline/TimelineModels.d.ts +45 -2
  80. package/lib/engine-components/timeline/TimelineModels.js +6 -0
  81. package/lib/engine-components/timeline/TimelineModels.js.map +1 -1
  82. package/lib/engine-components/timeline/TimelineTracks.d.ts +2 -1
  83. package/lib/engine-components/timeline/TimelineTracks.js +30 -25
  84. package/lib/engine-components/timeline/TimelineTracks.js.map +1 -1
  85. package/lib/engine-components/utils/LookAt.js +5 -1
  86. package/lib/engine-components/utils/LookAt.js.map +1 -1
  87. package/lib/engine-components/web/Clickthrough.js +10 -2
  88. package/lib/engine-components/web/Clickthrough.js.map +1 -1
  89. package/lib/engine-components/web/ScrollFollow.d.ts +24 -0
  90. package/lib/engine-components/web/ScrollFollow.js +167 -41
  91. package/lib/engine-components/web/ScrollFollow.js.map +1 -1
  92. package/lib/engine-components/web/ViewBox.d.ts +46 -0
  93. package/lib/engine-components/web/ViewBox.js +270 -0
  94. package/lib/engine-components/web/ViewBox.js.map +1 -0
  95. package/lib/engine-components/web/index.d.ts +1 -0
  96. package/lib/engine-components/web/index.js +1 -0
  97. package/lib/engine-components/web/index.js.map +1 -1
  98. package/lib/engine-components/webxr/WebARSessionRoot.js +1 -0
  99. package/lib/engine-components/webxr/WebARSessionRoot.js.map +1 -1
  100. package/lib/engine-components-experimental/Presentation.d.ts +1 -0
  101. package/lib/engine-components-experimental/Presentation.js +1 -0
  102. package/lib/engine-components-experimental/Presentation.js.map +1 -1
  103. package/package.json +2 -1
  104. package/src/engine/codegen/register_types.ts +2 -0
  105. package/src/engine/engine_camera.fit.ts +2 -32
  106. package/src/engine/engine_camera.ts +61 -9
  107. package/src/engine/engine_context.ts +50 -10
  108. package/src/engine/engine_gizmos.ts +37 -23
  109. package/src/engine/engine_license.ts +1 -1
  110. package/src/engine/engine_lightdata.ts +11 -11
  111. package/src/engine/engine_physics_rapier.ts +3 -0
  112. package/src/engine/engine_scenelighting.ts +5 -6
  113. package/src/engine/engine_utils.ts +12 -0
  114. package/src/engine/extensions/NEEDLE_lightmaps.ts +1 -1
  115. package/src/engine/extensions/extension_utils.ts +1 -1
  116. package/src/engine/webcomponents/logo-element.ts +29 -4
  117. package/src/engine/webcomponents/needle menu/needle-menu.ts +4 -3
  118. package/src/engine/webcomponents/needle-engine.loading.ts +32 -32
  119. package/src/engine/webcomponents/needle-engine.ts +33 -6
  120. package/src/engine/xr/NeedleXRController.ts +36 -4
  121. package/src/engine-components/Camera.ts +1 -1
  122. package/src/engine-components/CameraUtils.ts +1 -1
  123. package/src/engine-components/CharacterController.ts +2 -2
  124. package/src/engine-components/OrbitControls.ts +41 -2
  125. package/src/engine-components/Renderer.ts +6 -1
  126. package/src/engine-components/Skybox.ts +26 -7
  127. package/src/engine-components/codegen/components.ts +1 -0
  128. package/src/engine-components/debug/LogStats.ts +1 -0
  129. package/src/engine-components/timeline/PlayableDirector.ts +10 -1
  130. package/src/engine-components/timeline/TimelineModels.ts +45 -3
  131. package/src/engine-components/timeline/TimelineTracks.ts +30 -25
  132. package/src/engine-components/utils/LookAt.ts +5 -1
  133. package/src/engine-components/web/Clickthrough.ts +11 -2
  134. package/src/engine-components/web/ScrollFollow.ts +200 -48
  135. package/src/engine-components/web/ViewBox.ts +292 -0
  136. package/src/engine-components/web/index.ts +2 -1
  137. package/src/engine-components/webxr/WebARSessionRoot.ts +1 -0
  138. package/src/engine-components-experimental/Presentation.ts +1 -0
  139. package/dist/needle-engine.bundle-DlAVTipB.min.js +0 -1639
  140. package/dist/vendor-D0Yvltn9.umd.cjs +0 -1121
  141. package/dist/vendor-DU8tJyl_.js +0 -14366
  142. package/dist/vendor-JyrX4DVM.min.js +0 -1121
@@ -4,7 +4,10 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
4
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
5
  return c > 3 && r && Object.defineProperty(target, key, r), r;
6
6
  };
7
+ // For firefox ViewTimeline support
8
+ import "scroll-timeline-polyfill/dist/scroll-timeline.js";
7
9
  import { Object3D } from "three";
10
+ import { isDevEnvironment } from "../../engine/debug/debug.js";
8
11
  import { Mathf } from "../../engine/engine_math.js";
9
12
  import { serializable } from "../../engine/engine_serialization.js";
10
13
  import { getBoundingBox } from "../../engine/engine_three_utils.js";
@@ -26,6 +29,7 @@ const debug = getParam("debugscroll");
26
29
  *
27
30
  * @link Example at https://scrollytelling-2-z23hmxby7c6x-u30ld.needle.run/
28
31
  * @link Template at https://github.com/needle-engine/scrollytelling-template
32
+ * @link [Scrollytelling Bike Demo](https://scrollytelling-bike-z23hmxb2gnu5a.needle.run/)
29
33
  *
30
34
  * ## How to use with an Animator
31
35
  * 1. Create an Animator component and set up a float parameter named "scroll".
@@ -116,7 +120,8 @@ export class ScrollFollow extends Behaviour {
116
120
  this._current_value = this._target_value;
117
121
  }
118
122
  }
119
- if (this._current_value !== this._appliedValue) {
123
+ // if (this._current_value !== this._appliedValue)
124
+ {
120
125
  this._appliedValue = this._current_value;
121
126
  let defaultPrevented = false;
122
127
  if (this.changed.listenerCount > 0) {
@@ -134,8 +139,8 @@ export class ScrollFollow extends Behaviour {
134
139
  // if not prevented apply scroll
135
140
  if (!defaultPrevented) {
136
141
  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;
142
+ // const height = this._rangeEndValue - this._rangeStartValue;
143
+ // const pixelValue = this._rangeStartValue + value * height;
139
144
  // apply scroll to target(s)
140
145
  if (Array.isArray(this.target)) {
141
146
  this.target.forEach(t => t && this.applyScroll(t, value));
@@ -144,7 +149,7 @@ export class ScrollFollow extends Behaviour {
144
149
  this.applyScroll(this.target, value);
145
150
  }
146
151
  if (debug && this.context.time.frame % 30 === 0) {
147
- console.debug(`[ScrollFollow] ${this._current_value.toFixed(5)} — ${(this._target_value * 100).toFixed(0)}%`);
152
+ console.debug(`[ScrollFollow] ${this._current_value.toFixed(5)} — ${(this._target_value * 100).toFixed(0)}%, targets [${Array.isArray(this.target) ? this.target.length : 1}]`);
148
153
  }
149
154
  }
150
155
  }
@@ -194,8 +199,9 @@ export class ScrollFollow extends Behaviour {
194
199
  return;
195
200
  if (target instanceof PlayableDirector) {
196
201
  this.handleTimelineTarget(target, value);
197
- if (!target.isPlaying)
198
- target.evaluate();
202
+ if (target.isPlaying)
203
+ target.pause();
204
+ target.evaluate();
199
205
  }
200
206
  else if (target instanceof Animator) {
201
207
  target.setFloat("scroll", value);
@@ -239,18 +245,36 @@ export class ScrollFollow extends Behaviour {
239
245
  let scrollRegionStart = Infinity;
240
246
  let scrollRegionEnd = 0;
241
247
  markersArray.length = 0;
248
+ // querySelectorResults.length = 0;
249
+ let markerIndex = 0;
250
+ // https://scroll-driven-animations.style/tools/view-timeline/ranges
242
251
  for (const marker of director.foreachMarker("ScrollMarker")) {
252
+ const index = markerIndex++;
243
253
  // 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))) {
254
+ if ((marker.element === undefined || marker.needsUpdate === true || /** element is not in DOM anymore? */ (marker.element && !marker.element?.parentNode))) {
245
255
  marker.needsUpdate = false;
246
256
  try {
247
- marker.element = document.querySelector(marker.selector) || null;
257
+ // TODO: with this it's currently not possible to remap markers from HTML. For example if I have two sections and I want to now use the marker["center"] multiple times to stay at that marker for a longer time
258
+ marker.element = tryGetElementsForSelector(index, marker.name);
248
259
  if (debug)
249
- console.debug("ScrollMarker found on page", marker.element, marker.selector);
260
+ console.debug(`ScrollMarker #${index} "${marker.name}" (${marker.time.toFixed(2)}) found`, marker.element);
261
+ if (!marker.element) {
262
+ marker.timeline = undefined;
263
+ if (debug || isDevEnvironment())
264
+ console.warn(`No HTML element found for ScrollMarker: ${marker.name} (index ${index})`);
265
+ continue;
266
+ }
267
+ else {
268
+ /** @ts-ignore */
269
+ marker.timeline = new ViewTimeline({
270
+ subject: marker.element,
271
+ axis: 'block', // https://drafts.csswg.org/scroll-animations/#scroll-notation
272
+ });
273
+ }
250
274
  }
251
275
  catch (error) {
252
276
  marker.element = null;
253
- console.error("ScrollMarker selector is not valid: " + marker.selector + "\n", error);
277
+ console.error("ScrollMarker selector is not valid: " + marker.name + "\n", error);
254
278
  }
255
279
  }
256
280
  // skip markers without element (e.g. if the selector didn't return any element)
@@ -271,49 +295,92 @@ export class ScrollFollow extends Behaviour {
271
295
  const currentBottom = currentTop + this._scrollContainerHeight;
272
296
  weightsArray.length = 0;
273
297
  let sum = 0;
298
+ const oneFrameTime = 1 / 60;
299
+ // We keep a separate count here in case there are some markers that could not be resolved so point to *invalid* elements - the timeline should fallback to 0-1 scroll behaviour then
274
300
  let markerCount = 0;
275
- for (const marker of markersArray) {
301
+ for (let i = 0; i < markersArray.length; i++) {
302
+ const marker = markersArray[i];
276
303
  if (!marker.element)
277
304
  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
- }
305
+ const nextMarker = markersArray[i + 1];
306
+ const nextTime = nextMarker
307
+ ? (nextMarker.time - oneFrameTime)
308
+ : duration;
298
309
  markerCount += 1;
299
- if (overlap > 0) {
300
- weightsArray.push({ time: marker.time, weight: overlap });
301
- sum += overlap;
310
+ const timeline = marker.timeline;
311
+ if (timeline) {
312
+ const time01 = calculateTimelinePositionNormalized(timeline);
313
+ // remap 0-1 to 0 - 1 - 0 (full weight at center)
314
+ const weight = 1 - Math.abs(time01 - 0.5) * 2;
315
+ const name = marker.name || `marker${i}`;
316
+ if (time01 > 0 && time01 <= 1) {
317
+ const lerpTime = marker.time + (nextTime - marker.time) * time01;
318
+ weightsArray.push({ name, time: lerpTime, weight: weight });
319
+ sum += weight;
320
+ }
321
+ // Before the first marker is reached
322
+ else if (i === 0 && time01 <= 0) {
323
+ weightsArray.push({ name, time: 0, weight: 1 });
324
+ sum += 1;
325
+ }
326
+ // After the last marker is reached
327
+ else if (i === markersArray.length - 1 && time01 >= 1) {
328
+ weightsArray.push({ name, time: duration, weight: 1 });
329
+ sum += 1;
330
+ }
302
331
  }
332
+ continue;
333
+ // if(this.context.time.frame % 10 === 0) console.log(marker.element?.className, timeline, calculateTimelinePositionNormalized(timeline!));
334
+ // const top = marker.element.offsetTop - this._scrollContainerHeight;
335
+ // const height = marker.element.offsetHeight + this._scrollContainerHeight;
336
+ // const bottom = top + height;
337
+ // let overlap = 0;
338
+ // // 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
339
+ // if (bottom < currentTop) {
340
+ // // marker is above scroll region
341
+ // overlap = 0;
342
+ // }
343
+ // else if (top > currentBottom) {
344
+ // // marker is below scroll region
345
+ // overlap = 0;
346
+ // }
347
+ // else {
348
+ // // calculate overlap in pixels
349
+ // const overlapTop = Math.max(top, currentTop);
350
+ // const overlapBottom = Math.min(bottom, currentBottom);
351
+ // const height = Math.max(1, currentBottom - currentTop);
352
+ // overlap = Math.max(0, overlapBottom - overlapTop);
353
+ // }
354
+ // // if(this.context.time.frame % 20 === 0) console.log(overlap)
355
+ // if (overlap > 0) {
356
+ // weightsArray.push({ time: marker.time, weight: overlap });
357
+ // sum += overlap;
358
+ // }
303
359
  }
304
360
  if (weightsArray.length <= 0 && markerCount <= 0) {
305
361
  director.time = value * duration;
306
362
  }
307
363
  else if (weightsArray.length > 0) {
308
364
  // 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;
365
+ let time = weightsArray[0].time; // fallback to first time
366
+ if (weightsArray.length > 1) {
367
+ for (const entry of weightsArray) {
368
+ const weight = entry.weight / Math.max(0.00001, sum);
369
+ // console.log(weight.toFixed(2))
370
+ // lerp time based on weight
371
+ const diff = Math.abs(entry.time - time);
372
+ time += diff * weight;
373
+ }
374
+ }
375
+ if (this.damping <= 0) {
376
+ director.time = time;
377
+ }
378
+ else {
379
+ director.time = Mathf.lerp(director.time, time, this.context.time.deltaTime / this.damping);
380
+ }
381
+ if (debug && this.context.time.frame % 30 === 0) {
382
+ console.log(`[ScrollFollow ] Timeline ${director.name}: ${time.toFixed(3)}`, weightsArray.map(w => `[${w.name} ${(w.weight * 100).toFixed(0)}%]`).join(", "));
315
383
  }
316
- director.time = time;
317
384
  }
318
385
  }
319
386
  }
@@ -337,4 +404,63 @@ __decorate([
337
404
  ], ScrollFollow.prototype, "changed", void 0);
338
405
  const weightsArray = [];
339
406
  const markersArray = [];
407
+ // type SelectorCache = {
408
+ // /** The selector used to query the *elements */
409
+ // selector: string,
410
+ // elements: Element[] | null,
411
+ // usedElementCount: number,
412
+ // }
413
+ // const querySelectorResults: Array<SelectorCache> = [];
414
+ const needleScrollMarkerIndexCache = new Map();
415
+ const needleScrollMarkerNameCache = new Map();
416
+ let needsScrollMarkerRefresh = true;
417
+ function tryGetElementsForSelector(index, name, _cycle = 0) {
418
+ if (!needsScrollMarkerRefresh) {
419
+ if (name?.length) {
420
+ const element = needleScrollMarkerNameCache.get(name) || null;
421
+ if (element)
422
+ return element;
423
+ // const isNumber = !isNaN(Number(name));
424
+ // if (!isNumber) {
425
+ // }
426
+ }
427
+ const element = needleScrollMarkerIndexCache.get(index) || null;
428
+ const value = element?.getAttribute("data-timeline-marker");
429
+ // if (value?.length) {
430
+ // if (cycle === 0) {
431
+ // // if the HTML marker we found by index does define a different marker name we try to find the correct HTML element by name
432
+ // return tryGetElementsForSelector(index, value, 1);
433
+ // }
434
+ // if (isDevEnvironment()) console.warn(`ScrollMarker name mismatch: expected "${name}", got "${value}"`);
435
+ // }
436
+ return element;
437
+ }
438
+ needsScrollMarkerRefresh = false;
439
+ needleScrollMarkerIndexCache.clear();
440
+ const markers = document.querySelectorAll(`[data-timeline-marker]`);
441
+ markers.forEach((m, i) => {
442
+ needleScrollMarkerIndexCache.set(i, m);
443
+ const name = m.getAttribute("data-timeline-marker");
444
+ if (name?.length)
445
+ needleScrollMarkerNameCache.set(name, m);
446
+ });
447
+ needsScrollMarkerRefresh = false;
448
+ return tryGetElementsForSelector(index, name);
449
+ }
450
+ // #region ScrollTimeline
451
+ function calculateTimelinePositionNormalized(timeline) {
452
+ if (!timeline.source)
453
+ return 0;
454
+ const currentTime = timeline.currentTime;
455
+ const duration = timeline.duration;
456
+ let durationValue = 1;
457
+ if (duration.unit === "seconds") {
458
+ durationValue = duration.value;
459
+ }
460
+ else if (duration.unit === "percent") {
461
+ durationValue = duration.value;
462
+ }
463
+ const t01 = currentTime.unit === "seconds" ? (currentTime.value / durationValue) : (currentTime.value / 100);
464
+ return t01;
465
+ }
340
466
  //# sourceMappingURL=ScrollFollow.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ScrollFollow.js","sourceRoot":"","sources":["../../../src/engine-components/web/ScrollFollow.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ScrollFollow.js","sourceRoot":"","sources":["../../../src/engine-components/web/ScrollFollow.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,46 @@
1
+ import { Behaviour } from "../Component.js";
2
+ /**
3
+ * This component can be used to automatically fit a certain box area into the camera view - no matter your screen size or aspect ratio.
4
+ *
5
+ * Add the ViewBox to an object into your scene
6
+ *
7
+ * @link [Example on needle.run](https://viewbox-demo-z23hmxbz2gkayo-z1nyzm6.needle.run/)
8
+ * @link [Scrollytelling Demo using animated Viewbox](https://scrollytelling-bike-z23hmxb2gnu5a.needle.run/)
9
+ * @link [Example on Stackblitz](https://stackblitz.com/edit/needle-engine-view-box-example)
10
+ *
11
+ * @example Add a Viewbox component to an object in your scene
12
+ * ```ts
13
+ const viewBox = new Object3D();
14
+ viewBox.scale.set(0, 0, 0);
15
+ viewBox.addComponent(ViewBox, { debug: true });
16
+ scene.add(viewBox);
17
+ * ```
18
+
19
+ * @category Camera
20
+ * @group Components
21
+ * @component
22
+ */
23
+ export declare class ViewBox extends Behaviour {
24
+ static readonly instances: ViewBox[];
25
+ /**
26
+ * The reference field of view is used to calculate the box size. This should usually be the same as your camera's fov.
27
+ * @default -1 (meaning it will use the camera fov on the first frame)
28
+ */
29
+ referenceFieldOfView: number;
30
+ /**
31
+ * Enable debug logs and rendering for this component instance
32
+ */
33
+ debug: boolean;
34
+ onEnable(): void;
35
+ onDisable(): void;
36
+ private removeUpdateCallback;
37
+ private static readonly _tempProjectionMatrix;
38
+ private static readonly _tempProjectionMatrixInverse;
39
+ private internalUpdate;
40
+ /**
41
+ * Cover fit
42
+ */
43
+ private fit;
44
+ private projectBoxIntoCamera;
45
+ private _projectedBoxElement;
46
+ }
@@ -0,0 +1,270 @@
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
+ var ViewBox_1;
8
+ import { Matrix4, PerspectiveCamera } from "three";
9
+ import { isDevEnvironment } from "../../engine/debug/debug.js";
10
+ import { Gizmos } from "../../engine/engine_gizmos.js";
11
+ import { serializable } from "../../engine/engine_serialization_decorator.js";
12
+ import { getTempVector } from "../../engine/engine_three_utils.js";
13
+ import { registerType } from "../../engine/engine_typestore.js";
14
+ import { getParam } from "../../engine/engine_utils.js";
15
+ import { RGBAColor } from "../../engine/js-extensions/RGBAColor.js";
16
+ import { Behaviour } from "../Component.js";
17
+ const debugParam = getParam("debugviewbox");
18
+ const disabledGizmoColor = new RGBAColor(.5, .5, .5, .5);
19
+ /**
20
+ * This component can be used to automatically fit a certain box area into the camera view - no matter your screen size or aspect ratio.
21
+ *
22
+ * Add the ViewBox to an object into your scene
23
+ *
24
+ * @link [Example on needle.run](https://viewbox-demo-z23hmxbz2gkayo-z1nyzm6.needle.run/)
25
+ * @link [Scrollytelling Demo using animated Viewbox](https://scrollytelling-bike-z23hmxb2gnu5a.needle.run/)
26
+ * @link [Example on Stackblitz](https://stackblitz.com/edit/needle-engine-view-box-example)
27
+ *
28
+ * @example Add a Viewbox component to an object in your scene
29
+ * ```ts
30
+ const viewBox = new Object3D();
31
+ viewBox.scale.set(0, 0, 0);
32
+ viewBox.addComponent(ViewBox, { debug: true });
33
+ scene.add(viewBox);
34
+ * ```
35
+
36
+ * @category Camera
37
+ * @group Components
38
+ * @component
39
+ */
40
+ let ViewBox = ViewBox_1 = class ViewBox extends Behaviour {
41
+ static instances = [];
42
+ /**
43
+ * The reference field of view is used to calculate the box size. This should usually be the same as your camera's fov.
44
+ * @default -1 (meaning it will use the camera fov on the first frame)
45
+ */
46
+ referenceFieldOfView = -1;
47
+ /**
48
+ * Enable debug logs and rendering for this component instance
49
+ */
50
+ debug = false;
51
+ onEnable() {
52
+ if (debugParam || this.debug || isDevEnvironment())
53
+ console.debug("[ViewBox] Using camera fov:", this.referenceFieldOfView);
54
+ // register instance
55
+ ViewBox_1.instances.push(this);
56
+ this.removeUpdateCallback();
57
+ this.context.pre_render_callbacks.push(this.internalUpdate);
58
+ }
59
+ onDisable() {
60
+ if (debugParam || this.debug)
61
+ console.debug("[ViewBox] Disabled");
62
+ // unregister instance
63
+ const idx = ViewBox_1.instances.indexOf(this);
64
+ if (idx !== -1)
65
+ ViewBox_1.instances.splice(idx, 1);
66
+ this._projectedBoxElement?.remove();
67
+ this.removeUpdateCallback();
68
+ }
69
+ removeUpdateCallback() {
70
+ // remove prerender callback
71
+ const cbIdx = this.context.pre_render_callbacks.indexOf(this.internalUpdate);
72
+ if (cbIdx !== -1)
73
+ this.context.pre_render_callbacks.splice(cbIdx, 1);
74
+ }
75
+ static _tempProjectionMatrix = new Matrix4();
76
+ static _tempProjectionMatrixInverse = new Matrix4();
77
+ internalUpdate = () => {
78
+ if (this.context.isInXR)
79
+ return;
80
+ if (this.destroyed || !this.activeAndEnabled)
81
+ return;
82
+ const isActive = ViewBox_1.instances[ViewBox_1.instances.length - 1] === this;
83
+ if (!isActive) {
84
+ if (debugParam || this.debug) {
85
+ Gizmos.DrawWireBox(this.gameObject.worldPosition, this.gameObject.worldScale, disabledGizmoColor);
86
+ }
87
+ return;
88
+ }
89
+ if (debugParam || this.debug)
90
+ Gizmos.DrawWireBox(this.gameObject.worldPosition, this.gameObject.worldScale, 0xdddd00, 0, true, this.gameObject.worldQuaternion);
91
+ // calculate box size to fit the camera frustrum size at the current position (just scale)
92
+ const camera = this.context.mainCamera;
93
+ if (!camera)
94
+ return;
95
+ if (!(camera instanceof PerspectiveCamera)) {
96
+ // TODO: support orthographic camera
97
+ return;
98
+ }
99
+ if (this.referenceFieldOfView === undefined || this.referenceFieldOfView === -1) {
100
+ this.referenceFieldOfView = camera.fov;
101
+ console.debug("[ViewBox] No referenceFieldOfView set, using camera fov:", this.referenceFieldOfView);
102
+ }
103
+ if (this.referenceFieldOfView === undefined || this.referenceFieldOfView <= 0) {
104
+ if (debugParam || this.debug)
105
+ console.warn("[ViewBox] No valid referenceFieldOfView set, cannot adjust box size:", this.referenceFieldOfView);
106
+ return;
107
+ }
108
+ const domWidth = this.context.domWidth;
109
+ const domHeight = this.context.domHeight;
110
+ let rectWidth = domWidth;
111
+ let rectHeight = domHeight;
112
+ let diffWidth = 1;
113
+ let diffHeight = 1;
114
+ // use focus rect if available
115
+ const focusRectSize = this.context.focusRectSize;
116
+ if (focusRectSize) {
117
+ rectWidth = focusRectSize.width;
118
+ rectHeight = focusRectSize.height;
119
+ diffWidth = domWidth / rectWidth;
120
+ diffHeight = domHeight / rectHeight;
121
+ }
122
+ // Copy the projection matrix and restore values so we can reset it later
123
+ ViewBox_1._tempProjectionMatrix.copy(camera.projectionMatrix);
124
+ ViewBox_1._tempProjectionMatrixInverse.copy(camera.projectionMatrixInverse);
125
+ const view = camera.view;
126
+ const zoom = camera.zoom;
127
+ const aspect = camera.aspect;
128
+ const fov = camera.fov;
129
+ // Set values to default so we can calculate the box size correctly
130
+ camera.view = null;
131
+ camera.zoom = 1;
132
+ camera.fov = this.referenceFieldOfView;
133
+ camera.updateProjectionMatrix();
134
+ const boxPosition = this.gameObject.worldPosition;
135
+ const boxScale = this.gameObject.worldScale;
136
+ const cameraPosition = camera.worldPosition;
137
+ const distance = cameraPosition.distanceTo(boxPosition);
138
+ // #region camera fixes
139
+ // If the camera is inside the box, move it out
140
+ const boxSizeMax = Math.max(boxScale.x, boxScale.y, boxScale.z);
141
+ const direction = getTempVector(cameraPosition).sub(boxPosition);
142
+ if (distance < boxSizeMax) {
143
+ // move camera out of bounds
144
+ if (this.debug || debugParam)
145
+ console.warn("[ViewBox] Moving camera out of bounds", distance, "<", boxSizeMax);
146
+ const positionDirection = getTempVector(direction);
147
+ positionDirection.y *= .00000001; // stay on horizontal plane mostly
148
+ positionDirection.normalize();
149
+ const lengthToMove = (boxSizeMax - distance);
150
+ const newPosition = cameraPosition.add(positionDirection.multiplyScalar(lengthToMove));
151
+ camera.worldPosition = newPosition.lerp(cameraPosition, 1 - this.context.time.deltaTime);
152
+ }
153
+ // Ensure the camera looks at the ViewBox
154
+ // TOOD: smooth lookat over multiple frames if we have multiple viewboxes
155
+ // const dot = direction.normalize().dot(camera.worldForward);
156
+ // if (dot < .9) {
157
+ // console.log(dot);
158
+ // const targetRotation = direction;
159
+ // const rotation = getTempQuaternion();
160
+ // rotation.setFromUnitVectors(camera.worldForward.multiplyScalar(-1), targetRotation);
161
+ // camera.worldQuaternion = rotation;
162
+ // camera.updateMatrixWorld();
163
+ // }
164
+ const boxPositionInCameraSpace = getTempVector(boxPosition);
165
+ camera.worldToLocal(boxPositionInCameraSpace);
166
+ camera.lookAt(boxPosition);
167
+ camera.updateMatrixWorld();
168
+ // #region calculate fit
169
+ const vFOV = this.referenceFieldOfView * Math.PI / 180; // convert vertical fov to radians
170
+ const height = 2 * Math.tan(vFOV / 2) * distance; // visible height
171
+ const width = height * camera.aspect; // visible width
172
+ const projectedBox = this.projectBoxIntoCamera(camera, 1);
173
+ // return
174
+ const boxWidth = (projectedBox.maxX - projectedBox.minX);
175
+ const boxHeight = (projectedBox.maxY - projectedBox.minY);
176
+ const scale = this.fit(boxWidth * camera.aspect, boxHeight, width / diffWidth, height / diffHeight);
177
+ // console.log({ scale, width, height, boxWidth: boxWidth * camera.aspect, boxHeight, diffWidth, diffHeight, aspect: camera.aspect, distance })
178
+ // this.context.focusRectSettings.zoom = 1.39;
179
+ // if (!this.context.focusRect) this.context.setCameraFocusRect(this.context.domElement);
180
+ // return
181
+ const vec = getTempVector(boxPosition);
182
+ vec.project(camera);
183
+ this.context.focusRectSettings.offsetX = vec.x;
184
+ this.context.focusRectSettings.offsetY = vec.y;
185
+ this.context.focusRectSettings.zoom = scale / (height * .5);
186
+ // if we don't have a focus rect yet, set it to the dom element
187
+ if (!this.context.focusRect)
188
+ this.context.setCameraFocusRect(this.context.domElement);
189
+ // Reset values
190
+ camera.view = view;
191
+ camera.zoom = zoom;
192
+ camera.aspect = aspect;
193
+ camera.fov = fov;
194
+ camera.projectionMatrix.copy(ViewBox_1._tempProjectionMatrix);
195
+ camera.projectionMatrixInverse.copy(ViewBox_1._tempProjectionMatrixInverse);
196
+ // BACKLOG: some code for box scale of an object (different component)
197
+ // this.gameObject.worldScale = getTempVector(width, height, worldscale.z);
198
+ // this.gameObject.scale.multiplyScalar(.98)
199
+ // const minscale = Math.min(width, height);
200
+ // console.log(width, height);
201
+ // this.gameObject.worldScale = getTempVector(scale, scale, scale);
202
+ };
203
+ /**
204
+ * Cover fit
205
+ */
206
+ fit(width1, height1, width2, height2) {
207
+ const scaleX = width2 / width1;
208
+ const scaleY = height2 / height1;
209
+ return Math.min(scaleX, scaleY);
210
+ }
211
+ projectBoxIntoCamera(camera, _factor) {
212
+ const factor = .5 * _factor;
213
+ const corners = [
214
+ getTempVector(-factor, -factor, -factor),
215
+ getTempVector(factor, -factor, -factor),
216
+ getTempVector(-factor, factor, -factor),
217
+ getTempVector(factor, factor, -factor),
218
+ getTempVector(-factor, -factor, factor),
219
+ getTempVector(factor, -factor, factor),
220
+ getTempVector(-factor, factor, factor),
221
+ getTempVector(factor, factor, factor),
222
+ ];
223
+ let minX = Number.POSITIVE_INFINITY;
224
+ let maxX = Number.NEGATIVE_INFINITY;
225
+ let minY = Number.POSITIVE_INFINITY;
226
+ let maxY = Number.NEGATIVE_INFINITY;
227
+ for (let i = 0; i < corners.length; i++) {
228
+ const c = corners[i];
229
+ c.applyMatrix4(this.gameObject.matrixWorld);
230
+ c.project(camera);
231
+ if (c.x < minX)
232
+ minX = c.x;
233
+ if (c.x > maxX)
234
+ maxX = c.x;
235
+ if (c.y < minY)
236
+ minY = c.y;
237
+ if (c.y > maxY)
238
+ maxY = c.y;
239
+ }
240
+ if (debugParam) {
241
+ if (!this._projectedBoxElement) {
242
+ this._projectedBoxElement = document.createElement("div");
243
+ }
244
+ if (this._projectedBoxElement.parentElement !== this.context.domElement)
245
+ this.context.domElement.appendChild(this._projectedBoxElement);
246
+ this._projectedBoxElement.style.position = "fixed";
247
+ // dotted but with larger gaps
248
+ this._projectedBoxElement.style.outline = "2px dashed rgba(255,0,0,.5)";
249
+ this._projectedBoxElement.style.left = ((minX * .5 + .5) * this.context.domWidth) + "px";
250
+ this._projectedBoxElement.style.top = ((-maxY * .5 + .5) * this.context.domHeight) + "px";
251
+ this._projectedBoxElement.style.width = ((maxX - minX) * .5 * this.context.domWidth) + "px";
252
+ this._projectedBoxElement.style.height = ((maxY - minY) * .5 * this.context.domHeight) + "px";
253
+ this._projectedBoxElement.style.pointerEvents = "none";
254
+ this._projectedBoxElement.style.zIndex = "1000";
255
+ }
256
+ return { minX, maxX, minY, maxY };
257
+ }
258
+ _projectedBoxElement = null;
259
+ };
260
+ __decorate([
261
+ serializable()
262
+ ], ViewBox.prototype, "referenceFieldOfView", void 0);
263
+ __decorate([
264
+ serializable()
265
+ ], ViewBox.prototype, "debug", void 0);
266
+ ViewBox = ViewBox_1 = __decorate([
267
+ registerType
268
+ ], ViewBox);
269
+ export { ViewBox };
270
+ //# sourceMappingURL=ViewBox.js.map