react-three-map 0.7.2 → 0.8.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 (138) hide show
  1. package/CHANGELOG.md +9 -0
  2. package/README.md +42 -4
  3. package/dist/cjs/main.js +369 -181
  4. package/dist/es/main.mjs +6 -2
  5. package/dist/es/main.mjs.map +1 -1
  6. package/dist/es/main10.mjs +33 -20
  7. package/dist/es/main10.mjs.map +1 -1
  8. package/dist/es/main11.mjs +11 -19
  9. package/dist/es/main11.mjs.map +1 -1
  10. package/dist/es/main12.mjs +20 -85
  11. package/dist/es/main12.mjs.map +1 -1
  12. package/dist/es/main13.mjs +30 -9
  13. package/dist/es/main13.mjs.map +1 -1
  14. package/dist/es/main14.mjs +22 -67
  15. package/dist/es/main14.mjs.map +1 -1
  16. package/dist/es/main15.mjs +98 -0
  17. package/dist/es/main15.mjs.map +1 -0
  18. package/dist/es/main16.mjs +66 -0
  19. package/dist/es/main16.mjs.map +1 -0
  20. package/dist/es/main17.mjs +23 -0
  21. package/dist/es/main17.mjs.map +1 -0
  22. package/dist/es/main18.mjs +27 -0
  23. package/dist/es/main18.mjs.map +1 -0
  24. package/dist/es/main19.mjs +19 -0
  25. package/dist/es/main19.mjs.map +1 -0
  26. package/dist/es/main2.mjs.map +1 -1
  27. package/dist/es/main20.mjs +72 -0
  28. package/dist/es/main20.mjs.map +1 -0
  29. package/dist/es/main3.mjs +43 -50
  30. package/dist/es/main3.mjs.map +1 -1
  31. package/dist/es/main4.mjs +50 -24
  32. package/dist/es/main4.mjs.map +1 -1
  33. package/dist/es/main5.mjs +19 -3
  34. package/dist/es/main5.mjs.map +1 -1
  35. package/dist/es/main6.mjs +14 -33
  36. package/dist/es/main6.mjs.map +1 -1
  37. package/dist/es/main7.mjs +18 -7
  38. package/dist/es/main7.mjs.map +1 -1
  39. package/dist/es/main8.mjs +26 -21
  40. package/dist/es/main8.mjs.map +1 -1
  41. package/dist/es/main9.mjs +9 -15
  42. package/dist/es/main9.mjs.map +1 -1
  43. package/dist/maplibre/cjs/main.js +369 -181
  44. package/dist/maplibre/es/main.mjs +6 -2
  45. package/dist/maplibre/es/main.mjs.map +1 -1
  46. package/dist/maplibre/es/main10.mjs +33 -19
  47. package/dist/maplibre/es/main10.mjs.map +1 -1
  48. package/dist/maplibre/es/main11.mjs +11 -14
  49. package/dist/maplibre/es/main11.mjs.map +1 -1
  50. package/dist/maplibre/es/main12.mjs +20 -85
  51. package/dist/maplibre/es/main12.mjs.map +1 -1
  52. package/dist/maplibre/es/main13.mjs +30 -9
  53. package/dist/maplibre/es/main13.mjs.map +1 -1
  54. package/dist/maplibre/es/main14.mjs +22 -67
  55. package/dist/maplibre/es/main14.mjs.map +1 -1
  56. package/dist/maplibre/es/main15.mjs +98 -0
  57. package/dist/maplibre/es/main15.mjs.map +1 -0
  58. package/dist/maplibre/es/main16.mjs +66 -0
  59. package/dist/maplibre/es/main16.mjs.map +1 -0
  60. package/dist/maplibre/es/main17.mjs +23 -0
  61. package/dist/maplibre/es/main17.mjs.map +1 -0
  62. package/dist/maplibre/es/main18.mjs +27 -0
  63. package/dist/maplibre/es/main18.mjs.map +1 -0
  64. package/dist/maplibre/es/main19.mjs +19 -0
  65. package/dist/maplibre/es/main19.mjs.map +1 -0
  66. package/dist/maplibre/es/main2.mjs.map +1 -1
  67. package/dist/maplibre/es/main20.mjs +72 -0
  68. package/dist/maplibre/es/main20.mjs.map +1 -0
  69. package/dist/maplibre/es/main3.mjs +43 -50
  70. package/dist/maplibre/es/main3.mjs.map +1 -1
  71. package/dist/maplibre/es/main4.mjs +50 -24
  72. package/dist/maplibre/es/main4.mjs.map +1 -1
  73. package/dist/maplibre/es/main5.mjs +19 -3
  74. package/dist/maplibre/es/main5.mjs.map +1 -1
  75. package/dist/maplibre/es/main6.mjs +14 -33
  76. package/dist/maplibre/es/main6.mjs.map +1 -1
  77. package/dist/maplibre/es/main7.mjs +18 -7
  78. package/dist/maplibre/es/main7.mjs.map +1 -1
  79. package/dist/maplibre/es/main8.mjs +26 -21
  80. package/dist/maplibre/es/main8.mjs.map +1 -1
  81. package/dist/maplibre/es/main9.mjs +8 -20
  82. package/dist/maplibre/es/main9.mjs.map +1 -1
  83. package/dist/maplibre/types/api/canvas-props.d.ts +4 -4
  84. package/dist/maplibre/types/api/coords-to-vector-3.d.ts +4 -0
  85. package/dist/maplibre/types/api/coords.d.ts +5 -0
  86. package/dist/maplibre/types/api/index.d.ts +5 -0
  87. package/dist/maplibre/types/api/near-coordinates.d.ts +3 -0
  88. package/dist/maplibre/types/api/use-map.d.ts +1 -1
  89. package/dist/maplibre/types/core/canvas-in-layer/use-canvas-in-layer.d.ts +11 -0
  90. package/dist/maplibre/types/core/canvas-in-layer/use-render.d.ts +12 -0
  91. package/dist/maplibre/types/core/canvas-in-layer/use-root.d.ts +7 -0
  92. package/dist/maplibre/types/core/canvas-overlay/canvas-portal.d.ts +11 -0
  93. package/dist/maplibre/types/core/canvas-overlay/init-canvas-fc.d.ts +12 -0
  94. package/dist/maplibre/types/core/canvas-overlay/init-r3m.d.ts +10 -0
  95. package/dist/maplibre/types/core/canvas-overlay/render.d.ts +1 -0
  96. package/dist/maplibre/types/core/canvas-overlay/sync-camera-fc.d.ts +13 -0
  97. package/dist/maplibre/types/core/coords-to-matrix.d.ts +2 -4
  98. package/dist/maplibre/types/core/events.d.ts +4 -0
  99. package/dist/maplibre/types/core/use-coords-to-matrix.d.ts +5 -0
  100. package/dist/maplibre/types/core/use-coords.d.ts +7 -5
  101. package/dist/maplibre/types/core/use-r3m.d.ts +22 -0
  102. package/dist/maplibre/types/{maplibre → mapbox}/canvas.d.ts +1 -1
  103. package/dist/maplibre/types/maplibre.index.d.ts +3 -4
  104. package/dist/types/api/canvas-props.d.ts +4 -4
  105. package/dist/types/api/coords-to-vector-3.d.ts +4 -0
  106. package/dist/types/api/coords.d.ts +5 -0
  107. package/dist/types/api/index.d.ts +5 -0
  108. package/dist/types/api/near-coordinates.d.ts +3 -0
  109. package/dist/types/api/use-map.d.ts +1 -1
  110. package/dist/types/core/canvas-in-layer/use-canvas-in-layer.d.ts +11 -0
  111. package/dist/types/core/canvas-in-layer/use-render.d.ts +12 -0
  112. package/dist/types/core/canvas-in-layer/use-root.d.ts +7 -0
  113. package/dist/types/core/canvas-overlay/canvas-portal.d.ts +11 -0
  114. package/dist/types/core/canvas-overlay/init-canvas-fc.d.ts +12 -0
  115. package/dist/types/core/canvas-overlay/init-r3m.d.ts +10 -0
  116. package/dist/types/core/canvas-overlay/render.d.ts +1 -0
  117. package/dist/types/core/canvas-overlay/sync-camera-fc.d.ts +13 -0
  118. package/dist/types/core/coords-to-matrix.d.ts +2 -4
  119. package/dist/types/core/events.d.ts +4 -0
  120. package/dist/types/core/use-coords-to-matrix.d.ts +5 -0
  121. package/dist/types/core/use-coords.d.ts +7 -5
  122. package/dist/types/core/use-r3m.d.ts +22 -0
  123. package/dist/types/mapbox.index.d.ts +2 -3
  124. package/package.json +12 -9
  125. package/stories/package.json +12 -5
  126. package/stories/yarn.lock +128 -135
  127. package/dist/maplibre/types/core/create-events.d.ts +0 -3
  128. package/dist/maplibre/types/core/store.d.ts +0 -12
  129. package/dist/maplibre/types/core/use-canvas.d.ts +0 -11
  130. package/dist/maplibre/types/core/use-create-root.d.ts +0 -13
  131. package/dist/maplibre/types/core/use-on-add.d.ts +0 -10
  132. package/dist/maplibre/types/core/use-render.d.ts +0 -4
  133. package/dist/types/core/create-events.d.ts +0 -3
  134. package/dist/types/core/store.d.ts +0 -12
  135. package/dist/types/core/use-canvas.d.ts +0 -11
  136. package/dist/types/core/use-create-root.d.ts +0 -13
  137. package/dist/types/core/use-on-add.d.ts +0 -10
  138. package/dist/types/core/use-render.d.ts +0 -4
@@ -0,0 +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({
8
+ longitude,
9
+ latitude,
10
+ altitude,
11
+ fromLngLat
12
+ }) {
13
+ const center = fromLngLat([longitude, latitude], altitude);
14
+ const scaleUnit = center.meterInMercatorCoordinateUnits();
15
+ pos.set(center.x, center.y, center.z || 0);
16
+ scale.set(scaleUnit, -scaleUnit, scaleUnit);
17
+ quat.setFromEuler(euler.set(-Math.PI * 0.5, 0, 0));
18
+ return m4.compose(pos, quat, scale).toArray();
19
+ }
20
+ export {
21
+ coordsToMatrix
22
+ };
23
+ //# sourceMappingURL=main17.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"main17.mjs","sources":["../../src/core/coords-to-matrix.ts"],"sourcesContent":["import { Euler, Matrix4, Quaternion, Vector3 } from \"three\";\nimport { FromLngLat } from \"./generic-map\";\nimport { Coords } from \"../api/coords\";\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({\n longitude, latitude, altitude, fromLngLat\n}: Coords & { fromLngLat: FromLngLat }) {\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":";AAIA,MAAM,OAAO,IAAI;AACjB,MAAM,QAAQ,IAAI;AAClB,MAAM,MAAM,IAAI;AAChB,MAAM,QAAQ,IAAI;AAClB,MAAM,KAAK,IAAI;AAGR,SAAS,eAAe;AAAA,EAC7B;AAAA,EAAW;AAAA,EAAU;AAAA,EAAU;AACjC,GAAwC;AACtC,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;"}
@@ -0,0 +1,27 @@
1
+ import { events as events$1 } from "@react-three/fiber";
2
+ import { Matrix4 } from "three";
3
+ const projViewInv = new Matrix4();
4
+ const events = (store) => {
5
+ const originalEvents = events$1(store);
6
+ return {
7
+ ...originalEvents,
8
+ connect: (target) => {
9
+ if (!originalEvents.connect)
10
+ return;
11
+ originalEvents.connect(target.parentElement);
12
+ },
13
+ compute: (event, state) => {
14
+ state.pointer.x = event.offsetX / state.size.width * 2 - 1;
15
+ state.pointer.y = 1 - event.offsetY / state.size.height * 2;
16
+ if (state.camera.userData.projByViewInv)
17
+ projViewInv.fromArray(state.camera.userData.projByViewInv);
18
+ state.raycaster.camera = state.camera;
19
+ state.raycaster.ray.origin.setScalar(0).applyMatrix4(projViewInv);
20
+ state.raycaster.ray.direction.set(state.pointer.x, state.pointer.y, 1).applyMatrix4(projViewInv).sub(state.raycaster.ray.origin).normalize();
21
+ }
22
+ };
23
+ };
24
+ export {
25
+ events
26
+ };
27
+ //# sourceMappingURL=main18.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"main18.mjs","sources":["../../src/core/events.ts"],"sourcesContent":["import { Canvas, events as fiberEvents } from \"@react-three/fiber\";\nimport { Matrix4 } from \"three\";\n\n/** projection * view matrix inverted */\nconst projViewInv = new Matrix4()\n\ntype Events = Parameters<typeof Canvas>[0]['events'];\n\nexport const events: Events = (store) => {\n const originalEvents = fiberEvents(store);\n return {\n ...originalEvents,\n connect: target => {\n if (!originalEvents.connect) return;\n originalEvents.connect(target.parentElement!); // eslint-disable-line @typescript-eslint/no-non-null-assertion\n },\n compute: (event, state) => {\n\n state.pointer.x = (event.offsetX / state.size.width) * 2 - 1;\n state.pointer.y = 1 - (event.offsetY / state.size.height) * 2;\n\n if (state.camera.userData.projByViewInv) projViewInv.fromArray(state.camera.userData.projByViewInv);\n\n state.raycaster.camera = state.camera;\n state.raycaster.ray.origin.setScalar(0).applyMatrix4(projViewInv);\n state.raycaster.ray.direction\n .set(state.pointer.x, state.pointer.y, 1)\n .applyMatrix4(projViewInv)\n .sub(state.raycaster.ray.origin)\n .normalize();\n\n },\n };\n};"],"names":["fiberEvents"],"mappings":";;AAIA,MAAM,cAAc,IAAI;AAIX,MAAA,SAAiB,CAAC,UAAU;AACjC,QAAA,iBAAiBA,SAAY,KAAK;AACjC,SAAA;AAAA,IACL,GAAG;AAAA,IACH,SAAS,CAAU,WAAA;AACjB,UAAI,CAAC,eAAe;AAAS;AACd,qBAAA,QAAQ,OAAO,aAAc;AAAA,IAC9C;AAAA,IACA,SAAS,CAAC,OAAO,UAAU;AAEzB,YAAM,QAAQ,IAAK,MAAM,UAAU,MAAM,KAAK,QAAS,IAAI;AAC3D,YAAM,QAAQ,IAAI,IAAK,MAAM,UAAU,MAAM,KAAK,SAAU;AAExD,UAAA,MAAM,OAAO,SAAS;AAAe,oBAAY,UAAU,MAAM,OAAO,SAAS,aAAa;AAE5F,YAAA,UAAU,SAAS,MAAM;AAC/B,YAAM,UAAU,IAAI,OAAO,UAAU,CAAC,EAAE,aAAa,WAAW;AAC1D,YAAA,UAAU,IAAI,UACjB,IAAI,MAAM,QAAQ,GAAG,MAAM,QAAQ,GAAG,CAAC,EACvC,aAAa,WAAW,EACxB,IAAI,MAAM,UAAU,IAAI,MAAM,EAC9B;IAEL;AAAA,EAAA;AAEJ;"}
@@ -0,0 +1,19 @@
1
+ import { jsx, Fragment } from "react/jsx-runtime";
2
+ import { memo } from "react";
3
+ import { useInitR3M } from "./main12.mjs";
4
+ import { useSetCoords } from "./main13.mjs";
5
+ const InitR3M = memo(({
6
+ longitude,
7
+ latitude,
8
+ altitude,
9
+ ...props
10
+ }) => {
11
+ useInitR3M(props);
12
+ useSetCoords({ longitude, latitude, altitude });
13
+ return /* @__PURE__ */ jsx(Fragment, {});
14
+ });
15
+ InitR3M.displayName = "InitR3M";
16
+ export {
17
+ InitR3M
18
+ };
19
+ //# sourceMappingURL=main19.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"main19.mjs","sources":["../../src/core/canvas-overlay/init-r3m.tsx"],"sourcesContent":["import { memo } from \"react\";\nimport { FromLngLat, MapInstance } from \"../generic-map\";\nimport { useInitR3M } from \"../use-r3m\";\nimport { useSetCoords } from \"../use-coords\";\nimport { Coords } from \"../../api/coords\";\n\ninterface InitR3MProps extends Coords {\n map: MapInstance,\n fromLngLat: FromLngLat,\n}\n\n/** Initialises the `R3M` hook */\nexport const InitR3M = memo<InitR3MProps>(({\n longitude, latitude, altitude, ...props\n}) => {\n useInitR3M(props);\n useSetCoords({longitude, latitude, altitude});\n return <></>\n})\nInitR3M.displayName = 'InitR3M';"],"names":[],"mappings":";;;;AAYa,MAAA,UAAU,KAAmB,CAAC;AAAA,EACzC;AAAA,EAAW;AAAA,EAAU;AAAA,EAAU,GAAG;AACpC,MAAM;AACJ,aAAW,KAAK;AAChB,eAAa,EAAC,WAAW,UAAU,SAAS,CAAA;AAC5C,SAAS,oBAAA,UAAA,CAAA,CAAA;AACX,CAAC;AACD,QAAQ,cAAc;"}
@@ -1 +1 @@
1
- {"version":3,"file":"main2.mjs","sources":["../../src/api/use-map.ts"],"sourcesContent":["import { useThree } from \"@react-three/fiber\";\nimport { MapInstance } from \"../core/generic-map\";\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport const useMap = <T extends MapInstance = MapInstance>(): T | undefined => useThree((s) => (s as any as { r3m?: {map: T}}).r3m?.map);"],"names":[],"mappings":";AAIO,MAAM,SAAS,MAA0D,SAAS,CAAC,MAAO;;AAAA,iBAA+B,QAA/B,mBAAoC;AAAA,CAAG;"}
1
+ {"version":3,"file":"main2.mjs","sources":["../../src/api/use-map.ts"],"sourcesContent":["import { useThree } from \"@react-three/fiber\";\nimport { MapInstance } from \"../core/generic-map\";\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport const useMap = <T extends MapInstance = MapInstance>(): T => useThree((s: any) => {\n return s.r3m?.map;\n});"],"names":[],"mappings":";AAIO,MAAM,SAAS,MAA8C,SAAS,CAAC,MAAW;;AACvF,UAAO,OAAE,QAAF,mBAAO;AAChB,CAAC;"}
@@ -0,0 +1,72 @@
1
+ import { jsx, Fragment } from "react/jsx-runtime";
2
+ import { useThree, useFrame } from "@react-three/fiber";
3
+ import { memo, useRef, useEffect, useLayoutEffect } from "react";
4
+ import { syncCamera } from "./main10.mjs";
5
+ import { useCoordsToMatrix } from "./main11.mjs";
6
+ import { useFunction } from "./main9.mjs";
7
+ import { useR3M } from "./main12.mjs";
8
+ const SyncCameraFC = memo(({
9
+ latitude,
10
+ longitude,
11
+ altitude = 0,
12
+ setOnRender,
13
+ manualRender,
14
+ onReady,
15
+ mapCanvas
16
+ }) => {
17
+ const r3m = useR3M();
18
+ const camRef = useRef(null);
19
+ const camera = useThree((s) => s.camera);
20
+ const gl = useThree((s) => s.gl);
21
+ const threeCanvas = useThree((s) => s.gl.domElement);
22
+ const scene = useThree((s) => s.scene);
23
+ const advance = useThree((s) => s.advance);
24
+ const setSize = useThree((s) => s.setSize);
25
+ const set = useThree((s) => s.set);
26
+ const origin = useCoordsToMatrix({ latitude, longitude, altitude, fromLngLat: r3m.fromLngLat });
27
+ const ready = useRef(false);
28
+ useFrame(() => {
29
+ syncCamera(camera, origin, r3m.viewProjMx);
30
+ if (!manualRender)
31
+ return;
32
+ gl.render(scene, camera);
33
+ }, -Infinity);
34
+ const onRender = useFunction((viewProjMx) => {
35
+ if (threeCanvas.width !== mapCanvas.width || threeCanvas.height !== mapCanvas.height) {
36
+ setSize(
37
+ mapCanvas.clientWidth,
38
+ mapCanvas.clientHeight,
39
+ true,
40
+ mapCanvas.offsetTop,
41
+ mapCanvas.offsetLeft
42
+ );
43
+ }
44
+ r3m.viewProjMx = viewProjMx;
45
+ if (!ready.current && onReady) {
46
+ ready.current = true;
47
+ onReady();
48
+ }
49
+ advance(Date.now() * 1e-3, true);
50
+ });
51
+ useEffect(() => {
52
+ setOnRender && setOnRender(() => onRender);
53
+ }, [setOnRender, onRender]);
54
+ useLayoutEffect(() => {
55
+ if (!manualRender)
56
+ return;
57
+ set({ camera: camRef.current });
58
+ }, []);
59
+ return /* @__PURE__ */ jsx(Fragment, { children: manualRender && /* @__PURE__ */ jsx(
60
+ "perspectiveCamera",
61
+ {
62
+ ref: camRef,
63
+ matrixAutoUpdate: false,
64
+ matrixWorldAutoUpdate: false
65
+ }
66
+ ) });
67
+ });
68
+ SyncCameraFC.displayName = "SyncCameraFC";
69
+ export {
70
+ SyncCameraFC
71
+ };
72
+ //# sourceMappingURL=main20.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"main20.mjs","sources":["../../src/core/canvas-overlay/sync-camera-fc.tsx"],"sourcesContent":["import { useFrame, useThree } from \"@react-three/fiber\";\nimport { memo, useEffect, useLayoutEffect, useRef } from \"react\";\nimport { Matrix4Tuple, PerspectiveCamera } from \"three\";\nimport { syncCamera } from \"../sync-camera\";\nimport { useCoordsToMatrix } from \"../use-coords-to-matrix\";\nimport { useFunction } from \"../use-function\";\nimport { useR3M } from \"../use-r3m\";\nimport { Coords } from \"../../api/coords\";\n\ninterface SyncCameraFCProps extends Coords {\n setOnRender?: (callback: () => (mx: Matrix4Tuple) => void) => void,\n /** on `useFrame` it will manually render (used by `<Coordinates>`) */\n manualRender?: boolean,\n onReady?: () => void,\n mapCanvas: HTMLCanvasElement,\n}\n\n/** React Component (FC) to sync the Three camera with the map provider */\nexport const SyncCameraFC = memo<SyncCameraFCProps>(({\n latitude, longitude, altitude = 0, setOnRender, manualRender, onReady, mapCanvas\n}) => {\n\n const r3m = useR3M();\n\n const camRef = useRef<PerspectiveCamera>(null);\n\n const camera = useThree(s => s.camera) as PerspectiveCamera;\n const gl = useThree(s => s.gl);\n const threeCanvas = useThree(s => s.gl.domElement);\n const scene = useThree(s => s.scene);\n const advance = useThree(s => s.advance);\n const setSize = useThree(s => s.setSize);\n const set = useThree(s => s.set);\n\n const origin = useCoordsToMatrix({ latitude, longitude, altitude, fromLngLat: r3m.fromLngLat });\n\n const ready = useRef(false);\n\n useFrame(() => {\n syncCamera(camera, origin, r3m.viewProjMx)\n if (!manualRender) return;\n gl.render(scene, camera);\n }, -Infinity)\n\n const onRender = useFunction((viewProjMx: Matrix4Tuple) => {\n\n if(threeCanvas.width !== mapCanvas.width || threeCanvas.height !== mapCanvas.height) {\n setSize(\n mapCanvas.clientWidth,\n mapCanvas.clientHeight,\n true,\n mapCanvas.offsetTop,\n mapCanvas.offsetLeft,\n );\n }\n \n r3m.viewProjMx = viewProjMx;\n if (!ready.current && onReady) {\n ready.current = true;\n onReady();\n }\n advance(Date.now() * .001, true);\n })\n\n useEffect(() => {\n setOnRender && setOnRender(() => onRender)\n }, [setOnRender, onRender])\n\n useLayoutEffect(() => {\n if (!manualRender) return;\n set({ camera: camRef.current! }); // eslint-disable-line @typescript-eslint/no-non-null-assertion\n }, []) // eslint-disable-line react-hooks/exhaustive-deps\n\n return <>\n {manualRender && <perspectiveCamera\n ref={camRef}\n matrixAutoUpdate={false}\n matrixWorldAutoUpdate={false}\n />}\n </>\n})\n\nSyncCameraFC.displayName = 'SyncCameraFC';"],"names":[],"mappings":";;;;;;;AAkBa,MAAA,eAAe,KAAwB,CAAC;AAAA,EACnD;AAAA,EAAU;AAAA,EAAW,WAAW;AAAA,EAAG;AAAA,EAAa;AAAA,EAAc;AAAA,EAAS;AACzE,MAAM;AAEJ,QAAM,MAAM;AAEN,QAAA,SAAS,OAA0B,IAAI;AAE7C,QAAM,SAAS,SAAS,CAAK,MAAA,EAAE,MAAM;AACrC,QAAM,KAAK,SAAS,CAAK,MAAA,EAAE,EAAE;AAC7B,QAAM,cAAc,SAAS,CAAK,MAAA,EAAE,GAAG,UAAU;AACjD,QAAM,QAAQ,SAAS,CAAK,MAAA,EAAE,KAAK;AACnC,QAAM,UAAU,SAAS,CAAK,MAAA,EAAE,OAAO;AACvC,QAAM,UAAU,SAAS,CAAK,MAAA,EAAE,OAAO;AACvC,QAAM,MAAM,SAAS,CAAK,MAAA,EAAE,GAAG;AAEzB,QAAA,SAAS,kBAAkB,EAAE,UAAU,WAAW,UAAU,YAAY,IAAI,WAAA,CAAY;AAExF,QAAA,QAAQ,OAAO,KAAK;AAE1B,WAAS,MAAM;AACF,eAAA,QAAQ,QAAQ,IAAI,UAAU;AACzC,QAAI,CAAC;AAAc;AAChB,OAAA,OAAO,OAAO,MAAM;AAAA,EAAA,GACtB,SAAS;AAEN,QAAA,WAAW,YAAY,CAAC,eAA6B;AAEzD,QAAG,YAAY,UAAU,UAAU,SAAS,YAAY,WAAW,UAAU,QAAQ;AACnF;AAAA,QACE,UAAU;AAAA,QACV,UAAU;AAAA,QACV;AAAA,QACA,UAAU;AAAA,QACV,UAAU;AAAA,MAAA;AAAA,IAEd;AAEA,QAAI,aAAa;AACb,QAAA,CAAC,MAAM,WAAW,SAAS;AAC7B,YAAM,UAAU;AACR;IACV;AACA,YAAQ,KAAK,IAAQ,IAAA,MAAM,IAAI;AAAA,EAAA,CAChC;AAED,YAAU,MAAM;AACC,mBAAA,YAAY,MAAM,QAAQ;AAAA,EAAA,GACxC,CAAC,aAAa,QAAQ,CAAC;AAE1B,kBAAgB,MAAM;AACpB,QAAI,CAAC;AAAc;AACnB,QAAI,EAAE,QAAQ,OAAO,QAAU,CAAA;AAAA,EACjC,GAAG,CAAE,CAAA;AAEL,yCACG,UAAgB,gBAAA;AAAA,IAAC;AAAA,IAAA;AAAA,MAChB,KAAK;AAAA,MACL,kBAAkB;AAAA,MAClB,uBAAuB;AAAA,IAAA;AAAA,EAE3B,EAAA,CAAA;AACF,CAAC;AAED,aAAa,cAAc;"}
package/dist/es/main3.mjs CHANGED
@@ -1,56 +1,49 @@
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 } }) });
1
+ import { jsxs, Fragment, jsx } from "react/jsx-runtime";
2
+ import { extend } from "@react-three/fiber";
3
+ import { MercatorCoordinate } from "mapbox-gl";
4
+ import { memo, useState } from "react";
5
+ import { useMap, Layer } from "react-map-gl";
6
+ import * as THREE from "three";
7
+ import { useCanvasInLayer } from "./main7.mjs";
8
+ import { InitCanvasFC } from "./main8.mjs";
9
+ import { useFunction } from "./main9.mjs";
10
+ extend(THREE);
11
+ const fromLngLat = MercatorCoordinate.fromLngLat;
12
+ const Canvas = memo(({ overlay, ...props }) => {
13
+ const map = useMap().current.getMap();
14
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
15
+ overlay && /* @__PURE__ */ jsx(CanvasOverlay, { map, ...props }),
16
+ !overlay && /* @__PURE__ */ jsx(CanvasInLayer, { map, ...props })
17
+ ] });
26
18
  });
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)
19
+ Canvas.displayName = "Canvas";
20
+ const CanvasInLayer = memo(({ map, ...props }) => {
21
+ const layerProps = useCanvasInLayer(props, fromLngLat, map);
22
+ return /* @__PURE__ */ jsx(Layer, { ...layerProps });
23
+ });
24
+ CanvasInLayer.displayName = "CanvasInLayer";
25
+ const CanvasOverlay = memo(({ map, id, beforeId, ...props }) => {
26
+ const [onRender, setOnRender] = useState();
27
+ const render = useFunction((_gl, mx) => {
28
+ if (!onRender)
35
29
  return;
36
- syncCamera(cameraRef.current, origin, r3m.mapCamMx);
37
- gl.render(scene, cameraRef.current);
30
+ onRender(mx);
38
31
  });
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
- }
32
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
33
+ /* @__PURE__ */ jsx(Layer, { id, beforeId, type: "custom", render }),
34
+ /* @__PURE__ */ jsx(
35
+ InitCanvasFC,
36
+ {
37
+ ...props,
38
+ setOnRender,
39
+ map,
40
+ fromLngLat
41
+ }
42
+ )
43
+ ] });
44
+ });
45
+ CanvasInLayer.displayName = "CanvasInLayer";
53
46
  export {
54
- Coordinates
47
+ Canvas
55
48
  };
56
49
  //# sourceMappingURL=main3.mjs.map
@@ -1 +1 @@
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;"}
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, useState } from \"react\";\nimport { Layer, useMap } from \"react-map-gl\";\nimport * as THREE from \"three\";\nimport { Matrix4Tuple } from \"three\";\nimport { CanvasProps } from \"../api/canvas-props\";\nimport { useCanvasInLayer } from \"../core/canvas-in-layer/use-canvas-in-layer\";\nimport { InitCanvasFC } from \"../core/canvas-overlay/init-canvas-fc\";\nimport { Render } from \"../core/canvas-overlay/render\";\nimport { MapInstance } from \"../core/generic-map\";\nimport { useFunction } from \"../core/use-function\";\n\nextend(THREE);\n\nconst fromLngLat = MercatorCoordinate.fromLngLat\n\n/** react`-three-fiber` canvas inside `Mapbox` */\nexport const Canvas = memo<CanvasProps>(({ overlay, ...props }) => {\n\n const map = useMap().current!.getMap(); // eslint-disable-line @typescript-eslint/no-non-null-assertion\n\n return <>\n {overlay && <CanvasOverlay map={map} {...props} />}\n {!overlay && <CanvasInLayer map={map} {...props} />}\n </>\n})\nCanvas.displayName = 'Canvas'\n\ninterface CanvasPropsAndMap extends CanvasProps {\n map: MapInstance;\n}\n\nconst CanvasInLayer = memo<CanvasPropsAndMap>(({ map, ...props }) => {\n const layerProps = useCanvasInLayer(props, fromLngLat, map);\n return <Layer {...layerProps} />\n})\nCanvasInLayer.displayName = 'CanvasInLayer';\n\nconst CanvasOverlay = memo<CanvasPropsAndMap>(({ map, id, beforeId, ...props }) => {\n const [onRender, setOnRender] = useState<(mx: Matrix4Tuple) => void>();\n\n const render = useFunction<Render>((_gl, mx) => {\n if (!onRender) return;\n onRender(mx as Matrix4Tuple);\n })\n\n return <>\n <Layer id={id} beforeId={beforeId} type=\"custom\" render={render} />\n <InitCanvasFC {...props}\n setOnRender={setOnRender}\n map={map}\n fromLngLat={fromLngLat}\n />\n </>\n})\nCanvasInLayer.displayName = 'CanvasInLayer';"],"names":[],"mappings":";;;;;;;;;AAaA,OAAO,KAAK;AAEZ,MAAM,aAAa,mBAAmB;AAG/B,MAAM,SAAS,KAAkB,CAAC,EAAE,SAAS,GAAG,YAAY;AAEjE,QAAM,MAAM,OAAA,EAAS,QAAS,OAAO;AAErC,SACG,qBAAA,UAAA,EAAA,UAAA;AAAA,IAAA,WAAY,oBAAA,eAAA,EAAc,KAAW,GAAG,MAAO,CAAA;AAAA,IAC/C,CAAC,WAAW,oBAAC,eAAc,EAAA,KAAW,GAAG,OAAO;AAAA,EACnD,EAAA,CAAA;AACF,CAAC;AACD,OAAO,cAAc;AAMrB,MAAM,gBAAgB,KAAwB,CAAC,EAAE,KAAK,GAAG,YAAY;AACnE,QAAM,aAAa,iBAAiB,OAAO,YAAY,GAAG;AACnD,SAAA,oBAAC,OAAO,EAAA,GAAG,WAAY,CAAA;AAChC,CAAC;AACD,cAAc,cAAc;AAE5B,MAAM,gBAAgB,KAAwB,CAAC,EAAE,KAAK,IAAI,UAAU,GAAG,YAAY;AACjF,QAAM,CAAC,UAAU,WAAW,IAAI,SAAqC;AAErE,QAAM,SAAS,YAAoB,CAAC,KAAK,OAAO;AAC9C,QAAI,CAAC;AAAU;AACf,aAAS,EAAkB;AAAA,EAAA,CAC5B;AAED,SACE,qBAAA,UAAA,EAAA,UAAA;AAAA,IAAA,oBAAC,OAAM,EAAA,IAAQ,UAAoB,MAAK,UAAS,QAAgB;AAAA,IACjE;AAAA,MAAC;AAAA,MAAA;AAAA,QAAc,GAAG;AAAA,QAChB;AAAA,QACA;AAAA,QACA;AAAA,MAAA;AAAA,IACF;AAAA,EACF,EAAA,CAAA;AACF,CAAC;AACD,cAAc,cAAc;"}
package/dist/es/main4.mjs CHANGED
@@ -1,28 +1,54 @@
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(({ id, beforeId, ...props }) => {
11
- const { id: reactId, onAdd, onRemove, render } = useCanvas({ ...props, fromLngLat });
12
- return /* @__PURE__ */ jsx(
13
- Layer,
14
- {
15
- id: id || reactId,
16
- beforeId,
17
- type: "custom",
18
- renderingMode: "3d",
19
- onAdd,
20
- onRemove,
21
- render
22
- }
23
- );
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 { syncCamera } from "./main10.mjs";
6
+ import { useCoordsToMatrix } from "./main11.mjs";
7
+ import { useR3M } from "./main12.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 = useCoordsToMatrix({
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 } }) });
24
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 (!cameraRef.current)
33
+ return;
34
+ syncCamera(cameraRef.current, origin, r3m.viewProjMx);
35
+ gl.render(scene, cameraRef.current);
36
+ });
37
+ useLayoutEffect(() => {
38
+ if (!cameraRef.current)
39
+ return;
40
+ set({
41
+ invalidate: () => {
42
+ if (!r3m.map)
43
+ return;
44
+ r3m.map.triggerRepaint();
45
+ },
46
+ camera: cameraRef.current
47
+ });
48
+ }, [set, r3m]);
49
+ return /* @__PURE__ */ jsx("perspectiveCamera", { ref: cameraRef });
50
+ }
25
51
  export {
26
- Canvas
52
+ Coordinates
27
53
  };
28
54
  //# sourceMappingURL=main4.mjs.map
@@ -1 +1 @@
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>(({id, beforeId, ...props}) => {\n\n const { id: reactId, onAdd, onRemove, render } = useCanvas({ ...props, fromLngLat });\n\n return <Layer\n id={id || reactId}\n beforeId={beforeId}\n type=\"custom\"\n renderingMode=\"3d\"\n onAdd={onAdd}\n onRemove={onRemove}\n render={render}\n />\n})\n"],"names":[],"mappings":";;;;;;;AAQA,OAAO,KAAK;AAEZ,MAAM,aAAa,mBAAmB;AAGzB,MAAA,SAAS,KAAkB,CAAC,EAAC,IAAI,UAAU,GAAG,YAAW;AAEpE,QAAM,EAAE,IAAI,SAAS,OAAO,UAAU,WAAW,UAAU,EAAE,GAAG,OAAO,WAAY,CAAA;AAE5E,SAAA;AAAA,IAAC;AAAA,IAAA;AAAA,MACN,IAAI,MAAM;AAAA,MACV;AAAA,MACA,MAAK;AAAA,MACL,eAAc;AAAA,MACd;AAAA,MACA;AAAA,MACA;AAAA,IAAA;AAAA,EAAA;AAEJ,CAAC;"}
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 { syncCamera } from \"../core/sync-camera\";\nimport { useCoordsToMatrix } from \"../core/use-coords-to-matrix\";\nimport { R3M, useR3M } from \"../core/use-r3m\";\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 = useCoordsToMatrix({\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: R3M,\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 (!cameraRef.current) return;\n syncCamera(cameraRef.current, origin, r3m.viewProjMx);\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,kBAAkB;AAAA,IAC/B;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,UAAU;AAAS;AACxB,eAAW,UAAU,SAAS,QAAQ,IAAI,UAAU;AACjD,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/main5.mjs CHANGED
@@ -1,6 +1,22 @@
1
- import { useThree } from "@react-three/fiber";
2
- const useR3M = () => useThree((s) => s.r3m);
1
+ import { jsx } from "react/jsx-runtime";
2
+ import { memo, useMemo } from "react";
3
+ import { useCoords } from "./main13.mjs";
4
+ import { coordsToVector3 } from "./main6.mjs";
5
+ const NearCoordinates = memo(({ children, ...coords }) => {
6
+ const { latitude, longitude, altitude } = useCoords();
7
+ const pos = useMemo(() => coordsToVector3(coords, { latitude, longitude, altitude }), [
8
+ // eslint-disable-line react-hooks/exhaustive-deps
9
+ latitude,
10
+ longitude,
11
+ altitude,
12
+ coords.latitude,
13
+ coords.longitude,
14
+ coords.altitude
15
+ ]);
16
+ return /* @__PURE__ */ jsx("object3D", { position: pos, children });
17
+ });
18
+ NearCoordinates.displayName = "NearCoordinates";
3
19
  export {
4
- useR3M
20
+ NearCoordinates
5
21
  };
6
22
  //# sourceMappingURL=main5.mjs.map
@@ -1 +1 @@
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;"}
1
+ {"version":3,"file":"main5.mjs","sources":["../../src/api/near-coordinates.tsx"],"sourcesContent":["import { memo, useMemo } from \"react\";\nimport { useCoords } from \"../core/use-coords\";\nimport { CoordinatesProps } from \"./coordinates\";\nimport { coordsToVector3 } from \"./coords-to-vector-3\";\n\nexport const NearCoordinates = memo<CoordinatesProps>(({children, ...coords})=>{\n const {latitude, longitude, altitude} = useCoords();\n const pos = useMemo(()=>coordsToVector3(coords, {latitude, longitude, altitude}), [ // eslint-disable-line react-hooks/exhaustive-deps\n latitude, longitude, altitude, coords.latitude, coords.longitude, coords.altitude\n ]);\n return <object3D position={pos}>{children}</object3D>\n})\nNearCoordinates.displayName = 'NearCoordinates';"],"names":[],"mappings":";;;;AAKO,MAAM,kBAAkB,KAAuB,CAAC,EAAC,UAAU,GAAG,aAAU;AAC7E,QAAM,EAAC,UAAU,WAAW,aAAY,UAAU;AAC5C,QAAA,MAAM,QAAQ,MAAI,gBAAgB,QAAQ,EAAC,UAAU,WAAW,SAAQ,CAAC,GAAG;AAAA;AAAA,IAChF;AAAA,IAAU;AAAA,IAAW;AAAA,IAAU,OAAO;AAAA,IAAU,OAAO;AAAA,IAAW,OAAO;AAAA,EAAA,CAC1E;AACD,SAAQ,oBAAA,YAAA,EAAS,UAAU,KAAM,SAAS,CAAA;AAC5C,CAAC;AACD,gBAAgB,cAAc;"}
package/dist/es/main6.mjs CHANGED
@@ -1,37 +1,18 @@
1
- import { Matrix4, Vector3 } from "three";
2
- const originMx = new Matrix4();
3
- const projByView = new Matrix4();
4
- const projByViewInv = new Matrix4();
5
- const fwd = new Vector3();
6
- function syncCamera(camera, origin, mapCamMx) {
7
- projByView.fromArray(mapCamMx).multiply(originMx.fromArray(origin));
8
- projByViewInv.copy(projByView).invert();
9
- updateCamera(camera, projByViewInv);
10
- camera.updateMatrix();
11
- camera.updateMatrixWorld(true);
12
- camera.projectionMatrix.copy(camera.matrix).premultiply(projByView);
13
- camera.projectionMatrixInverse.copy(camera.projectionMatrix).invert();
14
- camera.far = calculateFar(
15
- camera.matrix.elements[10],
16
- camera.matrix.elements[14],
17
- camera.near
18
- );
19
- camera.userData.projByView = projByView.toArray();
20
- camera.userData.projByViewInv = projByViewInv.toArray();
21
- }
22
- const updateCamera = (target, projByViewInv2) => {
23
- target.position.setScalar(0).applyMatrix4(projByViewInv2);
24
- target.up.set(0, -1, 0).applyMatrix4(projByViewInv2).negate().add(target.position).normalize();
25
- fwd.set(0, 0, 1).applyMatrix4(projByViewInv2);
26
- target.lookAt(fwd);
27
- };
28
- function calculateFar(c, d, near) {
29
- const numerator = d * (c - 1);
30
- const denominator = c * near + near;
31
- const far = numerator / denominator;
32
- return far;
1
+ import { distance, bearing } from "@turf/turf";
2
+ import { MathUtils } from "three";
3
+ function coordsToVector3(point, origin) {
4
+ const originCoords = [origin.longitude, origin.latitude, origin.altitude || 0];
5
+ const pointCoords = [point.longitude, point.latitude, point.altitude || 0];
6
+ const dist = distance(originCoords, pointCoords, { units: "meters" });
7
+ const angle = bearing(originCoords, pointCoords);
8
+ const adjustedAngle = angle - 90;
9
+ const x = dist * Math.cos(adjustedAngle * MathUtils.DEG2RAD);
10
+ const y = (point.altitude || 0) - (origin.altitude || 0);
11
+ const z = dist * Math.sin(adjustedAngle * MathUtils.DEG2RAD);
12
+ const v3 = [x, y, z];
13
+ return v3;
33
14
  }
34
15
  export {
35
- syncCamera
16
+ coordsToVector3
36
17
  };
37
18
  //# sourceMappingURL=main6.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"main6.mjs","sources":["../../src/core/sync-camera.ts"],"sourcesContent":["import { Matrix4, Matrix4Tuple, Object3D, PerspectiveCamera, Vector3 } from \"three\";\n\nconst originMx = new Matrix4();\n\n/** projection * view matrix */\nconst projByView = new Matrix4();\n/** projection * view matrix inverted */\nconst projByViewInv = new Matrix4();\n\n/** forward */\nconst fwd = new Vector3();\n\n\nexport function syncCamera(camera: PerspectiveCamera, origin: Matrix4Tuple, mapCamMx: Matrix4Tuple) {\n\n projByView\n .fromArray(mapCamMx)\n .multiply(originMx.fromArray(origin));\n projByViewInv\n .copy(projByView)\n .invert();\n\n updateCamera(camera, projByViewInv);\n camera.updateMatrix();\n camera.updateMatrixWorld(true); \n\n camera.projectionMatrix.copy(camera.matrix).premultiply(projByView);\n camera.projectionMatrixInverse.copy(camera.projectionMatrix).invert();\n\n camera.far = calculateFar(\n camera.matrix.elements[10], camera.matrix.elements[14], camera.near\n )\n\n camera.userData.projByView = projByView.toArray();\n camera.userData.projByViewInv = projByViewInv.toArray();\n\n}\n\nconst updateCamera = (target: Object3D, projByViewInv: Matrix4) => {\n\n target.position\n .setScalar(0)\n .applyMatrix4(projByViewInv)\n\n target.up\n .set(0, -1, 0)\n .applyMatrix4(projByViewInv)\n .negate()\n .add(target.position)\n .normalize()\n\n fwd\n .set(0, 0, 1)\n .applyMatrix4(projByViewInv)\n\n target.lookAt(fwd);\n\n}\n\nfunction calculateFar(c: number, d: number, near: number): number {\n const numerator = d * (c - 1);\n const denominator = c * near + near;\n const far = numerator / denominator;\n return far;\n}"],"names":["projByViewInv"],"mappings":";AAEA,MAAM,WAAW,IAAI;AAGrB,MAAM,aAAa,IAAI;AAEvB,MAAM,gBAAgB,IAAI;AAG1B,MAAM,MAAM,IAAI;AAGA,SAAA,WAAW,QAA2B,QAAsB,UAAwB;AAElG,aACG,UAAU,QAAQ,EAClB,SAAS,SAAS,UAAU,MAAM,CAAC;AAEnC,gBAAA,KAAK,UAAU,EACf,OAAO;AAEV,eAAa,QAAQ,aAAa;AAClC,SAAO,aAAa;AACpB,SAAO,kBAAkB,IAAI;AAE7B,SAAO,iBAAiB,KAAK,OAAO,MAAM,EAAE,YAAY,UAAU;AAClE,SAAO,wBAAwB,KAAK,OAAO,gBAAgB,EAAE;AAE7D,SAAO,MAAM;AAAA,IACX,OAAO,OAAO,SAAS,EAAE;AAAA,IAAG,OAAO,OAAO,SAAS,EAAE;AAAA,IAAG,OAAO;AAAA,EAAA;AAG1D,SAAA,SAAS,aAAa,WAAW,QAAQ;AACzC,SAAA,SAAS,gBAAgB,cAAc,QAAQ;AAExD;AAEA,MAAM,eAAe,CAAC,QAAkBA,mBAA2B;AAEjE,SAAO,SACJ,UAAU,CAAC,EACX,aAAaA,cAAa;AAE7B,SAAO,GACJ,IAAI,GAAG,IAAI,CAAC,EACZ,aAAaA,cAAa,EAC1B,SACA,IAAI,OAAO,QAAQ,EACnB;AAEH,MACG,IAAI,GAAG,GAAG,CAAC,EACX,aAAaA,cAAa;AAE7B,SAAO,OAAO,GAAG;AAEnB;AAEA,SAAS,aAAa,GAAW,GAAW,MAAsB;AAC1D,QAAA,YAAY,KAAK,IAAI;AACrB,QAAA,cAAc,IAAI,OAAO;AAC/B,QAAM,MAAM,YAAY;AACjB,SAAA;AACT;"}
1
+ {"version":3,"file":"main6.mjs","sources":["../../src/api/coords-to-vector-3.ts"],"sourcesContent":["import { bearing, distance } from \"@turf/turf\";\nimport { MathUtils, Vector3Tuple } from \"three\";\nimport { Coords } from \"./coords\";\n\n/** converts geo coordinates `point` to a `Vector3Tuple` (represented in meters) using `origin` as the origin. */\nexport function coordsToVector3(point: Coords, origin: Coords) {\n const originCoords: Vector3Tuple = [origin.longitude, origin.latitude, origin.altitude || 0];\n const pointCoords: Vector3Tuple = [point.longitude, point.latitude, point.altitude || 0];\n\n // Calculate distance in meters\n const dist = distance(originCoords, pointCoords, { units: \"meters\" });\n\n // Calculate bearing angle\n const angle = bearing(originCoords, pointCoords);\n\n // Adjust the bearing to match the coordinate system\n // (e.g., if the positive X-axis corresponds to East and positive Z-axis to North)\n const adjustedAngle = angle - 90; \n\n // Convert angle and distance to 3D position\n const x = dist * Math.cos(adjustedAngle * MathUtils.DEG2RAD);\n const y = (point.altitude || 0) - (origin.altitude||0);\n const z = dist * Math.sin(adjustedAngle * MathUtils.DEG2RAD);\n\n const v3 : Vector3Tuple = [x, y, z];\n\n return v3;\n}"],"names":[],"mappings":";;AAKgB,SAAA,gBAAgB,OAAe,QAAgB;AACvD,QAAA,eAA6B,CAAC,OAAO,WAAW,OAAO,UAAU,OAAO,YAAY,CAAC;AACrF,QAAA,cAA4B,CAAC,MAAM,WAAW,MAAM,UAAU,MAAM,YAAY,CAAC;AAGvF,QAAM,OAAO,SAAS,cAAc,aAAa,EAAE,OAAO,UAAU;AAG9D,QAAA,QAAQ,QAAQ,cAAc,WAAW;AAI/C,QAAM,gBAAgB,QAAQ;AAG9B,QAAM,IAAI,OAAO,KAAK,IAAI,gBAAgB,UAAU,OAAO;AAC3D,QAAM,KAAK,MAAM,YAAY,MAAM,OAAO,YAAU;AACpD,QAAM,IAAI,OAAO,KAAK,IAAI,gBAAgB,UAAU,OAAO;AAE3D,QAAM,KAAoB,CAAC,GAAG,GAAG,CAAC;AAE3B,SAAA;AACT;"}
package/dist/es/main7.mjs CHANGED
@@ -1,15 +1,26 @@
1
- import { useMemo } from "react";
2
- import { coordsToMatrix } from "./main9.mjs";
3
- function useCoords({ latitude, longitude, altitude, fromLngLat }) {
4
- const m4 = useMemo(() => coordsToMatrix({
1
+ import { useCoordsToMatrix } from "./main11.mjs";
2
+ import { useRender } from "./main14.mjs";
3
+ import { useRoot } from "./main15.mjs";
4
+ function useCanvasInLayer(props, fromLngLat, map) {
5
+ const { latitude, longitude, altitude, frameloop } = props;
6
+ const origin = useCoordsToMatrix({
5
7
  latitude,
6
8
  longitude,
7
9
  altitude,
8
10
  fromLngLat
9
- }), [latitude, longitude, altitude, fromLngLat]);
10
- return m4;
11
+ });
12
+ const { onRemove, useThree, r3m } = useRoot(fromLngLat, map, props);
13
+ const render = useRender({ origin, frameloop, useThree, map, r3m });
14
+ return {
15
+ id: props.id,
16
+ beforeId: props.beforeId,
17
+ onRemove,
18
+ render,
19
+ type: "custom",
20
+ renderingMode: "3d"
21
+ };
11
22
  }
12
23
  export {
13
- useCoords
24
+ useCanvasInLayer
14
25
  };
15
26
  //# sourceMappingURL=main7.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"main7.mjs","sources":["../../src/core/use-coords.ts"],"sourcesContent":["import { useMemo } from \"react\";\nimport { coordsToMatrix } from \"./coords-to-matrix\";\n\ntype Props = Parameters<typeof coordsToMatrix>[0];\n\n/** calculate matrix from coordinates */\nexport function useCoords({latitude, longitude, altitude, fromLngLat}: Props) {\n const m4 = useMemo(() => coordsToMatrix({\n latitude, longitude, altitude, fromLngLat,\n }), [latitude, longitude, altitude, fromLngLat]);\n\n return m4;\n}"],"names":[],"mappings":";;AAMO,SAAS,UAAU,EAAC,UAAU,WAAW,UAAU,cAAoB;AACtE,QAAA,KAAK,QAAQ,MAAM,eAAe;AAAA,IACtC;AAAA,IAAU;AAAA,IAAW;AAAA,IAAU;AAAA,EAAA,CAChC,GAAG,CAAC,UAAU,WAAW,UAAU,UAAU,CAAC;AAExC,SAAA;AACT;"}
1
+ {"version":3,"file":"main7.mjs","sources":["../../src/core/canvas-in-layer/use-canvas-in-layer.tsx"],"sourcesContent":["import { CanvasProps } from \"../../api/canvas-props\";\nimport { FromLngLat, MapInstance } from \"../generic-map\";\nimport { useCoordsToMatrix } from \"../use-coords-to-matrix\";\nimport { useRender } from \"./use-render\";\nimport { useRoot } from \"./use-root\";\n\n/** get all the properties that you need to render as a map `<Layer>` */\nexport function useCanvasInLayer(props: CanvasProps,fromLngLat: FromLngLat, map: MapInstance) {\n\n const {latitude, longitude, altitude, frameloop } = props;\n\n const origin = useCoordsToMatrix({\n latitude, longitude, altitude, fromLngLat,\n });\n\n const { onRemove, useThree, r3m } = useRoot(fromLngLat, map, props);\n \n const render = useRender({origin, frameloop, useThree, map, r3m});\n \n return {\n id: props.id,\n beforeId: props.beforeId,\n onRemove,\n render,\n type: 'custom',\n renderingMode: '3d'\n } as const\n\n}"],"names":[],"mappings":";;;AAOgB,SAAA,iBAAiB,OAAmB,YAAwB,KAAkB;AAE5F,QAAM,EAAC,UAAU,WAAW,UAAU,cAAc;AAElD,QAAM,SAAS,kBAAkB;AAAA,IAC/B;AAAA,IAAU;AAAA,IAAW;AAAA,IAAU;AAAA,EAAA,CAChC;AAEK,QAAA,EAAE,UAAU,UAAU,IAAA,IAAQ,QAAQ,YAAY,KAAK,KAAK;AAE5D,QAAA,SAAS,UAAU,EAAC,QAAQ,WAAW,UAAU,KAAK,KAAI;AAEzD,SAAA;AAAA,IACL,IAAI,MAAM;AAAA,IACV,UAAU,MAAM;AAAA,IAChB;AAAA,IACA;AAAA,IACA,MAAM;AAAA,IACN,eAAe;AAAA,EAAA;AAGrB;"}
package/dist/es/main8.mjs CHANGED
@@ -1,25 +1,30 @@
1
- import { useCoords } from "./main7.mjs";
2
- import { useCreateRoot } from "./main10.mjs";
3
- import { useRender } from "./main11.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
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 "./main16.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;
17
16
  });
18
- const { id, onAdd, onRemove, r3mRef } = useCreateRoot({ frameloop, fromLngLat, ...renderProps });
19
- const render = useRender(m4, r3mRef, frameloop);
20
- return { id, onAdd, onRemove, render };
21
- }
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(/* @__PURE__ */ jsx(CanvasPortal, { ...props }), el) });
25
+ });
26
+ InitCanvasFC.displayName = "InitCanvasFC";
22
27
  export {
23
- useCanvas
28
+ InitCanvasFC
24
29
  };
25
30
  //# sourceMappingURL=main8.mjs.map