@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,97 +1,235 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { Script, Vec3, Quat } from 'playcanvas';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Auto-rotator script for PlayCanvas CameraControls.
|
|
5
|
+
* Automatically orbits the camera around its focus point after a period of inactivity.
|
|
6
|
+
*/
|
|
2
7
|
class AutoRotator extends Script {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
8
|
+
static scriptName = 'autoRotator';
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Rotation speed in degrees per second when auto-rotating.
|
|
12
|
+
*
|
|
13
|
+
* @attribute
|
|
14
|
+
* @title Speed
|
|
15
|
+
*/
|
|
16
|
+
speed = 4;
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Delay in seconds before auto-rotation starts after initialization.
|
|
20
|
+
*
|
|
21
|
+
* @attribute
|
|
22
|
+
* @title Start Delay
|
|
23
|
+
*/
|
|
24
|
+
startDelay = 5;
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* Delay in seconds before auto-rotation restarts after the camera stops moving.
|
|
28
|
+
*
|
|
29
|
+
* @attribute
|
|
30
|
+
* @title Restart Delay
|
|
31
|
+
*/
|
|
32
|
+
restartDelay = 2;
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* Duration in seconds to fade in the rotation speed.
|
|
36
|
+
*
|
|
37
|
+
* @attribute
|
|
38
|
+
* @title Start Fade In Time
|
|
39
|
+
*/
|
|
40
|
+
startFadeInTime = 5;
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Internal timer tracking how long the camera has been idle.
|
|
44
|
+
* @private
|
|
45
|
+
*/
|
|
46
|
+
timer = 0;
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* Flag to track if rotation has started at least once.
|
|
50
|
+
* @private
|
|
51
|
+
*/
|
|
52
|
+
hasStartedRotating = false;
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* Flag to track if we're currently rotating.
|
|
56
|
+
* @private
|
|
57
|
+
*/
|
|
58
|
+
isCurrentlyRotating = false;
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* Last known pitch angle for movement detection.
|
|
62
|
+
* @private
|
|
63
|
+
*/
|
|
64
|
+
pitch = null;
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* Last known yaw angle for movement detection.
|
|
68
|
+
* @private
|
|
69
|
+
*/
|
|
70
|
+
yaw = null;
|
|
71
|
+
|
|
72
|
+
/**
|
|
73
|
+
* Reference to the camera entity.
|
|
74
|
+
* @private
|
|
75
|
+
*/
|
|
76
|
+
cameraEntity = null;
|
|
77
|
+
|
|
78
|
+
/**
|
|
79
|
+
* Reference to the CameraControls script.
|
|
80
|
+
* @private
|
|
81
|
+
*/
|
|
82
|
+
cameraControls = null;
|
|
83
|
+
|
|
84
|
+
/**
|
|
85
|
+
* Reference to the WalkthroughCamera script (used when CameraControls is absent).
|
|
86
|
+
* @private
|
|
87
|
+
*/
|
|
88
|
+
walkthroughCamera = null;
|
|
89
|
+
|
|
90
|
+
/**
|
|
91
|
+
* Bound event handlers for cleanup.
|
|
92
|
+
* @private
|
|
93
|
+
*/
|
|
94
|
+
|
|
95
|
+
/**
|
|
96
|
+
* Handle user input events.
|
|
97
|
+
* @private
|
|
98
|
+
*/
|
|
99
|
+
handleUserInput() {
|
|
100
|
+
this.timer = 0;
|
|
101
|
+
this.isCurrentlyRotating = false;
|
|
102
|
+
this.hasStartedRotating = true;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
/**
|
|
106
|
+
* Initialize the script.
|
|
107
|
+
*/
|
|
108
|
+
initialize() {
|
|
109
|
+
this.onPointerDown = this.handleUserInput.bind(this);
|
|
110
|
+
this.onKeyDown = this.handleUserInput.bind(this);
|
|
111
|
+
if (this.app.graphicsDevice.canvas) {
|
|
112
|
+
this.app.graphicsDevice.canvas.addEventListener('pointerdown', this.onPointerDown);
|
|
113
|
+
}
|
|
114
|
+
window.addEventListener('keydown', this.onKeyDown);
|
|
115
|
+
this.resolveCamera();
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
/**
|
|
119
|
+
* Finds the camera and the script posing it. WalkthroughCamera is mounted on this entity, the rig,
|
|
120
|
+
* so that it poses a camera the walkthrough adopted from a host scene as readily as one of its own;
|
|
121
|
+
* CameraControls sits on the camera entity itself.
|
|
122
|
+
*
|
|
123
|
+
* Called again while nothing has been found, because an adopted camera is reparented into the rig
|
|
124
|
+
* by an effect that runs after the scripts are mounted.
|
|
125
|
+
* @private
|
|
126
|
+
*/
|
|
127
|
+
resolveCamera() {
|
|
128
|
+
this.cameraEntity = this.entity.findComponent('camera')?.entity ?? null;
|
|
129
|
+
this.cameraControls = this.cameraEntity?.script?.cameraControls ?? null;
|
|
130
|
+
// @ts-expect-error - scripts are added dynamically to the entity
|
|
131
|
+
const rigWalkthroughCamera = this.entity.script?.walkthroughCamera;
|
|
132
|
+
this.walkthroughCamera = rigWalkthroughCamera ?? this.cameraEntity?.script?.walkthroughCamera ?? null;
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
/**
|
|
136
|
+
* Update loop that handles auto-rotation logic.
|
|
137
|
+
* Runs after CameraControls updates.
|
|
138
|
+
*/
|
|
139
|
+
postUpdate(dt) {
|
|
140
|
+
if (!this.cameraControls && !this.walkthroughCamera) {
|
|
141
|
+
this.resolveCamera();
|
|
142
|
+
}
|
|
143
|
+
const hasControls = this.cameraControls && this.cameraControls._pose;
|
|
144
|
+
const hasWalkthrough = !!this.walkthroughCamera;
|
|
145
|
+
if (!hasControls && !hasWalkthrough) {
|
|
146
|
+
return;
|
|
147
|
+
}
|
|
148
|
+
const currentPitch = hasControls ? this.cameraControls._pose.angles.x : this.walkthroughCamera.currentPitch;
|
|
149
|
+
const currentYaw = hasControls ? this.cameraControls._pose.angles.y : this.walkthroughCamera.currentYaw;
|
|
150
|
+
|
|
151
|
+
// Initialize angles on first frame
|
|
152
|
+
if (this.pitch === null || this.yaw === null) {
|
|
153
|
+
this.pitch = currentPitch;
|
|
154
|
+
this.yaw = currentYaw;
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
// Check for camera movement only after initial rotation has started and while not actively rotating
|
|
158
|
+
if (this.hasStartedRotating && !this.isCurrentlyRotating && this.pitch !== null && this.yaw !== null) {
|
|
159
|
+
const pitchDiff = Math.abs(this.pitch - currentPitch);
|
|
160
|
+
const yawDiff = Math.abs(this.yaw - currentYaw);
|
|
161
|
+
if (pitchDiff > 0.1 || yawDiff > 0.1) {
|
|
162
|
+
this.pitch = currentPitch;
|
|
163
|
+
this.yaw = currentYaw;
|
|
19
164
|
this.timer = 0;
|
|
20
165
|
this.isCurrentlyRotating = false;
|
|
21
166
|
this.hasStartedRotating = true;
|
|
167
|
+
return;
|
|
168
|
+
}
|
|
22
169
|
}
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
170
|
+
this.timer += dt;
|
|
171
|
+
|
|
172
|
+
// Determine which delay to use
|
|
173
|
+
const currentDelay = this.hasStartedRotating ? this.restartDelay : this.startDelay;
|
|
174
|
+
|
|
175
|
+
// Start auto-rotation after delay
|
|
176
|
+
if (this.timer >= currentDelay) {
|
|
177
|
+
this.isCurrentlyRotating = true;
|
|
178
|
+
const time = this.timer - currentDelay;
|
|
179
|
+
const fadeIn = this.smoothStep(time / this.startFadeInTime);
|
|
180
|
+
const yawDelta = dt * fadeIn * this.speed;
|
|
181
|
+
if (hasControls) {
|
|
182
|
+
const pose = this.cameraControls._pose;
|
|
183
|
+
const focusPoint = pose.getFocus(new Vec3());
|
|
184
|
+
const offset = new Vec3().sub2(pose.position.clone(), focusPoint);
|
|
185
|
+
const rotationQuat = new Quat().setFromAxisAngle(Vec3.UP, yawDelta);
|
|
186
|
+
const rotatedOffset = new Vec3();
|
|
187
|
+
rotationQuat.transformVector(offset, rotatedOffset);
|
|
188
|
+
const newPos = new Vec3().add2(focusPoint, rotatedOffset);
|
|
189
|
+
pose.look(newPos, focusPoint);
|
|
190
|
+
if (this.cameraControls._controller?.attach) {
|
|
191
|
+
this.cameraControls._controller.attach(pose, false);
|
|
192
|
+
}
|
|
193
|
+
this.cameraEntity.setPosition(pose.position);
|
|
194
|
+
this.cameraEntity.setEulerAngles(pose.angles);
|
|
195
|
+
this.pitch = pose.angles.x;
|
|
196
|
+
this.yaw = pose.angles.y;
|
|
197
|
+
} else {
|
|
198
|
+
this.walkthroughCamera.orbitStep(yawDelta);
|
|
199
|
+
this.pitch = this.walkthroughCamera.currentPitch;
|
|
200
|
+
this.yaw = this.walkthroughCamera.currentYaw;
|
|
201
|
+
}
|
|
29
202
|
}
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
/**
|
|
206
|
+
* Smooth step interpolation function.
|
|
207
|
+
*
|
|
208
|
+
* @param {number} x - Input value.
|
|
209
|
+
* @returns {number} - Smoothly interpolated value.
|
|
210
|
+
* @private
|
|
211
|
+
*/
|
|
212
|
+
smoothStep(x) {
|
|
213
|
+
if (x <= 0) {
|
|
214
|
+
return 0;
|
|
35
215
|
}
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
const hasControls = this.cameraControls && this.cameraControls._pose;
|
|
39
|
-
const hasWalkthrough = !!this.walkthroughCamera;
|
|
40
|
-
if (!hasControls && !hasWalkthrough) return;
|
|
41
|
-
const currentPitch = hasControls ? this.cameraControls._pose.angles.x : this.walkthroughCamera.currentPitch;
|
|
42
|
-
const currentYaw = hasControls ? this.cameraControls._pose.angles.y : this.walkthroughCamera.currentYaw;
|
|
43
|
-
if (null === this.pitch || null === this.yaw) {
|
|
44
|
-
this.pitch = currentPitch;
|
|
45
|
-
this.yaw = currentYaw;
|
|
46
|
-
}
|
|
47
|
-
if (this.hasStartedRotating && !this.isCurrentlyRotating && null !== this.pitch && null !== this.yaw) {
|
|
48
|
-
const pitchDiff = Math.abs(this.pitch - currentPitch);
|
|
49
|
-
const yawDiff = Math.abs(this.yaw - currentYaw);
|
|
50
|
-
if (pitchDiff > 0.1 || yawDiff > 0.1) {
|
|
51
|
-
this.pitch = currentPitch;
|
|
52
|
-
this.yaw = currentYaw;
|
|
53
|
-
this.timer = 0;
|
|
54
|
-
this.isCurrentlyRotating = false;
|
|
55
|
-
this.hasStartedRotating = true;
|
|
56
|
-
return;
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
this.timer += dt;
|
|
60
|
-
const currentDelay = this.hasStartedRotating ? this.restartDelay : this.startDelay;
|
|
61
|
-
if (this.timer >= currentDelay) {
|
|
62
|
-
this.isCurrentlyRotating = true;
|
|
63
|
-
const time = this.timer - currentDelay;
|
|
64
|
-
const fadeIn = this.smoothStep(time / this.startFadeInTime);
|
|
65
|
-
const yawDelta = dt * fadeIn * this.speed;
|
|
66
|
-
if (hasControls) {
|
|
67
|
-
const pose = this.cameraControls._pose;
|
|
68
|
-
const focusPoint = pose.getFocus(new Vec3());
|
|
69
|
-
const offset = new Vec3().sub2(pose.position.clone(), focusPoint);
|
|
70
|
-
const rotationQuat = new Quat().setFromAxisAngle(Vec3.UP, yawDelta);
|
|
71
|
-
const rotatedOffset = new Vec3();
|
|
72
|
-
rotationQuat.transformVector(offset, rotatedOffset);
|
|
73
|
-
const newPos = new Vec3().add2(focusPoint, rotatedOffset);
|
|
74
|
-
pose.look(newPos, focusPoint);
|
|
75
|
-
if (this.cameraControls._controller?.attach) this.cameraControls._controller.attach(pose, false);
|
|
76
|
-
this.cameraEntity.setPosition(pose.position);
|
|
77
|
-
this.cameraEntity.setEulerAngles(pose.angles);
|
|
78
|
-
this.pitch = pose.angles.x;
|
|
79
|
-
this.yaw = pose.angles.y;
|
|
80
|
-
} else {
|
|
81
|
-
this.walkthroughCamera.orbitStep(yawDelta);
|
|
82
|
-
this.pitch = this.walkthroughCamera.currentPitch;
|
|
83
|
-
this.yaw = this.walkthroughCamera.currentYaw;
|
|
84
|
-
}
|
|
85
|
-
}
|
|
216
|
+
if (x >= 1) {
|
|
217
|
+
return 1;
|
|
86
218
|
}
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
219
|
+
return Math.sin((x - 0.5) * Math.PI) * 0.5 + 0.5;
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
/**
|
|
223
|
+
* Clean up event listeners when the script is destroyed.
|
|
224
|
+
*/
|
|
225
|
+
destroy() {
|
|
226
|
+
if (this.app.graphicsDevice.canvas && this.onPointerDown) {
|
|
227
|
+
this.app.graphicsDevice.canvas.removeEventListener('pointerdown', this.onPointerDown);
|
|
91
228
|
}
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
if (this.onKeyDown) window.removeEventListener('keydown', this.onKeyDown);
|
|
229
|
+
if (this.onKeyDown) {
|
|
230
|
+
window.removeEventListener('keydown', this.onKeyDown);
|
|
95
231
|
}
|
|
232
|
+
}
|
|
96
233
|
}
|
|
234
|
+
|
|
97
235
|
export { AutoRotator };
|
|
@@ -1,28 +1,30 @@
|
|
|
1
|
-
import
|
|
2
|
-
import
|
|
3
|
-
import {
|
|
1
|
+
import 'react';
|
|
2
|
+
import { useTheme, StyledEngineProvider, CircularProgress } from '@mui/material';
|
|
3
|
+
import { jsx } from 'react/jsx-runtime';
|
|
4
|
+
|
|
4
5
|
function BlockingSpinner() {
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
6
|
+
const theme = useTheme();
|
|
7
|
+
return /*#__PURE__*/jsx(StyledEngineProvider, {
|
|
8
|
+
injectFirst: true,
|
|
9
|
+
children: /*#__PURE__*/jsx(CircularProgress, {
|
|
10
|
+
size: "193",
|
|
11
|
+
sx: {
|
|
12
|
+
height: '200px',
|
|
13
|
+
width: '200px',
|
|
14
|
+
position: 'absolute',
|
|
15
|
+
top: 0,
|
|
16
|
+
bottom: 0,
|
|
17
|
+
left: 0,
|
|
18
|
+
right: 0,
|
|
19
|
+
margin: 'auto',
|
|
20
|
+
'& .MuiCircularProgress-svg': {
|
|
21
|
+
color: theme.palette.TwClrIcnBrand,
|
|
22
|
+
height: '200px',
|
|
23
|
+
width: '200px'
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
})
|
|
27
|
+
});
|
|
27
28
|
}
|
|
28
|
-
|
|
29
|
+
|
|
30
|
+
export { BlockingSpinner as default };
|
|
@@ -1,31 +1,35 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
1
|
+
import { useEffect } from 'react';
|
|
2
|
+
import { Entity } from '@playcanvas/react';
|
|
3
|
+
import { Script } from '@playcanvas/react/components';
|
|
4
|
+
import { useApp } from '@playcanvas/react/hooks';
|
|
5
|
+
import { BoundaryRingScript } from './boundary-ring.js';
|
|
6
|
+
import { jsx } from 'react/jsx-runtime';
|
|
7
|
+
|
|
8
|
+
const BoundaryRing = ({
|
|
9
|
+
center,
|
|
10
|
+
radius,
|
|
11
|
+
groundPlane
|
|
12
|
+
}) => {
|
|
13
|
+
const app = useApp();
|
|
14
|
+
useEffect(() => {
|
|
15
|
+
// Set imperatively rather than via reactive Script props. @playcanvas/react wraps Script
|
|
16
|
+
// in memo() whose shallowEquals returns early on the first prop with a .equals() method
|
|
17
|
+
// (Vec3), so any prop after a Vec3 is never compared and would not propagate.
|
|
18
|
+
// @ts-expect-error - scripts are added dynamically to the entity
|
|
19
|
+
const script = app.root.findByName('boundary-ring')?.script?.boundaryRing;
|
|
20
|
+
if (script) {
|
|
21
|
+
script.center = center;
|
|
22
|
+
script.radius = radius;
|
|
23
|
+
script.groundPlane = groundPlane;
|
|
24
|
+
script.rebuild();
|
|
25
|
+
}
|
|
26
|
+
}, [app, center, radius, groundPlane]);
|
|
27
|
+
return /*#__PURE__*/jsx(Entity, {
|
|
28
|
+
name: "boundary-ring",
|
|
29
|
+
children: /*#__PURE__*/jsx(Script, {
|
|
30
|
+
script: BoundaryRingScript
|
|
31
|
+
})
|
|
32
|
+
});
|
|
29
33
|
};
|
|
30
|
-
|
|
31
|
-
export default
|
|
34
|
+
|
|
35
|
+
export { BoundaryRing as default };
|
|
@@ -1,33 +1,37 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
1
|
+
import { useEffect } from 'react';
|
|
2
|
+
import { Entity } from '@playcanvas/react';
|
|
3
|
+
import { Script } from '@playcanvas/react/components';
|
|
4
|
+
import { useApp } from '@playcanvas/react/hooks';
|
|
5
|
+
import { BoundaryWallScript } from './boundary-wall.js';
|
|
6
|
+
import { jsx } from 'react/jsx-runtime';
|
|
7
|
+
|
|
8
|
+
const BoundaryWall = ({
|
|
9
|
+
center,
|
|
10
|
+
radius,
|
|
11
|
+
groundPlane,
|
|
12
|
+
baseY
|
|
13
|
+
}) => {
|
|
14
|
+
const app = useApp();
|
|
15
|
+
useEffect(() => {
|
|
16
|
+
// Set imperatively rather than via reactive Script props. @playcanvas/react wraps Script
|
|
17
|
+
// in memo() whose shallowEquals returns early on the first prop with a .equals() method
|
|
18
|
+
// (Vec3), so any prop after a Vec3 is never compared and would not propagate.
|
|
19
|
+
// @ts-expect-error - scripts are added dynamically to the entity
|
|
20
|
+
const script = app.root.findByName('boundary-wall')?.script?.boundaryWall;
|
|
21
|
+
if (script) {
|
|
22
|
+
script.center = center;
|
|
23
|
+
script.radius = radius;
|
|
24
|
+
script.groundPlane = groundPlane;
|
|
25
|
+
script.baseY = baseY;
|
|
26
|
+
script.rebuild();
|
|
27
|
+
}
|
|
28
|
+
}, [app, center, radius, groundPlane, baseY]);
|
|
29
|
+
return /*#__PURE__*/jsx(Entity, {
|
|
30
|
+
name: "boundary-wall",
|
|
31
|
+
children: /*#__PURE__*/jsx(Script, {
|
|
32
|
+
script: BoundaryWallScript
|
|
33
|
+
})
|
|
34
|
+
});
|
|
31
35
|
};
|
|
32
|
-
|
|
33
|
-
export default
|
|
36
|
+
|
|
37
|
+
export { BoundaryWall as default };
|