@needle-tools/engine 4.10.0-next.f0ec242 → 4.10.0

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 (124) hide show
  1. package/CHANGELOG.md +7 -3
  2. package/README.md +2 -1
  3. package/components.needle.json +1 -1
  4. package/dist/needle-engine.bundle-BSq-d_16.min.js +1652 -0
  5. package/dist/{needle-engine.bundle-dgNq9Vsa.umd.cjs → needle-engine.bundle-C2kVfQq6.umd.cjs} +153 -140
  6. package/dist/{needle-engine.bundle-BC-0Ex9m.js → needle-engine.bundle-CIuhf7-t.js} +7388 -7113
  7. package/dist/needle-engine.d.ts +15 -15
  8. package/dist/needle-engine.js +259 -257
  9. package/dist/needle-engine.min.js +1 -1
  10. package/dist/needle-engine.umd.cjs +1 -1
  11. package/dist/vendor-CPuBPspY.umd.cjs +1121 -0
  12. package/dist/vendor-DPCU8cUF.min.js +1121 -0
  13. package/dist/vendor-MBoqSyFm.js +16240 -0
  14. package/lib/engine/codegen/register_types.js +2 -0
  15. package/lib/engine/codegen/register_types.js.map +1 -1
  16. package/lib/engine/engine_camera.d.ts +7 -1
  17. package/lib/engine/engine_camera.js +46 -6
  18. package/lib/engine/engine_camera.js.map +1 -1
  19. package/lib/engine/engine_context.d.ts +6 -0
  20. package/lib/engine/engine_context.js +48 -9
  21. package/lib/engine/engine_context.js.map +1 -1
  22. package/lib/engine/engine_gizmos.d.ts +11 -10
  23. package/lib/engine/engine_gizmos.js +24 -10
  24. package/lib/engine/engine_gizmos.js.map +1 -1
  25. package/lib/engine/engine_license.js +1 -1
  26. package/lib/engine/engine_license.js.map +1 -1
  27. package/lib/engine/engine_lightdata.d.ts +3 -3
  28. package/lib/engine/engine_lightdata.js +10 -10
  29. package/lib/engine/engine_lightdata.js.map +1 -1
  30. package/lib/engine/engine_physics_rapier.js +4 -0
  31. package/lib/engine/engine_physics_rapier.js.map +1 -1
  32. package/lib/engine/engine_scenelighting.d.ts +1 -1
  33. package/lib/engine/engine_scenelighting.js +4 -5
  34. package/lib/engine/engine_scenelighting.js.map +1 -1
  35. package/lib/engine/engine_utils.d.ts +3 -1
  36. package/lib/engine/engine_utils.js +11 -0
  37. package/lib/engine/engine_utils.js.map +1 -1
  38. package/lib/engine/extensions/NEEDLE_lightmaps.js +1 -1
  39. package/lib/engine/extensions/NEEDLE_lightmaps.js.map +1 -1
  40. package/lib/engine/extensions/extension_utils.js +1 -1
  41. package/lib/engine/extensions/extension_utils.js.map +1 -1
  42. package/lib/engine/webcomponents/logo-element.d.ts +1 -1
  43. package/lib/engine/webcomponents/logo-element.js +29 -5
  44. package/lib/engine/webcomponents/logo-element.js.map +1 -1
  45. package/lib/engine/webcomponents/needle menu/needle-menu.js +4 -3
  46. package/lib/engine/webcomponents/needle menu/needle-menu.js.map +1 -1
  47. package/lib/engine/webcomponents/needle-engine.js +22 -0
  48. package/lib/engine/webcomponents/needle-engine.js.map +1 -1
  49. package/lib/engine/webcomponents/needle-engine.loading.d.ts +0 -1
  50. package/lib/engine/webcomponents/needle-engine.loading.js +3 -36
  51. package/lib/engine/webcomponents/needle-engine.loading.js.map +1 -1
  52. package/lib/engine/xr/NeedleXRController.d.ts +3 -3
  53. package/lib/engine/xr/NeedleXRController.js +28 -0
  54. package/lib/engine/xr/NeedleXRController.js.map +1 -1
  55. package/lib/engine-components/CameraUtils.js +2 -1
  56. package/lib/engine-components/CameraUtils.js.map +1 -1
  57. package/lib/engine-components/Renderer.js +6 -1
  58. package/lib/engine-components/Renderer.js.map +1 -1
  59. package/lib/engine-components/Skybox.js +22 -4
  60. package/lib/engine-components/Skybox.js.map +1 -1
  61. package/lib/engine-components/codegen/components.d.ts +1 -0
  62. package/lib/engine-components/codegen/components.js +1 -0
  63. package/lib/engine-components/codegen/components.js.map +1 -1
  64. package/lib/engine-components/debug/LogStats.d.ts +1 -0
  65. package/lib/engine-components/debug/LogStats.js +1 -0
  66. package/lib/engine-components/debug/LogStats.js.map +1 -1
  67. package/lib/engine-components/timeline/PlayableDirector.d.ts +7 -0
  68. package/lib/engine-components/timeline/PlayableDirector.js +8 -1
  69. package/lib/engine-components/timeline/PlayableDirector.js.map +1 -1
  70. package/lib/engine-components/timeline/TimelineModels.d.ts +11 -1
  71. package/lib/engine-components/timeline/TimelineTracks.d.ts +2 -1
  72. package/lib/engine-components/timeline/TimelineTracks.js +30 -25
  73. package/lib/engine-components/timeline/TimelineTracks.js.map +1 -1
  74. package/lib/engine-components/utils/LookAt.js +5 -1
  75. package/lib/engine-components/utils/LookAt.js.map +1 -1
  76. package/lib/engine-components/web/Clickthrough.js +10 -2
  77. package/lib/engine-components/web/Clickthrough.js.map +1 -1
  78. package/lib/engine-components/web/ScrollFollow.d.ts +24 -0
  79. package/lib/engine-components/web/ScrollFollow.js +169 -42
  80. package/lib/engine-components/web/ScrollFollow.js.map +1 -1
  81. package/lib/engine-components/web/ViewBox.d.ts +43 -0
  82. package/lib/engine-components/web/ViewBox.js +258 -0
  83. package/lib/engine-components/web/ViewBox.js.map +1 -0
  84. package/lib/engine-components/web/index.d.ts +1 -0
  85. package/lib/engine-components/web/index.js +1 -0
  86. package/lib/engine-components/web/index.js.map +1 -1
  87. package/lib/engine-components-experimental/Presentation.d.ts +1 -0
  88. package/lib/engine-components-experimental/Presentation.js +1 -0
  89. package/lib/engine-components-experimental/Presentation.js.map +1 -1
  90. package/package.json +3 -2
  91. package/src/engine/codegen/register_types.ts +2 -0
  92. package/src/engine/engine_camera.ts +61 -9
  93. package/src/engine/engine_context.ts +50 -10
  94. package/src/engine/engine_gizmos.ts +37 -23
  95. package/src/engine/engine_license.ts +1 -1
  96. package/src/engine/engine_lightdata.ts +11 -11
  97. package/src/engine/engine_physics_rapier.ts +3 -0
  98. package/src/engine/engine_scenelighting.ts +5 -6
  99. package/src/engine/engine_utils.ts +12 -0
  100. package/src/engine/extensions/NEEDLE_lightmaps.ts +1 -1
  101. package/src/engine/extensions/extension_utils.ts +1 -1
  102. package/src/engine/webcomponents/logo-element.ts +29 -4
  103. package/src/engine/webcomponents/needle menu/needle-menu.ts +4 -3
  104. package/src/engine/webcomponents/needle-engine.loading.ts +32 -32
  105. package/src/engine/webcomponents/needle-engine.ts +33 -6
  106. package/src/engine/xr/NeedleXRController.ts +36 -4
  107. package/src/engine-components/CameraUtils.ts +1 -1
  108. package/src/engine-components/Renderer.ts +6 -1
  109. package/src/engine-components/Skybox.ts +26 -7
  110. package/src/engine-components/codegen/components.ts +1 -0
  111. package/src/engine-components/debug/LogStats.ts +1 -0
  112. package/src/engine-components/timeline/PlayableDirector.ts +10 -1
  113. package/src/engine-components/timeline/TimelineModels.ts +11 -1
  114. package/src/engine-components/timeline/TimelineTracks.ts +30 -25
  115. package/src/engine-components/utils/LookAt.ts +5 -1
  116. package/src/engine-components/web/Clickthrough.ts +11 -2
  117. package/src/engine-components/web/ScrollFollow.ts +205 -51
  118. package/src/engine-components/web/ViewBox.ts +278 -0
  119. package/src/engine-components/web/index.ts +2 -1
  120. package/src/engine-components-experimental/Presentation.ts +1 -0
  121. package/dist/needle-engine.bundle-BSh7dSEx.min.js +0 -1639
  122. package/dist/vendor-D0Yvltn9.umd.cjs +0 -1121
  123. package/dist/vendor-DU8tJyl_.js +0 -14366
  124. 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,48 +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
- }
298
- if (overlap > 0) {
299
- weightsArray.push({ time: marker.time, weight: overlap });
300
- sum += overlap;
305
+ const nextMarker = markersArray[i + 1];
306
+ const nextTime = nextMarker
307
+ ? (nextMarker.time - oneFrameTime)
308
+ : duration;
309
+ markerCount += 1;
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
+ }
301
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
+ // }
302
359
  }
303
- if (weightsArray.length <= 0 && markersArray.length <= 0) {
360
+ if (weightsArray.length <= 0 && markerCount <= 0) {
304
361
  director.time = value * duration;
305
362
  }
306
363
  else if (weightsArray.length > 0) {
307
364
  // normalize and calculate weighted time
308
- let time = weightsArray[0].time;
309
- for (const o of weightsArray) {
310
- const weight = o.weight / Math.max(0.00001, sum);
311
- // lerp time based on weight
312
- const diff = Math.abs(o.time - time);
313
- 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(", "));
314
383
  }
315
- director.time = time;
316
384
  }
317
385
  }
318
386
  }
@@ -336,4 +404,63 @@ __decorate([
336
404
  ], ScrollFollow.prototype, "changed", void 0);
337
405
  const weightsArray = [];
338
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
+ }
339
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":";;;;;;AAAA,mCAAmC;AACnC,OAAO,kDAAkD,CAAC;AAE1D,OAAO,EAAQ,QAAQ,EAAE,MAAM,OAAO,CAAC;AAEvC,OAAO,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAC/D,OAAO,EAAE,KAAK,EAAE,MAAM,6BAA6B,CAAC;AACpD,OAAO,EAAE,YAAY,EAAE,MAAM,sCAAsC,CAAC;AACpE,OAAO,EAAE,cAAc,EAAqC,MAAM,oCAAoC,CAAC;AACvG,OAAO,EAAE,QAAQ,EAAE,MAAM,8BAA8B,CAAC;AACxD,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACpC,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAC1D,OAAO,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AAGnE,MAAM,KAAK,GAAG,QAAQ,CAAC,aAAa,CAAC,CAAC;AActC;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,MAAM,OAAO,YAAa,SAAQ,SAAS;IAEvC;;;;;;;;;;;;OAYG;IAEH,MAAM,GAA6B,IAAI,CAAC;IAExC;;;OAGG;IAEH,OAAO,GAAW,CAAC,CAAC;IAEpB;;;OAGG;IAEH,MAAM,GAAY,KAAK,CAAC;IAExB;;;;;OAKG;IAEH,YAAY,GAAkB,IAAI,CAAC;IAG3B,IAAI,GAAa,QAAQ,CAAC;IAElC;;OAEG;IAEH,OAAO,GAAiC,IAAI,SAAS,EAAqB,CAAC;IAE3E;;OAEG;IACH,IAAI,YAAY;QACZ,OAAO,IAAI,CAAC,cAAc,CAAC;IAC/B,CAAC;IAEO,cAAc,GAAW,CAAC,CAAC;IAC3B,aAAa,GAAW,CAAC,CAAC;IAC1B,aAAa,GAAW,CAAC,CAAC,CAAC;IAG3B,YAAY,GAAW,CAAC,CAAC;IACzB,UAAU,GAAW,CAAC,CAAC;IACvB,YAAY,GAAW,CAAC,CAAC;IACzB,sBAAsB,GAAW,CAAC,CAAC;IAE3C,gBAAgB;IAChB,QAAQ;QACJ,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,IAAI,CAAC,wBAAwB,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;QACnF,IAAI,CAAC,aAAa,GAAG,CAAC,CAAC,CAAC;IAC5B,CAAC;IAED,gBAAgB;IAChB,SAAS;QACL,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,IAAI,CAAC,wBAAwB,CAAC,CAAC;IACvE,CAAC;IAED,gBAAgB;IAChB,UAAU;QAEN,IAAI,CAAC,wBAAwB,EAAE,CAAC;QAEhC,IAAI,IAAI,CAAC,aAAa,IAAI,CAAC,EAAE;YACzB,IAAI,IAAI,CAAC,OAAO,GAAG,CAAC,EAAE,EAAE,gBAAgB;gBACpC,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC;gBACtH,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,KAAK,EAAE;oBAC5D,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,aAAa,CAAC;iBAC5C;aACJ;iBACI;gBACD,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,aAAa,CAAC;aAC5C;SACJ;QAED,mDAAmD;QACnD;YACI,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,cAAc,CAAC;YAEzC,IAAI,gBAAgB,GAAG,KAAK,CAAC;YAC7B,IAAI,IAAI,CAAC,OAAO,CAAC,aAAa,GAAG,CAAC,EAAE;gBAChC,oBAAoB;gBACpB,MAAM,KAAK,GAAsB;oBAC7B,IAAI,EAAE,QAAQ;oBACd,KAAK,EAAE,IAAI,CAAC,cAAc;oBAC1B,SAAS,EAAE,IAAI;oBACf,cAAc,EAAE,GAAG,EAAE,GAAG,KAAK,CAAC,gBAAgB,GAAG,IAAI,CAAC,CAAC,CAAC;oBACxD,gBAAgB,EAAE,KAAK;iBAC1B,CAAC;gBACF,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;gBAC3B,gBAAgB,GAAG,KAAK,CAAC,gBAAgB,CAAC;aAC7C;YAED,gCAAgC;YAChC,IAAI,CAAC,gBAAgB,EAAE;gBAEnB,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC;gBAE1E,8DAA8D;gBAC9D,6DAA6D;gBAE7D,4BAA4B;gBAC5B,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE;oBAC5B,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,IAAI,CAAC,WAAW,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC;iBAC7D;qBACI,IAAI,IAAI,CAAC,MAAM,EAAE;oBAClB,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;iBACxC;gBAED,IAAI,KAAK,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,GAAG,EAAE,KAAK,CAAC,EAAE;oBAC7C,OAAO,CAAC,KAAK,CAAC,kBAAkB,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,aAAa,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;iBACnL;aACJ;SACJ;IACL,CAAC;IAEO,kBAAkB,GAAkB,IAAI,CAAC;IACzC,oBAAoB,GAAmB,IAAI,CAAC;IACpD,YAAY;IACJ,gBAAgB,GAAW,CAAC,CAAC;IACrC,eAAe;IACP,cAAc,GAAW,CAAC,CAAC;IAE3B,wBAAwB,GAAG,GAAG,EAAE;QAEpC,QAAQ,IAAI,CAAC,IAAI,EAAE;YACf,KAAK,QAAQ;gBAET,IAAI,IAAI,CAAC,YAAY,EAAE,MAAM,EAAE;oBAC3B,IAAI,IAAI,CAAC,YAAY,KAAK,IAAI,CAAC,kBAAkB,EAAE;wBAC/C,IAAI,CAAC,oBAAoB,GAAG,QAAQ,CAAC,aAAa,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;wBACtE,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,YAAY,CAAC;qBAC/C;oBACD,IAAI,IAAI,CAAC,oBAAoB,EAAE;wBAC3B,MAAM,IAAI,GAAG,IAAI,CAAC,oBAAoB,CAAC,qBAAqB,EAAE,CAAC;wBAE/D,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,GAAG,GAAG,MAAM,CAAC,OAAO,CAAC;wBAC9C,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,WAAW,CAAC;wBACnD,IAAI,CAAC,YAAY,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC;wBAC9B,IAAI,CAAC,aAAa,GAAG,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,WAAW,CAAC,CAAC;wBACpE,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,GAAG,GAAG,MAAM,CAAC,OAAO,CAAC;wBAClD,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,WAAW,CAAC;wBAC/E,IAAI,CAAC,sBAAsB,GAAG,IAAI,CAAC,MAAM,CAAC;wBAC1C,MAAM;qBACT;iBACJ;qBACI;oBACD,IAAI,CAAC,YAAY,GAAG,CAAC,CAAC;oBACtB,IAAI,CAAC,UAAU,GAAG,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,YAAY,GAAG,MAAM,CAAC,WAAW,CAAC;oBACzE,IAAI,CAAC,YAAY,GAAG,MAAM,CAAC,OAAO,CAAC;oBACnC,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,YAAY,GAAG,CAAC,IAAI,CAAC,UAAU,IAAI,CAAC,CAAC,CAAC;oBAChE,IAAI,CAAC,gBAAgB,GAAG,CAAC,CAAC;oBAC1B,IAAI,CAAC,cAAc,GAAG,QAAQ,CAAC,IAAI,CAAC,YAAY,CAAC;oBACjD,IAAI,CAAC,sBAAsB,GAAG,MAAM,CAAC,WAAW,CAAC;iBACpD;gBACD,MAAM;SACb;QAED,IAAI,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,aAAa,CAAC;YAAE,IAAI,CAAC,aAAa,GAAG,CAAC,CAAC,CAAC;IAC5F,CAAC,CAAA;IAGO,WAAW,CAAC,MAAc,EAAE,KAAa;QAE7C,IAAI,CAAC,MAAM;YAAE,OAAO;QAEpB,IAAI,MAAM,YAAY,gBAAgB,EAAE;YACpC,IAAI,CAAC,oBAAoB,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;YACzC,IAAI,MAAM,CAAC,SAAS;gBAAE,MAAM,CAAC,KAAK,EAAE,CAAC;YACrC,MAAM,CAAC,QAAQ,EAAE,CAAC;SACrB;aACI,IAAI,MAAM,YAAY,QAAQ,EAAE;YACjC,MAAM,CAAC,QAAQ,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;SACpC;aACI,IAAI,MAAM,YAAY,SAAS,EAAE;YAClC,MAAM,CAAC,IAAI,GAAG,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC;SACzC;aACI,IAAI,MAAM,YAAY,WAAW,EAAE;YACpC,IAAI,CAAC,MAAM,CAAC,QAAQ;gBAAE,OAAO;YAC7B,MAAM,CAAC,IAAI,GAAG,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC;SACzC;aACI,IAAI,MAAM,YAAY,YAAY,EAAE;YACrC,MAAM,CAAC,UAAU,GAAG,KAAK,CAAC;SAC7B;aACI,IAAI,MAAM,YAAY,KAAK,EAAE;YAC9B,MAAM,CAAC,SAAS,GAAG,KAAK,CAAC;SAC5B;aACI,IAAI,MAAM,YAAY,QAAQ,EAAE;YACjC,gFAAgF;YAChF,IAAI,MAAM,CAAC,qBAAqB,CAAC,KAAK,SAAS,EAAE;gBAC7C,MAAM,CAAC,qBAAqB,CAAC,GAAG,cAAc,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC;aAClE;YACD,MAAM,MAAM,GAAG,MAAM,CAAC,qBAAqB,CAAS,CAAC;YACrD,IAAI,MAAM,EAAE;gBACR,iFAAiF;gBACjF,MAAM,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;aAC7E;SACJ;aACI,IAAI,QAAQ,IAAI,MAAM,EAAE;YACzB,IAAI,OAAO,MAAM,CAAC,MAAM,KAAK,QAAQ,EAAE;gBACnC,MAAM,CAAC,MAAM,GAAG,KAAK,CAAC;aACzB;iBACI,IAAI,OAAO,MAAM,CAAC,MAAM,KAAK,UAAU,EAAE;gBAC1C,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;aACxB;SACJ;IACL,CAAC;IAIO,oBAAoB,CAAC,QAA0B,EAAE,KAAa;QAElE,MAAM,QAAQ,GAAG,QAAQ,CAAC,QAAQ,CAAC;QAGnC,IAAI,iBAAiB,GAAG,QAAQ,CAAC;QACjC,IAAI,eAAe,GAAG,CAAC,CAAC;QACxB,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC;QAExB,mCAAmC;QACnC,IAAI,WAAW,GAAG,CAAC,CAAC;QAEpB,oEAAoE;QACpE,KAAK,MAAM,MAAM,IAAI,QAAQ,CAAC,aAAa,CAAuG,cAAc,CAAC,EAAE;YAE/J,MAAM,KAAK,GAAG,WAAW,EAAE,CAAC;YAE5B,+BAA+B;YAC/B,IAAI,CAAC,MAAM,CAAC,OAAO,KAAK,SAAS,IAAI,MAAM,CAAC,WAAW,KAAK,IAAI,IAAI,qCAAqC,CAAC,CAAC,MAAM,CAAC,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC,EAAE;gBACxJ,MAAM,CAAC,WAAW,GAAG,KAAK,CAAC;gBAC3B,IAAI;oBACA,gNAAgN;oBAChN,MAAM,CAAC,OAAO,GAAG,yBAAyB,CAAC,KAAK,EAAE,MAAM,CAAC,IAAI,CAAuB,CAAC;oBACrF,IAAI,KAAK;wBAAE,OAAO,CAAC,KAAK,CAAC,iBAAiB,KAAK,KAAK,MAAM,CAAC,IAAI,MAAM,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;oBACtH,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE;wBACjB,MAAM,CAAC,QAAQ,GAAG,SAAS,CAAC;wBAC5B,IAAI,KAAK,IAAI,gBAAgB,EAAE;4BAAE,OAAO,CAAC,IAAI,CAAC,2CAA2C,MAAM,CAAC,IAAI,WAAW,KAAK,GAAG,CAAC,CAAC;wBACzH,SAAS;qBACZ;yBACI;wBACD,iBAAiB;wBACjB,MAAM,CAAC,QAAQ,GAAG,IAAI,YAAY,CAAC;4BAC/B,OAAO,EAAE,MAAM,CAAC,OAAO;4BACvB,IAAI,EAAE,OAAO,EAAE,8DAA8D;yBAChF,CAAC,CAAC;qBACN;iBACJ;gBACD,OAAO,KAAK,EAAE;oBACV,MAAM,CAAC,OAAO,GAAG,IAAI,CAAC;oBACtB,OAAO,CAAC,KAAK,CAAC,sCAAsC,GAAG,MAAM,CAAC,IAAI,GAAG,IAAI,EAAE,KAAK,CAAC,CAAC;iBACrF;aACJ;YAED,gFAAgF;YAChF,IAAI,CAAC,MAAM,CAAC,OAAO;gBAAE,SAAS;YAE9B,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAE1B,MAAM,GAAG,GAAG,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC;YACrC,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC;YAC3C,MAAM,MAAM,GAAG,GAAG,GAAG,MAAM,CAAC;YAC5B,IAAI,GAAG,GAAG,iBAAiB,EAAE;gBACzB,iBAAiB,GAAG,GAAG,CAAC;aAC3B;YACD,IAAI,MAAM,GAAG,eAAe,EAAE;gBAC1B,eAAe,GAAG,MAAM,CAAC;aAC5B;SACJ;QAID,MAAM,UAAU,GAAG,IAAI,CAAC,YAAY,CAAC;QACrC,MAAM,aAAa,GAAG,UAAU,GAAG,IAAI,CAAC,sBAAsB,CAAC;QAE/D,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC;QACxB,IAAI,GAAG,GAAG,CAAC,CAAC;QACZ,MAAM,YAAY,GAAG,CAAC,GAAG,EAAE,CAAC;QAE5B,qLAAqL;QACrL,IAAI,WAAW,GAAG,CAAC,CAAC;QACpB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,YAAY,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;YAC1C,MAAM,MAAM,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC;YAC/B,IAAI,CAAC,MAAM,CAAC,OAAO;gBAAE,SAAS;YAC9B,MAAM,UAAU,GAAG,YAAY,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YAEvC,MAAM,QAAQ,GAAG,UAAU;gBACvB,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,GAAG,YAAY,CAAC;gBAClC,CAAC,CAAC,QAAQ,CAAC;YAEf,WAAW,IAAI,CAAC,CAAC;YAEjB,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;YACjC,IAAI,QAAQ,EAAE;gBACV,MAAM,MAAM,GAAG,mCAAmC,CAAC,QAAQ,CAAC,CAAC;gBAC7D,iDAAiD;gBACjD,MAAM,MAAM,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC;gBAC9C,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,IAAI,SAAS,CAAC,EAAE,CAAC;gBACzC,IAAI,MAAM,GAAG,CAAC,IAAI,MAAM,IAAI,CAAC,EAAE;oBAC3B,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,GAAG,CAAC,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC;oBACjE,YAAY,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;oBAC5D,GAAG,IAAI,MAAM,CAAC;iBACjB;gBACD,qCAAqC;qBAChC,IAAI,CAAC,KAAK,CAAC,IAAI,MAAM,IAAI,CAAC,EAAE;oBAC7B,YAAY,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC;oBAChD,GAAG,IAAI,CAAC,CAAC;iBACZ;gBACD,mCAAmC;qBAC9B,IAAI,CAAC,KAAK,YAAY,CAAC,MAAM,GAAG,CAAC,IAAI,MAAM,IAAI,CAAC,EAAE;oBACnD,YAAY,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC;oBACvD,GAAG,IAAI,CAAC,CAAC;iBACZ;aACJ;YACD,SAAS;YACT,2IAA2I;YAE3I,sEAAsE;YACtE,4EAA4E;YAC5E,+BAA+B;YAC/B,mBAAmB;YAEnB,6MAA6M;YAE7M,6BAA6B;YAC7B,uCAAuC;YACvC,mBAAmB;YACnB,IAAI;YACJ,kCAAkC;YAClC,uCAAuC;YACvC,mBAAmB;YACnB,IAAI;YACJ,SAAS;YACT,qCAAqC;YACrC,oDAAoD;YACpD,6DAA6D;YAC7D,8DAA8D;YAC9D,yDAAyD;YACzD,IAAI;YAEJ,iEAAiE;YAEjE,qBAAqB;YACrB,iEAAiE;YACjE,sBAAsB;YACtB,IAAI;SACP;QAED,IAAI,YAAY,CAAC,MAAM,IAAI,CAAC,IAAI,WAAW,IAAI,CAAC,EAAE;YAC9C,QAAQ,CAAC,IAAI,GAAG,KAAK,GAAG,QAAQ,CAAC;SACpC;aACI,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE;YAC9B,wCAAwC;YACxC,IAAI,IAAI,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,yBAAyB;YAC1D,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE;gBACzB,KAAK,MAAM,KAAK,IAAI,YAAY,EAAE;oBAC9B,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;oBACrD,iCAAiC;oBACjC,4BAA4B;oBAC5B,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC;oBACzC,IAAI,IAAI,IAAI,GAAG,MAAM,CAAC;iBACzB;aACJ;YACD,IAAI,IAAI,CAAC,OAAO,IAAI,CAAC,EAAE;gBACnB,QAAQ,CAAC,IAAI,GAAG,IAAI,CAAC;aACxB;iBACI;gBACD,QAAQ,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC;aAC/F;YAED,IAAI,KAAK,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,GAAG,EAAE,KAAK,CAAC,EAAE;gBAC7C,OAAO,CAAC,GAAG,CAAC,4BAA4B,QAAQ,CAAC,IAAI,KAAK,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;aACjK;SACJ;IACL,CAAC;CAEJ;AA3XG;IADC,YAAY,CAAC,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;4CACI;AAOxC;IADC,YAAY,EAAE;6CACK;AAOpB;IADC,YAAY,EAAE;4CACS;AASxB;IADC,YAAY,EAAE;kDACoB;AAGnC;IADC,YAAY,EAAE;0CACmB;AAMlC;IADC,YAAY,CAAC,SAAS,CAAC;6CACmD;AA+V/E,MAAM,YAAY,GAAkB,EAAE,CAAC;AACvC,MAAM,YAAY,GAGb,EAAE,CAAC;AAWR,yBAAyB;AACzB,sDAAsD;AACtD,wBAAwB;AACxB,kCAAkC;AAClC,gCAAgC;AAChC,IAAI;AACJ,yDAAyD;AAEzD,MAAM,4BAA4B,GAAG,IAAI,GAAG,EAA0B,CAAC;AACvE,MAAM,2BAA2B,GAAG,IAAI,GAAG,EAA0B,CAAC;AACtE,IAAI,wBAAwB,GAAG,IAAI,CAAC;AAEpC,SAAS,yBAAyB,CAAC,KAAa,EAAE,IAAY,EAAE,SAAiB,CAAC;IAE9E,IAAI,CAAC,wBAAwB,EAAE;QAC3B,IAAI,IAAI,EAAE,MAAM,EAAE;YACd,MAAM,OAAO,GAAG,2BAA2B,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC;YAC9D,IAAI,OAAO;gBAAE,OAAO,OAAO,CAAC;YAC5B,yCAAyC;YACzC,mBAAmB;YACnB,IAAI;SACP;QACD,MAAM,OAAO,GAAG,4BAA4B,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC;QAChE,MAAM,KAAK,GAAG,OAAO,EAAE,YAAY,CAAC,sBAAsB,CAAC,CAAC;QAC5D,uBAAuB;QACvB,yBAAyB;QACzB,sIAAsI;QACtI,6DAA6D;QAC7D,QAAQ;QACR,8GAA8G;QAC9G,IAAI;QACJ,OAAO,OAAO,CAAC;KAClB;IACD,wBAAwB,GAAG,KAAK,CAAC;IACjC,4BAA4B,CAAC,KAAK,EAAE,CAAC;IACrC,MAAM,OAAO,GAAG,QAAQ,CAAC,gBAAgB,CAAC,wBAAwB,CAAC,CAAC;IACpE,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QACrB,4BAA4B,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACvC,MAAM,IAAI,GAAG,CAAC,CAAC,YAAY,CAAC,sBAAsB,CAAC,CAAC;QACpD,IAAI,IAAI,EAAE,MAAM;YAAE,2BAA2B,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IAC/D,CAAC,CAAC,CAAC;IACH,wBAAwB,GAAG,KAAK,CAAC;IACjC,OAAO,yBAAyB,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;AAClD,CAAC;AAGD,yBAAyB;AAEzB,SAAS,mCAAmC,CAAC,QAAsB;IAC/D,IAAI,CAAC,QAAQ,CAAC,MAAM;QAAE,OAAO,CAAC,CAAC;IAC/B,MAAM,WAAW,GAAG,QAAQ,CAAC,WAAW,CAAC;IACzC,MAAM,QAAQ,GAAG,QAAQ,CAAC,QAAQ,CAAC;IACnC,IAAI,aAAa,GAAG,CAAC,CAAC;IACtB,IAAI,QAAQ,CAAC,IAAI,KAAK,SAAS,EAAE;QAC7B,aAAa,GAAG,QAAQ,CAAC,KAAK,CAAC;KAClC;SACI,IAAI,QAAQ,CAAC,IAAI,KAAK,SAAS,EAAE;QAClC,aAAa,GAAG,QAAQ,CAAC,KAAK,CAAC;KAClC;IACD,MAAM,GAAG,GAAG,WAAW,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,KAAK,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,KAAK,GAAG,GAAG,CAAC,CAAC;IAC7G,OAAO,GAAG,CAAC;AACf,CAAC"}
@@ -0,0 +1,43 @@
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
+ * @category Web
19
+ * @group Components
20
+ * @component
21
+ * ```
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 undefined (meaning it will use the camera fov on the first frame)
28
+ */
29
+ referenceFieldOfView: number | undefined;
30
+ /**
31
+ * Enable debug logs and rendering for this component instance
32
+ */
33
+ debug: boolean;
34
+ onEnable(): void;
35
+ onDisable(): void;
36
+ onBeforeRender(): void;
37
+ /**
38
+ * Cover fit
39
+ */
40
+ private fit;
41
+ private projectBoxIntoCamera;
42
+ private _projectedBoxElement;
43
+ }
@@ -0,0 +1,258 @@
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 { 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
+ * @category Web
36
+ * @group Components
37
+ * @component
38
+ * ```
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 undefined (meaning it will use the camera fov on the first frame)
45
+ */
46
+ referenceFieldOfView = undefined;
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
+ }
57
+ onDisable() {
58
+ if (debugParam || this.debug)
59
+ console.debug("[ViewBox] Disabled");
60
+ // unregister instance
61
+ const idx = ViewBox_1.instances.indexOf(this);
62
+ if (idx !== -1)
63
+ ViewBox_1.instances.splice(idx, 1);
64
+ this._projectedBoxElement?.remove();
65
+ }
66
+ onBeforeRender() {
67
+ if (this.context.isInXR)
68
+ return;
69
+ if (this.destroyed)
70
+ return;
71
+ const isActive = ViewBox_1.instances[ViewBox_1.instances.length - 1] === this;
72
+ if (!isActive) {
73
+ if (debugParam || this.debug) {
74
+ Gizmos.DrawWireBox(this.gameObject.worldPosition, this.gameObject.worldScale, disabledGizmoColor);
75
+ }
76
+ return;
77
+ }
78
+ if (debugParam || this.debug)
79
+ Gizmos.DrawWireBox(this.gameObject.worldPosition, this.gameObject.worldScale, 0xdddd00, 0, true, this.gameObject.worldQuaternion);
80
+ // calculate box size to fit the camera frustrum size at the current position (just scale)
81
+ const camera = this.context.mainCamera;
82
+ if (!camera)
83
+ return;
84
+ if (!(camera instanceof PerspectiveCamera)) {
85
+ // TODO: support orthographic camera
86
+ return;
87
+ }
88
+ if (this.referenceFieldOfView === undefined) {
89
+ this.referenceFieldOfView = camera.fov;
90
+ }
91
+ if (this.referenceFieldOfView === undefined || this.referenceFieldOfView <= 0) {
92
+ if (debugParam || this.debug)
93
+ console.warn("[ViewBox] No valid referenceFieldOfView set, cannot adjust box size:", this.referenceFieldOfView);
94
+ return;
95
+ }
96
+ const domWidth = this.context.domWidth;
97
+ const domHeight = this.context.domHeight;
98
+ let rectPosX = 0;
99
+ let rectPosY = 0;
100
+ let rectWidth = domWidth;
101
+ let rectHeight = domHeight;
102
+ let diffWidth = 1;
103
+ let diffHeight = 1;
104
+ // use focus rect if available
105
+ const focusRectSize = this.context.focusRectSize;
106
+ if (focusRectSize) {
107
+ // console.log(focusRectSize)
108
+ rectPosX = focusRectSize.x;
109
+ rectPosY = focusRectSize.y;
110
+ rectWidth = focusRectSize.width;
111
+ rectHeight = focusRectSize.height;
112
+ diffWidth = domWidth / rectWidth;
113
+ diffHeight = domHeight / rectHeight;
114
+ }
115
+ const view = camera.view;
116
+ const zoom = camera.zoom;
117
+ const aspect = camera.aspect;
118
+ const fov = camera.fov;
119
+ camera.view = null;
120
+ camera.zoom = 1;
121
+ camera.fov = this.referenceFieldOfView;
122
+ camera.updateProjectionMatrix();
123
+ const boxPosition = this.gameObject.worldPosition;
124
+ const boxScale = this.gameObject.worldScale;
125
+ const cameraPosition = camera.worldPosition;
126
+ const distance = cameraPosition.distanceTo(boxPosition);
127
+ // #region camera fixes
128
+ // If the camera is inside the box, move it out
129
+ const boxSizeMax = Math.max(boxScale.x, boxScale.y, boxScale.z);
130
+ const direction = getTempVector(cameraPosition).sub(boxPosition);
131
+ if (distance < boxSizeMax) {
132
+ // move camera out of bounds
133
+ if (this.debug || debugParam)
134
+ console.warn("[ViewBox] Moving camera out of bounds", distance, "<", boxSizeMax);
135
+ const positionDirection = getTempVector(direction);
136
+ positionDirection.y *= .00000001; // stay on horizontal plane mostly
137
+ positionDirection.normalize();
138
+ const lengthToMove = (boxSizeMax - distance);
139
+ const newPosition = cameraPosition.add(positionDirection.multiplyScalar(lengthToMove));
140
+ camera.worldPosition = newPosition.lerp(cameraPosition, 1 - this.context.time.deltaTime);
141
+ }
142
+ // Ensure the camera looks at the ViewBox
143
+ // TOOD: smooth lookat over multiple frames if we have multiple viewboxes
144
+ // const dot = direction.normalize().dot(camera.worldForward);
145
+ // if (dot < .9) {
146
+ // console.log(dot);
147
+ // const targetRotation = direction;
148
+ // const rotation = getTempQuaternion();
149
+ // rotation.setFromUnitVectors(camera.worldForward.multiplyScalar(-1), targetRotation);
150
+ // camera.worldQuaternion = rotation;
151
+ // camera.updateMatrixWorld();
152
+ // }
153
+ const boxPositionInCameraSpace = getTempVector(boxPosition);
154
+ camera.worldToLocal(boxPositionInCameraSpace);
155
+ camera.lookAt(boxPosition);
156
+ camera.updateMatrixWorld();
157
+ // #region calculate fit
158
+ const vFOV = this.referenceFieldOfView * Math.PI / 180; // convert vertical fov to radians
159
+ const height = 2 * Math.tan(vFOV / 2) * distance; // visible height
160
+ const width = height * camera.aspect; // visible width
161
+ const projectedBox = this.projectBoxIntoCamera(camera, 1);
162
+ // return
163
+ const boxWidth = (projectedBox.maxX - projectedBox.minX);
164
+ const boxHeight = (projectedBox.maxY - projectedBox.minY);
165
+ const scale = this.fit(boxWidth * camera.aspect, boxHeight, width / diffWidth, height / diffHeight);
166
+ // console.log({ scale, width, height, boxWidth: boxWidth * camera.aspect, boxHeight, diffWidth, diffHeight, aspect: camera.aspect, distance })
167
+ // this.context.focusRectSettings.zoom = 1.39;
168
+ // if (!this.context.focusRect) this.context.setCameraFocusRect(this.context.domElement);
169
+ // return
170
+ const vec = getTempVector(boxPosition);
171
+ vec.project(camera);
172
+ this.context.focusRectSettings.offsetX = vec.x;
173
+ this.context.focusRectSettings.offsetY = vec.y;
174
+ this.context.focusRectSettings.zoom = scale / (height * .5);
175
+ // if we don't have a focus rect yet, set it to the dom element
176
+ if (!this.context.focusRect)
177
+ this.context.setCameraFocusRect(this.context.domElement);
178
+ // Reset values
179
+ camera.view = view;
180
+ camera.zoom = zoom;
181
+ camera.aspect = aspect;
182
+ camera.fov = fov;
183
+ // camera.updateProjectionMatrix();
184
+ // BACKLOG: some code for box scale of an object (different component)
185
+ // this.gameObject.worldScale = getTempVector(width, height, worldscale.z);
186
+ // this.gameObject.scale.multiplyScalar(.98)
187
+ // const minscale = Math.min(width, height);
188
+ // console.log(width, height);
189
+ // this.gameObject.worldScale = getTempVector(scale, scale, scale);
190
+ }
191
+ /**
192
+ * Cover fit
193
+ */
194
+ fit(width1, height1, width2, height2) {
195
+ const scaleX = width2 / width1;
196
+ const scaleY = height2 / height1;
197
+ return Math.min(scaleX, scaleY);
198
+ }
199
+ projectBoxIntoCamera(camera, _factor) {
200
+ const factor = .5 * _factor;
201
+ const corners = [
202
+ getTempVector(-factor, -factor, -factor),
203
+ getTempVector(factor, -factor, -factor),
204
+ getTempVector(-factor, factor, -factor),
205
+ getTempVector(factor, factor, -factor),
206
+ getTempVector(-factor, -factor, factor),
207
+ getTempVector(factor, -factor, factor),
208
+ getTempVector(-factor, factor, factor),
209
+ getTempVector(factor, factor, factor),
210
+ ];
211
+ let minX = Number.POSITIVE_INFINITY;
212
+ let maxX = Number.NEGATIVE_INFINITY;
213
+ let minY = Number.POSITIVE_INFINITY;
214
+ let maxY = Number.NEGATIVE_INFINITY;
215
+ for (let i = 0; i < corners.length; i++) {
216
+ const c = corners[i];
217
+ c.applyMatrix4(this.gameObject.matrixWorld);
218
+ c.project(camera);
219
+ if (c.x < minX)
220
+ minX = c.x;
221
+ if (c.x > maxX)
222
+ maxX = c.x;
223
+ if (c.y < minY)
224
+ minY = c.y;
225
+ if (c.y > maxY)
226
+ maxY = c.y;
227
+ }
228
+ if (debugParam) {
229
+ if (!this._projectedBoxElement) {
230
+ this._projectedBoxElement = document.createElement("div");
231
+ }
232
+ if (this._projectedBoxElement.parentElement !== this.context.domElement)
233
+ this.context.domElement.appendChild(this._projectedBoxElement);
234
+ this._projectedBoxElement.style.position = "fixed";
235
+ // dotted but with larger gaps
236
+ this._projectedBoxElement.style.outline = "2px dashed rgba(255,0,0,.5)";
237
+ this._projectedBoxElement.style.left = ((minX * .5 + .5) * this.context.domWidth) + "px";
238
+ this._projectedBoxElement.style.top = ((-maxY * .5 + .5) * this.context.domHeight) + "px";
239
+ this._projectedBoxElement.style.width = ((maxX - minX) * .5 * this.context.domWidth) + "px";
240
+ this._projectedBoxElement.style.height = ((maxY - minY) * .5 * this.context.domHeight) + "px";
241
+ this._projectedBoxElement.style.pointerEvents = "none";
242
+ this._projectedBoxElement.style.zIndex = "1000";
243
+ }
244
+ return { minX, maxX, minY, maxY };
245
+ }
246
+ _projectedBoxElement = null;
247
+ };
248
+ __decorate([
249
+ serializable()
250
+ ], ViewBox.prototype, "referenceFieldOfView", void 0);
251
+ __decorate([
252
+ serializable()
253
+ ], ViewBox.prototype, "debug", void 0);
254
+ ViewBox = ViewBox_1 = __decorate([
255
+ registerType
256
+ ], ViewBox);
257
+ export { ViewBox };
258
+ //# sourceMappingURL=ViewBox.js.map