@tonybfox/threejs-tools 1.0.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 (80) hide show
  1. package/README.md +321 -0
  2. package/dist/asset-loader/index.cjs +376 -0
  3. package/dist/asset-loader/index.cjs.map +1 -0
  4. package/dist/asset-loader/index.d.mts +101 -0
  5. package/dist/asset-loader/index.d.ts +101 -0
  6. package/dist/asset-loader/index.mjs +7 -0
  7. package/dist/asset-loader/index.mjs.map +1 -0
  8. package/dist/camera/index.cjs +313 -0
  9. package/dist/camera/index.cjs.map +1 -0
  10. package/dist/camera/index.d.mts +82 -0
  11. package/dist/camera/index.d.ts +82 -0
  12. package/dist/camera/index.mjs +7 -0
  13. package/dist/camera/index.mjs.map +1 -0
  14. package/dist/chunk-5DP6WDB3.mjs +1161 -0
  15. package/dist/chunk-5DP6WDB3.mjs.map +1 -0
  16. package/dist/chunk-BJKSICFA.mjs +1579 -0
  17. package/dist/chunk-BJKSICFA.mjs.map +1 -0
  18. package/dist/chunk-BYRZCHE7.mjs +277 -0
  19. package/dist/chunk-BYRZCHE7.mjs.map +1 -0
  20. package/dist/chunk-EIROAPF7.mjs +387 -0
  21. package/dist/chunk-EIROAPF7.mjs.map +1 -0
  22. package/dist/chunk-EQDOX34V.mjs +164 -0
  23. package/dist/chunk-EQDOX34V.mjs.map +1 -0
  24. package/dist/chunk-IIAZ2WJJ.mjs +405 -0
  25. package/dist/chunk-IIAZ2WJJ.mjs.map +1 -0
  26. package/dist/chunk-L4VIIJZD.mjs +340 -0
  27. package/dist/chunk-L4VIIJZD.mjs.map +1 -0
  28. package/dist/chunk-P35QJCOG.mjs +339 -0
  29. package/dist/chunk-P35QJCOG.mjs.map +1 -0
  30. package/dist/chunk-R64RVBRM.mjs +394 -0
  31. package/dist/chunk-R64RVBRM.mjs.map +1 -0
  32. package/dist/compass/index.cjs +375 -0
  33. package/dist/compass/index.cjs.map +1 -0
  34. package/dist/compass/index.d.mts +58 -0
  35. package/dist/compass/index.d.ts +58 -0
  36. package/dist/compass/index.mjs +7 -0
  37. package/dist/compass/index.mjs.map +1 -0
  38. package/dist/grid/index.cjs +200 -0
  39. package/dist/grid/index.cjs.map +1 -0
  40. package/dist/grid/index.d.mts +43 -0
  41. package/dist/grid/index.d.ts +43 -0
  42. package/dist/grid/index.mjs +7 -0
  43. package/dist/grid/index.mjs.map +1 -0
  44. package/dist/index.cjs +5049 -0
  45. package/dist/index.cjs.map +1 -0
  46. package/dist/index.d.mts +13 -0
  47. package/dist/index.d.ts +13 -0
  48. package/dist/index.mjs +47 -0
  49. package/dist/index.mjs.map +1 -0
  50. package/dist/measurements/index.cjs +1198 -0
  51. package/dist/measurements/index.cjs.map +1 -0
  52. package/dist/measurements/index.d.mts +449 -0
  53. package/dist/measurements/index.d.ts +449 -0
  54. package/dist/measurements/index.mjs +9 -0
  55. package/dist/measurements/index.mjs.map +1 -0
  56. package/dist/sunlight/index.cjs +441 -0
  57. package/dist/sunlight/index.cjs.map +1 -0
  58. package/dist/sunlight/index.d.mts +92 -0
  59. package/dist/sunlight/index.d.ts +92 -0
  60. package/dist/sunlight/index.mjs +7 -0
  61. package/dist/sunlight/index.mjs.map +1 -0
  62. package/dist/terrain/index.cjs +423 -0
  63. package/dist/terrain/index.cjs.map +1 -0
  64. package/dist/terrain/index.d.mts +219 -0
  65. package/dist/terrain/index.d.ts +219 -0
  66. package/dist/terrain/index.mjs +7 -0
  67. package/dist/terrain/index.mjs.map +1 -0
  68. package/dist/transform-controls/index.cjs +1587 -0
  69. package/dist/transform-controls/index.cjs.map +1 -0
  70. package/dist/transform-controls/index.d.mts +162 -0
  71. package/dist/transform-controls/index.d.ts +162 -0
  72. package/dist/transform-controls/index.mjs +13 -0
  73. package/dist/transform-controls/index.mjs.map +1 -0
  74. package/dist/view-helper/index.cjs +430 -0
  75. package/dist/view-helper/index.cjs.map +1 -0
  76. package/dist/view-helper/index.d.mts +75 -0
  77. package/dist/view-helper/index.d.ts +75 -0
  78. package/dist/view-helper/index.mjs +7 -0
  79. package/dist/view-helper/index.mjs.map +1 -0
  80. package/package.json +124 -0
@@ -0,0 +1,219 @@
1
+ import * as THREE from 'three';
2
+
3
+ /**
4
+ * Geographic coordinates
5
+ */
6
+ interface GeoCoordinates {
7
+ /** Latitude in degrees */
8
+ latitude: number;
9
+ /** Longitude in degrees */
10
+ longitude: number;
11
+ }
12
+ /**
13
+ * Terrain dimensions
14
+ */
15
+ interface TerrainDimensions {
16
+ /** Width in meters */
17
+ width: number;
18
+ /** Depth in meters */
19
+ depth: number;
20
+ }
21
+ /**
22
+ * Configuration for fetching satellite imagery from Mapbox
23
+ */
24
+ interface MapboxTextureOptions {
25
+ /** Required Mapbox access token */
26
+ accessToken: string;
27
+ /** Style identifier (default: mapbox/satellite-v9) */
28
+ styleId?: string;
29
+ /** Requested image width in pixels (clamped to Mapbox limits, default: 1024) */
30
+ imageWidth?: number;
31
+ /** Requested image height in pixels (clamped to Mapbox limits, default: 1024) */
32
+ imageHeight?: number;
33
+ /** Whether to request @2x high-DPI imagery (default: false) */
34
+ highResolution?: boolean;
35
+ /** Optional padding factor (0-1) to expand the requested bounds (default: 0.1) */
36
+ paddingRatio?: number;
37
+ /** Override imagery format (default: png). jpg is smaller but lossy. */
38
+ imageFormat?: 'png' | 'jpg';
39
+ }
40
+ /**
41
+ * Configuration options for the terrain tool
42
+ */
43
+ interface TerrainToolOptions {
44
+ /** Number of width segments for the terrain mesh (default: 50) */
45
+ widthSegments?: number;
46
+ /** Number of depth segments for the terrain mesh (default: 50) */
47
+ depthSegments?: number;
48
+ /** Vertical exaggeration factor for elevation (default: 1.0) */
49
+ elevationScale?: number;
50
+ /** Base material color (default: 0x8B7355) */
51
+ baseColor?: number;
52
+ /** Whether to enable wireframe mode (default: false) */
53
+ wireframe?: boolean;
54
+ /** Texture URL for imagery overlay (optional) */
55
+ textureUrl?: string;
56
+ /** Automatically fetch Mapbox satellite imagery for the current bounds */
57
+ mapbox?: MapboxTextureOptions;
58
+ /** Whether to receive shadows (default: true) */
59
+ receiveShadow?: boolean;
60
+ /** Whether to cast shadows (default: true) */
61
+ castShadow?: boolean;
62
+ /** Use demo/synthetic data instead of API (default: false) */
63
+ useDemoData?: boolean;
64
+ }
65
+ /**
66
+ * Elevation data point from API
67
+ */
68
+ interface ElevationPoint {
69
+ /** Latitude */
70
+ latitude: number;
71
+ /** Longitude */
72
+ longitude: number;
73
+ /** Elevation in meters */
74
+ elevation: number;
75
+ }
76
+ /**
77
+ * Terrain data returned by the API
78
+ */
79
+ interface TerrainData {
80
+ /** Center coordinates */
81
+ center: GeoCoordinates;
82
+ /** Dimensions */
83
+ dimensions: TerrainDimensions;
84
+ /** Grid of elevation points */
85
+ elevations: number[][];
86
+ /** Minimum elevation in the dataset */
87
+ minElevation: number;
88
+ /** Maximum elevation in the dataset */
89
+ maxElevation: number;
90
+ }
91
+ /**
92
+ * Event types dispatched by the terrain tool
93
+ */
94
+ interface TerrainToolEvents {
95
+ /** Dispatched when terrain data has been fetched */
96
+ dataLoaded: {
97
+ data: TerrainData;
98
+ };
99
+ /** Dispatched when the terrain mesh has been created and added to the scene */
100
+ meshLoaded: {
101
+ mesh: THREE.Mesh;
102
+ };
103
+ /** Dispatched when terrain update starts */
104
+ updateStarted: {
105
+ center: GeoCoordinates;
106
+ dimensions: TerrainDimensions;
107
+ };
108
+ /** Dispatched when an error occurs */
109
+ error: {
110
+ message: string;
111
+ error: Error;
112
+ };
113
+ }
114
+
115
+ /**
116
+ * Terrain mesh creator for Three.js scenes
117
+ * Fetches elevation data from Open-Elevation API and creates 3D terrain meshes
118
+ *
119
+ * @example
120
+ * ```javascript
121
+ * const terrainTool = new TerrainTool(scene, {
122
+ * widthSegments: 100,
123
+ * depthSegments: 100,
124
+ * elevationScale: 2.0,
125
+ * useDemoData: false // Set to true for demo/testing without API
126
+ * })
127
+ *
128
+ * // Listen for events
129
+ * terrainTool.addEventListener('dataLoaded', (e) => {
130
+ * console.log('Terrain data loaded:', e.data)
131
+ * })
132
+ *
133
+ * terrainTool.addEventListener('meshLoaded', (e) => {
134
+ * console.log('Terrain mesh created:', e.mesh)
135
+ * })
136
+ *
137
+ * // Load terrain for a location
138
+ * terrainTool.loadTerrain(
139
+ * { latitude: 36.1699, longitude: -115.1398 }, // Las Vegas
140
+ * { width: 5000, depth: 5000 } // 5km x 5km
141
+ * )
142
+ * ```
143
+ */
144
+ declare class TerrainTool extends THREE.EventDispatcher<TerrainToolEvents> {
145
+ private scene;
146
+ private mesh;
147
+ private currentData;
148
+ private isLoading;
149
+ private mapboxOptions?;
150
+ private generatedTextureUrls;
151
+ widthSegments: number;
152
+ depthSegments: number;
153
+ elevationScale: number;
154
+ baseColor: number;
155
+ wireframe: boolean;
156
+ textureUrl: string | undefined;
157
+ receiveShadow: boolean;
158
+ castShadow: boolean;
159
+ useDemoData: boolean;
160
+ /**
161
+ * Creates a new TerrainTool instance
162
+ * @param scene - The Three.js scene to add terrain to
163
+ * @param options - Configuration options
164
+ */
165
+ constructor(scene: THREE.Scene, options?: TerrainToolOptions);
166
+ /**
167
+ * Update Mapbox imagery configuration at runtime
168
+ */
169
+ setMapboxOptions(options?: MapboxTextureOptions): void;
170
+ /**
171
+ * Loads terrain data and creates a mesh
172
+ * @param center - Center coordinates (latitude, longitude)
173
+ * @param dimensions - Terrain dimensions in meters
174
+ */
175
+ loadTerrain(center: GeoCoordinates, dimensions: TerrainDimensions): Promise<void>;
176
+ /**
177
+ * Updates the terrain with new coordinates and/or dimensions
178
+ * @param center - New center coordinates (optional, keeps current if not provided)
179
+ * @param dimensions - New dimensions (optional, keeps current if not provided)
180
+ */
181
+ updateTerrain(center?: GeoCoordinates, dimensions?: TerrainDimensions): Promise<void>;
182
+ /**
183
+ * Fetches elevation data from Open-Elevation API or generates demo data
184
+ * @private
185
+ */
186
+ private fetchElevationData;
187
+ /**
188
+ * Generates demo terrain data using perlin-like noise
189
+ * @private
190
+ */
191
+ private generateDemoData;
192
+ /**
193
+ * Creates a terrain mesh from elevation data
194
+ * @private
195
+ */
196
+ private createMesh;
197
+ private resolveTexture;
198
+ private computeBoundingBox;
199
+ private fetchMapboxTexture;
200
+ private releaseGeneratedTexture;
201
+ /**
202
+ * Gets the current terrain mesh
203
+ */
204
+ getMesh(): THREE.Mesh | null;
205
+ /**
206
+ * Gets the current terrain data
207
+ */
208
+ getData(): TerrainData | null;
209
+ /**
210
+ * Checks if terrain is currently loading
211
+ */
212
+ isTerrainLoading(): boolean;
213
+ /**
214
+ * Disposes of all resources
215
+ */
216
+ dispose(): void;
217
+ }
218
+
219
+ export { type ElevationPoint, type GeoCoordinates, type TerrainData, type TerrainDimensions, TerrainTool, type TerrainToolEvents, type TerrainToolOptions };
@@ -0,0 +1,219 @@
1
+ import * as THREE from 'three';
2
+
3
+ /**
4
+ * Geographic coordinates
5
+ */
6
+ interface GeoCoordinates {
7
+ /** Latitude in degrees */
8
+ latitude: number;
9
+ /** Longitude in degrees */
10
+ longitude: number;
11
+ }
12
+ /**
13
+ * Terrain dimensions
14
+ */
15
+ interface TerrainDimensions {
16
+ /** Width in meters */
17
+ width: number;
18
+ /** Depth in meters */
19
+ depth: number;
20
+ }
21
+ /**
22
+ * Configuration for fetching satellite imagery from Mapbox
23
+ */
24
+ interface MapboxTextureOptions {
25
+ /** Required Mapbox access token */
26
+ accessToken: string;
27
+ /** Style identifier (default: mapbox/satellite-v9) */
28
+ styleId?: string;
29
+ /** Requested image width in pixels (clamped to Mapbox limits, default: 1024) */
30
+ imageWidth?: number;
31
+ /** Requested image height in pixels (clamped to Mapbox limits, default: 1024) */
32
+ imageHeight?: number;
33
+ /** Whether to request @2x high-DPI imagery (default: false) */
34
+ highResolution?: boolean;
35
+ /** Optional padding factor (0-1) to expand the requested bounds (default: 0.1) */
36
+ paddingRatio?: number;
37
+ /** Override imagery format (default: png). jpg is smaller but lossy. */
38
+ imageFormat?: 'png' | 'jpg';
39
+ }
40
+ /**
41
+ * Configuration options for the terrain tool
42
+ */
43
+ interface TerrainToolOptions {
44
+ /** Number of width segments for the terrain mesh (default: 50) */
45
+ widthSegments?: number;
46
+ /** Number of depth segments for the terrain mesh (default: 50) */
47
+ depthSegments?: number;
48
+ /** Vertical exaggeration factor for elevation (default: 1.0) */
49
+ elevationScale?: number;
50
+ /** Base material color (default: 0x8B7355) */
51
+ baseColor?: number;
52
+ /** Whether to enable wireframe mode (default: false) */
53
+ wireframe?: boolean;
54
+ /** Texture URL for imagery overlay (optional) */
55
+ textureUrl?: string;
56
+ /** Automatically fetch Mapbox satellite imagery for the current bounds */
57
+ mapbox?: MapboxTextureOptions;
58
+ /** Whether to receive shadows (default: true) */
59
+ receiveShadow?: boolean;
60
+ /** Whether to cast shadows (default: true) */
61
+ castShadow?: boolean;
62
+ /** Use demo/synthetic data instead of API (default: false) */
63
+ useDemoData?: boolean;
64
+ }
65
+ /**
66
+ * Elevation data point from API
67
+ */
68
+ interface ElevationPoint {
69
+ /** Latitude */
70
+ latitude: number;
71
+ /** Longitude */
72
+ longitude: number;
73
+ /** Elevation in meters */
74
+ elevation: number;
75
+ }
76
+ /**
77
+ * Terrain data returned by the API
78
+ */
79
+ interface TerrainData {
80
+ /** Center coordinates */
81
+ center: GeoCoordinates;
82
+ /** Dimensions */
83
+ dimensions: TerrainDimensions;
84
+ /** Grid of elevation points */
85
+ elevations: number[][];
86
+ /** Minimum elevation in the dataset */
87
+ minElevation: number;
88
+ /** Maximum elevation in the dataset */
89
+ maxElevation: number;
90
+ }
91
+ /**
92
+ * Event types dispatched by the terrain tool
93
+ */
94
+ interface TerrainToolEvents {
95
+ /** Dispatched when terrain data has been fetched */
96
+ dataLoaded: {
97
+ data: TerrainData;
98
+ };
99
+ /** Dispatched when the terrain mesh has been created and added to the scene */
100
+ meshLoaded: {
101
+ mesh: THREE.Mesh;
102
+ };
103
+ /** Dispatched when terrain update starts */
104
+ updateStarted: {
105
+ center: GeoCoordinates;
106
+ dimensions: TerrainDimensions;
107
+ };
108
+ /** Dispatched when an error occurs */
109
+ error: {
110
+ message: string;
111
+ error: Error;
112
+ };
113
+ }
114
+
115
+ /**
116
+ * Terrain mesh creator for Three.js scenes
117
+ * Fetches elevation data from Open-Elevation API and creates 3D terrain meshes
118
+ *
119
+ * @example
120
+ * ```javascript
121
+ * const terrainTool = new TerrainTool(scene, {
122
+ * widthSegments: 100,
123
+ * depthSegments: 100,
124
+ * elevationScale: 2.0,
125
+ * useDemoData: false // Set to true for demo/testing without API
126
+ * })
127
+ *
128
+ * // Listen for events
129
+ * terrainTool.addEventListener('dataLoaded', (e) => {
130
+ * console.log('Terrain data loaded:', e.data)
131
+ * })
132
+ *
133
+ * terrainTool.addEventListener('meshLoaded', (e) => {
134
+ * console.log('Terrain mesh created:', e.mesh)
135
+ * })
136
+ *
137
+ * // Load terrain for a location
138
+ * terrainTool.loadTerrain(
139
+ * { latitude: 36.1699, longitude: -115.1398 }, // Las Vegas
140
+ * { width: 5000, depth: 5000 } // 5km x 5km
141
+ * )
142
+ * ```
143
+ */
144
+ declare class TerrainTool extends THREE.EventDispatcher<TerrainToolEvents> {
145
+ private scene;
146
+ private mesh;
147
+ private currentData;
148
+ private isLoading;
149
+ private mapboxOptions?;
150
+ private generatedTextureUrls;
151
+ widthSegments: number;
152
+ depthSegments: number;
153
+ elevationScale: number;
154
+ baseColor: number;
155
+ wireframe: boolean;
156
+ textureUrl: string | undefined;
157
+ receiveShadow: boolean;
158
+ castShadow: boolean;
159
+ useDemoData: boolean;
160
+ /**
161
+ * Creates a new TerrainTool instance
162
+ * @param scene - The Three.js scene to add terrain to
163
+ * @param options - Configuration options
164
+ */
165
+ constructor(scene: THREE.Scene, options?: TerrainToolOptions);
166
+ /**
167
+ * Update Mapbox imagery configuration at runtime
168
+ */
169
+ setMapboxOptions(options?: MapboxTextureOptions): void;
170
+ /**
171
+ * Loads terrain data and creates a mesh
172
+ * @param center - Center coordinates (latitude, longitude)
173
+ * @param dimensions - Terrain dimensions in meters
174
+ */
175
+ loadTerrain(center: GeoCoordinates, dimensions: TerrainDimensions): Promise<void>;
176
+ /**
177
+ * Updates the terrain with new coordinates and/or dimensions
178
+ * @param center - New center coordinates (optional, keeps current if not provided)
179
+ * @param dimensions - New dimensions (optional, keeps current if not provided)
180
+ */
181
+ updateTerrain(center?: GeoCoordinates, dimensions?: TerrainDimensions): Promise<void>;
182
+ /**
183
+ * Fetches elevation data from Open-Elevation API or generates demo data
184
+ * @private
185
+ */
186
+ private fetchElevationData;
187
+ /**
188
+ * Generates demo terrain data using perlin-like noise
189
+ * @private
190
+ */
191
+ private generateDemoData;
192
+ /**
193
+ * Creates a terrain mesh from elevation data
194
+ * @private
195
+ */
196
+ private createMesh;
197
+ private resolveTexture;
198
+ private computeBoundingBox;
199
+ private fetchMapboxTexture;
200
+ private releaseGeneratedTexture;
201
+ /**
202
+ * Gets the current terrain mesh
203
+ */
204
+ getMesh(): THREE.Mesh | null;
205
+ /**
206
+ * Gets the current terrain data
207
+ */
208
+ getData(): TerrainData | null;
209
+ /**
210
+ * Checks if terrain is currently loading
211
+ */
212
+ isTerrainLoading(): boolean;
213
+ /**
214
+ * Disposes of all resources
215
+ */
216
+ dispose(): void;
217
+ }
218
+
219
+ export { type ElevationPoint, type GeoCoordinates, type TerrainData, type TerrainDimensions, TerrainTool, type TerrainToolEvents, type TerrainToolOptions };
@@ -0,0 +1,7 @@
1
+ import {
2
+ TerrainTool
3
+ } from "../chunk-EIROAPF7.mjs";
4
+ export {
5
+ TerrainTool
6
+ };
7
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}