@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.
Files changed (295) hide show
  1. package/components/AntSwitch/index.js +22 -19
  2. package/components/Autocomplete/Autocomplete.js +130 -106
  3. package/components/Badge/index.js +29 -28
  4. package/components/BusySpinner/index.js +45 -40
  5. package/components/Button/Button.js +47 -41
  6. package/components/Checkbox.js +63 -64
  7. package/components/Confirm/index.js +83 -74
  8. package/components/DatePicker/DatePicker.js +141 -138
  9. package/components/DialogBox/DialogBox.js +118 -111
  10. package/components/Divisor.js +18 -18
  11. package/components/Dropdown.js +94 -66
  12. package/components/EditableTable/index.js +271 -211
  13. package/components/ErrorBox/ErrorBox.js +49 -47
  14. package/components/FileChooser/index.js +135 -117
  15. package/components/FormBottomBar/index.js +84 -75
  16. package/components/Icon/Icon.js +20 -12
  17. package/components/Icon/icons/index.js +256 -256
  18. package/components/IconTooltip/index.js +60 -49
  19. package/components/Map/MapBox.js +452 -545
  20. package/components/Map/MapContainer.js +29 -25
  21. package/components/Map/MapDateSliderControl.js +64 -64
  22. package/components/Map/MapDrawer.js +47 -41
  23. package/components/Map/MapLegend.js +172 -176
  24. package/components/Map/MapViewStyleControl.js +63 -59
  25. package/components/Map/ReactMapboxWrapper.js +2 -3
  26. package/components/Map/index.js +180 -161
  27. package/components/Map/types.js +17 -12
  28. package/components/Map/useMaintainLayerOrder.js +26 -16
  29. package/components/Markdown/index.js +26 -25
  30. package/components/Message/Message.js +76 -73
  31. package/components/MultiSelect/index.js +124 -112
  32. package/components/Navbar/NavFooter.js +13 -9
  33. package/components/Navbar/NavItem.js +76 -70
  34. package/components/Navbar/NavSection.js +19 -17
  35. package/components/Navbar/Navbar.js +46 -39
  36. package/components/Navbar/SubNavbar.js +13 -9
  37. package/components/Note.js +22 -18
  38. package/components/OverlayModal/OverlayModal.js +63 -56
  39. package/components/PageForm/index.js +41 -33
  40. package/components/PhotoChooser/index.js +173 -165
  41. package/components/PhotosCarousel/PhotoSlide.js +35 -32
  42. package/components/PhotosCarousel/index.js +85 -80
  43. package/components/PhotosCarousel/usePhotosCarousel.js +76 -69
  44. package/components/Pill/index.js +45 -41
  45. package/components/PillList/index.js +24 -17
  46. package/components/PlacementWrapper/index.js +59 -38
  47. package/components/PopoverMenu/Popover.js +85 -68
  48. package/components/PopoverMenu/index.js +56 -51
  49. package/components/PopoverMultiSelect/index.js +59 -52
  50. package/components/ProgressCircle/ProgressCircle.js +32 -28
  51. package/components/RadioButton.js +19 -17
  52. package/components/Select/Select.js +15 -13
  53. package/components/Select/SelectT.js +250 -235
  54. package/components/Separator/index.js +17 -14
  55. package/components/Size.js +1 -0
  56. package/components/Slider/index.js +56 -43
  57. package/components/SummaryBox.js +72 -70
  58. package/components/Tabs/index.js +135 -133
  59. package/components/TextTruncated/index.js +130 -117
  60. package/components/Textfield/Textfield.js +190 -158
  61. package/components/Textfield/TruncatedTextArea.js +84 -70
  62. package/components/TimelineSlider/TimelineMarker.js +30 -25
  63. package/components/TimelineSlider/TimelineRail.js +11 -8
  64. package/components/TimelineSlider/index.js +66 -64
  65. package/components/TimelineSliderV2/ClusterBadge.js +29 -25
  66. package/components/TimelineSliderV2/TimelineDot.js +35 -31
  67. package/components/TimelineSliderV2/TimelineRail.js +11 -8
  68. package/components/TimelineSliderV2/index.js +103 -121
  69. package/components/TimelineSliderV2/layout.js +147 -124
  70. package/components/TimelineSliderV2/types.js +1 -0
  71. package/components/Tooltip/Tooltip.js +56 -47
  72. package/components/ViewPhotosDialog/index.js +35 -28
  73. package/components/VirtualWalkthrough/Annotation.js +207 -163
  74. package/components/VirtualWalkthrough/AnnotationEditPane.js +184 -198
  75. package/components/VirtualWalkthrough/AnnotationPanel.js +199 -187
  76. package/components/VirtualWalkthrough/Application.js +34 -31
  77. package/components/VirtualWalkthrough/AutoRotator.js +223 -85
  78. package/components/VirtualWalkthrough/BlockingSpinner.js +28 -26
  79. package/components/VirtualWalkthrough/BoundaryRing.js +34 -30
  80. package/components/VirtualWalkthrough/BoundaryWall.js +36 -32
  81. package/components/VirtualWalkthrough/CameraInfo.js +89 -100
  82. package/components/VirtualWalkthrough/ControlsInfoPane.js +195 -254
  83. package/components/VirtualWalkthrough/GradientSky.js +73 -72
  84. package/components/VirtualWalkthrough/SplatControls.js +221 -209
  85. package/components/VirtualWalkthrough/SplatCrop.js +20 -21
  86. package/components/VirtualWalkthrough/SplatFadeCrop.js +20 -21
  87. package/components/VirtualWalkthrough/SplatModel.js +85 -65
  88. package/components/VirtualWalkthrough/SplatRevealRain.js +46 -41
  89. package/components/VirtualWalkthrough/TfAnnotationManager.js +379 -197
  90. package/components/VirtualWalkthrough/TfXrNavigation.js +162 -73
  91. package/components/VirtualWalkthrough/VirtualWalkthroughViewer.js +431 -438
  92. package/components/VirtualWalkthrough/VrAnnotationPanel.js +22 -18
  93. package/components/VirtualWalkthrough/XrAnnotationInteraction.js +17 -14
  94. package/components/VirtualWalkthrough/XrExitButton.js +17 -14
  95. package/components/VirtualWalkthrough/XrGazeDwell.js +17 -14
  96. package/components/VirtualWalkthrough/XrPointerRay.js +17 -14
  97. package/components/VirtualWalkthrough/XrStartPose.js +121 -67
  98. package/components/VirtualWalkthrough/boundary-ring.js +117 -87
  99. package/components/VirtualWalkthrough/boundary-wall.js +258 -175
  100. package/components/VirtualWalkthrough/camera-adoption.js +64 -18
  101. package/components/VirtualWalkthrough/groundPlane.js +47 -32
  102. package/components/VirtualWalkthrough/gsplat-fade-crop-effect.js +35 -35
  103. package/components/VirtualWalkthrough/splatFormat.js +47 -13
  104. package/components/VirtualWalkthrough/useAdoptedCamera.js +44 -23
  105. package/components/VirtualWalkthrough/useRestartOnVr.js +37 -26
  106. package/components/VirtualWalkthrough/useXrRenderTuning.js +54 -33
  107. package/components/VirtualWalkthrough/vr-annotation-panel-layout.js +99 -67
  108. package/components/VirtualWalkthrough/vr-annotation-panel.js +433 -403
  109. package/components/VirtualWalkthrough/vr-annotation-scroll.js +28 -10
  110. package/components/VirtualWalkthrough/walkthrough-camera.js +329 -204
  111. package/components/VirtualWalkthrough/xr-annotation-candidate-buffer.js +80 -39
  112. package/components/VirtualWalkthrough/xr-annotation-candidates.js +18 -6
  113. package/components/VirtualWalkthrough/xr-annotation-interaction.js +56 -31
  114. package/components/VirtualWalkthrough/xr-annotation-targeting.js +38 -22
  115. package/components/VirtualWalkthrough/xr-button-arming.js +17 -7
  116. package/components/VirtualWalkthrough/xr-button-hold.js +36 -22
  117. package/components/VirtualWalkthrough/xr-exit-button-mask.js +36 -22
  118. package/components/VirtualWalkthrough/xr-exit-button.js +207 -148
  119. package/components/VirtualWalkthrough/xr-face-buttons.js +29 -19
  120. package/components/VirtualWalkthrough/xr-gaze-dwell-state.js +34 -23
  121. package/components/VirtualWalkthrough/xr-gaze-dwell.js +144 -107
  122. package/components/VirtualWalkthrough/xr-interactive-ui.js +24 -12
  123. package/components/VirtualWalkthrough/xr-pointer-ray.js +20 -13
  124. package/components/VirtualWalkthrough/xr-progress-pie-material.js +88 -117
  125. package/components/VirtualWalkthrough/xr-progress-pie.js +10 -1
  126. package/components/VirtualWalkthrough/xr-ray-quad.js +30 -16
  127. package/components/VirtualWalkthrough/xr-render-tuning.js +48 -17
  128. package/components/VirtualWalkthrough/xr-scene-bounds.js +37 -21
  129. package/components/VirtualWalkthrough/xr-start-pose.js +73 -27
  130. package/components/VirtualWalkthrough/xr-teleport-gesture.js +42 -16
  131. package/components/svg/BlobbyGrayIconImage.js +39 -41
  132. package/components/svg/BlobbyGrayIconImport.js +39 -41
  133. package/components/svg/BlobbyGrayIconUploadToTheCloud.js +39 -41
  134. package/components/svg/BlobbyIconCloudChecked.js +164 -202
  135. package/components/svg/BlobbyIconExportOrUploadPhoto.js +164 -202
  136. package/components/svg/BlobbyIconFolder.js +164 -202
  137. package/components/svg/BlobbyIconGraphReport.js +164 -202
  138. package/components/svg/BlobbyIconHappy.js +164 -202
  139. package/components/svg/BlobbyIconHeartMonitor.js +164 -202
  140. package/components/svg/BlobbyIconLeaf.js +164 -202
  141. package/components/svg/BlobbyIconLibrary.js +164 -202
  142. package/components/svg/BlobbyIconNursery.js +166 -204
  143. package/components/svg/BlobbyIconOrganization.js +164 -202
  144. package/components/svg/BlobbyIconParchment.js +164 -202
  145. package/components/svg/BlobbyIconPeople.js +164 -202
  146. package/components/svg/BlobbyIconSeedBank.js +164 -202
  147. package/components/svg/BlobbyIconSeedling.js +164 -202
  148. package/components/svg/BlobbyIconSeeds.js +164 -202
  149. package/components/svg/BlobbyIconSite.js +167 -206
  150. package/components/svg/BlobbyIconSparkles.js +164 -202
  151. package/components/svg/BlobbyIconWrench.js +164 -202
  152. package/components/svg/Bug.js +21 -19
  153. package/components/svg/Calendar.js +21 -19
  154. package/components/svg/CaretDown.js +21 -19
  155. package/components/svg/CaretLeft.js +21 -19
  156. package/components/svg/CaretRight.js +21 -19
  157. package/components/svg/CaretUp.js +21 -19
  158. package/components/svg/ChevronDown.js +21 -19
  159. package/components/svg/ChevronUp.js +21 -19
  160. package/components/svg/Close.js +21 -19
  161. package/components/svg/Critical.js +21 -19
  162. package/components/svg/Edit.js +164 -202
  163. package/components/svg/Error.js +21 -19
  164. package/components/svg/Filter.js +21 -19
  165. package/components/svg/Folder.js +21 -19
  166. package/components/svg/Help.js +21 -19
  167. package/components/svg/Home.js +21 -19
  168. package/components/svg/IconAdd.js +21 -19
  169. package/components/svg/IconArrowRight.js +23 -21
  170. package/components/svg/IconBusinessNetwork.js +21 -19
  171. package/components/svg/IconCalendar.js +21 -19
  172. package/components/svg/IconCancel.js +21 -19
  173. package/components/svg/IconChargingBattery.js +21 -19
  174. package/components/svg/IconChecklist.js +23 -21
  175. package/components/svg/IconCheckmark.js +21 -19
  176. package/components/svg/IconCoinInHand.js +21 -19
  177. package/components/svg/IconColumns.js +21 -19
  178. package/components/svg/IconComment.js +22 -20
  179. package/components/svg/IconDashboard.js +21 -19
  180. package/components/svg/IconDataMigration.js +21 -19
  181. package/components/svg/IconDocument.js +23 -21
  182. package/components/svg/IconDownloadFromTheCloud.js +23 -21
  183. package/components/svg/IconEdit.js +23 -21
  184. package/components/svg/IconExpand.js +23 -21
  185. package/components/svg/IconExport.js +21 -19
  186. package/components/svg/IconExternalLink.js +21 -19
  187. package/components/svg/IconEye.js +21 -19
  188. package/components/svg/IconEyeOff.js +21 -19
  189. package/components/svg/IconFile.js +21 -19
  190. package/components/svg/IconFolder.js +21 -19
  191. package/components/svg/IconFullScreen.js +22 -20
  192. package/components/svg/IconFutures.js +21 -19
  193. package/components/svg/IconGraphReport.js +21 -19
  194. package/components/svg/IconGrid.js +21 -19
  195. package/components/svg/IconHeartMonitor.js +21 -19
  196. package/components/svg/IconHelp.js +23 -21
  197. package/components/svg/IconHistory.js +21 -19
  198. package/components/svg/IconImport.js +21 -19
  199. package/components/svg/IconIndex.js +21 -19
  200. package/components/svg/IconLayers.js +21 -19
  201. package/components/svg/IconLibrary.js +22 -20
  202. package/components/svg/IconList.js +21 -19
  203. package/components/svg/IconLivePlant.js +21 -19
  204. package/components/svg/IconLocations.js +21 -19
  205. package/components/svg/IconMail.js +21 -19
  206. package/components/svg/IconManager.js +21 -19
  207. package/components/svg/IconMap.js +21 -19
  208. package/components/svg/IconMarker.js +21 -19
  209. package/components/svg/IconMenu.js +21 -19
  210. package/components/svg/IconMenuHorizontal.js +21 -19
  211. package/components/svg/IconModule.js +21 -19
  212. package/components/svg/IconMyLocation.js +21 -19
  213. package/components/svg/IconNote.js +23 -21
  214. package/components/svg/IconNursery.js +23 -21
  215. package/components/svg/IconOrg.js +21 -19
  216. package/components/svg/IconParchment.js +21 -19
  217. package/components/svg/IconPhoto.js +21 -19
  218. package/components/svg/IconPlantsFilled.js +21 -19
  219. package/components/svg/IconRedo.js +21 -19
  220. package/components/svg/IconRestorationSite.js +21 -19
  221. package/components/svg/IconSeedBank.js +21 -19
  222. package/components/svg/IconSeedling.js +21 -19
  223. package/components/svg/IconSettings.js +21 -19
  224. package/components/svg/IconSlice.js +21 -19
  225. package/components/svg/IconSubmit.js +21 -19
  226. package/components/svg/IconSubtract.js +23 -21
  227. package/components/svg/IconSynced.js +21 -19
  228. package/components/svg/IconTrashCan.js +21 -19
  229. package/components/svg/IconTreasureMap.js +21 -19
  230. package/components/svg/IconUnavailable.js +21 -19
  231. package/components/svg/IconUndo.js +21 -19
  232. package/components/svg/IconVariable.js +21 -19
  233. package/components/svg/IconVideo.js +31 -30
  234. package/components/svg/IconWifi.js +21 -19
  235. package/components/svg/Info.js +21 -19
  236. package/components/svg/Key.js +21 -19
  237. package/components/svg/Leaf.js +21 -19
  238. package/components/svg/Lock.js +21 -19
  239. package/components/svg/Logo.js +43 -48
  240. package/components/svg/MenuVertical.js +21 -19
  241. package/components/svg/Notification.js +21 -19
  242. package/components/svg/Person.js +21 -19
  243. package/components/svg/Plus.js +21 -19
  244. package/components/svg/RestorationSite.js +21 -19
  245. package/components/svg/Search.js +21 -19
  246. package/components/svg/Seeds.js +21 -19
  247. package/components/svg/Site.js +21 -19
  248. package/components/svg/Sparkles.js +21 -19
  249. package/components/svg/Species.js +21 -19
  250. package/components/svg/Species2.js +164 -202
  251. package/components/svg/Spinner.js +48 -54
  252. package/components/svg/Star.js +21 -19
  253. package/components/svg/Success.js +21 -19
  254. package/components/svg/SuccessFilled.js +21 -19
  255. package/components/svg/TerrawareLogoDesktop.js +49 -55
  256. package/components/svg/TerrawareLogoMobile.js +26 -25
  257. package/components/svg/Touchscreen.js +21 -19
  258. package/components/svg/UploadCloud.js +164 -202
  259. package/components/svg/Warning.js +21 -19
  260. package/components/svg/WelcomeClipboard.js +133 -156
  261. package/components/svg/index.js +129 -129
  262. package/components/table/EnhancedTableToolbar.js +74 -68
  263. package/components/table/EnhancedTableToolbarV2.js +41 -31
  264. package/components/table/TableCellRenderer.js +231 -196
  265. package/components/table/TableHeader.js +73 -71
  266. package/components/table/TableHeaderItem.js +102 -97
  267. package/components/table/density.js +19 -18
  268. package/components/table/index.js +369 -350
  269. package/components/table/sort.js +52 -27
  270. package/components/table/types.js +1 -0
  271. package/components/types/index.js +1 -0
  272. package/hooks/cameraEntityContext.js +13 -2
  273. package/hooks/useBoolean.js +13 -17
  274. package/hooks/useCameraPosition.js +56 -56
  275. package/hooks/useDevicePerformance.js +17 -17
  276. package/hooks/useXr.js +87 -85
  277. package/index.js +58 -58
  278. package/package.json +1 -1
  279. package/setupTests.js +4 -0
  280. package/strings/export.js +170 -111
  281. package/strings/index.js +54 -25
  282. package/strings/locales.js +41 -21
  283. package/strings/strings-en.js +51 -49
  284. package/strings/strings-es.js +51 -49
  285. package/strings/strings-fr.js +51 -49
  286. package/strings/strings-gx.js +51 -49
  287. package/style-dictionary-dist/TerrawareTheme.js +186 -186
  288. package/theme.js +76 -74
  289. package/utils/color.js +15 -8
  290. package/utils/date.js +108 -42
  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 +79 -42
  295. package/virtualWalkthrough.js +23 -23
@@ -1,97 +1,235 @@
1
- import { Quat, Script, Vec3 } from "playcanvas";
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
- static scriptName = 'autoRotator';
4
- speed = 4;
5
- startDelay = 5;
6
- restartDelay = 2;
7
- startFadeInTime = 5;
8
- timer = 0;
9
- hasStartedRotating = false;
10
- isCurrentlyRotating = false;
11
- pitch = null;
12
- yaw = null;
13
- cameraEntity = null;
14
- cameraControls = null;
15
- walkthroughCamera = null;
16
- onPointerDown;
17
- onKeyDown;
18
- handleUserInput() {
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
- initialize() {
24
- this.onPointerDown = this.handleUserInput.bind(this);
25
- this.onKeyDown = this.handleUserInput.bind(this);
26
- if (this.app.graphicsDevice.canvas) this.app.graphicsDevice.canvas.addEventListener('pointerdown', this.onPointerDown);
27
- window.addEventListener('keydown', this.onKeyDown);
28
- this.resolveCamera();
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
- resolveCamera() {
31
- this.cameraEntity = this.entity.findComponent('camera')?.entity ?? null;
32
- this.cameraControls = this.cameraEntity?.script?.cameraControls ?? null;
33
- const rigWalkthroughCamera = this.entity.script?.walkthroughCamera;
34
- this.walkthroughCamera = rigWalkthroughCamera ?? this.cameraEntity?.script?.walkthroughCamera ?? null;
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
- postUpdate(dt) {
37
- if (!this.cameraControls && !this.walkthroughCamera) this.resolveCamera();
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
- smoothStep(x) {
88
- if (x <= 0) return 0;
89
- if (x >= 1) return 1;
90
- return 0.5 * Math.sin((x - 0.5) * Math.PI) + 0.5;
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
- destroy() {
93
- if (this.app.graphicsDevice.canvas && this.onPointerDown) this.app.graphicsDevice.canvas.removeEventListener('pointerdown', this.onPointerDown);
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 { jsx } from "react/jsx-runtime";
2
- import "react";
3
- import { CircularProgress, StyledEngineProvider, useTheme } from "@mui/material";
1
+ import 'react';
2
+ import { useTheme, StyledEngineProvider, CircularProgress } from '@mui/material';
3
+ import { jsx } from 'react/jsx-runtime';
4
+
4
5
  function BlockingSpinner() {
5
- const theme = useTheme();
6
- return /*#__PURE__*/ jsx(StyledEngineProvider, {
7
- injectFirst: true,
8
- children: /*#__PURE__*/ jsx(CircularProgress, {
9
- size: "193",
10
- sx: {
11
- height: '200px',
12
- width: '200px',
13
- position: 'absolute',
14
- top: 0,
15
- bottom: 0,
16
- left: 0,
17
- right: 0,
18
- margin: 'auto',
19
- '& .MuiCircularProgress-svg': {
20
- color: theme.palette.TwClrIcnBrand,
21
- height: '200px',
22
- width: '200px'
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
- export default BlockingSpinner;
29
+
30
+ export { BlockingSpinner as default };
@@ -1,31 +1,35 @@
1
- import { jsx } from "react/jsx-runtime";
2
- import { useEffect } from "react";
3
- import { Entity } from "@playcanvas/react";
4
- import { Script } from "@playcanvas/react/components";
5
- import { useApp } from "@playcanvas/react/hooks";
6
- import { BoundaryRingScript } from "./boundary-ring.js";
7
- const BoundaryRing = ({ center, radius, groundPlane })=>{
8
- const app = useApp();
9
- useEffect(()=>{
10
- const script = app.root.findByName('boundary-ring')?.script?.boundaryRing;
11
- if (script) {
12
- script.center = center;
13
- script.radius = radius;
14
- script.groundPlane = groundPlane;
15
- script.rebuild();
16
- }
17
- }, [
18
- app,
19
- center,
20
- radius,
21
- groundPlane
22
- ]);
23
- return /*#__PURE__*/ jsx(Entity, {
24
- name: "boundary-ring",
25
- children: /*#__PURE__*/ jsx(Script, {
26
- script: BoundaryRingScript
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
- const VirtualWalkthrough_BoundaryRing = BoundaryRing;
31
- export default VirtualWalkthrough_BoundaryRing;
34
+
35
+ export { BoundaryRing as default };
@@ -1,33 +1,37 @@
1
- import { jsx } from "react/jsx-runtime";
2
- import { useEffect } from "react";
3
- import { Entity } from "@playcanvas/react";
4
- import { Script } from "@playcanvas/react/components";
5
- import { useApp } from "@playcanvas/react/hooks";
6
- import { BoundaryWallScript } from "./boundary-wall.js";
7
- const BoundaryWall = ({ center, radius, groundPlane, baseY })=>{
8
- const app = useApp();
9
- useEffect(()=>{
10
- const script = app.root.findByName('boundary-wall')?.script?.boundaryWall;
11
- if (script) {
12
- script.center = center;
13
- script.radius = radius;
14
- script.groundPlane = groundPlane;
15
- script.baseY = baseY;
16
- script.rebuild();
17
- }
18
- }, [
19
- app,
20
- center,
21
- radius,
22
- groundPlane,
23
- baseY
24
- ]);
25
- return /*#__PURE__*/ jsx(Entity, {
26
- name: "boundary-wall",
27
- children: /*#__PURE__*/ jsx(Script, {
28
- script: BoundaryWallScript
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
- const VirtualWalkthrough_BoundaryWall = BoundaryWall;
33
- export default VirtualWalkthrough_BoundaryWall;
36
+
37
+ export { BoundaryWall as default };