@tableslayer/ui 0.1.4 → 0.1.5

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 (206) hide show
  1. package/dist/components/PropsTable/PropsTable.svelte +1 -1
  2. package/package.json +9 -9
  3. package/src/lib/components/Avatar/Avatar.svelte +0 -82
  4. package/src/lib/components/Avatar/AvatarFileInput.svelte +0 -85
  5. package/src/lib/components/Avatar/AvatarPopover.svelte +0 -34
  6. package/src/lib/components/Avatar/index.ts +0 -4
  7. package/src/lib/components/Avatar/types.ts +0 -24
  8. package/src/lib/components/BrushSizeSlider/BrushSizeSlider.svelte +0 -174
  9. package/src/lib/components/BrushSizeSlider/index.ts +0 -1
  10. package/src/lib/components/Button/Button.svelte +0 -182
  11. package/src/lib/components/Button/ConfirmActionButton.svelte +0 -98
  12. package/src/lib/components/Button/IconButton.svelte +0 -121
  13. package/src/lib/components/Button/RadioButton.svelte +0 -93
  14. package/src/lib/components/Button/index.ts +0 -5
  15. package/src/lib/components/Button/types.ts +0 -54
  16. package/src/lib/components/CardFan/CardFan.svelte +0 -165
  17. package/src/lib/components/CardFan/index.ts +0 -2
  18. package/src/lib/components/CardFan/types.ts +0 -6
  19. package/src/lib/components/CodeBlock/Code.svelte +0 -7
  20. package/src/lib/components/CodeBlock/CodeBlock.svelte +0 -102
  21. package/src/lib/components/CodeBlock/index.ts +0 -3
  22. package/src/lib/components/CodeBlock/types.ts +0 -10
  23. package/src/lib/components/ColorMode/ColorMode.svelte +0 -8
  24. package/src/lib/components/ColorMode/index.ts +0 -2
  25. package/src/lib/components/ColorMode/types.ts +0 -12
  26. package/src/lib/components/ColorPicker/ColorPicker.svelte +0 -838
  27. package/src/lib/components/ColorPicker/ColorPickerSwatch.svelte +0 -32
  28. package/src/lib/components/ColorPicker/index.ts +0 -3
  29. package/src/lib/components/ColorPicker/types.ts +0 -51
  30. package/src/lib/components/ContextMenu/ContextMenu.svelte +0 -86
  31. package/src/lib/components/ContextMenu/index.ts +0 -2
  32. package/src/lib/components/ContextMenu/types.ts +0 -15
  33. package/src/lib/components/DrawingSliders/DrawingSliders.svelte +0 -379
  34. package/src/lib/components/DrawingSliders/index.ts +0 -1
  35. package/src/lib/components/Editor/Editor.svelte +0 -825
  36. package/src/lib/components/Editor/index.ts +0 -1
  37. package/src/lib/components/FogSliders/FogSliders.svelte +0 -33
  38. package/src/lib/components/FogSliders/index.ts +0 -1
  39. package/src/lib/components/Hr/Hr.svelte +0 -15
  40. package/src/lib/components/Hr/index.ts +0 -1
  41. package/src/lib/components/Icon/Icon.svelte +0 -6
  42. package/src/lib/components/Icon/index.ts +0 -2
  43. package/src/lib/components/Icon/types.ts +0 -20
  44. package/src/lib/components/Input/DualInputSlider.svelte +0 -126
  45. package/src/lib/components/Input/FileInput.svelte +0 -176
  46. package/src/lib/components/Input/FormControl.svelte +0 -150
  47. package/src/lib/components/Input/FormError.svelte +0 -37
  48. package/src/lib/components/Input/Input.svelte +0 -56
  49. package/src/lib/components/Input/InputCheckbox.svelte +0 -99
  50. package/src/lib/components/Input/InputSlider.svelte +0 -86
  51. package/src/lib/components/Input/Label.svelte +0 -19
  52. package/src/lib/components/Input/index.ts +0 -9
  53. package/src/lib/components/Input/types.ts +0 -39
  54. package/src/lib/components/Link/Link.svelte +0 -41
  55. package/src/lib/components/Link/LinkBox.svelte +0 -20
  56. package/src/lib/components/Link/LinkOverlay.svelte +0 -23
  57. package/src/lib/components/Link/index.ts +0 -4
  58. package/src/lib/components/Link/types.ts +0 -17
  59. package/src/lib/components/Loading/Loader.svelte +0 -60
  60. package/src/lib/components/Loading/Skeleton.svelte +0 -9
  61. package/src/lib/components/Loading/index.ts +0 -2
  62. package/src/lib/components/Logo/Logo.svelte +0 -16
  63. package/src/lib/components/Logo/index.ts +0 -1
  64. package/src/lib/components/MarkerTooltip/MarkerTooltip.svelte +0 -435
  65. package/src/lib/components/MarkerTooltip/index.ts +0 -1
  66. package/src/lib/components/Menu/SelectorMenu.svelte +0 -280
  67. package/src/lib/components/Menu/index.ts +0 -2
  68. package/src/lib/components/Menu/types.ts +0 -17
  69. package/src/lib/components/MyCounterButton.svelte +0 -11
  70. package/src/lib/components/Panel/index.ts +0 -2
  71. package/src/lib/components/Panel/panel.svelte +0 -18
  72. package/src/lib/components/Panel/types.ts +0 -8
  73. package/src/lib/components/PersistButton/PersistButton.svelte +0 -100
  74. package/src/lib/components/PersistButton/index.ts +0 -1
  75. package/src/lib/components/Popover/Popover.svelte +0 -81
  76. package/src/lib/components/Popover/index.ts +0 -2
  77. package/src/lib/components/Popover/types.ts +0 -19
  78. package/src/lib/components/PropsTable/PropsTable.svelte +0 -107
  79. package/src/lib/components/RadialMenu/EffectPreview.svelte +0 -36
  80. package/src/lib/components/RadialMenu/EffectPreviewScene.svelte +0 -194
  81. package/src/lib/components/RadialMenu/RadialMenu.svelte +0 -503
  82. package/src/lib/components/RadialMenu/RadialMenuItem.svelte +0 -176
  83. package/src/lib/components/RadialMenu/index.ts +0 -2
  84. package/src/lib/components/RadialMenu/types.ts +0 -35
  85. package/src/lib/components/Select/Select.svelte +0 -342
  86. package/src/lib/components/Select/index.ts +0 -2
  87. package/src/lib/components/Select/types.ts +0 -22
  88. package/src/lib/components/Spacer/Spacer.svelte +0 -14
  89. package/src/lib/components/Spacer/index.ts +0 -2
  90. package/src/lib/components/Spacer/types.ts +0 -5
  91. package/src/lib/components/Stage/components/AnnotationLayer/AnnotationLayer.svelte +0 -445
  92. package/src/lib/components/Stage/components/AnnotationLayer/AnnotationMaterial.svelte +0 -167
  93. package/src/lib/components/Stage/components/AnnotationLayer/types.ts +0 -196
  94. package/src/lib/components/Stage/components/CursorLayer/CursorLayer.svelte +0 -148
  95. package/src/lib/components/Stage/components/CursorLayer/cursor.svg +0 -26
  96. package/src/lib/components/Stage/components/CursorLayer/index.ts +0 -2
  97. package/src/lib/components/Stage/components/CursorLayer/types.ts +0 -23
  98. package/src/lib/components/Stage/components/DrawingLayer/DrawingMaterial.svelte +0 -364
  99. package/src/lib/components/Stage/components/DrawingLayer/types.ts +0 -65
  100. package/src/lib/components/Stage/components/EdgeOverlayLayer/EdgeOverlayLayer.svelte +0 -72
  101. package/src/lib/components/Stage/components/EdgeOverlayLayer/types.ts +0 -34
  102. package/src/lib/components/Stage/components/FogLayer/FogLayer.svelte +0 -75
  103. package/src/lib/components/Stage/components/FogLayer/types.ts +0 -51
  104. package/src/lib/components/Stage/components/FogOfWarLayer/FogOfWarLayer.svelte +0 -249
  105. package/src/lib/components/Stage/components/FogOfWarLayer/FogOfWarMaterial.svelte +0 -200
  106. package/src/lib/components/Stage/components/FogOfWarLayer/types.ts +0 -116
  107. package/src/lib/components/Stage/components/GridLayer/GridLayer.svelte +0 -20
  108. package/src/lib/components/Stage/components/GridLayer/GridMaterial.svelte +0 -69
  109. package/src/lib/components/Stage/components/GridLayer/types.ts +0 -79
  110. package/src/lib/components/Stage/components/LayerInput/LayerInput.svelte +0 -300
  111. package/src/lib/components/Stage/components/MapLayer/MapLayer.svelte +0 -196
  112. package/src/lib/components/Stage/components/MapLayer/dataSources/GifDataSource.ts +0 -265
  113. package/src/lib/components/Stage/components/MapLayer/dataSources/IMapDataSource.ts +0 -55
  114. package/src/lib/components/Stage/components/MapLayer/dataSources/ImageDataSource.ts +0 -87
  115. package/src/lib/components/Stage/components/MapLayer/dataSources/VideoDataSource.ts +0 -150
  116. package/src/lib/components/Stage/components/MapLayer/dataSources/dataSourceFactory.ts +0 -48
  117. package/src/lib/components/Stage/components/MapLayer/dataSources/index.ts +0 -16
  118. package/src/lib/components/Stage/components/MapLayer/types.ts +0 -58
  119. package/src/lib/components/Stage/components/MarkerLayer/MarkerLayer.svelte +0 -398
  120. package/src/lib/components/Stage/components/MarkerLayer/MarkerToken.svelte +0 -262
  121. package/src/lib/components/Stage/components/MarkerLayer/types.ts +0 -126
  122. package/src/lib/components/Stage/components/MeasurementLayer/MeasurementLayer.svelte +0 -364
  123. package/src/lib/components/Stage/components/MeasurementLayer/MeasurementManager.svelte +0 -473
  124. package/src/lib/components/Stage/components/MeasurementLayer/measurements/BaseMeasurement.ts +0 -427
  125. package/src/lib/components/Stage/components/MeasurementLayer/measurements/BeamMeasurement.ts +0 -105
  126. package/src/lib/components/Stage/components/MeasurementLayer/measurements/CircleMeasurement.ts +0 -98
  127. package/src/lib/components/Stage/components/MeasurementLayer/measurements/ConeMeasurement.ts +0 -163
  128. package/src/lib/components/Stage/components/MeasurementLayer/measurements/LineMeasurement.ts +0 -102
  129. package/src/lib/components/Stage/components/MeasurementLayer/measurements/RectangleMeasurement.ts +0 -120
  130. package/src/lib/components/Stage/components/MeasurementLayer/measurements/index.ts +0 -7
  131. package/src/lib/components/Stage/components/MeasurementLayer/types.ts +0 -94
  132. package/src/lib/components/Stage/components/MeasurementLayer/utils/canvasDrawing.ts +0 -357
  133. package/src/lib/components/Stage/components/MeasurementLayer/utils/distanceCalculations.ts +0 -170
  134. package/src/lib/components/Stage/components/ParticleSystem/ParticleSystem.svelte +0 -220
  135. package/src/lib/components/Stage/components/ParticleSystem/particles/atlases/ash.png +0 -0
  136. package/src/lib/components/Stage/components/ParticleSystem/particles/atlases/leaves.png +0 -0
  137. package/src/lib/components/Stage/components/ParticleSystem/particles/atlases/rain.png +0 -0
  138. package/src/lib/components/Stage/components/ParticleSystem/particles/atlases/snow.png +0 -0
  139. package/src/lib/components/Stage/components/ParticleSystem/rng.js +0 -20
  140. package/src/lib/components/Stage/components/ParticleSystem/types.ts +0 -95
  141. package/src/lib/components/Stage/components/PerformanceDebugger/PerformanceDebugger.svelte +0 -144
  142. package/src/lib/components/Stage/components/PerformanceDebugger/index.ts +0 -1
  143. package/src/lib/components/Stage/components/PerformanceOverlay/PerformanceOverlay.svelte +0 -208
  144. package/src/lib/components/Stage/components/PerformanceOverlay/index.ts +0 -1
  145. package/src/lib/components/Stage/components/PointerInputManager/PointerInputManager.svelte +0 -201
  146. package/src/lib/components/Stage/components/Scene/Scene.svelte +0 -651
  147. package/src/lib/components/Stage/components/Scene/luts.ts +0 -24
  148. package/src/lib/components/Stage/components/Scene/types.ts +0 -225
  149. package/src/lib/components/Stage/components/Stage/Stage.svelte +0 -332
  150. package/src/lib/components/Stage/components/Stage/types.ts +0 -136
  151. package/src/lib/components/Stage/components/WeatherLayer/WeatherLayer.svelte +0 -135
  152. package/src/lib/components/Stage/components/WeatherLayer/presets/AshPreset.ts +0 -71
  153. package/src/lib/components/Stage/components/WeatherLayer/presets/LeavesPreset.ts +0 -70
  154. package/src/lib/components/Stage/components/WeatherLayer/presets/RainPreset.ts +0 -68
  155. package/src/lib/components/Stage/components/WeatherLayer/presets/SnowPreset.ts +0 -70
  156. package/src/lib/components/Stage/components/WeatherLayer/presets/index.ts +0 -6
  157. package/src/lib/components/Stage/components/WeatherLayer/types.ts +0 -35
  158. package/src/lib/components/Stage/helpers/clippingPlaneStore.svelte.ts +0 -28
  159. package/src/lib/components/Stage/helpers/debugState.svelte.ts +0 -18
  160. package/src/lib/components/Stage/helpers/grid.ts +0 -548
  161. package/src/lib/components/Stage/helpers/lazyBrush.ts +0 -171
  162. package/src/lib/components/Stage/helpers/performanceMetrics.svelte.ts +0 -220
  163. package/src/lib/components/Stage/helpers/utils.ts +0 -21
  164. package/src/lib/components/Stage/index.ts +0 -49
  165. package/src/lib/components/Stage/shaders/AnnotationEffects.frag +0 -1070
  166. package/src/lib/components/Stage/shaders/Annotations.frag +0 -29
  167. package/src/lib/components/Stage/shaders/Drawing.frag +0 -83
  168. package/src/lib/components/Stage/shaders/Drawing.vert +0 -5
  169. package/src/lib/components/Stage/shaders/Fog.frag +0 -147
  170. package/src/lib/components/Stage/shaders/FractalNoise.frag +0 -96
  171. package/src/lib/components/Stage/shaders/GridShader.frag +0 -174
  172. package/src/lib/components/Stage/shaders/Overlay.frag +0 -23
  173. package/src/lib/components/Stage/shaders/Overlay.vert +0 -0
  174. package/src/lib/components/Stage/shaders/Particles.frag +0 -27
  175. package/src/lib/components/Stage/shaders/Particles.vert +0 -51
  176. package/src/lib/components/Stage/shaders/ToolOutline.frag +0 -59
  177. package/src/lib/components/Stage/shaders/default.vert +0 -8
  178. package/src/lib/components/Stage/types.ts +0 -4
  179. package/src/lib/components/Table/Table.svelte +0 -16
  180. package/src/lib/components/Table/Td.svelte +0 -17
  181. package/src/lib/components/Table/Th.svelte +0 -18
  182. package/src/lib/components/Table/index.ts +0 -4
  183. package/src/lib/components/Table/types.ts +0 -14
  184. package/src/lib/components/Text/Text.svelte +0 -23
  185. package/src/lib/components/Text/index.ts +0 -2
  186. package/src/lib/components/Text/types.ts +0 -12
  187. package/src/lib/components/Title/Title.svelte +0 -54
  188. package/src/lib/components/Title/index.ts +0 -2
  189. package/src/lib/components/Title/types.ts +0 -9
  190. package/src/lib/components/Toast/Toast.svelte +0 -155
  191. package/src/lib/components/Toast/index.ts +0 -5
  192. package/src/lib/components/Toast/toastCookie.ts +0 -24
  193. package/src/lib/components/Toast/types.ts +0 -6
  194. package/src/lib/components/ToolTip/ToolTip.svelte +0 -70
  195. package/src/lib/components/ToolTip/index.ts +0 -2
  196. package/src/lib/components/ToolTip/types.ts +0 -14
  197. package/src/lib/components/index.ts +0 -32
  198. package/src/lib/components/types.ts +0 -0
  199. package/src/lib/index.ts +0 -2
  200. package/src/lib/styles/globals.css +0 -108
  201. package/src/lib/styles/normalize.css +0 -9
  202. package/src/lib/styles/reset.css +0 -133
  203. package/src/lib/styles/utilities.css +0 -179
  204. package/src/lib/styles/vars.css +0 -1103
  205. package/src/lib/types/awareness.ts +0 -17
  206. package/src/lib/utils/rle.ts +0 -217
@@ -1,473 +0,0 @@
1
- <script lang="ts">
2
- import * as THREE from 'three';
3
- import { T, useTask } from '@threlte/core';
4
- import { onDestroy } from 'svelte';
5
- import { MeasurementType, type MeasurementLayerProps } from './types';
6
- import type { IMeasurement } from './measurements/BaseMeasurement';
7
- import { LineMeasurement } from './measurements/LineMeasurement';
8
- import { CircleMeasurement } from './measurements/CircleMeasurement';
9
- import { RectangleMeasurement } from './measurements/RectangleMeasurement';
10
- import { BeamMeasurement } from './measurements/BeamMeasurement';
11
- import { ConeMeasurement } from './measurements/ConeMeasurement';
12
- import { drawCircle } from './utils/canvasDrawing';
13
- import type { DisplayProps } from '../Stage/types';
14
- import type { GridLayerProps } from '../GridLayer/types';
15
- import { SceneLayer, SceneLayerOrder } from '../Scene/types';
16
-
17
- interface Props {
18
- props: MeasurementLayerProps;
19
- visible: boolean;
20
- displayProps: DisplayProps;
21
- gridProps: GridLayerProps;
22
- sceneRotation?: number;
23
- onFadeComplete?: () => void;
24
- }
25
-
26
- const { props, visible, displayProps, gridProps, sceneRotation = 0, onFadeComplete }: Props = $props();
27
-
28
- $effect(() => {
29
- console.log('[MeasurementManager] Grid props:', gridProps);
30
- });
31
-
32
- let currentMeasurement: IMeasurement | null = null;
33
- let measurementGroup = $state(new THREE.Group());
34
- let autoHideTimeoutId: ReturnType<typeof setTimeout> | null = null;
35
-
36
- // Fade animation state
37
- let isFading = $state(false);
38
- let fadeStartTime = $state(0);
39
- let fadeOpacity = $state(1.0);
40
- let receivedFadeoutTime = $state<number | null>(null); // Store fadeout time for received measurements
41
-
42
- // Preview indicator
43
- let previewMesh = $state(new THREE.Mesh());
44
- let previewMaterial = $state(new THREE.MeshBasicMaterial());
45
- let previewGeometry = $state(new THREE.PlaneGeometry());
46
- let previewSize = $derived(props ? props.markerSize + props.outlineThickness * 2 : 22);
47
- let showPreview = $state(false);
48
-
49
- // Task for fade animation
50
- useTask(() => {
51
- if (isFading && props) {
52
- const now = performance.now();
53
- const fadeElapsed = now - fadeStartTime;
54
- // Use receivedFadeoutTime if set, otherwise use props.fadeoutTime
55
- const fadeTime = receivedFadeoutTime ?? props.fadeoutTime;
56
- const progress = Math.min(fadeElapsed / fadeTime, 1);
57
-
58
- fadeOpacity = 1 - progress;
59
-
60
- // Update the opacity of all materials in the measurement group
61
- if (currentMeasurement) {
62
- if (currentMeasurement.shapeMesh.material instanceof THREE.MeshBasicMaterial) {
63
- currentMeasurement.shapeMesh.material.opacity = props.opacity * fadeOpacity;
64
- }
65
- if (currentMeasurement.textMesh.material instanceof THREE.MeshBasicMaterial) {
66
- currentMeasurement.textMesh.material.opacity = props.opacity * fadeOpacity;
67
- }
68
- }
69
-
70
- if (progress >= 1) {
71
- isFading = false;
72
- clearMeasurement();
73
- // Notify parent that fade is complete
74
- if (onFadeComplete) {
75
- onFadeComplete();
76
- }
77
- }
78
- }
79
- });
80
-
81
- onDestroy(() => {
82
- // Clear any pending auto-hide timeout
83
- if (autoHideTimeoutId !== null) {
84
- clearTimeout(autoHideTimeoutId);
85
- autoHideTimeoutId = null;
86
- }
87
-
88
- // Stop fade animation
89
- isFading = false;
90
-
91
- currentMeasurement?.dispose();
92
- if (previewGeometry) {
93
- previewGeometry.dispose();
94
- }
95
- if (previewMaterial) {
96
- if (previewMaterial.map) {
97
- previewMaterial.map.dispose();
98
- }
99
- previewMaterial.dispose();
100
- }
101
- });
102
-
103
- /**
104
- * Creates a canvas texture for the preview marker that matches the measurement point styling.
105
- * The marker uses the same visual properties (color, thickness, outline) as measurement start/end points.
106
- */
107
- $effect(() => {
108
- if (!props) return;
109
-
110
- // Create the preview marker texture
111
- const markerCanvas = createMarkerCanvas();
112
- const markerTexture = new THREE.CanvasTexture(markerCanvas);
113
- markerTexture.needsUpdate = true;
114
-
115
- // Dispose the old texture before assigning new one to prevent memory leak
116
- if (previewMaterial.map) {
117
- previewMaterial.map.dispose();
118
- }
119
-
120
- // Assign the texture to the preview material
121
- previewMaterial.map = markerTexture;
122
- previewMaterial.needsUpdate = true;
123
- });
124
-
125
- /**
126
- * Updates the preview indicator position and visibility based on mouse position and measurement state.
127
- * The preview is automatically hidden when a measurement is currently being created.
128
- *
129
- * @param {THREE.Vector2 | null} position - The world position where the preview should be displayed, or null to hide
130
- * @param {boolean} [visible=true] - Whether the preview should be visible (defaults to true)
131
- * @returns {void}
132
- */
133
- function updatePreview(position: THREE.Vector2 | null, visible: boolean = true): void {
134
- if (!position || currentMeasurement) {
135
- showPreview = false;
136
- return;
137
- }
138
-
139
- showPreview = visible;
140
- if (previewMesh && showPreview) {
141
- previewMesh.position.set(position.x, position.y, 0);
142
- }
143
- }
144
-
145
- /**
146
- * Hides the preview indicator from view.
147
- * Used when measurements are active or when the cursor leaves the measurement area.
148
- * @returns {void}
149
- */
150
- function hidePreview(): void {
151
- showPreview = false;
152
- }
153
-
154
- /**
155
- * Shows the preview indicator if no measurement is currently active.
156
- * Provides visual feedback for where the next measurement point will be placed.
157
- * @returns {void}
158
- */
159
- function showPreviewIndicator(): void {
160
- if (!currentMeasurement) {
161
- showPreview = true;
162
- }
163
- }
164
-
165
- /**
166
- * Creates a canvas texture for the measurement marker that matches the measurement point styling.
167
- * The marker uses the same visual properties (color, thickness, outline) as measurement start/end points.
168
- *
169
- * @returns {HTMLCanvasElement} A canvas element with the rendered marker that can be used as a texture
170
- */
171
- function createMarkerCanvas(): HTMLCanvasElement {
172
- const canvas = document.createElement('canvas');
173
- const context = canvas.getContext('2d', { colorSpace: 'srgb' })!;
174
-
175
- const width = previewSize;
176
- const height = previewSize;
177
-
178
- canvas.width = width;
179
- canvas.height = height;
180
-
181
- context.clearRect(0, 0, canvas.width, canvas.height);
182
-
183
- if (props) {
184
- drawCircle(
185
- context,
186
- previewSize / 2,
187
- previewSize / 2,
188
- props.markerSize / 2,
189
- props.color,
190
- props.outlineColor,
191
- props.outlineThickness
192
- );
193
- }
194
-
195
- return canvas;
196
- }
197
-
198
- /**
199
- * Starts a new measurement at the specified point based on the current measurement type.
200
- * Clears any existing measurement and creates the appropriate measurement class instance.
201
- *
202
- * @param {THREE.Vector2} startPoint - The world coordinates where the measurement should begin
203
- * @returns {void}
204
- */
205
- function startMeasurement(startPoint: THREE.Vector2): void {
206
- if (!props) return;
207
-
208
- // Clear any existing auto-hide timeout
209
- if (autoHideTimeoutId !== null) {
210
- clearTimeout(autoHideTimeoutId);
211
- autoHideTimeoutId = null;
212
- }
213
-
214
- // Reset fade state
215
- isFading = false;
216
- fadeOpacity = 1.0;
217
-
218
- clearMeasurement();
219
- showPreview = false; // Hide preview when starting measurement
220
-
221
- // Create new measurement based on type
222
- let measurement: IMeasurement;
223
-
224
- switch (props.type) {
225
- case MeasurementType.Line:
226
- measurement = new LineMeasurement(startPoint, props, displayProps, gridProps);
227
- break;
228
- case MeasurementType.Beam:
229
- measurement = new BeamMeasurement(startPoint, props, displayProps, gridProps);
230
- break;
231
- case MeasurementType.Cone:
232
- measurement = new ConeMeasurement(startPoint, props, displayProps, gridProps);
233
- break;
234
- case MeasurementType.Circle:
235
- measurement = new CircleMeasurement(startPoint, props, displayProps, gridProps);
236
- break;
237
- case MeasurementType.Square:
238
- measurement = new RectangleMeasurement(startPoint, props, displayProps, gridProps);
239
- break;
240
- default:
241
- measurement = new LineMeasurement(startPoint, props, displayProps, gridProps);
242
- break;
243
- }
244
-
245
- currentMeasurement = measurement;
246
- measurementGroup.add(measurement.object);
247
- }
248
-
249
- /**
250
- * Updates the current measurement with a new end point, typically called during mouse movement.
251
- * Recalculates measurement geometry and updates the visual representation in real-time.
252
- *
253
- * @param {THREE.Vector2} endPoint - The world coordinates for the current end point of the measurement
254
- * @returns {void}
255
- */
256
- function updateMeasurement(endPoint: THREE.Vector2): void {
257
- currentMeasurement?.update(endPoint, sceneRotation);
258
- }
259
-
260
- /**
261
- * Completes the current measurement and schedules its automatic removal.
262
- * The measurement is displayed for the duration specified by autoHideDelay, then fades out over fadeoutTime before being cleared.
263
- * @returns {void}
264
- */
265
- function finishMeasurement(): void {
266
- if (!currentMeasurement || !props) return;
267
-
268
- // Don't finish measurements with zero distance (same start and end point)
269
- const distance = currentMeasurement.startPoint.distanceTo(currentMeasurement.endPoint);
270
- if (distance === 0) {
271
- clearMeasurement();
272
- return;
273
- }
274
-
275
- autoHideTimeoutId = setTimeout(() => {
276
- // Start the fade animation
277
- fadeStartTime = performance.now();
278
- isFading = true;
279
- }, props.autoHideDelay);
280
- }
281
-
282
- /**
283
- * Removes the current measurement from the scene and disposes of its resources.
284
- * Cleans up Three.js objects to prevent memory leaks and resets the measurement state.
285
- * @returns {void}
286
- */
287
- function clearMeasurement(): void {
288
- // Clear any existing auto-hide timeout
289
- if (autoHideTimeoutId !== null) {
290
- clearTimeout(autoHideTimeoutId);
291
- autoHideTimeoutId = null;
292
- }
293
-
294
- // Reset fade state
295
- isFading = false;
296
- fadeOpacity = 1.0;
297
- receivedFadeoutTime = null; // Reset received fadeout time
298
-
299
- if (currentMeasurement) {
300
- currentMeasurement.dispose();
301
- currentMeasurement = null;
302
- measurementGroup.clear();
303
- }
304
- }
305
-
306
- /**
307
- * Displays a measurement received from another user (via Y.js).
308
- * Creates the measurement and immediately sets it to finished state to trigger auto-fade.
309
- *
310
- * @param {THREE.Vector2} startPoint - The starting point of the measurement
311
- * @param {THREE.Vector2} endPoint - The ending point of the measurement
312
- * @param {number} type - The type of measurement (MeasurementType enum)
313
- * @returns {void}
314
- */
315
- function displayReceivedMeasurement(
316
- startPoint: THREE.Vector2,
317
- endPoint: THREE.Vector2,
318
- type: number,
319
- beamWidth?: number,
320
- coneAngle?: number,
321
- color?: string,
322
- thickness?: number,
323
- outlineColor?: string,
324
- outlineThickness?: number,
325
- opacity?: number,
326
- markerSize?: number,
327
- autoHideDelay?: number,
328
- fadeoutTime?: number,
329
- showDistance?: boolean,
330
- snapToGrid?: boolean,
331
- enableDMG252?: boolean
332
- ): void {
333
- if (!props) {
334
- console.log('[MeasurementManager] No props available for displayReceivedMeasurement');
335
- return;
336
- }
337
-
338
- console.log('[MeasurementManager] displayReceivedMeasurement called:', {
339
- startPoint,
340
- endPoint,
341
- type,
342
- beamWidth,
343
- coneAngle,
344
- thickness,
345
- hasCurrentMeasurement: !!currentMeasurement
346
- });
347
-
348
- // Clear any existing measurement
349
- clearMeasurement();
350
-
351
- // Create the appropriate measurement type
352
- let measurement: IMeasurement;
353
-
354
- // Use the received properties if provided, override the props temporarily
355
- const measurementProps = {
356
- ...props,
357
- type,
358
- ...(beamWidth !== undefined && { beamWidth }),
359
- ...(coneAngle !== undefined && { coneAngle }),
360
- ...(color !== undefined && { color }),
361
- ...(thickness !== undefined && { thickness }),
362
- ...(outlineColor !== undefined && { outlineColor }),
363
- ...(outlineThickness !== undefined && { outlineThickness }),
364
- ...(opacity !== undefined && { opacity }),
365
- ...(markerSize !== undefined && { markerSize }),
366
- ...(autoHideDelay !== undefined && { autoHideDelay }),
367
- ...(fadeoutTime !== undefined && { fadeoutTime }),
368
- ...(showDistance !== undefined && { showDistance }),
369
- ...(snapToGrid !== undefined && { snapToGrid }),
370
- ...(enableDMG252 !== undefined && { enableDMG252 })
371
- };
372
-
373
- switch (type) {
374
- case MeasurementType.Line:
375
- measurement = new LineMeasurement(startPoint, measurementProps, displayProps, gridProps);
376
- break;
377
- case MeasurementType.Beam:
378
- measurement = new BeamMeasurement(startPoint, measurementProps, displayProps, gridProps);
379
- break;
380
- case MeasurementType.Cone:
381
- measurement = new ConeMeasurement(startPoint, measurementProps, displayProps, gridProps);
382
- break;
383
- case MeasurementType.Circle:
384
- measurement = new CircleMeasurement(startPoint, measurementProps, displayProps, gridProps);
385
- break;
386
- case MeasurementType.Square:
387
- measurement = new RectangleMeasurement(startPoint, measurementProps, displayProps, gridProps);
388
- break;
389
- default:
390
- measurement = new LineMeasurement(startPoint, measurementProps, displayProps, gridProps);
391
- break;
392
- }
393
-
394
- // Set the measurement
395
- currentMeasurement = measurement;
396
- measurementGroup.add(measurement.object);
397
-
398
- console.log('[MeasurementManager] Measurement created and added to group:', {
399
- groupChildren: measurementGroup.children.length,
400
- measurementObject: measurement.object,
401
- visible: measurementGroup.visible
402
- });
403
-
404
- // Update to the end point
405
- currentMeasurement.update(endPoint, sceneRotation);
406
-
407
- console.log('[MeasurementManager] Measurement updated to endpoint');
408
-
409
- // Store the fadeout time if provided for the fade animation
410
- if (fadeoutTime !== undefined) {
411
- receivedFadeoutTime = fadeoutTime;
412
- }
413
-
414
- // Schedule auto-fade with the received timing properties
415
- const delay = autoHideDelay ?? props.autoHideDelay;
416
- console.log(
417
- '[MeasurementManager] Scheduling auto-fade with delay:',
418
- delay,
419
- 'fadeTime:',
420
- fadeoutTime ?? props.fadeoutTime
421
- );
422
-
423
- autoHideTimeoutId = setTimeout(() => {
424
- // Start the fade animation
425
- fadeStartTime = performance.now();
426
- isFading = true;
427
- }, delay);
428
-
429
- console.log('[MeasurementManager] Measurement auto-fade scheduled');
430
- }
431
-
432
- // Export the methods for use by parent components
433
- export {
434
- startMeasurement,
435
- updateMeasurement,
436
- finishMeasurement,
437
- clearMeasurement,
438
- updatePreview,
439
- hidePreview,
440
- showPreviewIndicator,
441
- displayReceivedMeasurement
442
- };
443
- </script>
444
-
445
- <!-- Measurement Group -->
446
- <!-- Always visible to show received measurements in playfield -->
447
- <T.Group
448
- bind:ref={measurementGroup}
449
- visible={true}
450
- layers={[SceneLayer.Overlay]}
451
- renderOrder={SceneLayerOrder.Measurement}
452
- >
453
- <!-- Measurement objects will be added here dynamically -->
454
- </T.Group>
455
-
456
- <!-- Preview indicator -->
457
- <T.Mesh
458
- bind:ref={previewMesh}
459
- visible={showPreview && visible}
460
- layers={[SceneLayer.Overlay]}
461
- renderOrder={SceneLayerOrder.Measurement}
462
- >
463
- <T.MeshBasicMaterial
464
- bind:ref={previewMaterial}
465
- transparent={true}
466
- opacity={props?.opacity ?? 1}
467
- side={THREE.DoubleSide}
468
- depthWrite={false}
469
- depthTest={false}
470
- toneMapped={false}
471
- />
472
- <T.PlaneGeometry bind:ref={previewGeometry} args={[previewSize, previewSize]} />
473
- </T.Mesh>