react-babylon-map 0.0.1

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 (211) hide show
  1. package/.claude/settings.local.json +78 -0
  2. package/demo.html +161 -0
  3. package/dist/cjs/main.js +520 -0
  4. package/dist/es/main.mjs +20 -0
  5. package/dist/es/main.mjs.map +1 -0
  6. package/dist/es/main10.mjs +33 -0
  7. package/dist/es/main10.mjs.map +1 -0
  8. package/dist/es/main11.mjs +12 -0
  9. package/dist/es/main11.mjs.map +1 -0
  10. package/dist/es/main12.mjs +14 -0
  11. package/dist/es/main12.mjs.map +1 -0
  12. package/dist/es/main13.mjs +12 -0
  13. package/dist/es/main13.mjs.map +1 -0
  14. package/dist/es/main14.mjs +5 -0
  15. package/dist/es/main14.mjs.map +1 -0
  16. package/dist/es/main15.mjs +12 -0
  17. package/dist/es/main15.mjs.map +1 -0
  18. package/dist/es/main16.mjs +25 -0
  19. package/dist/es/main16.mjs.map +1 -0
  20. package/dist/es/main17.mjs +54 -0
  21. package/dist/es/main17.mjs.map +1 -0
  22. package/dist/es/main18.mjs +88 -0
  23. package/dist/es/main18.mjs.map +1 -0
  24. package/dist/es/main19.mjs +18 -0
  25. package/dist/es/main19.mjs.map +1 -0
  26. package/dist/es/main2.mjs +9 -0
  27. package/dist/es/main2.mjs.map +1 -0
  28. package/dist/es/main20.mjs +21 -0
  29. package/dist/es/main20.mjs.map +1 -0
  30. package/dist/es/main21.mjs +61 -0
  31. package/dist/es/main21.mjs.map +1 -0
  32. package/dist/es/main3.mjs +46 -0
  33. package/dist/es/main3.mjs.map +1 -0
  34. package/dist/es/main4.mjs +23 -0
  35. package/dist/es/main4.mjs.map +1 -0
  36. package/dist/es/main5.mjs +69 -0
  37. package/dist/es/main5.mjs.map +1 -0
  38. package/dist/es/main6.mjs +35 -0
  39. package/dist/es/main6.mjs.map +1 -0
  40. package/dist/es/main7.mjs +65 -0
  41. package/dist/es/main7.mjs.map +1 -0
  42. package/dist/es/main8.mjs +14 -0
  43. package/dist/es/main8.mjs.map +1 -0
  44. package/dist/es/main9.mjs +26 -0
  45. package/dist/es/main9.mjs.map +1 -0
  46. package/dist/maplibre/cjs/main.js +520 -0
  47. package/dist/maplibre/es/main.mjs +20 -0
  48. package/dist/maplibre/es/main.mjs.map +1 -0
  49. package/dist/maplibre/es/main10.mjs +33 -0
  50. package/dist/maplibre/es/main10.mjs.map +1 -0
  51. package/dist/maplibre/es/main11.mjs +12 -0
  52. package/dist/maplibre/es/main11.mjs.map +1 -0
  53. package/dist/maplibre/es/main12.mjs +14 -0
  54. package/dist/maplibre/es/main12.mjs.map +1 -0
  55. package/dist/maplibre/es/main13.mjs +12 -0
  56. package/dist/maplibre/es/main13.mjs.map +1 -0
  57. package/dist/maplibre/es/main14.mjs +5 -0
  58. package/dist/maplibre/es/main14.mjs.map +1 -0
  59. package/dist/maplibre/es/main15.mjs +12 -0
  60. package/dist/maplibre/es/main15.mjs.map +1 -0
  61. package/dist/maplibre/es/main16.mjs +25 -0
  62. package/dist/maplibre/es/main16.mjs.map +1 -0
  63. package/dist/maplibre/es/main17.mjs +54 -0
  64. package/dist/maplibre/es/main17.mjs.map +1 -0
  65. package/dist/maplibre/es/main18.mjs +88 -0
  66. package/dist/maplibre/es/main18.mjs.map +1 -0
  67. package/dist/maplibre/es/main19.mjs +18 -0
  68. package/dist/maplibre/es/main19.mjs.map +1 -0
  69. package/dist/maplibre/es/main2.mjs +9 -0
  70. package/dist/maplibre/es/main2.mjs.map +1 -0
  71. package/dist/maplibre/es/main20.mjs +61 -0
  72. package/dist/maplibre/es/main20.mjs.map +1 -0
  73. package/dist/maplibre/es/main21.mjs +21 -0
  74. package/dist/maplibre/es/main21.mjs.map +1 -0
  75. package/dist/maplibre/es/main3.mjs +46 -0
  76. package/dist/maplibre/es/main3.mjs.map +1 -0
  77. package/dist/maplibre/es/main4.mjs +23 -0
  78. package/dist/maplibre/es/main4.mjs.map +1 -0
  79. package/dist/maplibre/es/main5.mjs +69 -0
  80. package/dist/maplibre/es/main5.mjs.map +1 -0
  81. package/dist/maplibre/es/main6.mjs +35 -0
  82. package/dist/maplibre/es/main6.mjs.map +1 -0
  83. package/dist/maplibre/es/main7.mjs +65 -0
  84. package/dist/maplibre/es/main7.mjs.map +1 -0
  85. package/dist/maplibre/es/main8.mjs +14 -0
  86. package/dist/maplibre/es/main8.mjs.map +1 -0
  87. package/dist/maplibre/es/main9.mjs +26 -0
  88. package/dist/maplibre/es/main9.mjs.map +1 -0
  89. package/dist/maplibre/types/api/canvas-props.d.ts +9 -0
  90. package/dist/maplibre/types/api/coordinates.d.ts +13 -0
  91. package/dist/maplibre/types/api/coords-to-vector-3.d.ts +3 -0
  92. package/dist/maplibre/types/api/coords.d.ts +5 -0
  93. package/dist/maplibre/types/api/index.d.ts +7 -0
  94. package/dist/maplibre/types/api/near-coordinates.d.ts +13 -0
  95. package/dist/maplibre/types/api/use-map.d.ts +3 -0
  96. package/dist/maplibre/types/api/vector-3-to-coords.d.ts +2 -0
  97. package/dist/maplibre/types/core/canvas-in-layer/use-canvas-in-layer.d.ts +15 -0
  98. package/dist/maplibre/types/core/canvas-in-layer/use-render.d.ts +15 -0
  99. package/dist/maplibre/types/core/canvas-in-layer/use-root.d.ts +11 -0
  100. package/dist/maplibre/types/core/canvas-overlay/canvas-portal.d.ts +10 -0
  101. package/dist/maplibre/types/core/canvas-overlay/init-canvas-fc.d.ts +11 -0
  102. package/dist/maplibre/types/core/canvas-overlay/render.d.ts +1 -0
  103. package/dist/maplibre/types/core/canvas-overlay/sync-camera-fc.d.ts +12 -0
  104. package/dist/maplibre/types/core/coords-to-matrix.d.ts +9 -0
  105. package/dist/maplibre/types/core/earth-radius.d.ts +1 -0
  106. package/dist/maplibre/types/core/generic-map.d.ts +49 -0
  107. package/dist/maplibre/types/core/matrix-utils.d.ts +7 -0
  108. package/dist/maplibre/types/core/sync-camera.d.ts +7 -0
  109. package/dist/maplibre/types/core/use-babylon-map.d.ts +32 -0
  110. package/dist/maplibre/types/core/use-coords-to-matrix.d.ts +6 -0
  111. package/dist/maplibre/types/core/use-coords.d.ts +5 -0
  112. package/dist/maplibre/types/core/use-function.d.ts +1 -0
  113. package/dist/maplibre/types/maplibre/canvas.d.ts +4 -0
  114. package/dist/maplibre/types/maplibre.index.d.ts +4 -0
  115. package/dist/types/api/canvas-props.d.ts +9 -0
  116. package/dist/types/api/coordinates.d.ts +13 -0
  117. package/dist/types/api/coords-to-vector-3.d.ts +3 -0
  118. package/dist/types/api/coords.d.ts +5 -0
  119. package/dist/types/api/index.d.ts +7 -0
  120. package/dist/types/api/near-coordinates.d.ts +13 -0
  121. package/dist/types/api/use-map.d.ts +3 -0
  122. package/dist/types/api/vector-3-to-coords.d.ts +2 -0
  123. package/dist/types/core/canvas-in-layer/use-canvas-in-layer.d.ts +15 -0
  124. package/dist/types/core/canvas-in-layer/use-render.d.ts +15 -0
  125. package/dist/types/core/canvas-in-layer/use-root.d.ts +11 -0
  126. package/dist/types/core/canvas-overlay/canvas-portal.d.ts +10 -0
  127. package/dist/types/core/canvas-overlay/init-canvas-fc.d.ts +11 -0
  128. package/dist/types/core/canvas-overlay/render.d.ts +1 -0
  129. package/dist/types/core/canvas-overlay/sync-camera-fc.d.ts +12 -0
  130. package/dist/types/core/coords-to-matrix.d.ts +9 -0
  131. package/dist/types/core/earth-radius.d.ts +1 -0
  132. package/dist/types/core/generic-map.d.ts +49 -0
  133. package/dist/types/core/matrix-utils.d.ts +7 -0
  134. package/dist/types/core/sync-camera.d.ts +7 -0
  135. package/dist/types/core/use-babylon-map.d.ts +32 -0
  136. package/dist/types/core/use-coords-to-matrix.d.ts +6 -0
  137. package/dist/types/core/use-coords.d.ts +5 -0
  138. package/dist/types/core/use-function.d.ts +1 -0
  139. package/dist/types/mapbox/canvas.d.ts +4 -0
  140. package/dist/types/mapbox.index.d.ts +4 -0
  141. package/package.json +58 -0
  142. package/plan.md +719 -0
  143. package/src/api/canvas-props.ts +10 -0
  144. package/src/api/coordinates.tsx +83 -0
  145. package/src/api/coords-to-vector-3.ts +39 -0
  146. package/src/api/coords.tsx +6 -0
  147. package/src/api/index.ts +7 -0
  148. package/src/api/near-coordinates.tsx +87 -0
  149. package/src/api/use-map.ts +8 -0
  150. package/src/api/vector-3-to-coords.ts +13 -0
  151. package/src/core/canvas-in-layer/use-canvas-in-layer.tsx +27 -0
  152. package/src/core/canvas-in-layer/use-render.ts +43 -0
  153. package/src/core/canvas-in-layer/use-root.tsx +82 -0
  154. package/src/core/canvas-overlay/canvas-portal.tsx +98 -0
  155. package/src/core/canvas-overlay/init-canvas-fc.tsx +45 -0
  156. package/src/core/canvas-overlay/render.tsx +1 -0
  157. package/src/core/canvas-overlay/sync-camera-fc.tsx +83 -0
  158. package/src/core/coords-to-matrix.ts +21 -0
  159. package/src/core/earth-radius.ts +1 -0
  160. package/src/core/events.ts +55 -0
  161. package/src/core/generic-map.ts +59 -0
  162. package/src/core/map-engine.tsx +70 -0
  163. package/src/core/matrix-utils.ts +22 -0
  164. package/src/core/sync-camera.ts +29 -0
  165. package/src/core/use-babylon-map.ts +46 -0
  166. package/src/core/use-coords-to-matrix.ts +13 -0
  167. package/src/core/use-coords.tsx +22 -0
  168. package/src/core/use-function.ts +10 -0
  169. package/src/mapbox/canvas.tsx +59 -0
  170. package/src/mapbox.index.ts +7 -0
  171. package/src/maplibre/canvas.tsx +59 -0
  172. package/src/maplibre.index.ts +7 -0
  173. package/src/vite-env.d.ts +1 -0
  174. package/stories/.ladle/components.tsx +50 -0
  175. package/stories/.ladle/style.css +63 -0
  176. package/stories/package.json +31 -0
  177. package/stories/pnpm-lock.yaml +5450 -0
  178. package/stories/sandbox.config.json +3 -0
  179. package/stories/src/adaptive-dpr.tsx +34 -0
  180. package/stories/src/billboard.stories.tsx +111 -0
  181. package/stories/src/buildings-3d.stories.tsx +280 -0
  182. package/stories/src/canvas/mapbox.stories.tsx +113 -0
  183. package/stories/src/canvas/maplibre.stories.tsx +93 -0
  184. package/stories/src/comparison.stories.tsx +161 -0
  185. package/stories/src/extrude/chaillot.ts +8 -0
  186. package/stories/src/exude-coordinates.stories.tsx +139 -0
  187. package/stories/src/free-3d-buildings/get-buildings-data.ts +49 -0
  188. package/stories/src/html-on-top.stories.tsx +156 -0
  189. package/stories/src/ifc/ifc-to-babylon.ts +97 -0
  190. package/stories/src/ifc/ifc.main.ts +904 -0
  191. package/stories/src/ifc/ifc2bb.ts +343 -0
  192. package/stories/src/ifc/model.ifc +14155 -0
  193. package/stories/src/ifc.stories.tsx +276 -0
  194. package/stories/src/mapbox/story-mapbox.tsx +97 -0
  195. package/stories/src/maplibre/story-maplibre.tsx +36 -0
  196. package/stories/src/multi-coordinates.stories.tsx +115 -0
  197. package/stories/src/pivot-controls.stories.tsx +148 -0
  198. package/stories/src/postprocessing.stories.tsx +125 -0
  199. package/stories/src/render-on-demand.stories.tsx +76 -0
  200. package/stories/src/story-map.tsx +44 -0
  201. package/stories/src/sunlight.stories.tsx +215 -0
  202. package/stories/src/vite-env.d.ts +1 -0
  203. package/stories/tsconfig.json +32 -0
  204. package/stories/tsconfig.node.json +10 -0
  205. package/stories/vite.config.ts +27 -0
  206. package/tsconfig.json +31 -0
  207. package/tsconfig.mapbox.json +7 -0
  208. package/tsconfig.maplibre.json +7 -0
  209. package/tsconfig.node.json +10 -0
  210. package/tsconfig.types.json +25 -0
  211. package/vite.config.ts +65 -0
@@ -0,0 +1,520 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const react = require("react");
4
+ const jsxRuntime = require("react/jsx-runtime");
5
+ const mapboxGl = require("mapbox-gl");
6
+ const mapbox = require("react-map-gl/mapbox");
7
+ const core = require("@babylonjs/core");
8
+ const require$$0 = require("react-dom");
9
+ const BabylonMapContext = react.createContext(null);
10
+ function useBabylonMap() {
11
+ const ctx = react.useContext(BabylonMapContext);
12
+ if (!ctx)
13
+ throw new Error("useBabylonMap must be used inside a <Canvas>");
14
+ return ctx;
15
+ }
16
+ function createBabylonMap(opts) {
17
+ return {
18
+ map: opts.map,
19
+ viewProjMx: new Array(16).fill(0),
20
+ fromLngLat: opts.fromLngLat,
21
+ engine: opts.engine,
22
+ scene: opts.scene
23
+ };
24
+ }
25
+ const useMap$1 = () => {
26
+ const ctx = useBabylonMap();
27
+ return ctx.map;
28
+ };
29
+ const tmpCameraMx = core.Matrix.Identity();
30
+ const tmpWvpMx = core.Matrix.Identity();
31
+ function syncCamera(camera, origin, mapCamMx) {
32
+ core.Matrix.FromArrayToRef(mapCamMx, 0, tmpCameraMx);
33
+ origin.multiplyToRef(tmpCameraMx, tmpWvpMx);
34
+ camera.freezeProjectionMatrix(tmpWvpMx);
35
+ camera.minZ = 0;
36
+ camera.maxZ = 1e6;
37
+ }
38
+ function coordsToMatrix({
39
+ longitude,
40
+ latitude,
41
+ altitude,
42
+ fromLngLat: fromLngLat2
43
+ }) {
44
+ const center = fromLngLat2([longitude, latitude], altitude);
45
+ const scaleUnit = center.meterInMercatorCoordinateUnits();
46
+ const position = new core.Vector3(center.x, center.y, center.z || 0);
47
+ const scaling = new core.Vector3(scaleUnit, scaleUnit, scaleUnit);
48
+ const rotation = core.Quaternion.FromEulerAngles(Math.PI / 2, 0, 0);
49
+ return core.Matrix.Compose(scaling, rotation, position);
50
+ }
51
+ function useCoordsToMatrix({ latitude, longitude, altitude, fromLngLat: fromLngLat2 }) {
52
+ return react.useMemo(
53
+ () => coordsToMatrix({ latitude, longitude, altitude, fromLngLat: fromLngLat2 }),
54
+ [latitude, longitude, altitude, fromLngLat2]
55
+ );
56
+ }
57
+ const Coordinates = react.memo(({
58
+ latitude,
59
+ longitude,
60
+ altitude = 0,
61
+ children
62
+ }) => {
63
+ const babylonMap = useBabylonMap();
64
+ const origin = useCoordsToMatrix({
65
+ latitude,
66
+ longitude,
67
+ altitude,
68
+ fromLngLat: babylonMap.fromLngLat
69
+ });
70
+ const [subScene] = react.useState(() => {
71
+ if (!babylonMap.engine)
72
+ return null;
73
+ const sub = new core.Scene(babylonMap.engine);
74
+ sub.autoClear = false;
75
+ sub.clearColor = new core.Color4(0, 0, 0, 0);
76
+ return sub;
77
+ });
78
+ const cameraRef = react.useRef(null);
79
+ react.useEffect(() => {
80
+ if (!subScene)
81
+ return;
82
+ const cam = new core.FreeCamera("coordsCam", core.Vector3.Zero(), subScene);
83
+ cam.inputs.clear();
84
+ cam.minZ = 0;
85
+ cameraRef.current = cam;
86
+ const light = new core.HemisphericLight("coordsLight", new core.Vector3(0, 1, 0), subScene);
87
+ light.intensity = 1;
88
+ return () => {
89
+ cam.dispose();
90
+ light.dispose();
91
+ };
92
+ }, [subScene]);
93
+ react.useEffect(() => {
94
+ if (!subScene || !babylonMap.scene)
95
+ return;
96
+ const mainScene = babylonMap.scene;
97
+ const observer = mainScene.onBeforeRenderObservable.add(() => {
98
+ var _a;
99
+ if (!cameraRef.current)
100
+ return;
101
+ syncCamera(cameraRef.current, origin, babylonMap.viewProjMx);
102
+ (_a = babylonMap.engine) == null ? void 0 : _a.wipeCaches(true);
103
+ subScene.render(false);
104
+ });
105
+ return () => {
106
+ mainScene.onBeforeRenderObservable.remove(observer);
107
+ };
108
+ }, [subScene, babylonMap.scene, origin, babylonMap]);
109
+ const childMap = {
110
+ ...babylonMap,
111
+ scene: subScene || void 0
112
+ };
113
+ return /* @__PURE__ */ jsxRuntime.jsx(BabylonMapContext.Provider, { value: childMap, children });
114
+ });
115
+ Coordinates.displayName = "Coordinates";
116
+ const earthRadius = 63710088e-1;
117
+ const DEG2RAD$1 = Math.PI / 180;
118
+ const mercatorScaleLookup = {};
119
+ function getMercatorScale(lat) {
120
+ const index = Math.round(lat * 1e3);
121
+ if (mercatorScaleLookup[index] === void 0) {
122
+ mercatorScaleLookup[index] = 1 / Math.cos(lat * DEG2RAD$1);
123
+ }
124
+ return mercatorScaleLookup[index];
125
+ }
126
+ function averageMercatorScale(originLat, pointLat, steps = 10) {
127
+ let totalScale = 0;
128
+ const latStep = (pointLat - originLat) / steps;
129
+ for (let i = 0; i <= steps; i++) {
130
+ const lat = originLat + latStep * i;
131
+ totalScale += getMercatorScale(lat);
132
+ }
133
+ return totalScale / (steps + 1);
134
+ }
135
+ function coordsToVector3(point, origin) {
136
+ const latitudeDiff = (point.latitude - origin.latitude) * DEG2RAD$1;
137
+ const longitudeDiff = (point.longitude - origin.longitude) * DEG2RAD$1;
138
+ const altitudeDiff = (point.altitude || 0) - (origin.altitude || 0);
139
+ const x = longitudeDiff * earthRadius * Math.cos(origin.latitude * DEG2RAD$1);
140
+ const y = altitudeDiff;
141
+ const steps = Math.ceil(Math.abs(point.latitude - origin.latitude)) * 100 + 1;
142
+ const avgScale = averageMercatorScale(origin.latitude, point.latitude, steps);
143
+ const z = -latitudeDiff * earthRadius / getMercatorScale(origin.latitude) * avgScale;
144
+ return [x, y, z];
145
+ }
146
+ function useCoords() {
147
+ const ctx = react.useContext(BabylonMapContext);
148
+ if (!ctx)
149
+ throw new Error("useCoords must be used inside a <Canvas>");
150
+ return ctx.coords;
151
+ }
152
+ const NearCoordinates = react.memo(({ children, ...coords }) => {
153
+ const { latitude, longitude, altitude } = useCoords();
154
+ const babylonMap = useBabylonMap();
155
+ const pos = coordsToVector3(coords, { latitude, longitude, altitude });
156
+ const [subScene] = react.useState(() => {
157
+ if (!babylonMap.engine)
158
+ return null;
159
+ const sub = new core.Scene(babylonMap.engine);
160
+ sub.autoClear = false;
161
+ sub.clearColor = new core.Color4(0, 0, 0, 0);
162
+ return sub;
163
+ });
164
+ const cameraRef = react.useRef(null);
165
+ react.useEffect(() => {
166
+ if (!subScene)
167
+ return;
168
+ const cam = new core.FreeCamera("nearCoordsCam", new core.Vector3(pos[0], pos[1], pos[2]), subScene);
169
+ cam.inputs.clear();
170
+ cam.minZ = 0;
171
+ cameraRef.current = cam;
172
+ const light = new core.HemisphericLight("nearCoordsLight", new core.Vector3(0, 1, 0), subScene);
173
+ light.intensity = 1;
174
+ return () => {
175
+ cam.dispose();
176
+ light.dispose();
177
+ };
178
+ }, [subScene]);
179
+ react.useEffect(() => {
180
+ if (!cameraRef.current)
181
+ return;
182
+ cameraRef.current.position.set(pos[0], pos[1], pos[2]);
183
+ }, [pos]);
184
+ react.useEffect(() => {
185
+ if (!subScene || !babylonMap.scene)
186
+ return;
187
+ const mainScene = babylonMap.scene;
188
+ const observer = mainScene.onBeforeRenderObservable.add(() => {
189
+ var _a;
190
+ if (!cameraRef.current)
191
+ return;
192
+ cameraRef.current.freezeProjectionMatrix(babylonMap.scene.activeCamera.getProjectionMatrix());
193
+ (_a = babylonMap.engine) == null ? void 0 : _a.wipeCaches(true);
194
+ subScene.render(false);
195
+ });
196
+ return () => {
197
+ mainScene.onBeforeRenderObservable.remove(observer);
198
+ };
199
+ }, [subScene, babylonMap.scene, babylonMap]);
200
+ const childMap = {
201
+ ...babylonMap,
202
+ scene: subScene || void 0
203
+ };
204
+ return /* @__PURE__ */ jsxRuntime.jsx(BabylonMapContext.Provider, { value: childMap, children });
205
+ });
206
+ NearCoordinates.displayName = "NearCoordinates";
207
+ const DEG2RAD = Math.PI / 180;
208
+ const RAD2DEG = 180 / Math.PI;
209
+ function vector3ToCoords(position, origin) {
210
+ const [x, y, z] = position;
211
+ const latitude = origin.latitude + -z / earthRadius * RAD2DEG;
212
+ const longitude = origin.longitude + x / earthRadius * RAD2DEG / Math.cos(origin.latitude * DEG2RAD);
213
+ const altitude = (origin.altitude || 0) + y;
214
+ return { latitude, longitude, altitude };
215
+ }
216
+ const useFunction = (callback) => {
217
+ const callbackRef = react.useRef(callback);
218
+ callbackRef.current = callback;
219
+ return react.useCallback((...args) => {
220
+ return callbackRef.current(...args);
221
+ }, []);
222
+ };
223
+ function useRender({
224
+ map,
225
+ origin,
226
+ scene,
227
+ camera,
228
+ frameloop,
229
+ babylonMap
230
+ }) {
231
+ const render = useFunction((_gl, projViewMx) => {
232
+ const pVMx = "defaultProjectionData" in projViewMx ? Object.values(projViewMx.defaultProjectionData.mainMatrix) : projViewMx;
233
+ babylonMap.viewProjMx = pVMx;
234
+ syncCamera(camera, origin, pVMx);
235
+ scene.getEngine().wipeCaches(true);
236
+ scene.render(false);
237
+ if (!frameloop || frameloop === "always")
238
+ map.triggerRepaint();
239
+ });
240
+ return render;
241
+ }
242
+ var createRoot;
243
+ var m = require$$0;
244
+ if (process.env.NODE_ENV === "production") {
245
+ createRoot = m.createRoot;
246
+ m.hydrateRoot;
247
+ } else {
248
+ var i = m.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED;
249
+ createRoot = function(c, o) {
250
+ i.usingClientEntryPoint = true;
251
+ try {
252
+ return m.createRoot(c, o);
253
+ } finally {
254
+ i.usingClientEntryPoint = false;
255
+ }
256
+ };
257
+ }
258
+ function useRoot(fromLngLat2, map, { longitude, latitude, altitude, frameloop, ...props }) {
259
+ const [{ engine, scene, camera, reactRoot, babylonMap }] = react.useState(() => {
260
+ const canvas = map.getCanvas();
261
+ const gl = canvas.getContext("webgl2") || canvas.getContext("webgl");
262
+ const engine2 = new core.Engine(
263
+ gl,
264
+ true,
265
+ { useHighPrecisionMatrix: true },
266
+ true
267
+ );
268
+ const scene2 = new core.Scene(engine2);
269
+ scene2.autoClear = false;
270
+ scene2.clearColor = new core.Color4(0, 0, 0, 0);
271
+ scene2.detachControl();
272
+ const camera2 = new core.FreeCamera("cam", core.Vector3.Zero(), scene2);
273
+ camera2.inputs.clear();
274
+ camera2.minZ = 0;
275
+ const babylonMap2 = createBabylonMap({ map, fromLngLat: fromLngLat2, engine: engine2, scene: scene2 });
276
+ const container = document.createElement("div");
277
+ const reactRoot2 = createRoot(container);
278
+ return { engine: engine2, scene: scene2, camera: camera2, reactRoot: reactRoot2, container, babylonMap: babylonMap2 };
279
+ });
280
+ const onResize = useFunction(() => {
281
+ engine.resize();
282
+ });
283
+ const onRemove = useFunction(() => {
284
+ reactRoot.unmount();
285
+ scene.dispose();
286
+ engine.dispose();
287
+ });
288
+ babylonMap.coords = { longitude, latitude, altitude };
289
+ react.useEffect(() => {
290
+ map.on("resize", onResize);
291
+ return () => {
292
+ map.off("resize", onResize);
293
+ };
294
+ }, []);
295
+ react.useEffect(() => {
296
+ reactRoot.render(
297
+ /* @__PURE__ */ jsxRuntime.jsx(BabylonMapContext.Provider, { value: babylonMap, children: props.children })
298
+ );
299
+ }, [props.children]);
300
+ return { onRemove, engine, scene, camera, babylonMap };
301
+ }
302
+ function useCanvasInLayer(props, fromLngLat2, map) {
303
+ const { latitude, longitude, altitude, frameloop } = props;
304
+ const origin = useCoordsToMatrix({
305
+ latitude,
306
+ longitude,
307
+ altitude,
308
+ fromLngLat: fromLngLat2
309
+ });
310
+ const { onRemove, scene, camera, babylonMap } = useRoot(fromLngLat2, map, props);
311
+ const render = useRender({ origin, frameloop, scene, camera, map, babylonMap });
312
+ return {
313
+ id: props.id,
314
+ beforeId: props.beforeId,
315
+ onRemove,
316
+ render,
317
+ type: "custom",
318
+ renderingMode: "3d"
319
+ };
320
+ }
321
+ const SyncCameraFC = react.memo(({
322
+ latitude,
323
+ longitude,
324
+ altitude = 0,
325
+ setOnRender,
326
+ onReady,
327
+ map,
328
+ canvasRef
329
+ }) => {
330
+ const mapCanvas = map.getCanvas();
331
+ const babylonMap = useBabylonMap();
332
+ const scene = babylonMap.scene;
333
+ const engine = babylonMap.engine;
334
+ const origin = useCoordsToMatrix({ latitude, longitude, altitude, fromLngLat: babylonMap.fromLngLat });
335
+ const ready = react.useRef(false);
336
+ const triggerRepaint = react.useMemo(() => map.triggerRepaint, [map]);
337
+ const mapPaintRequests = react.useRef(0);
338
+ const triggerRepaintOff = useFunction(() => {
339
+ mapPaintRequests.current++;
340
+ });
341
+ const onRender = useFunction((viewProjMx) => {
342
+ map.triggerRepaint = triggerRepaintOff;
343
+ if (canvasRef.current && engine) {
344
+ if (canvasRef.current.width !== mapCanvas.width || canvasRef.current.height !== mapCanvas.height) {
345
+ canvasRef.current.width = mapCanvas.clientWidth * window.devicePixelRatio;
346
+ canvasRef.current.height = mapCanvas.clientHeight * window.devicePixelRatio;
347
+ canvasRef.current.style.width = `${mapCanvas.clientWidth}px`;
348
+ canvasRef.current.style.height = `${mapCanvas.clientHeight}px`;
349
+ engine.resize();
350
+ }
351
+ }
352
+ const pVMx = "defaultProjectionData" in viewProjMx ? Object.values(viewProjMx.defaultProjectionData.mainMatrix) : viewProjMx;
353
+ babylonMap.viewProjMx = pVMx;
354
+ syncCamera(scene.activeCamera, origin, babylonMap.viewProjMx);
355
+ engine.wipeCaches(true);
356
+ scene.render(false);
357
+ if (!ready.current && onReady) {
358
+ ready.current = true;
359
+ onReady();
360
+ }
361
+ map.triggerRepaint = triggerRepaint;
362
+ if (mapPaintRequests.current > 0) {
363
+ mapPaintRequests.current = 0;
364
+ map.triggerRepaint();
365
+ }
366
+ });
367
+ react.useEffect(() => {
368
+ setOnRender && setOnRender(() => onRender);
369
+ }, [setOnRender, onRender]);
370
+ return null;
371
+ });
372
+ SyncCameraFC.displayName = "SyncCameraFC";
373
+ const canvasStyle = {
374
+ position: "absolute",
375
+ top: 0,
376
+ left: 0,
377
+ width: "100%",
378
+ height: "100%",
379
+ pointerEvents: "none"
380
+ };
381
+ const CanvasPortal = react.memo(({
382
+ children,
383
+ latitude,
384
+ longitude,
385
+ altitude,
386
+ setOnRender,
387
+ map,
388
+ fromLngLat: fromLngLat2
389
+ }) => {
390
+ const canvasRef = react.useRef(null);
391
+ const mapCanvas = map.getCanvas();
392
+ const [babylonMap, setBabylonMap] = react.useState(null);
393
+ const [ready, setReady] = react.useState(false);
394
+ react.useEffect(() => {
395
+ const canvas = canvasRef.current;
396
+ const engine = new core.Engine(canvas, true, { preserveDrawingBuffer: true, stencil: true, useHighPrecisionMatrix: true });
397
+ const scene = new core.Scene(engine);
398
+ scene.clearColor = new core.Color4(0, 0, 0, 0);
399
+ const camera = new core.FreeCamera("cam", core.Vector3.Zero(), scene);
400
+ camera.inputs.clear();
401
+ camera.minZ = 0;
402
+ setBabylonMap(createBabylonMap({ map, fromLngLat: fromLngLat2, engine, scene }));
403
+ return () => {
404
+ scene.dispose();
405
+ engine.dispose();
406
+ };
407
+ }, []);
408
+ react.useEffect(() => {
409
+ if (!(babylonMap == null ? void 0 : babylonMap.engine))
410
+ return;
411
+ const engine = babylonMap.engine;
412
+ const onResize = () => {
413
+ const c = canvasRef.current;
414
+ if (!c)
415
+ return;
416
+ c.width = mapCanvas.clientWidth * window.devicePixelRatio;
417
+ c.height = mapCanvas.clientHeight * window.devicePixelRatio;
418
+ c.style.width = `${mapCanvas.clientWidth}px`;
419
+ c.style.height = `${mapCanvas.clientHeight}px`;
420
+ engine.resize();
421
+ };
422
+ onResize();
423
+ map.on("resize", onResize);
424
+ return () => {
425
+ map.off("resize", onResize);
426
+ };
427
+ }, [babylonMap, map, mapCanvas]);
428
+ const onReady = useFunction(() => {
429
+ setReady(true);
430
+ });
431
+ return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
432
+ /* @__PURE__ */ jsxRuntime.jsx("canvas", { ref: canvasRef, style: canvasStyle }),
433
+ babylonMap && /* @__PURE__ */ jsxRuntime.jsxs(BabylonMapContext.Provider, { value: babylonMap, children: [
434
+ /* @__PURE__ */ jsxRuntime.jsx(
435
+ SyncCameraFC,
436
+ {
437
+ latitude,
438
+ longitude,
439
+ altitude,
440
+ setOnRender,
441
+ onReady,
442
+ map,
443
+ canvasRef
444
+ }
445
+ ),
446
+ ready && children
447
+ ] })
448
+ ] });
449
+ });
450
+ CanvasPortal.displayName = "CanvasPortal";
451
+ const InitCanvasFC = react.memo((props) => {
452
+ const canvas = props.map.getCanvas();
453
+ const [el] = react.useState(() => {
454
+ const el2 = document.createElement("div");
455
+ el2.style.position = "absolute";
456
+ el2.style.top = "0";
457
+ el2.style.bottom = "0";
458
+ el2.style.left = "0";
459
+ el2.style.right = "0";
460
+ el2.style.pointerEvents = "none";
461
+ return el2;
462
+ });
463
+ react.useEffect(() => {
464
+ const parent = canvas.parentElement;
465
+ parent.appendChild(el);
466
+ return () => {
467
+ parent.removeChild(el);
468
+ };
469
+ }, []);
470
+ return /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children: require$$0.createPortal(
471
+ /* @__PURE__ */ jsxRuntime.jsx(CanvasPortal, { ...props }),
472
+ el
473
+ ) });
474
+ });
475
+ InitCanvasFC.displayName = "InitCanvasFC";
476
+ const fromLngLat = mapboxGl.MercatorCoordinate.fromLngLat;
477
+ const Canvas = react.memo(({ overlay, ...props }) => {
478
+ const map = mapbox.useMap().current.getMap();
479
+ return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
480
+ overlay && /* @__PURE__ */ jsxRuntime.jsx(CanvasOverlay, { map, ...props }),
481
+ !overlay && /* @__PURE__ */ jsxRuntime.jsx(CanvasInLayer, { map, ...props })
482
+ ] });
483
+ });
484
+ Canvas.displayName = "Canvas";
485
+ const CanvasInLayer = react.memo(({ map, ...props }) => {
486
+ const layerProps = useCanvasInLayer(props, fromLngLat, map);
487
+ return /* @__PURE__ */ jsxRuntime.jsx(mapbox.Layer, { ...layerProps });
488
+ });
489
+ CanvasInLayer.displayName = "CanvasInLayer";
490
+ const CanvasOverlay = react.memo(({ map, id, beforeId, ...props }) => {
491
+ const [onRender, setOnRender] = react.useState();
492
+ const render = useFunction((_gl, mx) => {
493
+ if (!onRender)
494
+ return;
495
+ onRender(mx);
496
+ });
497
+ return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
498
+ /* @__PURE__ */ jsxRuntime.jsx(mapbox.Layer, { id, beforeId, type: "custom", render }),
499
+ /* @__PURE__ */ jsxRuntime.jsx(
500
+ InitCanvasFC,
501
+ {
502
+ ...props,
503
+ setOnRender,
504
+ map,
505
+ fromLngLat
506
+ }
507
+ )
508
+ ] });
509
+ });
510
+ CanvasOverlay.displayName = "CanvasOverlay";
511
+ const useMap = useMap$1;
512
+ exports.BabylonMapContext = BabylonMapContext;
513
+ exports.Canvas = Canvas;
514
+ exports.Coordinates = Coordinates;
515
+ exports.NearCoordinates = NearCoordinates;
516
+ exports.averageMercatorScale = averageMercatorScale;
517
+ exports.coordsToVector3 = coordsToVector3;
518
+ exports.useBabylonMap = useBabylonMap;
519
+ exports.useMap = useMap;
520
+ exports.vector3ToCoords = vector3ToCoords;
@@ -0,0 +1,20 @@
1
+ import { useMap as useMap$1 } from "./main2.mjs";
2
+ import { Canvas } from "./main3.mjs";
3
+ import { BabylonMapContext, useBabylonMap } from "./main4.mjs";
4
+ import { Coordinates } from "./main5.mjs";
5
+ import { averageMercatorScale, coordsToVector3 } from "./main6.mjs";
6
+ import { NearCoordinates } from "./main7.mjs";
7
+ import { vector3ToCoords } from "./main8.mjs";
8
+ const useMap = useMap$1;
9
+ export {
10
+ BabylonMapContext,
11
+ Canvas,
12
+ Coordinates,
13
+ NearCoordinates,
14
+ averageMercatorScale,
15
+ coordsToVector3,
16
+ useBabylonMap,
17
+ useMap,
18
+ vector3ToCoords
19
+ };
20
+ //# sourceMappingURL=main.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"main.mjs","sources":["../../src/mapbox.index.ts"],"sourcesContent":["import type { Map } from 'mapbox-gl';\nimport { useMap as useMapGeneric } from './api/use-map';\n\nexport * from './api';\nexport * from './mapbox/canvas';\n\nexport const useMap = useMapGeneric<Map>;\n"],"names":["useMapGeneric"],"mappings":";;;;;;;AAMO,MAAM,SAASA;"}
@@ -0,0 +1,33 @@
1
+ import { jsx, Fragment } from "react/jsx-runtime";
2
+ import { memo, useState, useEffect } from "react";
3
+ import { createPortal } from "react-dom";
4
+ import { CanvasPortal } from "./main18.mjs";
5
+ const InitCanvasFC = memo((props) => {
6
+ const canvas = props.map.getCanvas();
7
+ const [el] = useState(() => {
8
+ const el2 = document.createElement("div");
9
+ el2.style.position = "absolute";
10
+ el2.style.top = "0";
11
+ el2.style.bottom = "0";
12
+ el2.style.left = "0";
13
+ el2.style.right = "0";
14
+ el2.style.pointerEvents = "none";
15
+ return el2;
16
+ });
17
+ useEffect(() => {
18
+ const parent = canvas.parentElement;
19
+ parent.appendChild(el);
20
+ return () => {
21
+ parent.removeChild(el);
22
+ };
23
+ }, []);
24
+ return /* @__PURE__ */ jsx(Fragment, { children: createPortal(
25
+ /* @__PURE__ */ jsx(CanvasPortal, { ...props }),
26
+ el
27
+ ) });
28
+ });
29
+ InitCanvasFC.displayName = "InitCanvasFC";
30
+ export {
31
+ InitCanvasFC
32
+ };
33
+ //# sourceMappingURL=main10.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"main10.mjs","sources":["../../src/core/canvas-overlay/init-canvas-fc.tsx"],"sourcesContent":["import { memo, useEffect, useState } from 'react';\nimport { createPortal } from 'react-dom';\nimport { CanvasProps } from '../../api/canvas-props';\nimport { FromLngLat, MapInstance } from '../generic-map';\nimport { CanvasPortal } from './canvas-portal';\n\ninterface InitCanvasFCProps extends CanvasProps {\n map: MapInstance;\n setOnRender: (callback: () => (mx: number[]) => void) => void;\n frameloop?: 'always' | 'demand';\n fromLngLat: FromLngLat;\n}\n\nexport const InitCanvasFC = memo<InitCanvasFCProps>((props) => {\n const canvas = props.map.getCanvas();\n\n const [el] = useState(() => {\n const el = document.createElement('div');\n el.style.position = 'absolute';\n el.style.top = '0';\n el.style.bottom = '0';\n el.style.left = '0';\n el.style.right = '0';\n el.style.pointerEvents = 'none';\n return el;\n });\n\n useEffect(() => {\n const parent = canvas.parentElement!; // eslint-disable-line @typescript-eslint/no-non-null-assertion\n parent.appendChild(el);\n return () => {\n parent.removeChild(el);\n };\n }, []); // eslint-disable-line react-hooks/exhaustive-deps\n\n return (\n <>\n {createPortal(\n <CanvasPortal {...props} />,\n el,\n )}\n </>\n );\n});\nInitCanvasFC.displayName = 'InitCanvasFC';\n"],"names":["el"],"mappings":";;;;AAaa,MAAA,eAAe,KAAwB,CAAC,UAAU;AACvD,QAAA,SAAS,MAAM,IAAI,UAAU;AAEnC,QAAM,CAAC,EAAE,IAAI,SAAS,MAAM;AACpBA,UAAAA,MAAK,SAAS,cAAc,KAAK;AACvCA,QAAG,MAAM,WAAW;AACpBA,QAAG,MAAM,MAAM;AACfA,QAAG,MAAM,SAAS;AAClBA,QAAG,MAAM,OAAO;AAChBA,QAAG,MAAM,QAAQ;AACjBA,QAAG,MAAM,gBAAgB;AAClBA,WAAAA;AAAAA,EAAA,CACR;AAED,YAAU,MAAM;AACd,UAAM,SAAS,OAAO;AACtB,WAAO,YAAY,EAAE;AACrB,WAAO,MAAM;AACX,aAAO,YAAY,EAAE;AAAA,IAAA;AAAA,EAEzB,GAAG,CAAE,CAAA;AAEL,SAEK,oBAAA,UAAA,EAAA,UAAA;AAAA,IACC,oBAAC,cAAc,EAAA,GAAG,OAAO;AAAA,IACzB;AAAA,EAEJ,EAAA,CAAA;AAEJ,CAAC;AACD,aAAa,cAAc;"}
@@ -0,0 +1,12 @@
1
+ import { useRef, useCallback } from "react";
2
+ const useFunction = (callback) => {
3
+ const callbackRef = useRef(callback);
4
+ callbackRef.current = callback;
5
+ return useCallback((...args) => {
6
+ return callbackRef.current(...args);
7
+ }, []);
8
+ };
9
+ export {
10
+ useFunction
11
+ };
12
+ //# sourceMappingURL=main11.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"main11.mjs","sources":["../../src/core/use-function.ts"],"sourcesContent":["import { useCallback, useRef } from 'react';\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\nexport const useFunction = <T extends (...args: any[]) => any>(callback: T): T => {\n const callbackRef = useRef(callback);\n callbackRef.current = callback;\n return useCallback((...args: any[]) => {\n return callbackRef.current(...args);\n }, []) as T;\n};\n"],"names":[],"mappings":";AAGa,MAAA,cAAc,CAAoC,aAAmB;AAC1E,QAAA,cAAc,OAAO,QAAQ;AACnC,cAAY,UAAU;AACf,SAAA,YAAY,IAAI,SAAgB;AAC9B,WAAA,YAAY,QAAQ,GAAG,IAAI;AAAA,EACpC,GAAG,CAAE,CAAA;AACP;"}
@@ -0,0 +1,14 @@
1
+ import { Matrix } from "@babylonjs/core";
2
+ const tmpCameraMx = Matrix.Identity();
3
+ const tmpWvpMx = Matrix.Identity();
4
+ function syncCamera(camera, origin, mapCamMx) {
5
+ Matrix.FromArrayToRef(mapCamMx, 0, tmpCameraMx);
6
+ origin.multiplyToRef(tmpCameraMx, tmpWvpMx);
7
+ camera.freezeProjectionMatrix(tmpWvpMx);
8
+ camera.minZ = 0;
9
+ camera.maxZ = 1e6;
10
+ }
11
+ export {
12
+ syncCamera
13
+ };
14
+ //# sourceMappingURL=main12.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"main12.mjs","sources":["../../src/core/sync-camera.ts"],"sourcesContent":["import { FreeCamera, Matrix } from '@babylonjs/core';\n\nconst tmpCameraMx = Matrix.Identity();\nconst tmpWvpMx = Matrix.Identity();\n\n/** Synchronise a Babylon camera with the map's view-projection matrix.\n * @param camera The Babylon camera to update.\n * @param origin Babylon world matrix for the Canvas origin.\n * @param mapCamMx Flat array from MapLibre's view-projection (column-major).\n */\nexport function syncCamera(\n camera: FreeCamera,\n origin: Matrix,\n mapCamMx: number[],\n): void {\n\n // Matrix.FromArray reads column-major data (same layout as MapLibre provides)\n Matrix.FromArrayToRef(mapCamMx, 0, tmpCameraMx);\n\n // world-view-projection = origin * camera (same as demo: worldMatrix.multiply(cameraMatrix))\n origin.multiplyToRef(tmpCameraMx, tmpWvpMx);\n\n // Freeze the projection to the composed matrix so Babylon's own\n // projection math is bypassed.\n camera.freezeProjectionMatrix(tmpWvpMx);\n\n camera.minZ = 0;\n camera.maxZ = 1e6;\n}\n"],"names":[],"mappings":";AAEA,MAAM,cAAc,OAAO;AAC3B,MAAM,WAAW,OAAO;AAOR,SAAA,WACd,QACA,QACA,UACM;AAGC,SAAA,eAAe,UAAU,GAAG,WAAW;AAGvC,SAAA,cAAc,aAAa,QAAQ;AAI1C,SAAO,uBAAuB,QAAQ;AAEtC,SAAO,OAAO;AACd,SAAO,OAAO;AAChB;"}
@@ -0,0 +1,12 @@
1
+ import { useMemo } from "react";
2
+ import { coordsToMatrix } from "./main19.mjs";
3
+ function useCoordsToMatrix({ latitude, longitude, altitude, fromLngLat }) {
4
+ return useMemo(
5
+ () => coordsToMatrix({ latitude, longitude, altitude, fromLngLat }),
6
+ [latitude, longitude, altitude, fromLngLat]
7
+ );
8
+ }
9
+ export {
10
+ useCoordsToMatrix
11
+ };
12
+ //# sourceMappingURL=main13.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"main13.mjs","sources":["../../src/core/use-coords-to-matrix.ts"],"sourcesContent":["import { useMemo } from 'react';\nimport { Matrix } from '@babylonjs/core';\nimport { coordsToMatrix } from './coords-to-matrix';\n\ntype Props = Parameters<typeof coordsToMatrix>[0];\n\n/** Calculate a Babylon Matrix from coordinates (memoised). */\nexport function useCoordsToMatrix({ latitude, longitude, altitude, fromLngLat }: Props): Matrix {\n return useMemo(\n () => coordsToMatrix({ latitude, longitude, altitude, fromLngLat }),\n [latitude, longitude, altitude, fromLngLat],\n );\n}\n"],"names":[],"mappings":";;AAOO,SAAS,kBAAkB,EAAE,UAAU,WAAW,UAAU,cAA6B;AACvF,SAAA;AAAA,IACL,MAAM,eAAe,EAAE,UAAU,WAAW,UAAU,YAAY;AAAA,IAClE,CAAC,UAAU,WAAW,UAAU,UAAU;AAAA,EAAA;AAE9C;"}
@@ -0,0 +1,5 @@
1
+ const earthRadius = 63710088e-1;
2
+ export {
3
+ earthRadius
4
+ };
5
+ //# sourceMappingURL=main14.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"main14.mjs","sources":["../../src/core/earth-radius.ts"],"sourcesContent":["export const earthRadius = 6371008.8;\n"],"names":[],"mappings":"AAAO,MAAM,cAAc;"}
@@ -0,0 +1,12 @@
1
+ import { useContext } from "react";
2
+ import { BabylonMapContext } from "./main4.mjs";
3
+ function useCoords() {
4
+ const ctx = useContext(BabylonMapContext);
5
+ if (!ctx)
6
+ throw new Error("useCoords must be used inside a <Canvas>");
7
+ return ctx.coords;
8
+ }
9
+ export {
10
+ useCoords
11
+ };
12
+ //# sourceMappingURL=main15.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"main15.mjs","sources":["../../src/core/use-coords.tsx"],"sourcesContent":["import { useContext, useMemo } from 'react';\nimport { Coords } from '../api/coords';\nimport { BabylonMapContext, BabylonMap } from './use-babylon-map';\n\n/** Read the current coordinates from context. */\nexport function useCoords(): Coords {\n const ctx = useContext(BabylonMapContext);\n if (!ctx) throw new Error('useCoords must be used inside a <Canvas>');\n return (ctx as any).coords as Coords; // eslint-disable-line @typescript-eslint/no-explicit-any\n}\n\n/** Update the coordinates stored on the context. */\nexport function useSetCoords({ longitude, latitude, altitude }: Coords) {\n // Coordinates are now stored directly on the BabylonMap context object\n // so downstream hooks can read them.\n useMemo(() => {\n const ctx = (BabylonMapContext as any)._currentValue as BabylonMap | null; // eslint-disable-line @typescript-eslint/no-explicit-any\n if (ctx) {\n (ctx as any).coords = { longitude, latitude, altitude }; // eslint-disable-line @typescript-eslint/no-explicit-any\n }\n }, [longitude, latitude, altitude]);\n}\n"],"names":[],"mappings":";;AAKO,SAAS,YAAoB;AAC5B,QAAA,MAAM,WAAW,iBAAiB;AACxC,MAAI,CAAC;AAAW,UAAA,IAAI,MAAM,0CAA0C;AACpE,SAAQ,IAAY;AACtB;"}