@terraware/web-components 5.0.26 → 5.0.27-rc.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 (295) hide show
  1. package/components/AntSwitch/index.js +19 -22
  2. package/components/Autocomplete/Autocomplete.js +106 -130
  3. package/components/Badge/index.js +28 -29
  4. package/components/BusySpinner/index.js +40 -45
  5. package/components/Button/Button.js +41 -47
  6. package/components/Checkbox.js +64 -63
  7. package/components/Confirm/index.js +74 -83
  8. package/components/DatePicker/DatePicker.js +138 -141
  9. package/components/DialogBox/DialogBox.js +111 -118
  10. package/components/Divisor.js +18 -18
  11. package/components/Dropdown.js +66 -94
  12. package/components/EditableTable/index.js +211 -271
  13. package/components/ErrorBox/ErrorBox.js +47 -49
  14. package/components/FileChooser/index.js +117 -135
  15. package/components/FormBottomBar/index.js +75 -84
  16. package/components/Icon/Icon.js +12 -20
  17. package/components/Icon/icons/index.js +256 -256
  18. package/components/IconTooltip/index.js +49 -60
  19. package/components/Map/MapBox.js +545 -452
  20. package/components/Map/MapContainer.js +25 -29
  21. package/components/Map/MapDateSliderControl.js +64 -64
  22. package/components/Map/MapDrawer.js +41 -47
  23. package/components/Map/MapLegend.js +176 -172
  24. package/components/Map/MapViewStyleControl.js +59 -63
  25. package/components/Map/ReactMapboxWrapper.js +3 -2
  26. package/components/Map/index.js +161 -180
  27. package/components/Map/types.js +12 -17
  28. package/components/Map/useMaintainLayerOrder.js +16 -26
  29. package/components/Markdown/index.js +25 -26
  30. package/components/Message/Message.js +73 -76
  31. package/components/MultiSelect/index.js +112 -124
  32. package/components/Navbar/NavFooter.js +9 -13
  33. package/components/Navbar/NavItem.js +70 -76
  34. package/components/Navbar/NavSection.js +17 -19
  35. package/components/Navbar/Navbar.js +39 -46
  36. package/components/Navbar/SubNavbar.js +9 -13
  37. package/components/Note.js +18 -22
  38. package/components/OverlayModal/OverlayModal.js +56 -63
  39. package/components/PageForm/index.js +33 -41
  40. package/components/PhotoChooser/index.js +165 -173
  41. package/components/PhotosCarousel/PhotoSlide.js +32 -35
  42. package/components/PhotosCarousel/index.js +80 -85
  43. package/components/PhotosCarousel/usePhotosCarousel.js +69 -76
  44. package/components/Pill/index.js +41 -45
  45. package/components/PillList/index.js +17 -24
  46. package/components/PlacementWrapper/index.js +38 -59
  47. package/components/PopoverMenu/Popover.js +68 -85
  48. package/components/PopoverMenu/index.js +51 -56
  49. package/components/PopoverMultiSelect/index.js +52 -59
  50. package/components/ProgressCircle/ProgressCircle.js +28 -32
  51. package/components/RadioButton.js +17 -19
  52. package/components/Select/Select.js +13 -15
  53. package/components/Select/SelectT.js +235 -250
  54. package/components/Separator/index.js +14 -17
  55. package/components/Size.js +0 -1
  56. package/components/Slider/index.js +43 -56
  57. package/components/SummaryBox.js +70 -72
  58. package/components/Tabs/index.js +133 -135
  59. package/components/TextTruncated/index.js +117 -130
  60. package/components/Textfield/Textfield.js +158 -190
  61. package/components/Textfield/TruncatedTextArea.js +70 -84
  62. package/components/TimelineSlider/TimelineMarker.js +25 -30
  63. package/components/TimelineSlider/TimelineRail.js +8 -11
  64. package/components/TimelineSlider/index.js +64 -66
  65. package/components/TimelineSliderV2/ClusterBadge.js +25 -29
  66. package/components/TimelineSliderV2/TimelineDot.js +31 -35
  67. package/components/TimelineSliderV2/TimelineRail.js +8 -11
  68. package/components/TimelineSliderV2/index.js +121 -103
  69. package/components/TimelineSliderV2/layout.js +124 -147
  70. package/components/TimelineSliderV2/types.js +0 -1
  71. package/components/Tooltip/Tooltip.js +47 -56
  72. package/components/ViewPhotosDialog/index.js +28 -35
  73. package/components/VirtualWalkthrough/Annotation.js +163 -207
  74. package/components/VirtualWalkthrough/AnnotationEditPane.js +198 -184
  75. package/components/VirtualWalkthrough/AnnotationPanel.js +187 -199
  76. package/components/VirtualWalkthrough/Application.js +31 -34
  77. package/components/VirtualWalkthrough/AutoRotator.js +85 -223
  78. package/components/VirtualWalkthrough/BlockingSpinner.js +26 -28
  79. package/components/VirtualWalkthrough/BoundaryRing.js +30 -34
  80. package/components/VirtualWalkthrough/BoundaryWall.js +32 -36
  81. package/components/VirtualWalkthrough/CameraInfo.js +100 -89
  82. package/components/VirtualWalkthrough/ControlsInfoPane.js +254 -195
  83. package/components/VirtualWalkthrough/GradientSky.js +72 -73
  84. package/components/VirtualWalkthrough/SplatControls.js +209 -221
  85. package/components/VirtualWalkthrough/SplatCrop.js +21 -20
  86. package/components/VirtualWalkthrough/SplatFadeCrop.js +21 -20
  87. package/components/VirtualWalkthrough/SplatModel.js +65 -85
  88. package/components/VirtualWalkthrough/SplatRevealRain.js +41 -46
  89. package/components/VirtualWalkthrough/TfAnnotationManager.js +197 -379
  90. package/components/VirtualWalkthrough/TfXrNavigation.js +73 -162
  91. package/components/VirtualWalkthrough/VirtualWalkthroughViewer.js +438 -431
  92. package/components/VirtualWalkthrough/VrAnnotationPanel.js +18 -22
  93. package/components/VirtualWalkthrough/XrAnnotationInteraction.js +14 -17
  94. package/components/VirtualWalkthrough/XrExitButton.js +14 -17
  95. package/components/VirtualWalkthrough/XrGazeDwell.js +14 -17
  96. package/components/VirtualWalkthrough/XrPointerRay.js +14 -17
  97. package/components/VirtualWalkthrough/XrStartPose.js +67 -121
  98. package/components/VirtualWalkthrough/boundary-ring.js +87 -117
  99. package/components/VirtualWalkthrough/boundary-wall.js +175 -258
  100. package/components/VirtualWalkthrough/camera-adoption.js +18 -64
  101. package/components/VirtualWalkthrough/groundPlane.js +32 -47
  102. package/components/VirtualWalkthrough/gsplat-fade-crop-effect.js +35 -35
  103. package/components/VirtualWalkthrough/splatFormat.js +13 -47
  104. package/components/VirtualWalkthrough/useAdoptedCamera.js +23 -44
  105. package/components/VirtualWalkthrough/useRestartOnVr.js +26 -37
  106. package/components/VirtualWalkthrough/useXrRenderTuning.js +33 -54
  107. package/components/VirtualWalkthrough/vr-annotation-panel-layout.js +67 -99
  108. package/components/VirtualWalkthrough/vr-annotation-panel.js +403 -433
  109. package/components/VirtualWalkthrough/vr-annotation-scroll.js +10 -28
  110. package/components/VirtualWalkthrough/walkthrough-camera.js +204 -329
  111. package/components/VirtualWalkthrough/xr-annotation-candidate-buffer.js +39 -80
  112. package/components/VirtualWalkthrough/xr-annotation-candidates.js +6 -18
  113. package/components/VirtualWalkthrough/xr-annotation-interaction.js +31 -56
  114. package/components/VirtualWalkthrough/xr-annotation-targeting.js +22 -38
  115. package/components/VirtualWalkthrough/xr-button-arming.js +7 -17
  116. package/components/VirtualWalkthrough/xr-button-hold.js +22 -36
  117. package/components/VirtualWalkthrough/xr-exit-button-mask.js +22 -36
  118. package/components/VirtualWalkthrough/xr-exit-button.js +148 -207
  119. package/components/VirtualWalkthrough/xr-face-buttons.js +19 -29
  120. package/components/VirtualWalkthrough/xr-gaze-dwell-state.js +23 -34
  121. package/components/VirtualWalkthrough/xr-gaze-dwell.js +107 -144
  122. package/components/VirtualWalkthrough/xr-interactive-ui.js +12 -24
  123. package/components/VirtualWalkthrough/xr-pointer-ray.js +13 -20
  124. package/components/VirtualWalkthrough/xr-progress-pie-material.js +117 -88
  125. package/components/VirtualWalkthrough/xr-progress-pie.js +1 -10
  126. package/components/VirtualWalkthrough/xr-ray-quad.js +16 -30
  127. package/components/VirtualWalkthrough/xr-render-tuning.js +17 -48
  128. package/components/VirtualWalkthrough/xr-scene-bounds.js +21 -37
  129. package/components/VirtualWalkthrough/xr-start-pose.js +27 -73
  130. package/components/VirtualWalkthrough/xr-teleport-gesture.js +16 -42
  131. package/components/svg/BlobbyGrayIconImage.js +41 -39
  132. package/components/svg/BlobbyGrayIconImport.js +41 -39
  133. package/components/svg/BlobbyGrayIconUploadToTheCloud.js +41 -39
  134. package/components/svg/BlobbyIconCloudChecked.js +202 -164
  135. package/components/svg/BlobbyIconExportOrUploadPhoto.js +202 -164
  136. package/components/svg/BlobbyIconFolder.js +202 -164
  137. package/components/svg/BlobbyIconGraphReport.js +202 -164
  138. package/components/svg/BlobbyIconHappy.js +202 -164
  139. package/components/svg/BlobbyIconHeartMonitor.js +202 -164
  140. package/components/svg/BlobbyIconLeaf.js +202 -164
  141. package/components/svg/BlobbyIconLibrary.js +202 -164
  142. package/components/svg/BlobbyIconNursery.js +204 -166
  143. package/components/svg/BlobbyIconOrganization.js +202 -164
  144. package/components/svg/BlobbyIconParchment.js +202 -164
  145. package/components/svg/BlobbyIconPeople.js +202 -164
  146. package/components/svg/BlobbyIconSeedBank.js +202 -164
  147. package/components/svg/BlobbyIconSeedling.js +202 -164
  148. package/components/svg/BlobbyIconSeeds.js +202 -164
  149. package/components/svg/BlobbyIconSite.js +206 -167
  150. package/components/svg/BlobbyIconSparkles.js +202 -164
  151. package/components/svg/BlobbyIconWrench.js +202 -164
  152. package/components/svg/Bug.js +19 -21
  153. package/components/svg/Calendar.js +19 -21
  154. package/components/svg/CaretDown.js +19 -21
  155. package/components/svg/CaretLeft.js +19 -21
  156. package/components/svg/CaretRight.js +19 -21
  157. package/components/svg/CaretUp.js +19 -21
  158. package/components/svg/ChevronDown.js +19 -21
  159. package/components/svg/ChevronUp.js +19 -21
  160. package/components/svg/Close.js +19 -21
  161. package/components/svg/Critical.js +19 -21
  162. package/components/svg/Edit.js +202 -164
  163. package/components/svg/Error.js +19 -21
  164. package/components/svg/Filter.js +19 -21
  165. package/components/svg/Folder.js +19 -21
  166. package/components/svg/Help.js +19 -21
  167. package/components/svg/Home.js +19 -21
  168. package/components/svg/IconAdd.js +19 -21
  169. package/components/svg/IconArrowRight.js +21 -23
  170. package/components/svg/IconBusinessNetwork.js +19 -21
  171. package/components/svg/IconCalendar.js +19 -21
  172. package/components/svg/IconCancel.js +19 -21
  173. package/components/svg/IconChargingBattery.js +19 -21
  174. package/components/svg/IconChecklist.js +21 -23
  175. package/components/svg/IconCheckmark.js +19 -21
  176. package/components/svg/IconCoinInHand.js +19 -21
  177. package/components/svg/IconColumns.js +19 -21
  178. package/components/svg/IconComment.js +20 -22
  179. package/components/svg/IconDashboard.js +19 -21
  180. package/components/svg/IconDataMigration.js +19 -21
  181. package/components/svg/IconDocument.js +21 -23
  182. package/components/svg/IconDownloadFromTheCloud.js +21 -23
  183. package/components/svg/IconEdit.js +21 -23
  184. package/components/svg/IconExpand.js +21 -23
  185. package/components/svg/IconExport.js +19 -21
  186. package/components/svg/IconExternalLink.js +19 -21
  187. package/components/svg/IconEye.js +19 -21
  188. package/components/svg/IconEyeOff.js +19 -21
  189. package/components/svg/IconFile.js +19 -21
  190. package/components/svg/IconFolder.js +19 -21
  191. package/components/svg/IconFullScreen.js +20 -22
  192. package/components/svg/IconFutures.js +19 -21
  193. package/components/svg/IconGraphReport.js +19 -21
  194. package/components/svg/IconGrid.js +19 -21
  195. package/components/svg/IconHeartMonitor.js +19 -21
  196. package/components/svg/IconHelp.js +21 -23
  197. package/components/svg/IconHistory.js +19 -21
  198. package/components/svg/IconImport.js +19 -21
  199. package/components/svg/IconIndex.js +19 -21
  200. package/components/svg/IconLayers.js +19 -21
  201. package/components/svg/IconLibrary.js +20 -22
  202. package/components/svg/IconList.js +19 -21
  203. package/components/svg/IconLivePlant.js +19 -21
  204. package/components/svg/IconLocations.js +19 -21
  205. package/components/svg/IconMail.js +19 -21
  206. package/components/svg/IconManager.js +19 -21
  207. package/components/svg/IconMap.js +19 -21
  208. package/components/svg/IconMarker.js +19 -21
  209. package/components/svg/IconMenu.js +19 -21
  210. package/components/svg/IconMenuHorizontal.js +19 -21
  211. package/components/svg/IconModule.js +19 -21
  212. package/components/svg/IconMyLocation.js +19 -21
  213. package/components/svg/IconNote.js +21 -23
  214. package/components/svg/IconNursery.js +21 -23
  215. package/components/svg/IconOrg.js +19 -21
  216. package/components/svg/IconParchment.js +19 -21
  217. package/components/svg/IconPhoto.js +19 -21
  218. package/components/svg/IconPlantsFilled.js +19 -21
  219. package/components/svg/IconRedo.js +19 -21
  220. package/components/svg/IconRestorationSite.js +19 -21
  221. package/components/svg/IconSeedBank.js +19 -21
  222. package/components/svg/IconSeedling.js +19 -21
  223. package/components/svg/IconSettings.js +19 -21
  224. package/components/svg/IconSlice.js +19 -21
  225. package/components/svg/IconSubmit.js +19 -21
  226. package/components/svg/IconSubtract.js +21 -23
  227. package/components/svg/IconSynced.js +19 -21
  228. package/components/svg/IconTrashCan.js +19 -21
  229. package/components/svg/IconTreasureMap.js +19 -21
  230. package/components/svg/IconUnavailable.js +19 -21
  231. package/components/svg/IconUndo.js +19 -21
  232. package/components/svg/IconVariable.js +19 -21
  233. package/components/svg/IconVideo.js +30 -31
  234. package/components/svg/IconWifi.js +19 -21
  235. package/components/svg/Info.js +19 -21
  236. package/components/svg/Key.js +19 -21
  237. package/components/svg/Leaf.js +19 -21
  238. package/components/svg/Lock.js +19 -21
  239. package/components/svg/Logo.js +48 -43
  240. package/components/svg/MenuVertical.js +19 -21
  241. package/components/svg/Notification.js +19 -21
  242. package/components/svg/Person.js +19 -21
  243. package/components/svg/Plus.js +19 -21
  244. package/components/svg/RestorationSite.js +19 -21
  245. package/components/svg/Search.js +19 -21
  246. package/components/svg/Seeds.js +19 -21
  247. package/components/svg/Site.js +19 -21
  248. package/components/svg/Sparkles.js +19 -21
  249. package/components/svg/Species.js +19 -21
  250. package/components/svg/Species2.js +202 -164
  251. package/components/svg/Spinner.js +54 -48
  252. package/components/svg/Star.js +19 -21
  253. package/components/svg/Success.js +19 -21
  254. package/components/svg/SuccessFilled.js +19 -21
  255. package/components/svg/TerrawareLogoDesktop.js +55 -49
  256. package/components/svg/TerrawareLogoMobile.js +25 -26
  257. package/components/svg/Touchscreen.js +19 -21
  258. package/components/svg/UploadCloud.js +202 -164
  259. package/components/svg/Warning.js +19 -21
  260. package/components/svg/WelcomeClipboard.js +156 -133
  261. package/components/svg/index.js +129 -129
  262. package/components/table/EnhancedTableToolbar.js +68 -74
  263. package/components/table/EnhancedTableToolbarV2.js +31 -41
  264. package/components/table/TableCellRenderer.js +196 -231
  265. package/components/table/TableHeader.js +71 -73
  266. package/components/table/TableHeaderItem.js +97 -102
  267. package/components/table/density.js +18 -19
  268. package/components/table/index.js +350 -369
  269. package/components/table/sort.js +27 -52
  270. package/components/table/types.js +0 -1
  271. package/components/types/index.js +0 -1
  272. package/hooks/cameraEntityContext.js +2 -13
  273. package/hooks/useBoolean.js +17 -13
  274. package/hooks/useCameraPosition.js +56 -56
  275. package/hooks/useDevicePerformance.js +17 -17
  276. package/hooks/useXr.js +85 -87
  277. package/index.js +58 -58
  278. package/package.json +1 -1
  279. package/setupTests.js +0 -4
  280. package/strings/export.js +111 -170
  281. package/strings/index.js +25 -54
  282. package/strings/locales.js +21 -41
  283. package/strings/strings-en.js +49 -51
  284. package/strings/strings-es.js +49 -51
  285. package/strings/strings-fr.js +49 -51
  286. package/strings/strings-gx.js +49 -51
  287. package/style-dictionary-dist/TerrawareTheme.js +186 -186
  288. package/theme.js +74 -76
  289. package/utils/color.js +8 -15
  290. package/utils/date.js +42 -108
  291. package/utils/index.js +4 -4
  292. package/utils/preventDefaultEvent.js +3 -3
  293. package/utils/text.js +11 -11
  294. package/utils/useDeviceInfo.js +42 -79
  295. package/virtualWalkthrough.js +23 -23
@@ -1,172 +1,83 @@
1
- import { Vec3 } from 'playcanvas';
2
- import { XrNavigation } from 'playcanvas/scripts/esm/xr/xr-navigation.mjs';
3
- import { clampToCircle } from './xr-scene-bounds.js';
4
- import { TeleportGestureLatch } from './xr-teleport-gesture.js';
5
-
6
- /** The base script's per-source aim state, which it exposes only as underscore-private fields. */
7
-
8
- /**
9
- * XrNavigation that never teleports on a select meant for something else: it honours the
10
- * enableTeleport flag (which the base ignores in tryTeleport) and skips sources whose ray is over
11
- * interactive UI.
12
- */
1
+ import { Vec3 } from "playcanvas";
2
+ import { XrNavigation } from "playcanvas/scripts/esm/xr/xr-navigation.mjs";
3
+ import { clampToCircle } from "./xr-scene-bounds.js";
4
+ import { TeleportGestureLatch } from "./xr-teleport-gesture.js";
13
5
  class TfXrNavigation extends XrNavigation {
14
- static scriptName = 'tfXrNavigation';
15
-
16
- /** Assigned by the React wrapper. True when this source's ray is over interactive UI. */
17
-
18
- /**
19
- * World-space bounds circle. Assigned by the React wrapper rather than passed as a Script prop:
20
- * boundsCenter is a Vec3, and @playcanvas/react's memo() comparator stops at the first prop with
21
- * an .equals() method, so any prop after it would never propagate.
22
- * A boundsRadius of 0 disables clamping entirely.
23
- */
24
- boundsCenter = new Vec3();
25
- boundsRadius = 0;
26
-
27
- /** How far the rig was pulled back in the last postUpdate to keep the head inside the bounds. */
28
- clampDistance = 0;
29
- _gestures = new TeleportGestureLatch();
30
- _isBlocked(inputSource) {
31
- return !this.enableTeleport || this.isTeleportBlocked?.(inputSource) === true;
32
- }
33
-
34
- /**
35
- * Tracks controllers the base script never heard about.
36
- *
37
- * Movement, turning and teleport all iterate `_inputSources`, which the base fills from the XR
38
- * input `add` event it subscribes to in initialize. A walkthrough that adopts the host's camera is
39
- * mounted into a session that is already running, so the controllers present at session start
40
- * fired `add` before this script existed and every control is inert for the whole session.
41
- *
42
- * The sources are picked up by hand rather than by re-firing `add` on the input manager, which
43
- * would also reach the host's own listeners and have them handle controllers they already know
44
- * about. The handlers mirror the base's and are stored in its map, so its teardown detaches them.
45
- */
46
- _syncInputSources() {
47
- const internals = this;
48
- for (const inputSource of this.app.xr?.input?.inputSources ?? []) {
49
- if (internals._inputSources.has(inputSource)) {
50
- continue;
51
- }
52
- const handleSelectStart = () => {
53
- internals._activePointers.set(inputSource, true);
54
- internals._arcHits.delete(inputSource);
55
- };
56
- const handleSelectEnd = () => {
57
- internals._activePointers.set(inputSource, false);
58
- if (this.enableTeleport) {
59
- this.tryTeleport(inputSource);
60
- }
61
- };
62
- inputSource.on('selectstart', handleSelectStart);
63
- inputSource.on('selectend', handleSelectEnd);
64
- internals._inputHandlers.set(inputSource, {
65
- handleSelectStart,
66
- handleSelectEnd
67
- });
68
- internals._inputSources.add(inputSource);
6
+ static scriptName = 'tfXrNavigation';
7
+ isTeleportBlocked;
8
+ boundsCenter = new Vec3();
9
+ boundsRadius = 0;
10
+ clampDistance = 0;
11
+ _gestures = new TeleportGestureLatch();
12
+ _isBlocked(inputSource) {
13
+ return !this.enableTeleport || this.isTeleportBlocked?.(inputSource) === true;
69
14
  }
70
- }
71
- _resolveCamera() {
72
- const internals = this;
73
- if (!internals._cameraEntity) {
74
- internals._cameraEntity = this.entity.findComponent('camera')?.entity ?? null;
15
+ _syncInputSources() {
16
+ const internals = this;
17
+ for (const inputSource of this.app.xr?.input?.inputSources ?? []){
18
+ if (internals._inputSources.has(inputSource)) continue;
19
+ const handleSelectStart = ()=>{
20
+ internals._activePointers.set(inputSource, true);
21
+ internals._arcHits.delete(inputSource);
22
+ };
23
+ const handleSelectEnd = ()=>{
24
+ internals._activePointers.set(inputSource, false);
25
+ if (this.enableTeleport) this.tryTeleport(inputSource);
26
+ };
27
+ inputSource.on('selectstart', handleSelectStart);
28
+ inputSource.on('selectend', handleSelectEnd);
29
+ internals._inputHandlers.set(inputSource, {
30
+ handleSelectStart,
31
+ handleSelectEnd
32
+ });
33
+ internals._inputSources.add(inputSource);
34
+ }
75
35
  }
76
- }
77
- tryTeleport(inputSource) {
78
- // The latch decides on the frames the press actually aimed through, because super.tryTeleport
79
- // commits the arc hit cached back then rather than re-tracing the release-time ray. The live
80
- // check stays too: the same release also fires 'select', so a ray that lands on UI at release
81
- // is operating that UI and must not move the rig as well.
82
- if (this._gestures.consumeBlocked(inputSource) || this._isBlocked(inputSource)) {
83
- return;
36
+ _resolveCamera() {
37
+ const internals = this;
38
+ if (!internals._cameraEntity) internals._cameraEntity = this.entity.findComponent('camera')?.entity ?? null;
84
39
  }
85
- super.tryTeleport(inputSource);
86
- }
87
- update(dt) {
88
- this._resolveCamera();
89
- this._syncInputSources();
90
- super.update(dt);
91
- const internals = this;
92
- for (const inputSource of internals._inputSources) {
93
- // Sampled once per source per frame: isTeleportBlocked ray-tests every hotspot.
94
- const uiBlocked = this.isTeleportBlocked?.(inputSource) === true;
95
-
96
- // Tracked unconditionally, and before the arc-hiding work below. super.update has just cached
97
- // this frame's arc hit, which is what a release would commit, so the latch has to see the same
98
- // frame. A source that isn't pressed carries no gesture, so any stale entry from a press that
99
- // ended while teleport was disabled (skipping tryTeleport entirely) is dropped here rather
100
- // than leaking into the source's next press.
101
- this._gestures.track(inputSource, {
102
- pressed: internals._activePointers.get(inputSource) === true,
103
- teleportDisabled: !this.enableTeleport,
104
- uiBlocked
105
- });
106
-
107
- // The base hides the arc only from inside its own teleport handling, which it skips entirely
108
- // once teleport is off - so an arc raised before the block (gaze dwell can open a panel while
109
- // the trigger is held) would otherwise stay frozen in the world. These writes are idempotent,
110
- // and the base re-enables the visuals itself on the first frame a source is unblocked.
111
- const visual = internals._arcVisuals.get(inputSource);
112
- if (!visual || !visual.entity.enabled && !visual.ringEntity.enabled) {
113
- continue;
114
- }
115
- if (!this.enableTeleport || uiBlocked) {
116
- visual.entity.enabled = false;
117
- visual.ringEntity.enabled = false;
118
- }
40
+ tryTeleport(inputSource) {
41
+ if (this._gestures.consumeBlocked(inputSource) || this._isBlocked(inputSource)) return;
42
+ super.tryTeleport(inputSource);
119
43
  }
120
- }
121
-
122
- /**
123
- * Holds the head inside the bounds circle. Runs in postUpdate, after PlayCanvas has written this
124
- * frame's head pose into the camera's local transform (xr.update runs before app.update) and after
125
- * the base script's locomotion, so one clamp covers every way the head can move: thumbstick
126
- * translation of the rig, room-scale walking within the rig, and snap turns pivoting the rig.
127
- *
128
- * This script must stay a no-op outside XR regardless of how it's mounted.
129
- */
130
- postUpdate() {
131
- this.clampDistance = 0;
132
- const camera = this._cameraEntity;
133
- if (!this.app.xr?.active || !camera || this.boundsRadius <= 0) {
134
- return;
44
+ update(dt) {
45
+ this._resolveCamera();
46
+ this._syncInputSources();
47
+ super.update(dt);
48
+ const internals = this;
49
+ for (const inputSource of internals._inputSources){
50
+ const uiBlocked = this.isTeleportBlocked?.(inputSource) === true;
51
+ this._gestures.track(inputSource, {
52
+ pressed: true === internals._activePointers.get(inputSource),
53
+ teleportDisabled: !this.enableTeleport,
54
+ uiBlocked
55
+ });
56
+ const visual = internals._arcVisuals.get(inputSource);
57
+ if (visual && (visual.entity.enabled || visual.ringEntity.enabled)) {
58
+ if (!this.enableTeleport || uiBlocked) {
59
+ visual.entity.enabled = false;
60
+ visual.ringEntity.enabled = false;
61
+ }
62
+ }
63
+ }
135
64
  }
136
- const head = camera.getPosition();
137
- const clamped = clampToCircle(head.x, head.z, this.boundsCenter.x, this.boundsCenter.z, this.boundsRadius);
138
- if (clamped.distance === 0) {
139
- return;
65
+ postUpdate() {
66
+ this.clampDistance = 0;
67
+ const camera = this._cameraEntity;
68
+ if (!this.app.xr?.active || !camera || this.boundsRadius <= 0) return;
69
+ const head = camera.getPosition();
70
+ const clamped = clampToCircle(head.x, head.z, this.boundsCenter.x, this.boundsCenter.z, this.boundsRadius);
71
+ if (0 === clamped.distance) return;
72
+ this.entity.translate(clamped.x - head.x, 0, clamped.z - head.z);
73
+ this.clampDistance = clamped.distance;
140
74
  }
141
-
142
- // World-space translate, not translateLocal: a snap turn has yawed the rig, so a local-space
143
- // correction would be rotated away from the direction the head actually overshot.
144
- this.entity.translate(clamped.x - head.x, 0, clamped.z - head.z);
145
- this.clampDistance = clamped.distance;
146
- }
147
-
148
- /**
149
- * Clamps the teleport landing point to the bounds circle. Overriding here rather than in
150
- * tryTeleport covers both paths that produce a landing point — the per-frame aim in
151
- * _handleTeleportation and tryTeleport's own recompute when no hit is cached — and because
152
- * _handleTeleportation positions the landing ring from this same record immediately afterwards,
153
- * the ring previews the clamped destination without any extra work.
154
- *
155
- * Only valid hits are clamped: when the base finds no hit it leaves rec.point holding a stale
156
- * value from an earlier frame, which must not be projected onto the circle and shown as a target.
157
- * Clamping only ever shortens the throw, so a hit that passed the base's distance check still does.
158
- */
159
- _computeArcHit(origin, direction, rec) {
160
- super._computeArcHit(origin, direction, rec);
161
- if (!rec.valid || this.boundsRadius <= 0) {
162
- return;
75
+ _computeArcHit(origin, direction, rec) {
76
+ super._computeArcHit(origin, direction, rec);
77
+ if (!rec.valid || this.boundsRadius <= 0) return;
78
+ const clamped = clampToCircle(rec.point.x, rec.point.z, this.boundsCenter.x, this.boundsCenter.z, this.boundsRadius);
79
+ rec.point.x = clamped.x;
80
+ rec.point.z = clamped.z;
163
81
  }
164
-
165
- // Y is left alone: it is the navigation plane height, and bounds are XZ-only.
166
- const clamped = clampToCircle(rec.point.x, rec.point.z, this.boundsCenter.x, this.boundsCenter.z, this.boundsRadius);
167
- rec.point.x = clamped.x;
168
- rec.point.z = clamped.z;
169
- }
170
82
  }
171
-
172
83
  export { TfXrNavigation };