react-three-map 0.5.0 → 0.6.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 (50) hide show
  1. package/CHANGELOG.md +16 -0
  2. package/dist/cjs/main.js +85 -84
  3. package/dist/es/main.mjs +2 -2
  4. package/dist/es/main.mjs.map +1 -1
  5. package/dist/es/main10.mjs +20 -19
  6. package/dist/es/main10.mjs.map +1 -1
  7. package/dist/es/main11.mjs +19 -14
  8. package/dist/es/main11.mjs.map +1 -1
  9. package/dist/es/main12.mjs +1 -0
  10. package/dist/es/main12.mjs.map +1 -1
  11. package/dist/es/main3.mjs +52 -23
  12. package/dist/es/main3.mjs.map +1 -1
  13. package/dist/es/main4.mjs +23 -52
  14. package/dist/es/main4.mjs.map +1 -1
  15. package/dist/es/main5.mjs +3 -22
  16. package/dist/es/main5.mjs.map +1 -1
  17. package/dist/es/main6.mjs +34 -3
  18. package/dist/es/main6.mjs.map +1 -1
  19. package/dist/es/main7.mjs +11 -33
  20. package/dist/es/main7.mjs.map +1 -1
  21. package/dist/es/main8.mjs +17 -7
  22. package/dist/es/main8.mjs.map +1 -1
  23. package/dist/es/main9.mjs +15 -21
  24. package/dist/es/main9.mjs.map +1 -1
  25. package/dist/maplibre/cjs/main.js +85 -84
  26. package/dist/maplibre/es/main.mjs +2 -2
  27. package/dist/maplibre/es/main.mjs.map +1 -1
  28. package/dist/maplibre/es/main10.mjs +19 -20
  29. package/dist/maplibre/es/main10.mjs.map +1 -1
  30. package/dist/maplibre/es/main11.mjs +14 -19
  31. package/dist/maplibre/es/main11.mjs.map +1 -1
  32. package/dist/maplibre/es/main12.mjs +1 -0
  33. package/dist/maplibre/es/main12.mjs.map +1 -1
  34. package/dist/maplibre/es/main3.mjs +52 -23
  35. package/dist/maplibre/es/main3.mjs.map +1 -1
  36. package/dist/maplibre/es/main4.mjs +23 -52
  37. package/dist/maplibre/es/main4.mjs.map +1 -1
  38. package/dist/maplibre/es/main5.mjs +3 -22
  39. package/dist/maplibre/es/main5.mjs.map +1 -1
  40. package/dist/maplibre/es/main6.mjs +34 -3
  41. package/dist/maplibre/es/main6.mjs.map +1 -1
  42. package/dist/maplibre/es/main7.mjs +11 -33
  43. package/dist/maplibre/es/main7.mjs.map +1 -1
  44. package/dist/maplibre/es/main8.mjs +17 -7
  45. package/dist/maplibre/es/main8.mjs.map +1 -1
  46. package/dist/maplibre/es/main9.mjs +21 -15
  47. package/dist/maplibre/es/main9.mjs.map +1 -1
  48. package/dist/maplibre/types/maplibre.index.d.ts +3 -3
  49. package/dist/types/mapbox.index.d.ts +3 -3
  50. package/package.json +1 -1
package/CHANGELOG.md CHANGED
@@ -1,5 +1,21 @@
1
1
  # react-three-map
2
2
 
3
+ ## 0.6.1
4
+
5
+ ### Patch Changes
6
+
7
+ - be1efa7: Fix resizing bug when DPR changes.
8
+
9
+ ## 0.6.0
10
+
11
+ ### Minor Changes
12
+
13
+ - 3a9a852: Add `useMap` hook to access the map from react-three-map.
14
+
15
+ ### Patch Changes
16
+
17
+ - 3a9a852: Better type for `useMap`.
18
+
3
19
  ## 0.5.0
4
20
 
5
21
  ### Minor Changes
package/dist/cjs/main.js CHANGED
@@ -2,10 +2,10 @@
2
2
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
3
  const fiber = require("@react-three/fiber");
4
4
  const jsxRuntime = require("react/jsx-runtime");
5
- const mapboxGl = require("mapbox-gl");
6
5
  const react = require("react");
7
- const reactMapGl = require("react-map-gl");
8
6
  const THREE = require("three");
7
+ const mapboxGl = require("mapbox-gl");
8
+ const reactMapGl = require("react-map-gl");
9
9
  function _interopNamespaceDefault(e) {
10
10
  const n = Object.create(null, { [Symbol.toStringTag]: { value: "Module" } });
11
11
  if (e) {
@@ -27,6 +27,39 @@ const useMap$1 = () => fiber.useThree((s) => {
27
27
  var _a;
28
28
  return (_a = s.r3m) == null ? void 0 : _a.map;
29
29
  });
30
+ const useR3M = () => fiber.useThree((s) => s.r3m);
31
+ const originMx = new THREE.Matrix4();
32
+ const projByView = new THREE.Matrix4();
33
+ const projByViewInv$1 = new THREE.Matrix4();
34
+ const fwd = new THREE.Vector3();
35
+ function syncCamera(camera, origin, mapCamMx) {
36
+ projByView.fromArray(mapCamMx).multiply(originMx.fromArray(origin));
37
+ projByViewInv$1.copy(projByView).invert();
38
+ updateCamera(camera, projByViewInv$1);
39
+ camera.updateMatrix();
40
+ camera.updateMatrixWorld(true);
41
+ camera.projectionMatrix.copy(camera.matrix).premultiply(projByView);
42
+ camera.projectionMatrixInverse.copy(camera.projectionMatrix).invert();
43
+ camera.far = calculateFar(
44
+ camera.matrix.elements[10],
45
+ camera.matrix.elements[14],
46
+ camera.near
47
+ );
48
+ camera.userData.projByView = projByView.toArray();
49
+ camera.userData.projByViewInv = projByViewInv$1.toArray();
50
+ }
51
+ const updateCamera = (target, projByViewInv2) => {
52
+ target.position.setScalar(0).applyMatrix4(projByViewInv2);
53
+ target.up.set(0, -1, 0).applyMatrix4(projByViewInv2).negate().add(target.position).normalize();
54
+ fwd.set(0, 0, 1).applyMatrix4(projByViewInv2);
55
+ target.lookAt(fwd);
56
+ };
57
+ function calculateFar(c, d, near) {
58
+ const numerator = d * (c - 1);
59
+ const denominator = c * near + near;
60
+ const far = numerator / denominator;
61
+ return far;
62
+ }
30
63
  const quat = new THREE.Quaternion();
31
64
  const euler = new THREE.Euler();
32
65
  const pos = new THREE.Vector3();
@@ -49,6 +82,51 @@ function useCoords({ latitude, longitude, altitude, fromLngLat: fromLngLat2 }) {
49
82
  }), [latitude, longitude, altitude, fromLngLat2]);
50
83
  return m42;
51
84
  }
85
+ const Coordinates = react.memo(({
86
+ latitude,
87
+ longitude,
88
+ altitude = 0,
89
+ children
90
+ }) => {
91
+ const [scene] = react.useState(() => new THREE.Scene());
92
+ const r3m = useR3M();
93
+ const origin = useCoords({
94
+ latitude,
95
+ longitude,
96
+ altitude,
97
+ fromLngLat: r3m.fromLngLat
98
+ });
99
+ return /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children: fiber.createPortal(/* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
100
+ /* @__PURE__ */ jsxRuntime.jsx(RenderAtCoords, { r3m, origin }),
101
+ children
102
+ ] }), scene, { events: { priority: 2 } }) });
103
+ });
104
+ Coordinates.displayName = "Coordinates";
105
+ function RenderAtCoords({ r3m, origin }) {
106
+ const { gl, scene, set } = fiber.useThree();
107
+ const cameraRef = react.useRef(null);
108
+ fiber.useFrame(() => {
109
+ if (!r3m.mapCamMx)
110
+ return;
111
+ if (!cameraRef.current)
112
+ return;
113
+ syncCamera(cameraRef.current, origin, r3m.mapCamMx);
114
+ gl.render(scene, cameraRef.current);
115
+ });
116
+ react.useLayoutEffect(() => {
117
+ if (!cameraRef.current)
118
+ return;
119
+ set({
120
+ invalidate: () => {
121
+ if (!r3m.map)
122
+ return;
123
+ r3m.map.triggerRepaint();
124
+ },
125
+ camera: cameraRef.current
126
+ });
127
+ }, [set, r3m]);
128
+ return /* @__PURE__ */ jsxRuntime.jsx("perspectiveCamera", { ref: cameraRef });
129
+ }
52
130
  const DOM_EVENTS = {
53
131
  onClick: ["click", false],
54
132
  onContextMenu: ["contextmenu", false],
@@ -61,7 +139,7 @@ const DOM_EVENTS = {
61
139
  onPointerCancel: ["pointercancel", true],
62
140
  onLostPointerCapture: ["lostpointercapture", true]
63
141
  };
64
- const projByViewInv$1 = new THREE.Matrix4();
142
+ const projByViewInv = new THREE.Matrix4();
65
143
  function createEvents() {
66
144
  return (store) => {
67
145
  const { handlePointer } = fiber.createEvents(store);
@@ -72,10 +150,10 @@ function createEvents() {
72
150
  state.pointer.x = event.offsetX / state.size.width * 2 - 1;
73
151
  state.pointer.y = 1 - event.offsetY / state.size.height * 2;
74
152
  if (state.camera.userData.projByViewInv)
75
- projByViewInv$1.fromArray(state.camera.userData.projByViewInv);
153
+ projByViewInv.fromArray(state.camera.userData.projByViewInv);
76
154
  state.raycaster.camera = state.camera;
77
- state.raycaster.ray.origin.setScalar(0).applyMatrix4(projByViewInv$1);
78
- state.raycaster.ray.direction.set(state.pointer.x, state.pointer.y, 1).applyMatrix4(projByViewInv$1).sub(state.raycaster.ray.origin).normalize();
155
+ state.raycaster.ray.origin.setScalar(0).applyMatrix4(projByViewInv);
156
+ state.raycaster.ray.direction.set(state.pointer.x, state.pointer.y, 1).applyMatrix4(projByViewInv).sub(state.raycaster.ray.origin).normalize();
79
157
  },
80
158
  connected: void 0,
81
159
  handlers: Object.keys(DOM_EVENTS).reduce(
@@ -178,6 +256,7 @@ function useOnAdd(fromLngLat2, { frameloop, ...renderProps }) {
178
256
  return;
179
257
  const canvas = r3mRef.current.map.getCanvas();
180
258
  r3mRef.current.state.setSize(canvas.width, canvas.height);
259
+ r3mRef.current.state.viewport.dpr = window.devicePixelRatio;
181
260
  });
182
261
  const onRemove = useFunction(() => {
183
262
  if (!r3mRef.current.root)
@@ -208,38 +287,6 @@ const useCreateRoot = ({
208
287
  }, [r3mRef, mounted, children]);
209
288
  return { id, onAdd, onRemove, r3mRef };
210
289
  };
211
- const originMx = new THREE.Matrix4();
212
- const projByView = new THREE.Matrix4();
213
- const projByViewInv = new THREE.Matrix4();
214
- const fwd = new THREE.Vector3();
215
- function syncCamera(camera, origin, mapCamMx) {
216
- projByView.fromArray(mapCamMx).multiply(originMx.fromArray(origin));
217
- projByViewInv.copy(projByView).invert();
218
- updateCamera(camera, projByViewInv);
219
- camera.updateMatrix();
220
- camera.updateMatrixWorld(true);
221
- camera.projectionMatrix.copy(camera.matrix).premultiply(projByView);
222
- camera.projectionMatrixInverse.copy(camera.projectionMatrix).invert();
223
- camera.far = calculateFar(
224
- camera.matrix.elements[10],
225
- camera.matrix.elements[14],
226
- camera.near
227
- );
228
- camera.userData.projByView = projByView.toArray();
229
- camera.userData.projByViewInv = projByViewInv.toArray();
230
- }
231
- const updateCamera = (target, projByViewInv2) => {
232
- target.position.setScalar(0).applyMatrix4(projByViewInv2);
233
- target.up.set(0, -1, 0).applyMatrix4(projByViewInv2).negate().add(target.position).normalize();
234
- fwd.set(0, 0, 1).applyMatrix4(projByViewInv2);
235
- target.lookAt(fwd);
236
- };
237
- function calculateFar(c, d, near) {
238
- const numerator = d * (c - 1);
239
- const denominator = c * near + near;
240
- const far = numerator / denominator;
241
- return far;
242
- }
243
290
  function useRender(origin, r3mRef, frameloop) {
244
291
  const render = useFunction((_gl, mapCamMx) => {
245
292
  const r3m = r3mRef.current;
@@ -291,52 +338,6 @@ const Canvas = react.memo((props) => {
291
338
  }
292
339
  );
293
340
  });
294
- const useR3M = () => fiber.useThree((s) => s.r3m);
295
- const Coordinates = react.memo(({
296
- latitude,
297
- longitude,
298
- altitude = 0,
299
- children
300
- }) => {
301
- const [scene] = react.useState(() => new THREE.Scene());
302
- const r3m = useR3M();
303
- const origin = useCoords({
304
- latitude,
305
- longitude,
306
- altitude,
307
- fromLngLat: r3m.fromLngLat
308
- });
309
- return /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children: fiber.createPortal(/* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
310
- /* @__PURE__ */ jsxRuntime.jsx(RenderAtCoords, { r3m, origin }),
311
- children
312
- ] }), scene, { events: { priority: 2 } }) });
313
- });
314
- Coordinates.displayName = "Coordinates";
315
- function RenderAtCoords({ r3m, origin }) {
316
- const { gl, scene, set } = fiber.useThree();
317
- const cameraRef = react.useRef(null);
318
- fiber.useFrame(() => {
319
- if (!r3m.mapCamMx)
320
- return;
321
- if (!cameraRef.current)
322
- return;
323
- syncCamera(cameraRef.current, origin, r3m.mapCamMx);
324
- gl.render(scene, cameraRef.current);
325
- });
326
- react.useLayoutEffect(() => {
327
- if (!cameraRef.current)
328
- return;
329
- set({
330
- invalidate: () => {
331
- if (!r3m.map)
332
- return;
333
- r3m.map.triggerRepaint();
334
- },
335
- camera: cameraRef.current
336
- });
337
- }, [set, r3m]);
338
- return /* @__PURE__ */ jsxRuntime.jsx("perspectiveCamera", { ref: cameraRef });
339
- }
340
341
  const useMap = useMap$1;
341
342
  exports.Canvas = Canvas;
342
343
  exports.Coordinates = Coordinates;
package/dist/es/main.mjs CHANGED
@@ -1,6 +1,6 @@
1
1
  import { useMap as useMap$1 } from "./main2.mjs";
2
- import { Canvas } from "./main3.mjs";
3
- import { Coordinates } from "./main4.mjs";
2
+ import { Coordinates } from "./main3.mjs";
3
+ import { Canvas } from "./main4.mjs";
4
4
  const useMap = useMap$1;
5
5
  export {
6
6
  Canvas,
@@ -1 +1 @@
1
- {"version":3,"file":"main.mjs","sources":["../../src/mapbox.index.ts"],"sourcesContent":["import { MapInstance } from 'react-map-gl';\nimport { useMap as useMapGeneric } from './api/use-map';\n\nexport * from './mapbox/canvas';\nexport * from './api/canvas-props';\nexport * from './api/coordinates';\n\nexport const useMap = useMapGeneric<MapInstance>;\n"],"names":["useMapGeneric"],"mappings":";;;AAOO,MAAM,SAASA;"}
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/canvas-props';\nexport * from './api/coordinates';\nexport * from './mapbox/canvas';\n\nexport const useMap = useMapGeneric<Map>;\n"],"names":["useMapGeneric"],"mappings":";;;AAOO,MAAM,SAASA;"}
@@ -1,23 +1,24 @@
1
- import { syncCamera } from "./main7.mjs";
2
- import { useFunction } from "./main13.mjs";
3
- function useRender(origin, r3mRef, frameloop) {
4
- const render = useFunction((_gl, mapCamMx) => {
5
- const r3m = r3mRef.current;
6
- if (!r3m.state || !r3m.map)
1
+ import { jsx, Fragment } from "react/jsx-runtime";
2
+ import { useId, useEffect } from "react";
3
+ import { useOnAdd } from "./main12.mjs";
4
+ const useCreateRoot = ({
5
+ children,
6
+ frameloop,
7
+ fromLngLat,
8
+ ...renderProps
9
+ }) => {
10
+ const id = useId();
11
+ const { onAdd, onRemove, mounted, r3mRef } = useOnAdd(fromLngLat, { frameloop, ...renderProps });
12
+ useEffect(() => {
13
+ if (!mounted)
7
14
  return;
8
- const camera = r3m.state.camera;
9
- const gl = r3m.state.gl;
10
- const advance = r3m.state.advance;
11
- r3m.mapCamMx = mapCamMx;
12
- syncCamera(camera, origin, mapCamMx);
13
- gl.resetState();
14
- advance(Date.now() * 1e-3, true);
15
- if (frameloop === "always")
16
- r3m.map.triggerRepaint();
17
- });
18
- return render;
19
- }
15
+ if (!r3mRef.current.root)
16
+ return;
17
+ r3mRef.current.root.render(/* @__PURE__ */ jsx(Fragment, { children }));
18
+ }, [r3mRef, mounted, children]);
19
+ return { id, onAdd, onRemove, r3mRef };
20
+ };
20
21
  export {
21
- useRender
22
+ useCreateRoot
22
23
  };
23
24
  //# sourceMappingURL=main10.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"main10.mjs","sources":["../../src/core/use-render.ts"],"sourcesContent":["import { MutableRefObject } from \"react\";\nimport { Matrix4Tuple, PerspectiveCamera } from \"three\";\nimport { R3mStore } from \"./store\";\nimport { syncCamera } from \"./sync-camera\";\nimport { useFunction } from \"./use-function\";\n\nexport function useRender(\n origin: Matrix4Tuple, r3mRef: MutableRefObject<R3mStore>, frameloop: 'always' | 'demand'\n) {\n\n const render = useFunction((_gl: WebGL2RenderingContext, mapCamMx: number[]) => {\n const r3m = r3mRef.current;\n if (!r3m.state || !r3m.map) return;\n const camera = r3m.state.camera;\n const gl = r3m.state.gl;\n const advance = r3m.state.advance;\n r3m.mapCamMx = mapCamMx as Matrix4Tuple;\n syncCamera(camera as PerspectiveCamera, origin, mapCamMx as Matrix4Tuple);\n gl.resetState();\n advance(Date.now() * 0.001, true);\n if (frameloop === 'always') r3m.map.triggerRepaint();\n })\n\n return render;\n\n}"],"names":[],"mappings":";;AAMgB,SAAA,UACd,QAAsB,QAAoC,WAC1D;AAEA,QAAM,SAAS,YAAY,CAAC,KAA6B,aAAuB;AAC9E,UAAM,MAAM,OAAO;AACnB,QAAI,CAAC,IAAI,SAAS,CAAC,IAAI;AAAK;AACtB,UAAA,SAAS,IAAI,MAAM;AACnB,UAAA,KAAK,IAAI,MAAM;AACf,UAAA,UAAU,IAAI,MAAM;AAC1B,QAAI,WAAW;AACJ,eAAA,QAA6B,QAAQ,QAAwB;AACxE,OAAG,WAAW;AACd,YAAQ,KAAK,IAAQ,IAAA,MAAO,IAAI;AAChC,QAAI,cAAc;AAAU,UAAI,IAAI;EAAe,CACpD;AAEM,SAAA;AAET;"}
1
+ {"version":3,"file":"main10.mjs","sources":["../../src/core/use-create-root.tsx"],"sourcesContent":["import { RenderProps } from \"@react-three/fiber\";\nimport { PropsWithChildren, useEffect, useId } from \"react\";\nimport { FromLngLat } from \"./generic-map\";\nimport { useOnAdd } from \"./use-on-add\";\n\nexport interface useCanvasProps extends Omit<RenderProps<HTMLCanvasElement>, 'frameloop'>, PropsWithChildren {\n frameloop: 'always' | 'demand',\n fromLngLat: FromLngLat\n}\n\nexport const useCreateRoot = (({\n children, frameloop, fromLngLat, ...renderProps\n}: useCanvasProps) => {\n\n const id = useId();\n\n const { onAdd, onRemove, mounted, r3mRef } = useOnAdd(fromLngLat, { frameloop, ...renderProps });\n\n useEffect(() => {\n if (!mounted) return;\n if (!r3mRef.current.root) return;\n r3mRef.current.root.render(<>\n {children}\n </>);\n }, [r3mRef, mounted, children])\n\n return { id, onAdd, onRemove, r3mRef }\n})"],"names":[],"mappings":";;;AAUO,MAAM,gBAAiB,CAAC;AAAA,EAC7B;AAAA,EAAU;AAAA,EAAW;AAAA,EAAY,GAAG;AACtC,MAAsB;AAEpB,QAAM,KAAK;AAEX,QAAM,EAAE,OAAO,UAAU,SAAS,OAAO,IAAI,SAAS,YAAY,EAAE,WAAW,GAAG,YAAa,CAAA;AAE/F,YAAU,MAAM;AACd,QAAI,CAAC;AAAS;AACV,QAAA,CAAC,OAAO,QAAQ;AAAM;AAC1B,WAAO,QAAQ,KAAK,OAAO,oBAAA,UAAA,EACxB,SACH,CAAA,CAAG;AAAA,EACF,GAAA,CAAC,QAAQ,SAAS,QAAQ,CAAC;AAE9B,SAAO,EAAE,IAAI,OAAO,UAAU,OAAO;AACvC;"}
@@ -1,18 +1,23 @@
1
- import { Quaternion, Euler, Vector3, Matrix4 } from "three";
2
- const quat = new Quaternion();
3
- const euler = new Euler();
4
- const pos = new Vector3();
5
- const scale = new Vector3();
6
- const m4 = new Matrix4();
7
- function coordsToMatrix({ longitude, latitude, altitude, fromLngLat }) {
8
- const center = fromLngLat([longitude, latitude], altitude);
9
- const scaleUnit = center.meterInMercatorCoordinateUnits();
10
- pos.set(center.x, center.y, center.z || 0);
11
- scale.set(scaleUnit, -scaleUnit, scaleUnit);
12
- quat.setFromEuler(euler.set(-Math.PI * 0.5, 0, 0));
13
- return m4.compose(pos, quat, scale).toArray();
1
+ import { syncCamera } from "./main6.mjs";
2
+ import { useFunction } from "./main13.mjs";
3
+ function useRender(origin, r3mRef, frameloop) {
4
+ const render = useFunction((_gl, mapCamMx) => {
5
+ const r3m = r3mRef.current;
6
+ if (!r3m.state || !r3m.map)
7
+ return;
8
+ const camera = r3m.state.camera;
9
+ const gl = r3m.state.gl;
10
+ const advance = r3m.state.advance;
11
+ r3m.mapCamMx = mapCamMx;
12
+ syncCamera(camera, origin, mapCamMx);
13
+ gl.resetState();
14
+ advance(Date.now() * 1e-3, true);
15
+ if (frameloop === "always")
16
+ r3m.map.triggerRepaint();
17
+ });
18
+ return render;
14
19
  }
15
20
  export {
16
- coordsToMatrix
21
+ useRender
17
22
  };
18
23
  //# sourceMappingURL=main11.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"main11.mjs","sources":["../../src/core/coords-to-matrix.ts"],"sourcesContent":["import { Euler, Matrix4, Quaternion, Vector3 } from \"three\";\nimport { FromLngLat } from \"./generic-map\";\n\nconst quat = new Quaternion();\nconst euler = new Euler();\nconst pos = new Vector3();\nconst scale = new Vector3();\nconst m4 = new Matrix4();\n\n/** calculate Matrix4 from coordinates */\nexport function coordsToMatrix({ longitude, latitude, altitude, fromLngLat }: {\n longitude: number, latitude: number, altitude: number, fromLngLat: FromLngLat\n}) {\n const center = fromLngLat([longitude, latitude], altitude);\n const scaleUnit = center.meterInMercatorCoordinateUnits();\n pos.set(center.x, center.y, center.z || 0);\n scale.set(scaleUnit, -scaleUnit, scaleUnit);\n quat.setFromEuler(euler.set(-Math.PI * .5, 0, 0));\n return m4.compose(pos, quat, scale).toArray();\n}\n"],"names":[],"mappings":";AAGA,MAAM,OAAO,IAAI;AACjB,MAAM,QAAQ,IAAI;AAClB,MAAM,MAAM,IAAI;AAChB,MAAM,QAAQ,IAAI;AAClB,MAAM,KAAK,IAAI;AAGR,SAAS,eAAe,EAAE,WAAW,UAAU,UAAU,cAE7D;AACD,QAAM,SAAS,WAAW,CAAC,WAAW,QAAQ,GAAG,QAAQ;AACnD,QAAA,YAAY,OAAO;AACzB,MAAI,IAAI,OAAO,GAAG,OAAO,GAAG,OAAO,KAAK,CAAC;AACzC,QAAM,IAAI,WAAW,CAAC,WAAW,SAAS;AACrC,OAAA,aAAa,MAAM,IAAI,CAAC,KAAK,KAAK,KAAI,GAAG,CAAC,CAAC;AAChD,SAAO,GAAG,QAAQ,KAAK,MAAM,KAAK,EAAE;AACtC;"}
1
+ {"version":3,"file":"main11.mjs","sources":["../../src/core/use-render.ts"],"sourcesContent":["import { MutableRefObject } from \"react\";\nimport { Matrix4Tuple, PerspectiveCamera } from \"three\";\nimport { R3mStore } from \"./store\";\nimport { syncCamera } from \"./sync-camera\";\nimport { useFunction } from \"./use-function\";\n\nexport function useRender(\n origin: Matrix4Tuple, r3mRef: MutableRefObject<R3mStore>, frameloop: 'always' | 'demand'\n) {\n\n const render = useFunction((_gl: WebGL2RenderingContext, mapCamMx: number[]) => {\n const r3m = r3mRef.current;\n if (!r3m.state || !r3m.map) return;\n const camera = r3m.state.camera;\n const gl = r3m.state.gl;\n const advance = r3m.state.advance;\n r3m.mapCamMx = mapCamMx as Matrix4Tuple;\n syncCamera(camera as PerspectiveCamera, origin, mapCamMx as Matrix4Tuple);\n gl.resetState();\n advance(Date.now() * 0.001, true);\n if (frameloop === 'always') r3m.map.triggerRepaint();\n })\n\n return render;\n\n}"],"names":[],"mappings":";;AAMgB,SAAA,UACd,QAAsB,QAAoC,WAC1D;AAEA,QAAM,SAAS,YAAY,CAAC,KAA6B,aAAuB;AAC9E,UAAM,MAAM,OAAO;AACnB,QAAI,CAAC,IAAI,SAAS,CAAC,IAAI;AAAK;AACtB,UAAA,SAAS,IAAI,MAAM;AACnB,UAAA,KAAK,IAAI,MAAM;AACf,UAAA,UAAU,IAAI,MAAM;AAC1B,QAAI,WAAW;AACJ,eAAA,QAA6B,QAAQ,QAAwB;AACxE,OAAG,WAAW;AACd,YAAQ,KAAK,IAAQ,IAAA,MAAO,IAAI;AAChC,QAAI,cAAc;AAAU,UAAI,IAAI;EAAe,CACpD;AAEM,SAAA;AAET;"}
@@ -59,6 +59,7 @@ function useOnAdd(fromLngLat, { frameloop, ...renderProps }) {
59
59
  return;
60
60
  const canvas = r3mRef.current.map.getCanvas();
61
61
  r3mRef.current.state.setSize(canvas.width, canvas.height);
62
+ r3mRef.current.state.viewport.dpr = window.devicePixelRatio;
62
63
  });
63
64
  const onRemove = useFunction(() => {
64
65
  if (!r3mRef.current.root)
@@ -1 +1 @@
1
- {"version":3,"file":"main12.mjs","sources":["../../src/core/use-on-add.ts"],"sourcesContent":["import { RenderProps, _roots, createRoot } from \"@react-three/fiber\";\nimport { useEffect, useRef, useState } from \"react\";\nimport { createEvents } from \"./create-events\";\nimport { FromLngLat, MapInstance } from \"./generic-map\";\nimport { R3mStore } from \"./store\";\nimport { useFunction } from \"./use-function\";\n\nexport function useOnAdd(\n fromLngLat: FromLngLat,\n { frameloop, ...renderProps }: RenderProps<HTMLCanvasElement>\n) {\n\n const [mounted, setMounted] = useState(false);\n\n const r3mRef = useRef<R3mStore>({ fromLngLat });\n\n const onAdd = useFunction((map: MapInstance, gl: WebGLRenderingContext) => {\n\n const canvas = map.getCanvas();\n const root = createRoot(canvas);\n root.configure({\n dpr: window.devicePixelRatio,\n events: createEvents(),\n ...renderProps,\n frameloop: 'never',\n gl: {\n context: gl,\n depth: true,\n autoClear: false,\n antialias: true,\n ...renderProps?.gl,\n },\n onCreated: (state) => {\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n state.gl.forceContextLoss = () => { };\n },\n camera: {\n matrixAutoUpdate: false,\n near: 0,\n },\n size: {\n width: canvas.clientWidth,\n height: canvas.clientHeight,\n top: 0,\n left: 0,\n ...renderProps?.size,\n },\n });\n\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const store = _roots.get(canvas)!.store;\n\n r3mRef.current.map = map;\n r3mRef.current.root = root;\n r3mRef.current.state = store.getState();\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n store.setState({ r3m: r3mRef.current } as any);\n\n if (frameloop === 'demand') {\n store.setState({\n frameloop,\n invalidate: () => {\n map.triggerRepaint();\n },\n })\n }\n\n map.on('resize', onResize)\n\n setTimeout(() => setMounted(true));\n\n })\n\n const onResize = useFunction(() => {\n if (!r3mRef.current.map) return;\n if (!r3mRef.current.state) return;\n const canvas = r3mRef.current.map.getCanvas();\n r3mRef.current.state.setSize(canvas.width, canvas.height);\n })\n\n const onRemove = useFunction(() => {\n if (!r3mRef.current.root) return;\n r3mRef.current.root.unmount();\n r3mRef.current.root = undefined;\n if (!r3mRef.current.map) return;\n r3mRef.current.map.off('resize', onResize)\n })\n\n // on unmount\n useEffect(() => () => onRemove(), [onRemove])\n\n return { onAdd, onRemove, mounted, r3mRef };\n}"],"names":[],"mappings":";;;;AAOO,SAAS,SACd,YACA,EAAE,WAAW,GAAG,eAChB;AAEA,QAAM,CAAC,SAAS,UAAU,IAAI,SAAS,KAAK;AAE5C,QAAM,SAAS,OAAiB,EAAE,WAAY,CAAA;AAE9C,QAAM,QAAQ,YAAY,CAAC,KAAkB,OAA8B;AAEnE,UAAA,SAAS,IAAI;AACb,UAAA,OAAO,WAAW,MAAM;AAC9B,SAAK,UAAU;AAAA,MACb,KAAK,OAAO;AAAA,MACZ,QAAQ,aAAa;AAAA,MACrB,GAAG;AAAA,MACH,WAAW;AAAA,MACX,IAAI;AAAA,QACF,SAAS;AAAA,QACT,OAAO;AAAA,QACP,WAAW;AAAA,QACX,WAAW;AAAA,QACX,GAAG,2CAAa;AAAA,MAClB;AAAA,MACA,WAAW,CAAC,UAAU;AAEd,cAAA,GAAG,mBAAmB,MAAM;AAAA,QAAA;AAAA,MACpC;AAAA,MACA,QAAQ;AAAA,QACN,kBAAkB;AAAA,QAClB,MAAM;AAAA,MACR;AAAA,MACA,MAAM;AAAA,QACJ,OAAO,OAAO;AAAA,QACd,QAAQ,OAAO;AAAA,QACf,KAAK;AAAA,QACL,MAAM;AAAA,QACN,GAAG,2CAAa;AAAA,MAClB;AAAA,IAAA,CACD;AAGD,UAAM,QAAQ,OAAO,IAAI,MAAM,EAAG;AAElC,WAAO,QAAQ,MAAM;AACrB,WAAO,QAAQ,OAAO;AACf,WAAA,QAAQ,QAAQ,MAAM,SAAS;AAGtC,UAAM,SAAS,EAAE,KAAK,OAAO,QAAgB,CAAA;AAE7C,QAAI,cAAc,UAAU;AAC1B,YAAM,SAAS;AAAA,QACb;AAAA,QACA,YAAY,MAAM;AAChB,cAAI,eAAe;AAAA,QACrB;AAAA,MAAA,CACD;AAAA,IACH;AAEI,QAAA,GAAG,UAAU,QAAQ;AAEd,eAAA,MAAM,WAAW,IAAI,CAAC;AAAA,EAAA,CAElC;AAEK,QAAA,WAAW,YAAY,MAAM;AAC7B,QAAA,CAAC,OAAO,QAAQ;AAAK;AACrB,QAAA,CAAC,OAAO,QAAQ;AAAO;AAC3B,UAAM,SAAS,OAAO,QAAQ,IAAI,UAAU;AAC5C,WAAO,QAAQ,MAAM,QAAQ,OAAO,OAAO,OAAO,MAAM;AAAA,EAAA,CACzD;AAEK,QAAA,WAAW,YAAY,MAAM;AAC7B,QAAA,CAAC,OAAO,QAAQ;AAAM;AACnB,WAAA,QAAQ,KAAK;AACpB,WAAO,QAAQ,OAAO;AAClB,QAAA,CAAC,OAAO,QAAQ;AAAK;AACzB,WAAO,QAAQ,IAAI,IAAI,UAAU,QAAQ;AAAA,EAAA,CAC1C;AAGD,YAAU,MAAM,MAAM,SAAY,GAAA,CAAC,QAAQ,CAAC;AAE5C,SAAO,EAAE,OAAO,UAAU,SAAS,OAAO;AAC5C;"}
1
+ {"version":3,"file":"main12.mjs","sources":["../../src/core/use-on-add.ts"],"sourcesContent":["import { RenderProps, _roots, createRoot } from \"@react-three/fiber\";\nimport { useEffect, useRef, useState } from \"react\";\nimport { createEvents } from \"./create-events\";\nimport { FromLngLat, MapInstance } from \"./generic-map\";\nimport { R3mStore } from \"./store\";\nimport { useFunction } from \"./use-function\";\n\nexport function useOnAdd(\n fromLngLat: FromLngLat,\n { frameloop, ...renderProps }: RenderProps<HTMLCanvasElement>\n) {\n\n const [mounted, setMounted] = useState(false);\n\n const r3mRef = useRef<R3mStore>({ fromLngLat });\n\n const onAdd = useFunction((map: MapInstance, gl: WebGLRenderingContext) => {\n\n const canvas = map.getCanvas();\n const root = createRoot(canvas);\n root.configure({\n dpr: window.devicePixelRatio,\n events: createEvents(),\n ...renderProps,\n frameloop: 'never',\n gl: {\n context: gl,\n depth: true,\n autoClear: false,\n antialias: true,\n ...renderProps?.gl,\n },\n onCreated: (state) => {\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n state.gl.forceContextLoss = () => { };\n },\n camera: {\n matrixAutoUpdate: false,\n near: 0,\n },\n size: {\n width: canvas.clientWidth,\n height: canvas.clientHeight,\n top: 0,\n left: 0,\n ...renderProps?.size,\n },\n });\n\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const store = _roots.get(canvas)!.store;\n\n r3mRef.current.map = map;\n r3mRef.current.root = root;\n r3mRef.current.state = store.getState();\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n store.setState({ r3m: r3mRef.current } as any);\n\n if (frameloop === 'demand') {\n store.setState({\n frameloop,\n invalidate: () => {\n map.triggerRepaint();\n },\n })\n }\n\n map.on('resize', onResize)\n\n setTimeout(() => setMounted(true));\n\n })\n\n const onResize = useFunction(() => {\n if (!r3mRef.current.map) return;\n if (!r3mRef.current.state) return;\n const canvas = r3mRef.current.map.getCanvas();\n r3mRef.current.state.setSize(canvas.width, canvas.height)\n r3mRef.current.state.viewport.dpr = window.devicePixelRatio;\n })\n\n const onRemove = useFunction(() => {\n if (!r3mRef.current.root) return;\n r3mRef.current.root.unmount();\n r3mRef.current.root = undefined;\n if (!r3mRef.current.map) return;\n r3mRef.current.map.off('resize', onResize)\n })\n\n // on unmount\n useEffect(() => () => onRemove(), [onRemove])\n\n return { onAdd, onRemove, mounted, r3mRef };\n}"],"names":[],"mappings":";;;;AAOO,SAAS,SACd,YACA,EAAE,WAAW,GAAG,eAChB;AAEA,QAAM,CAAC,SAAS,UAAU,IAAI,SAAS,KAAK;AAE5C,QAAM,SAAS,OAAiB,EAAE,WAAY,CAAA;AAE9C,QAAM,QAAQ,YAAY,CAAC,KAAkB,OAA8B;AAEnE,UAAA,SAAS,IAAI;AACb,UAAA,OAAO,WAAW,MAAM;AAC9B,SAAK,UAAU;AAAA,MACb,KAAK,OAAO;AAAA,MACZ,QAAQ,aAAa;AAAA,MACrB,GAAG;AAAA,MACH,WAAW;AAAA,MACX,IAAI;AAAA,QACF,SAAS;AAAA,QACT,OAAO;AAAA,QACP,WAAW;AAAA,QACX,WAAW;AAAA,QACX,GAAG,2CAAa;AAAA,MAClB;AAAA,MACA,WAAW,CAAC,UAAU;AAEd,cAAA,GAAG,mBAAmB,MAAM;AAAA,QAAA;AAAA,MACpC;AAAA,MACA,QAAQ;AAAA,QACN,kBAAkB;AAAA,QAClB,MAAM;AAAA,MACR;AAAA,MACA,MAAM;AAAA,QACJ,OAAO,OAAO;AAAA,QACd,QAAQ,OAAO;AAAA,QACf,KAAK;AAAA,QACL,MAAM;AAAA,QACN,GAAG,2CAAa;AAAA,MAClB;AAAA,IAAA,CACD;AAGD,UAAM,QAAQ,OAAO,IAAI,MAAM,EAAG;AAElC,WAAO,QAAQ,MAAM;AACrB,WAAO,QAAQ,OAAO;AACf,WAAA,QAAQ,QAAQ,MAAM,SAAS;AAGtC,UAAM,SAAS,EAAE,KAAK,OAAO,QAAgB,CAAA;AAE7C,QAAI,cAAc,UAAU;AAC1B,YAAM,SAAS;AAAA,QACb;AAAA,QACA,YAAY,MAAM;AAChB,cAAI,eAAe;AAAA,QACrB;AAAA,MAAA,CACD;AAAA,IACH;AAEI,QAAA,GAAG,UAAU,QAAQ;AAEd,eAAA,MAAM,WAAW,IAAI,CAAC;AAAA,EAAA,CAElC;AAEK,QAAA,WAAW,YAAY,MAAM;AAC7B,QAAA,CAAC,OAAO,QAAQ;AAAK;AACrB,QAAA,CAAC,OAAO,QAAQ;AAAO;AAC3B,UAAM,SAAS,OAAO,QAAQ,IAAI,UAAU;AAC5C,WAAO,QAAQ,MAAM,QAAQ,OAAO,OAAO,OAAO,MAAM;AACxD,WAAO,QAAQ,MAAM,SAAS,MAAM,OAAO;AAAA,EAAA,CAC5C;AAEK,QAAA,WAAW,YAAY,MAAM;AAC7B,QAAA,CAAC,OAAO,QAAQ;AAAM;AACnB,WAAA,QAAQ,KAAK;AACpB,WAAO,QAAQ,OAAO;AAClB,QAAA,CAAC,OAAO,QAAQ;AAAK;AACzB,WAAO,QAAQ,IAAI,IAAI,UAAU,QAAQ;AAAA,EAAA,CAC1C;AAGD,YAAU,MAAM,MAAM,SAAY,GAAA,CAAC,QAAQ,CAAC;AAE5C,SAAO,EAAE,OAAO,UAAU,SAAS,OAAO;AAC5C;"}
package/dist/es/main3.mjs CHANGED
@@ -1,27 +1,56 @@
1
- import { jsx } from "react/jsx-runtime";
2
- import { extend } from "@react-three/fiber";
3
- import { MercatorCoordinate } from "mapbox-gl";
4
- import { memo } from "react";
5
- import { Layer } from "react-map-gl";
6
- import * as THREE from "three";
7
- import { useCanvas } from "./main5.mjs";
8
- extend(THREE);
9
- const fromLngLat = MercatorCoordinate.fromLngLat;
10
- const Canvas = memo((props) => {
11
- const { id, onAdd, onRemove, render } = useCanvas({ ...props, fromLngLat });
12
- return /* @__PURE__ */ jsx(
13
- Layer,
14
- {
15
- id,
16
- type: "custom",
17
- renderingMode: "3d",
18
- onAdd,
19
- onRemove,
20
- render
21
- }
22
- );
1
+ import { jsx, Fragment, jsxs } from "react/jsx-runtime";
2
+ import { createPortal, useThree, useFrame } from "@react-three/fiber";
3
+ import { memo, useState, useRef, useLayoutEffect } from "react";
4
+ import { Scene } from "three";
5
+ import { useR3M } from "./main5.mjs";
6
+ import { syncCamera } from "./main6.mjs";
7
+ import { useCoords } from "./main7.mjs";
8
+ const Coordinates = memo(({
9
+ latitude,
10
+ longitude,
11
+ altitude = 0,
12
+ children
13
+ }) => {
14
+ const [scene] = useState(() => new Scene());
15
+ const r3m = useR3M();
16
+ const origin = useCoords({
17
+ latitude,
18
+ longitude,
19
+ altitude,
20
+ fromLngLat: r3m.fromLngLat
21
+ });
22
+ return /* @__PURE__ */ jsx(Fragment, { children: createPortal(/* @__PURE__ */ jsxs(Fragment, { children: [
23
+ /* @__PURE__ */ jsx(RenderAtCoords, { r3m, origin }),
24
+ children
25
+ ] }), scene, { events: { priority: 2 } }) });
23
26
  });
27
+ Coordinates.displayName = "Coordinates";
28
+ function RenderAtCoords({ r3m, origin }) {
29
+ const { gl, scene, set } = useThree();
30
+ const cameraRef = useRef(null);
31
+ useFrame(() => {
32
+ if (!r3m.mapCamMx)
33
+ return;
34
+ if (!cameraRef.current)
35
+ return;
36
+ syncCamera(cameraRef.current, origin, r3m.mapCamMx);
37
+ gl.render(scene, cameraRef.current);
38
+ });
39
+ useLayoutEffect(() => {
40
+ if (!cameraRef.current)
41
+ return;
42
+ set({
43
+ invalidate: () => {
44
+ if (!r3m.map)
45
+ return;
46
+ r3m.map.triggerRepaint();
47
+ },
48
+ camera: cameraRef.current
49
+ });
50
+ }, [set, r3m]);
51
+ return /* @__PURE__ */ jsx("perspectiveCamera", { ref: cameraRef });
52
+ }
24
53
  export {
25
- Canvas
54
+ Coordinates
26
55
  };
27
56
  //# sourceMappingURL=main3.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"main3.mjs","sources":["../../src/mapbox/canvas.tsx"],"sourcesContent":["import { extend } from \"@react-three/fiber\";\nimport { MercatorCoordinate } from \"mapbox-gl\";\nimport { memo } from \"react\";\nimport { Layer } from \"react-map-gl\";\nimport * as THREE from \"three\";\nimport { CanvasProps } from \"../api/canvas-props\";\nimport { useCanvas } from \"../core/use-canvas\";\n\nextend(THREE);\n\nconst fromLngLat = MercatorCoordinate.fromLngLat\n\n/** react`-three-fiber` canvas inside `Mapbox` */\nexport const Canvas = memo<CanvasProps>((props) => {\n\n const { id, onAdd, onRemove, render } = useCanvas({ ...props, fromLngLat });\n\n return <Layer\n id={id}\n type=\"custom\"\n renderingMode=\"3d\"\n onAdd={onAdd}\n onRemove={onRemove}\n render={render}\n />\n})"],"names":[],"mappings":";;;;;;;AAQA,OAAO,KAAK;AAEZ,MAAM,aAAa,mBAAmB;AAGzB,MAAA,SAAS,KAAkB,CAAC,UAAU;AAE3C,QAAA,EAAE,IAAI,OAAO,UAAU,OAAA,IAAW,UAAU,EAAE,GAAG,OAAO,WAAA,CAAY;AAEnE,SAAA;AAAA,IAAC;AAAA,IAAA;AAAA,MACN;AAAA,MACA,MAAK;AAAA,MACL,eAAc;AAAA,MACd;AAAA,MACA;AAAA,MACA;AAAA,IAAA;AAAA,EAAA;AAEJ,CAAC;"}
1
+ {"version":3,"file":"main3.mjs","sources":["../../src/api/coordinates.tsx"],"sourcesContent":["import { createPortal, useFrame, useThree } from \"@react-three/fiber\";\nimport { PropsWithChildren, memo, useLayoutEffect, useRef, useState } from \"react\";\nimport { Matrix4Tuple, PerspectiveCamera, Scene } from \"three\";\nimport { R3mStore, useR3M } from \"../core/store\";\nimport { syncCamera } from \"../core/sync-camera\";\nimport { useCoords } from \"../core/use-coords\";\n\nexport interface CoordinatesProps extends PropsWithChildren {\n longitude: number,\n latitude: number,\n altitude?: number,\n}\n\nexport const Coordinates = memo<CoordinatesProps>(({\n latitude, longitude, altitude = 0, children\n}) => {\n\n const [scene] = useState(() => new Scene())\n\n const r3m = useR3M();\n\n const origin = useCoords({\n latitude, longitude, altitude, fromLngLat: r3m.fromLngLat,\n });\n\n\n return <>{createPortal(<>\n <RenderAtCoords r3m={r3m} origin={origin} />\n {children}\n </>, scene, { events: { priority: 2 } })}</>\n})\n\nCoordinates.displayName = 'Coordinates';\n\ninterface RenderAtCoordsProps {\n r3m: R3mStore,\n origin: Matrix4Tuple\n}\n\nfunction RenderAtCoords({ r3m, origin }: RenderAtCoordsProps) {\n\n const { gl, scene, set } = useThree()\n\n const cameraRef = useRef<PerspectiveCamera>(null)\n\n useFrame(() => {\n if (!r3m.mapCamMx) return;\n if (!cameraRef.current) return;\n syncCamera(cameraRef.current, origin, r3m.mapCamMx);\n gl.render(scene, cameraRef.current);\n })\n\n useLayoutEffect(() => {\n if (!cameraRef.current) return;\n set({\n invalidate: () => {\n if (!r3m.map) return;\n r3m.map.triggerRepaint();\n },\n camera: cameraRef.current,\n });\n }, [set, r3m])\n\n return <perspectiveCamera ref={cameraRef} />\n}"],"names":[],"mappings":";;;;;;;AAaa,MAAA,cAAc,KAAuB,CAAC;AAAA,EACjD;AAAA,EAAU;AAAA,EAAW,WAAW;AAAA,EAAG;AACrC,MAAM;AAEJ,QAAM,CAAC,KAAK,IAAI,SAAS,MAAM,IAAI,MAAO,CAAA;AAE1C,QAAM,MAAM;AAEZ,QAAM,SAAS,UAAU;AAAA,IACvB;AAAA,IAAU;AAAA,IAAW;AAAA,IAAU,YAAY,IAAI;AAAA,EAAA,CAChD;AAGM,SAAA,oBAAA,UAAA,EAAG,uBACR,qBAAA,UAAA,EAAA,UAAA;AAAA,IAAC,oBAAA,gBAAA,EAAe,KAAU,OAAgB,CAAA;AAAA,IACzC;AAAA,EAAA,GACH,GAAK,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAA,GAAK,EAAE,CAAA;AAC3C,CAAC;AAED,YAAY,cAAc;AAO1B,SAAS,eAAe,EAAE,KAAK,UAA+B;AAE5D,QAAM,EAAE,IAAI,OAAO,QAAQ,SAAS;AAE9B,QAAA,YAAY,OAA0B,IAAI;AAEhD,WAAS,MAAM;AACb,QAAI,CAAC,IAAI;AAAU;AACnB,QAAI,CAAC,UAAU;AAAS;AACxB,eAAW,UAAU,SAAS,QAAQ,IAAI,QAAQ;AAC/C,OAAA,OAAO,OAAO,UAAU,OAAO;AAAA,EAAA,CACnC;AAED,kBAAgB,MAAM;AACpB,QAAI,CAAC,UAAU;AAAS;AACpB,QAAA;AAAA,MACF,YAAY,MAAM;AAChB,YAAI,CAAC,IAAI;AAAK;AACd,YAAI,IAAI;MACV;AAAA,MACA,QAAQ,UAAU;AAAA,IAAA,CACnB;AAAA,EAAA,GACA,CAAC,KAAK,GAAG,CAAC;AAEN,SAAA,oBAAC,qBAAkB,EAAA,KAAK,UAAW,CAAA;AAC5C;"}
package/dist/es/main4.mjs CHANGED
@@ -1,56 +1,27 @@
1
- import { jsx, Fragment, jsxs } from "react/jsx-runtime";
2
- import { createPortal, useThree, useFrame } from "@react-three/fiber";
3
- import { memo, useState, useRef, useLayoutEffect } from "react";
4
- import { Scene } from "three";
5
- import { useR3M } from "./main6.mjs";
6
- import { syncCamera } from "./main7.mjs";
7
- import { useCoords } from "./main8.mjs";
8
- const Coordinates = memo(({
9
- latitude,
10
- longitude,
11
- altitude = 0,
12
- children
13
- }) => {
14
- const [scene] = useState(() => new Scene());
15
- const r3m = useR3M();
16
- const origin = useCoords({
17
- latitude,
18
- longitude,
19
- altitude,
20
- fromLngLat: r3m.fromLngLat
21
- });
22
- return /* @__PURE__ */ jsx(Fragment, { children: createPortal(/* @__PURE__ */ jsxs(Fragment, { children: [
23
- /* @__PURE__ */ jsx(RenderAtCoords, { r3m, origin }),
24
- children
25
- ] }), scene, { events: { priority: 2 } }) });
1
+ import { jsx } from "react/jsx-runtime";
2
+ import { extend } from "@react-three/fiber";
3
+ import { MercatorCoordinate } from "mapbox-gl";
4
+ import { memo } from "react";
5
+ import { Layer } from "react-map-gl";
6
+ import * as THREE from "three";
7
+ import { useCanvas } from "./main8.mjs";
8
+ extend(THREE);
9
+ const fromLngLat = MercatorCoordinate.fromLngLat;
10
+ const Canvas = memo((props) => {
11
+ const { id, onAdd, onRemove, render } = useCanvas({ ...props, fromLngLat });
12
+ return /* @__PURE__ */ jsx(
13
+ Layer,
14
+ {
15
+ id,
16
+ type: "custom",
17
+ renderingMode: "3d",
18
+ onAdd,
19
+ onRemove,
20
+ render
21
+ }
22
+ );
26
23
  });
27
- Coordinates.displayName = "Coordinates";
28
- function RenderAtCoords({ r3m, origin }) {
29
- const { gl, scene, set } = useThree();
30
- const cameraRef = useRef(null);
31
- useFrame(() => {
32
- if (!r3m.mapCamMx)
33
- return;
34
- if (!cameraRef.current)
35
- return;
36
- syncCamera(cameraRef.current, origin, r3m.mapCamMx);
37
- gl.render(scene, cameraRef.current);
38
- });
39
- useLayoutEffect(() => {
40
- if (!cameraRef.current)
41
- return;
42
- set({
43
- invalidate: () => {
44
- if (!r3m.map)
45
- return;
46
- r3m.map.triggerRepaint();
47
- },
48
- camera: cameraRef.current
49
- });
50
- }, [set, r3m]);
51
- return /* @__PURE__ */ jsx("perspectiveCamera", { ref: cameraRef });
52
- }
53
24
  export {
54
- Coordinates
25
+ Canvas
55
26
  };
56
27
  //# sourceMappingURL=main4.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"main4.mjs","sources":["../../src/api/coordinates.tsx"],"sourcesContent":["import { createPortal, useFrame, useThree } from \"@react-three/fiber\";\nimport { PropsWithChildren, memo, useLayoutEffect, useRef, useState } from \"react\";\nimport { Matrix4Tuple, PerspectiveCamera, Scene } from \"three\";\nimport { R3mStore, useR3M } from \"../core/store\";\nimport { syncCamera } from \"../core/sync-camera\";\nimport { useCoords } from \"../core/use-coords\";\n\nexport interface CoordinatesProps extends PropsWithChildren {\n longitude: number,\n latitude: number,\n altitude?: number,\n}\n\nexport const Coordinates = memo<CoordinatesProps>(({\n latitude, longitude, altitude = 0, children\n}) => {\n\n const [scene] = useState(() => new Scene())\n\n const r3m = useR3M();\n\n const origin = useCoords({\n latitude, longitude, altitude, fromLngLat: r3m.fromLngLat,\n });\n\n\n return <>{createPortal(<>\n <RenderAtCoords r3m={r3m} origin={origin} />\n {children}\n </>, scene, { events: { priority: 2 } })}</>\n})\n\nCoordinates.displayName = 'Coordinates';\n\ninterface RenderAtCoordsProps {\n r3m: R3mStore,\n origin: Matrix4Tuple\n}\n\nfunction RenderAtCoords({ r3m, origin }: RenderAtCoordsProps) {\n\n const { gl, scene, set } = useThree()\n\n const cameraRef = useRef<PerspectiveCamera>(null)\n\n useFrame(() => {\n if (!r3m.mapCamMx) return;\n if (!cameraRef.current) return;\n syncCamera(cameraRef.current, origin, r3m.mapCamMx);\n gl.render(scene, cameraRef.current);\n })\n\n useLayoutEffect(() => {\n if (!cameraRef.current) return;\n set({\n invalidate: () => {\n if (!r3m.map) return;\n r3m.map.triggerRepaint();\n },\n camera: cameraRef.current,\n });\n }, [set, r3m])\n\n return <perspectiveCamera ref={cameraRef} />\n}"],"names":[],"mappings":";;;;;;;AAaa,MAAA,cAAc,KAAuB,CAAC;AAAA,EACjD;AAAA,EAAU;AAAA,EAAW,WAAW;AAAA,EAAG;AACrC,MAAM;AAEJ,QAAM,CAAC,KAAK,IAAI,SAAS,MAAM,IAAI,MAAO,CAAA;AAE1C,QAAM,MAAM;AAEZ,QAAM,SAAS,UAAU;AAAA,IACvB;AAAA,IAAU;AAAA,IAAW;AAAA,IAAU,YAAY,IAAI;AAAA,EAAA,CAChD;AAGM,SAAA,oBAAA,UAAA,EAAG,uBACR,qBAAA,UAAA,EAAA,UAAA;AAAA,IAAC,oBAAA,gBAAA,EAAe,KAAU,OAAgB,CAAA;AAAA,IACzC;AAAA,EAAA,GACH,GAAK,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAA,GAAK,EAAE,CAAA;AAC3C,CAAC;AAED,YAAY,cAAc;AAO1B,SAAS,eAAe,EAAE,KAAK,UAA+B;AAE5D,QAAM,EAAE,IAAI,OAAO,QAAQ,SAAS;AAE9B,QAAA,YAAY,OAA0B,IAAI;AAEhD,WAAS,MAAM;AACb,QAAI,CAAC,IAAI;AAAU;AACnB,QAAI,CAAC,UAAU;AAAS;AACxB,eAAW,UAAU,SAAS,QAAQ,IAAI,QAAQ;AAC/C,OAAA,OAAO,OAAO,UAAU,OAAO;AAAA,EAAA,CACnC;AAED,kBAAgB,MAAM;AACpB,QAAI,CAAC,UAAU;AAAS;AACpB,QAAA;AAAA,MACF,YAAY,MAAM;AAChB,YAAI,CAAC,IAAI;AAAK;AACd,YAAI,IAAI;MACV;AAAA,MACA,QAAQ,UAAU;AAAA,IAAA,CACnB;AAAA,EAAA,GACA,CAAC,KAAK,GAAG,CAAC;AAEN,SAAA,oBAAC,qBAAkB,EAAA,KAAK,UAAW,CAAA;AAC5C;"}
1
+ {"version":3,"file":"main4.mjs","sources":["../../src/mapbox/canvas.tsx"],"sourcesContent":["import { extend } from \"@react-three/fiber\";\nimport { MercatorCoordinate } from \"mapbox-gl\";\nimport { memo } from \"react\";\nimport { Layer } from \"react-map-gl\";\nimport * as THREE from \"three\";\nimport { CanvasProps } from \"../api/canvas-props\";\nimport { useCanvas } from \"../core/use-canvas\";\n\nextend(THREE);\n\nconst fromLngLat = MercatorCoordinate.fromLngLat\n\n/** react`-three-fiber` canvas inside `Mapbox` */\nexport const Canvas = memo<CanvasProps>((props) => {\n\n const { id, onAdd, onRemove, render } = useCanvas({ ...props, fromLngLat });\n\n return <Layer\n id={id}\n type=\"custom\"\n renderingMode=\"3d\"\n onAdd={onAdd}\n onRemove={onRemove}\n render={render}\n />\n})"],"names":[],"mappings":";;;;;;;AAQA,OAAO,KAAK;AAEZ,MAAM,aAAa,mBAAmB;AAGzB,MAAA,SAAS,KAAkB,CAAC,UAAU;AAE3C,QAAA,EAAE,IAAI,OAAO,UAAU,OAAA,IAAW,UAAU,EAAE,GAAG,OAAO,WAAA,CAAY;AAEnE,SAAA;AAAA,IAAC;AAAA,IAAA;AAAA,MACN;AAAA,MACA,MAAK;AAAA,MACL,eAAc;AAAA,MACd;AAAA,MACA;AAAA,MACA;AAAA,IAAA;AAAA,EAAA;AAEJ,CAAC;"}
package/dist/es/main5.mjs CHANGED
@@ -1,25 +1,6 @@
1
- import { useCoords } from "./main8.mjs";
2
- import { useCreateRoot } from "./main9.mjs";
3
- import { useRender } from "./main10.mjs";
4
- function useCanvas({
5
- longitude,
6
- latitude,
7
- altitude = 0,
8
- frameloop = "always",
9
- fromLngLat,
10
- ...renderProps
11
- }) {
12
- const m4 = useCoords({
13
- latitude,
14
- longitude,
15
- altitude,
16
- fromLngLat
17
- });
18
- const { id, onAdd, onRemove, r3mRef } = useCreateRoot({ frameloop, fromLngLat, ...renderProps });
19
- const render = useRender(m4, r3mRef, frameloop);
20
- return { id, onAdd, onRemove, render };
21
- }
1
+ import { useThree } from "@react-three/fiber";
2
+ const useR3M = () => useThree((s) => s.r3m);
22
3
  export {
23
- useCanvas
4
+ useR3M
24
5
  };
25
6
  //# sourceMappingURL=main5.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"main5.mjs","sources":["../../src/core/use-canvas.ts"],"sourcesContent":["import { CanvasProps } from \"../api/canvas-props\";\nimport { FromLngLat } from \"./generic-map\";\nimport { useCoords } from \"./use-coords\";\nimport { useCreateRoot } from \"./use-create-root\";\nimport { useRender } from \"./use-render\";\n\nexport interface useCanvasProps extends CanvasProps {\n fromLngLat: FromLngLat,\n}\n\nexport function useCanvas({\n longitude, latitude, altitude = 0,\n frameloop = 'always',\n fromLngLat,\n ...renderProps\n}: useCanvasProps) {\n\n const m4 = useCoords({\n latitude, longitude, altitude, fromLngLat,\n });\n\n const { id, onAdd, onRemove, r3mRef } = useCreateRoot({ frameloop, fromLngLat, ...renderProps });\n\n const render = useRender(m4, r3mRef, frameloop);\n\n return { id, onAdd, onRemove, render }\n}"],"names":[],"mappings":";;;AAUO,SAAS,UAAU;AAAA,EACxB;AAAA,EAAW;AAAA,EAAU,WAAW;AAAA,EAChC,YAAY;AAAA,EACZ;AAAA,EACA,GAAG;AACL,GAAmB;AAEjB,QAAM,KAAK,UAAU;AAAA,IACnB;AAAA,IAAU;AAAA,IAAW;AAAA,IAAU;AAAA,EAAA,CAChC;AAED,QAAM,EAAE,IAAI,OAAO,UAAU,OAAO,IAAI,cAAc,EAAE,WAAW,YAAY,GAAG,YAAa,CAAA;AAE/F,QAAM,SAAS,UAAU,IAAI,QAAQ,SAAS;AAE9C,SAAO,EAAE,IAAI,OAAO,UAAU,OAAO;AACvC;"}
1
+ {"version":3,"file":"main5.mjs","sources":["../../src/core/store.ts"],"sourcesContent":["import { ReconcilerRoot, RootState, useThree } from \"@react-three/fiber\";\nimport { Matrix4Tuple } from \"three\";\nimport { FromLngLat, MapInstance } from \"./generic-map\";\n\n/** react-three-map store */\nexport interface R3mStore {\n fromLngLat: FromLngLat,\n map?: MapInstance;\n mapCamMx?: Matrix4Tuple;\n state?: RootState\n root?: ReconcilerRoot<HTMLCanvasElement>;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport const useR3M = (): R3mStore => useThree((s: any) => s.r3m);"],"names":[],"mappings":";AAcO,MAAM,SAAS,MAAgB,SAAS,CAAC,MAAW,EAAE,GAAG;"}