@terraware/web-components 5.0.26 → 5.0.27-rc.0

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