@terraware/web-components 5.0.27-rc.0 → 5.0.27
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/components/AntSwitch/index.js +22 -19
- package/components/Autocomplete/Autocomplete.js +130 -106
- package/components/Badge/index.js +29 -28
- package/components/BusySpinner/index.js +45 -40
- package/components/Button/Button.js +47 -41
- package/components/Checkbox.js +63 -64
- package/components/Confirm/index.js +83 -74
- package/components/DatePicker/DatePicker.js +141 -138
- package/components/DialogBox/DialogBox.js +118 -111
- package/components/Divisor.js +18 -18
- package/components/Dropdown.js +94 -66
- package/components/EditableTable/index.js +271 -211
- package/components/ErrorBox/ErrorBox.js +49 -47
- package/components/FileChooser/index.js +135 -117
- package/components/FormBottomBar/index.js +84 -75
- package/components/Icon/Icon.js +20 -12
- package/components/Icon/icons/index.js +256 -256
- package/components/IconTooltip/index.js +60 -49
- package/components/Map/MapBox.js +452 -545
- package/components/Map/MapContainer.js +29 -25
- package/components/Map/MapDateSliderControl.js +64 -64
- package/components/Map/MapDrawer.js +47 -41
- package/components/Map/MapLegend.js +172 -176
- package/components/Map/MapViewStyleControl.js +63 -59
- package/components/Map/ReactMapboxWrapper.js +2 -3
- package/components/Map/index.js +180 -161
- package/components/Map/types.js +17 -12
- package/components/Map/useMaintainLayerOrder.js +26 -16
- package/components/Markdown/index.js +26 -25
- package/components/Message/Message.js +76 -73
- package/components/MultiSelect/index.js +124 -112
- package/components/Navbar/NavFooter.js +13 -9
- package/components/Navbar/NavItem.js +76 -70
- package/components/Navbar/NavSection.js +19 -17
- package/components/Navbar/Navbar.js +46 -39
- package/components/Navbar/SubNavbar.js +13 -9
- package/components/Note.js +22 -18
- package/components/OverlayModal/OverlayModal.js +63 -56
- package/components/PageForm/index.js +41 -33
- package/components/PhotoChooser/index.js +173 -165
- package/components/PhotosCarousel/PhotoSlide.js +35 -32
- package/components/PhotosCarousel/index.js +85 -80
- package/components/PhotosCarousel/usePhotosCarousel.js +76 -69
- package/components/Pill/index.js +45 -41
- package/components/PillList/index.js +24 -17
- package/components/PlacementWrapper/index.js +59 -38
- package/components/PopoverMenu/Popover.js +85 -68
- package/components/PopoverMenu/index.js +56 -51
- package/components/PopoverMultiSelect/index.js +59 -52
- package/components/ProgressCircle/ProgressCircle.js +32 -28
- package/components/RadioButton.js +19 -17
- package/components/Select/Select.js +15 -13
- package/components/Select/SelectT.js +250 -235
- package/components/Separator/index.js +17 -14
- package/components/Size.js +1 -0
- package/components/Slider/index.js +56 -43
- package/components/SummaryBox.js +72 -70
- package/components/Tabs/index.js +135 -133
- package/components/TextTruncated/index.js +130 -117
- package/components/Textfield/Textfield.js +190 -158
- package/components/Textfield/TruncatedTextArea.js +84 -70
- package/components/TimelineSlider/TimelineMarker.js +30 -25
- package/components/TimelineSlider/TimelineRail.js +11 -8
- package/components/TimelineSlider/index.js +66 -64
- package/components/TimelineSliderV2/ClusterBadge.js +29 -25
- package/components/TimelineSliderV2/TimelineDot.js +35 -31
- package/components/TimelineSliderV2/TimelineRail.js +11 -8
- package/components/TimelineSliderV2/index.js +103 -121
- package/components/TimelineSliderV2/layout.js +147 -124
- package/components/TimelineSliderV2/types.js +1 -0
- package/components/Tooltip/Tooltip.js +56 -47
- package/components/ViewPhotosDialog/index.js +35 -28
- package/components/VirtualWalkthrough/Annotation.js +207 -163
- package/components/VirtualWalkthrough/AnnotationEditPane.js +184 -198
- package/components/VirtualWalkthrough/AnnotationPanel.js +199 -187
- package/components/VirtualWalkthrough/Application.js +34 -31
- package/components/VirtualWalkthrough/AutoRotator.js +223 -85
- package/components/VirtualWalkthrough/BlockingSpinner.js +28 -26
- package/components/VirtualWalkthrough/BoundaryRing.js +34 -30
- package/components/VirtualWalkthrough/BoundaryWall.js +36 -32
- package/components/VirtualWalkthrough/CameraInfo.js +89 -100
- package/components/VirtualWalkthrough/ControlsInfoPane.js +195 -254
- package/components/VirtualWalkthrough/GradientSky.js +73 -72
- package/components/VirtualWalkthrough/SplatControls.js +221 -209
- package/components/VirtualWalkthrough/SplatCrop.js +20 -21
- package/components/VirtualWalkthrough/SplatFadeCrop.js +20 -21
- package/components/VirtualWalkthrough/SplatModel.js +85 -65
- package/components/VirtualWalkthrough/SplatRevealRain.js +46 -41
- package/components/VirtualWalkthrough/TfAnnotationManager.js +379 -197
- package/components/VirtualWalkthrough/TfXrNavigation.js +162 -73
- package/components/VirtualWalkthrough/VirtualWalkthroughViewer.js +431 -438
- package/components/VirtualWalkthrough/VrAnnotationPanel.js +22 -18
- package/components/VirtualWalkthrough/XrAnnotationInteraction.js +17 -14
- package/components/VirtualWalkthrough/XrExitButton.js +17 -14
- package/components/VirtualWalkthrough/XrGazeDwell.js +17 -14
- package/components/VirtualWalkthrough/XrPointerRay.js +17 -14
- package/components/VirtualWalkthrough/XrStartPose.js +121 -67
- package/components/VirtualWalkthrough/boundary-ring.js +117 -87
- package/components/VirtualWalkthrough/boundary-wall.js +258 -175
- package/components/VirtualWalkthrough/camera-adoption.js +64 -18
- package/components/VirtualWalkthrough/groundPlane.js +47 -32
- package/components/VirtualWalkthrough/gsplat-fade-crop-effect.js +35 -35
- package/components/VirtualWalkthrough/splatFormat.js +47 -13
- package/components/VirtualWalkthrough/useAdoptedCamera.js +44 -23
- package/components/VirtualWalkthrough/useRestartOnVr.js +37 -26
- package/components/VirtualWalkthrough/useXrRenderTuning.js +54 -33
- package/components/VirtualWalkthrough/vr-annotation-panel-layout.js +99 -67
- package/components/VirtualWalkthrough/vr-annotation-panel.js +433 -403
- package/components/VirtualWalkthrough/vr-annotation-scroll.js +28 -10
- package/components/VirtualWalkthrough/walkthrough-camera.js +329 -204
- package/components/VirtualWalkthrough/xr-annotation-candidate-buffer.js +80 -39
- package/components/VirtualWalkthrough/xr-annotation-candidates.js +18 -6
- package/components/VirtualWalkthrough/xr-annotation-interaction.js +56 -31
- package/components/VirtualWalkthrough/xr-annotation-targeting.js +38 -22
- package/components/VirtualWalkthrough/xr-button-arming.js +17 -7
- package/components/VirtualWalkthrough/xr-button-hold.js +36 -22
- package/components/VirtualWalkthrough/xr-exit-button-mask.js +36 -22
- package/components/VirtualWalkthrough/xr-exit-button.js +207 -148
- package/components/VirtualWalkthrough/xr-face-buttons.js +29 -19
- package/components/VirtualWalkthrough/xr-gaze-dwell-state.js +34 -23
- package/components/VirtualWalkthrough/xr-gaze-dwell.js +144 -107
- package/components/VirtualWalkthrough/xr-interactive-ui.js +24 -12
- package/components/VirtualWalkthrough/xr-pointer-ray.js +20 -13
- package/components/VirtualWalkthrough/xr-progress-pie-material.js +88 -117
- package/components/VirtualWalkthrough/xr-progress-pie.js +10 -1
- package/components/VirtualWalkthrough/xr-ray-quad.js +30 -16
- package/components/VirtualWalkthrough/xr-render-tuning.js +48 -17
- package/components/VirtualWalkthrough/xr-scene-bounds.js +37 -21
- package/components/VirtualWalkthrough/xr-start-pose.js +73 -27
- package/components/VirtualWalkthrough/xr-teleport-gesture.js +42 -16
- package/components/svg/BlobbyGrayIconImage.js +39 -41
- package/components/svg/BlobbyGrayIconImport.js +39 -41
- package/components/svg/BlobbyGrayIconUploadToTheCloud.js +39 -41
- package/components/svg/BlobbyIconCloudChecked.js +164 -202
- package/components/svg/BlobbyIconExportOrUploadPhoto.js +164 -202
- package/components/svg/BlobbyIconFolder.js +164 -202
- package/components/svg/BlobbyIconGraphReport.js +164 -202
- package/components/svg/BlobbyIconHappy.js +164 -202
- package/components/svg/BlobbyIconHeartMonitor.js +164 -202
- package/components/svg/BlobbyIconLeaf.js +164 -202
- package/components/svg/BlobbyIconLibrary.js +164 -202
- package/components/svg/BlobbyIconNursery.js +166 -204
- package/components/svg/BlobbyIconOrganization.js +164 -202
- package/components/svg/BlobbyIconParchment.js +164 -202
- package/components/svg/BlobbyIconPeople.js +164 -202
- package/components/svg/BlobbyIconSeedBank.js +164 -202
- package/components/svg/BlobbyIconSeedling.js +164 -202
- package/components/svg/BlobbyIconSeeds.js +164 -202
- package/components/svg/BlobbyIconSite.js +167 -206
- package/components/svg/BlobbyIconSparkles.js +164 -202
- package/components/svg/BlobbyIconWrench.js +164 -202
- package/components/svg/Bug.js +21 -19
- package/components/svg/Calendar.js +21 -19
- package/components/svg/CaretDown.js +21 -19
- package/components/svg/CaretLeft.js +21 -19
- package/components/svg/CaretRight.js +21 -19
- package/components/svg/CaretUp.js +21 -19
- package/components/svg/ChevronDown.js +21 -19
- package/components/svg/ChevronUp.js +21 -19
- package/components/svg/Close.js +21 -19
- package/components/svg/Critical.js +21 -19
- package/components/svg/Edit.js +164 -202
- package/components/svg/Error.js +21 -19
- package/components/svg/Filter.js +21 -19
- package/components/svg/Folder.js +21 -19
- package/components/svg/Help.js +21 -19
- package/components/svg/Home.js +21 -19
- package/components/svg/IconAdd.js +21 -19
- package/components/svg/IconArrowRight.js +23 -21
- package/components/svg/IconBusinessNetwork.js +21 -19
- package/components/svg/IconCalendar.js +21 -19
- package/components/svg/IconCancel.js +21 -19
- package/components/svg/IconChargingBattery.js +21 -19
- package/components/svg/IconChecklist.js +23 -21
- package/components/svg/IconCheckmark.js +21 -19
- package/components/svg/IconCoinInHand.js +21 -19
- package/components/svg/IconColumns.js +21 -19
- package/components/svg/IconComment.js +22 -20
- package/components/svg/IconDashboard.js +21 -19
- package/components/svg/IconDataMigration.js +21 -19
- package/components/svg/IconDocument.js +23 -21
- package/components/svg/IconDownloadFromTheCloud.js +23 -21
- package/components/svg/IconEdit.js +23 -21
- package/components/svg/IconExpand.js +23 -21
- package/components/svg/IconExport.js +21 -19
- package/components/svg/IconExternalLink.js +21 -19
- package/components/svg/IconEye.js +21 -19
- package/components/svg/IconEyeOff.js +21 -19
- package/components/svg/IconFile.js +21 -19
- package/components/svg/IconFolder.js +21 -19
- package/components/svg/IconFullScreen.js +22 -20
- package/components/svg/IconFutures.js +21 -19
- package/components/svg/IconGraphReport.js +21 -19
- package/components/svg/IconGrid.js +21 -19
- package/components/svg/IconHeartMonitor.js +21 -19
- package/components/svg/IconHelp.js +23 -21
- package/components/svg/IconHistory.js +21 -19
- package/components/svg/IconImport.js +21 -19
- package/components/svg/IconIndex.js +21 -19
- package/components/svg/IconLayers.js +21 -19
- package/components/svg/IconLibrary.js +22 -20
- package/components/svg/IconList.js +21 -19
- package/components/svg/IconLivePlant.js +21 -19
- package/components/svg/IconLocations.js +21 -19
- package/components/svg/IconMail.js +21 -19
- package/components/svg/IconManager.js +21 -19
- package/components/svg/IconMap.js +21 -19
- package/components/svg/IconMarker.js +21 -19
- package/components/svg/IconMenu.js +21 -19
- package/components/svg/IconMenuHorizontal.js +21 -19
- package/components/svg/IconModule.js +21 -19
- package/components/svg/IconMyLocation.js +21 -19
- package/components/svg/IconNote.js +23 -21
- package/components/svg/IconNursery.js +23 -21
- package/components/svg/IconOrg.js +21 -19
- package/components/svg/IconParchment.js +21 -19
- package/components/svg/IconPhoto.js +21 -19
- package/components/svg/IconPlantsFilled.js +21 -19
- package/components/svg/IconRedo.js +21 -19
- package/components/svg/IconRestorationSite.js +21 -19
- package/components/svg/IconSeedBank.js +21 -19
- package/components/svg/IconSeedling.js +21 -19
- package/components/svg/IconSettings.js +21 -19
- package/components/svg/IconSlice.js +21 -19
- package/components/svg/IconSubmit.js +21 -19
- package/components/svg/IconSubtract.js +23 -21
- package/components/svg/IconSynced.js +21 -19
- package/components/svg/IconTrashCan.js +21 -19
- package/components/svg/IconTreasureMap.js +21 -19
- package/components/svg/IconUnavailable.js +21 -19
- package/components/svg/IconUndo.js +21 -19
- package/components/svg/IconVariable.js +21 -19
- package/components/svg/IconVideo.js +31 -30
- package/components/svg/IconWifi.js +21 -19
- package/components/svg/Info.js +21 -19
- package/components/svg/Key.js +21 -19
- package/components/svg/Leaf.js +21 -19
- package/components/svg/Lock.js +21 -19
- package/components/svg/Logo.js +43 -48
- package/components/svg/MenuVertical.js +21 -19
- package/components/svg/Notification.js +21 -19
- package/components/svg/Person.js +21 -19
- package/components/svg/Plus.js +21 -19
- package/components/svg/RestorationSite.js +21 -19
- package/components/svg/Search.js +21 -19
- package/components/svg/Seeds.js +21 -19
- package/components/svg/Site.js +21 -19
- package/components/svg/Sparkles.js +21 -19
- package/components/svg/Species.js +21 -19
- package/components/svg/Species2.js +164 -202
- package/components/svg/Spinner.js +48 -54
- package/components/svg/Star.js +21 -19
- package/components/svg/Success.js +21 -19
- package/components/svg/SuccessFilled.js +21 -19
- package/components/svg/TerrawareLogoDesktop.js +49 -55
- package/components/svg/TerrawareLogoMobile.js +26 -25
- package/components/svg/Touchscreen.js +21 -19
- package/components/svg/UploadCloud.js +164 -202
- package/components/svg/Warning.js +21 -19
- package/components/svg/WelcomeClipboard.js +133 -156
- package/components/svg/index.js +129 -129
- package/components/table/EnhancedTableToolbar.js +74 -68
- package/components/table/EnhancedTableToolbarV2.js +41 -31
- package/components/table/TableCellRenderer.js +231 -196
- package/components/table/TableHeader.js +73 -71
- package/components/table/TableHeaderItem.js +102 -97
- package/components/table/density.js +19 -18
- package/components/table/index.js +369 -350
- package/components/table/sort.js +52 -27
- package/components/table/types.js +1 -0
- package/components/types/index.js +1 -0
- package/hooks/cameraEntityContext.js +13 -2
- package/hooks/useBoolean.js +13 -17
- package/hooks/useCameraPosition.js +56 -56
- package/hooks/useDevicePerformance.js +17 -17
- package/hooks/useXr.js +87 -85
- package/index.js +58 -58
- package/package.json +1 -1
- package/setupTests.js +4 -0
- package/strings/export.js +170 -111
- package/strings/index.js +54 -25
- package/strings/locales.js +41 -21
- package/strings/strings-en.js +51 -49
- package/strings/strings-es.js +51 -49
- package/strings/strings-fr.js +51 -49
- package/strings/strings-gx.js +51 -49
- package/style-dictionary-dist/TerrawareTheme.js +186 -186
- package/theme.js +76 -74
- package/utils/color.js +15 -8
- package/utils/date.js +108 -42
- package/utils/index.js +4 -4
- package/utils/preventDefaultEvent.js +3 -3
- package/utils/text.js +11 -11
- package/utils/useDeviceInfo.js +79 -42
- package/virtualWalkthrough.js +23 -23
|
@@ -1,83 +1,172 @@
|
|
|
1
|
-
import { Vec3 } from
|
|
2
|
-
import { XrNavigation } from
|
|
3
|
-
import { clampToCircle } from
|
|
4
|
-
import { TeleportGestureLatch } from
|
|
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
|
+
*/
|
|
5
13
|
class TfXrNavigation extends XrNavigation {
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
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);
|
|
34
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);
|
|
35
69
|
}
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
70
|
+
}
|
|
71
|
+
_resolveCamera() {
|
|
72
|
+
const internals = this;
|
|
73
|
+
if (!internals._cameraEntity) {
|
|
74
|
+
internals._cameraEntity = this.entity.findComponent('camera')?.entity ?? null;
|
|
39
75
|
}
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
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;
|
|
43
84
|
}
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
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
|
+
}
|
|
119
|
+
}
|
|
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;
|
|
64
135
|
}
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
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;
|
|
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;
|
|
74
140
|
}
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
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;
|
|
81
163
|
}
|
|
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
|
+
}
|
|
82
170
|
}
|
|
171
|
+
|
|
83
172
|
export { TfXrNavigation };
|