react-three-map 0.8.1 → 1.0.0-next.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 (109) hide show
  1. package/CHANGELOG.md +19 -0
  2. package/README.md +41 -24
  3. package/dist/cjs/main.js +1283 -44
  4. package/dist/es/main.mjs +2 -1
  5. package/dist/es/main10.mjs +71 -10
  6. package/dist/es/main10.mjs.map +1 -1
  7. package/dist/es/main11.mjs +12 -35
  8. package/dist/es/main11.mjs.map +1 -1
  9. package/dist/es/main12.mjs +12 -13
  10. package/dist/es/main12.mjs.map +1 -1
  11. package/dist/es/main13.mjs +42 -24
  12. package/dist/es/main13.mjs.map +1 -1
  13. package/dist/es/main14.mjs +13 -4
  14. package/dist/es/main14.mjs.map +1 -1
  15. package/dist/es/main15.mjs +22 -31
  16. package/dist/es/main15.mjs.map +1 -1
  17. package/dist/es/main16.mjs +87 -22
  18. package/dist/es/main16.mjs.map +1 -1
  19. package/dist/es/main17.mjs +14 -94
  20. package/dist/es/main17.mjs.map +1 -1
  21. package/dist/es/main18.mjs +22 -62
  22. package/dist/es/main18.mjs.map +1 -1
  23. package/dist/es/main19.mjs +27 -20
  24. package/dist/es/main19.mjs.map +1 -1
  25. package/dist/es/main20.mjs +8 -23
  26. package/dist/es/main20.mjs.map +1 -1
  27. package/dist/es/main21.mjs +34 -16
  28. package/dist/es/main21.mjs.map +1 -1
  29. package/dist/es/main22.mjs +12 -80
  30. package/dist/es/main22.mjs.map +1 -1
  31. package/dist/es/main23.mjs +26 -0
  32. package/dist/es/main23.mjs.map +1 -0
  33. package/dist/es/main24.mjs +5 -0
  34. package/dist/es/main24.mjs.map +1 -0
  35. package/dist/es/main25.mjs +33 -0
  36. package/dist/es/main25.mjs.map +1 -0
  37. package/dist/es/main26.mjs +27 -0
  38. package/dist/es/main26.mjs.map +1 -0
  39. package/dist/es/main27.mjs +98 -0
  40. package/dist/es/main27.mjs.map +1 -0
  41. package/dist/es/main28.mjs +66 -0
  42. package/dist/es/main28.mjs.map +1 -0
  43. package/dist/es/main29.mjs +23 -0
  44. package/dist/es/main29.mjs.map +1 -0
  45. package/dist/es/main3.mjs +13 -4
  46. package/dist/es/main3.mjs.map +1 -1
  47. package/dist/es/main30.mjs +27 -0
  48. package/dist/es/main30.mjs.map +1 -0
  49. package/dist/es/main31.mjs +19 -0
  50. package/dist/es/main31.mjs.map +1 -0
  51. package/dist/es/main32.mjs +83 -0
  52. package/dist/es/main32.mjs.map +1 -0
  53. package/dist/es/main33.mjs +501 -0
  54. package/dist/es/main33.mjs.map +1 -0
  55. package/dist/es/main34.mjs +90 -0
  56. package/dist/es/main34.mjs.map +1 -0
  57. package/dist/es/main35.mjs +6 -0
  58. package/dist/es/main35.mjs.map +1 -0
  59. package/dist/es/main36.mjs +26 -0
  60. package/dist/es/main36.mjs.map +1 -0
  61. package/dist/es/main37.mjs +19 -0
  62. package/dist/es/main37.mjs.map +1 -0
  63. package/dist/es/main38.mjs +50 -0
  64. package/dist/es/main38.mjs.map +1 -0
  65. package/dist/es/main39.mjs +31 -0
  66. package/dist/es/main39.mjs.map +1 -0
  67. package/dist/es/main4.mjs +3 -3
  68. package/dist/es/main40.mjs +9 -0
  69. package/dist/es/main40.mjs.map +1 -0
  70. package/dist/es/main41.mjs +62 -0
  71. package/dist/es/main41.mjs.map +1 -0
  72. package/dist/es/main42.mjs +42 -0
  73. package/dist/es/main42.mjs.map +1 -0
  74. package/dist/es/main5.mjs +22 -2
  75. package/dist/es/main5.mjs.map +1 -1
  76. package/dist/es/main6.mjs +1 -1
  77. package/dist/es/main7.mjs +1 -1
  78. package/dist/es/main8.mjs +87 -20
  79. package/dist/es/main8.mjs.map +1 -1
  80. package/dist/es/main9.mjs +80 -24
  81. package/dist/es/main9.mjs.map +1 -1
  82. package/dist/maplibre/cjs/main.js +30 -9
  83. package/dist/maplibre/es/main.mjs +2 -1
  84. package/dist/maplibre/es/main.mjs.map +1 -1
  85. package/dist/maplibre/es/main14.mjs +1 -1
  86. package/dist/maplibre/es/main14.mjs.map +1 -1
  87. package/dist/maplibre/es/main16.mjs +2 -1
  88. package/dist/maplibre/es/main16.mjs.map +1 -1
  89. package/dist/maplibre/es/main3.mjs +2 -2
  90. package/dist/maplibre/es/main3.mjs.map +1 -1
  91. package/dist/maplibre/es/main5.mjs +21 -1
  92. package/dist/maplibre/es/main5.mjs.map +1 -1
  93. package/dist/maplibre/types/api/coords-to-vector-3.d.ts +1 -0
  94. package/dist/maplibre/types/core/canvas-in-layer/use-canvas-in-layer.d.ts +5 -1
  95. package/dist/maplibre/types/core/canvas-in-layer/use-render.d.ts +5 -1
  96. package/dist/maplibre/types/core/earth-radius.d.ts +1 -1
  97. package/dist/maplibre/types/core/generic-map.d.ts +2 -2
  98. package/dist/maplibre/types/{mapbox → maplibre}/canvas.d.ts +1 -1
  99. package/dist/maplibre/types/maplibre.index.d.ts +1 -1
  100. package/dist/types/api/coords-to-vector-3.d.ts +1 -0
  101. package/dist/types/core/canvas-in-layer/use-canvas-in-layer.d.ts +5 -1
  102. package/dist/types/core/canvas-in-layer/use-render.d.ts +5 -1
  103. package/dist/types/core/earth-radius.d.ts +1 -1
  104. package/dist/types/core/generic-map.d.ts +2 -2
  105. package/dist/types/mapbox/canvas.d.ts +1 -1
  106. package/made-with/studio-carto-urban-project.webp +0 -0
  107. package/package.json +7 -7
  108. package/stories/package.json +4 -4
  109. package/stories/yarn.lock +175 -98
@@ -1,98 +1,18 @@
1
- import { jsx, Fragment } from "react/jsx-runtime";
2
- import { createRoot, _roots } from "@react-three/fiber";
3
- import { useState, useEffect } from "react";
4
- import { events } from "./main20.mjs";
5
- import { setCoords, useSetRootCoords } from "./main15.mjs";
6
- import { useFunction } from "./main10.mjs";
7
- import { initR3M } from "./main13.mjs";
8
- function useRoot(fromLngLat, map, { frameloop, longitude, latitude, altitude, ...props }) {
9
- const [{ root, useThree, canvas, r3m }] = useState(() => {
10
- const canvas2 = map.getCanvas();
11
- const gl = canvas2.getContext("webgl2") || canvas2.getContext("webgl");
12
- const root2 = createRoot(canvas2);
13
- root2.configure({
14
- dpr: window.devicePixelRatio,
15
- events,
16
- ...props,
17
- frameloop: "never",
18
- gl: {
19
- context: gl,
20
- autoClear: false,
21
- antialias: true,
22
- ...props == null ? void 0 : props.gl
23
- },
24
- onCreated: (state) => {
25
- state.gl.forceContextLoss = () => {
26
- };
27
- },
28
- camera: {
29
- matrixAutoUpdate: false,
30
- near: 0
31
- },
32
- size: {
33
- width: canvas2.clientWidth,
34
- height: canvas2.clientHeight,
35
- top: canvas2.offsetTop,
36
- left: canvas2.offsetLeft,
37
- updateStyle: false,
38
- ...props == null ? void 0 : props.size
39
- }
40
- });
41
- const store = _roots.get(canvas2).store;
42
- const r3m2 = initR3M({ map, fromLngLat, store });
43
- setCoords(store, { longitude, latitude, altitude });
44
- if (frameloop === "demand") {
45
- store.setState({
46
- frameloop,
47
- invalidate: () => {
48
- map.triggerRepaint();
49
- }
50
- });
51
- }
52
- return { root: root2, useThree: store, map, canvas: canvas2, r3m: r3m2 };
53
- });
54
- const onResize = useFunction(() => {
55
- const { setDpr, setSize } = useThree.getState();
56
- setDpr(window.devicePixelRatio);
57
- setSize(
58
- canvas.clientWidth,
59
- canvas.clientHeight,
60
- false,
61
- canvas.offsetTop,
62
- canvas.offsetLeft
63
- );
64
- });
65
- const onRemove = useFunction(() => {
66
- root.unmount();
67
- });
68
- useSetRootCoords(useThree, { longitude, latitude, altitude });
69
- useEffect(() => {
70
- if (frameloop !== "demand")
71
- return;
72
- const setState = useThree.setState;
73
- const { invalidate } = useThree.getState();
74
- setState({
75
- frameloop,
76
- invalidate: () => {
77
- map.triggerRepaint();
78
- }
79
- });
80
- return () => {
81
- setState({ frameloop: "never", invalidate });
82
- };
83
- }, [frameloop]);
84
- useEffect(() => {
85
- map.on("resize", onResize);
86
- return () => {
87
- map.off("resize", onResize);
88
- };
89
- }, []);
90
- useEffect(() => {
91
- root.render(/* @__PURE__ */ jsx(Fragment, { children: props.children }));
92
- }, [props.children]);
93
- return { onRemove, useThree, r3m };
1
+ import * as React from "react";
2
+ import { useContext, useMemo } from "react";
3
+ import { MapContext } from "./main8.mjs";
4
+ const MountedMapsContext = React.createContext(null);
5
+ function useMap() {
6
+ var _a;
7
+ const maps = (_a = useContext(MountedMapsContext)) == null ? void 0 : _a.maps;
8
+ const currentMap = useContext(MapContext);
9
+ const mapsWithCurrent = useMemo(() => {
10
+ return { ...maps, current: currentMap == null ? void 0 : currentMap.map };
11
+ }, [maps, currentMap]);
12
+ return mapsWithCurrent;
94
13
  }
95
14
  export {
96
- useRoot
15
+ MountedMapsContext,
16
+ useMap
97
17
  };
98
18
  //# sourceMappingURL=main17.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"main17.mjs","sources":["../../src/core/canvas-in-layer/use-root.tsx"],"sourcesContent":["import { _roots, createRoot } from \"@react-three/fiber\";\nimport { useEffect, useState } from \"react\";\nimport { CanvasProps } from \"../../api/canvas-props\";\nimport { events } from \"../events\";\nimport { FromLngLat, MapInstance } from \"../generic-map\";\nimport { setCoords, useSetRootCoords } from \"../use-coords\";\nimport { useFunction } from \"../use-function\";\nimport { initR3M } from \"../use-r3m\";\n\nexport function useRoot(\n fromLngLat: FromLngLat,\n map: MapInstance,\n { frameloop, longitude, latitude, altitude, ...props }: CanvasProps\n) {\n\n const [{ root, useThree, canvas, r3m }] = useState(() => {\n const canvas = map.getCanvas();\n const gl = (canvas.getContext('webgl2') || canvas.getContext('webgl')) as WebGLRenderingContext;\n\n const root = createRoot(canvas);\n root.configure({\n dpr: window.devicePixelRatio,\n events,\n ...props,\n frameloop: 'never',\n gl: {\n context: gl,\n autoClear: false,\n antialias: true,\n ...props?.gl,\n },\n onCreated: (state) => {\n state.gl.forceContextLoss = () => { }; // eslint-disable-line @typescript-eslint/no-empty-function\n },\n camera: {\n matrixAutoUpdate: false,\n near: 0,\n },\n size: {\n width: canvas.clientWidth,\n height: canvas.clientHeight,\n top: canvas.offsetTop,\n left: canvas.offsetLeft,\n updateStyle: false,\n ...props?.size,\n },\n });\n\n const store = _roots.get(canvas)!.store; // eslint-disable-line @typescript-eslint/no-non-null-assertion\n\n const r3m = initR3M({ map, fromLngLat, store });\n setCoords(store, {longitude, latitude, altitude});\n\n if (frameloop === 'demand') {\n store.setState({\n frameloop,\n invalidate: () => {\n map.triggerRepaint();\n },\n })\n }\n\n return { root, useThree: store, map, canvas, r3m }\n\n })\n\n const onResize = useFunction(() => {\n\n const { setDpr, setSize } = useThree.getState();\n\n setDpr(window.devicePixelRatio);\n\n setSize(\n canvas.clientWidth,\n canvas.clientHeight,\n false,\n canvas.offsetTop,\n canvas.offsetLeft,\n );\n\n })\n\n const onRemove = useFunction(() => {\n root.unmount();\n })\n\n useSetRootCoords(useThree, {longitude, latitude, altitude});\n\n // on `frameloop` change\n useEffect(() => {\n if (frameloop !== 'demand') return;\n const setState = useThree.setState;\n const { invalidate } = useThree.getState();\n setState({\n frameloop,\n invalidate: () => {\n map.triggerRepaint();\n }\n });\n return () => {\n setState({ frameloop: 'never', invalidate })\n }\n }, [frameloop]) // eslint-disable-line react-hooks/exhaustive-deps\n\n // on mount / unmount\n useEffect(() => {\n map.on('resize', onResize);\n return () => {\n map.off('resize', onResize)\n }\n }, []) // eslint-disable-line react-hooks/exhaustive-deps\n\n // root.render\n useEffect(() => {\n root.render(<>\n {props.children}\n </>);\n }, [props.children]) // eslint-disable-line react-hooks/exhaustive-deps\n\n return { onRemove, useThree, r3m };\n}"],"names":["canvas","root","r3m"],"mappings":";;;;;;;AASgB,SAAA,QACd,YACA,KACA,EAAE,WAAW,WAAW,UAAU,UAAU,GAAG,SAC/C;AAEM,QAAA,CAAC,EAAE,MAAM,UAAU,QAAQ,IAAK,CAAA,IAAI,SAAS,MAAM;AACjDA,UAAAA,UAAS,IAAI;AACnB,UAAM,KAAMA,QAAO,WAAW,QAAQ,KAAKA,QAAO,WAAW,OAAO;AAE9DC,UAAAA,QAAO,WAAWD,OAAM;AAC9BC,UAAK,UAAU;AAAA,MACb,KAAK,OAAO;AAAA,MACZ;AAAA,MACA,GAAG;AAAA,MACH,WAAW;AAAA,MACX,IAAI;AAAA,QACF,SAAS;AAAA,QACT,WAAW;AAAA,QACX,WAAW;AAAA,QACX,GAAG,+BAAO;AAAA,MACZ;AAAA,MACA,WAAW,CAAC,UAAU;AACd,cAAA,GAAG,mBAAmB,MAAM;AAAA,QAAA;AAAA,MACpC;AAAA,MACA,QAAQ;AAAA,QACN,kBAAkB;AAAA,QAClB,MAAM;AAAA,MACR;AAAA,MACA,MAAM;AAAA,QACJ,OAAOD,QAAO;AAAA,QACd,QAAQA,QAAO;AAAA,QACf,KAAKA,QAAO;AAAA,QACZ,MAAMA,QAAO;AAAA,QACb,aAAa;AAAA,QACb,GAAG,+BAAO;AAAA,MACZ;AAAA,IAAA,CACD;AAED,UAAM,QAAQ,OAAO,IAAIA,OAAM,EAAG;AAElC,UAAME,OAAM,QAAQ,EAAE,KAAK,YAAY,OAAO;AAC9C,cAAU,OAAO,EAAC,WAAW,UAAU,SAAS,CAAA;AAEhD,QAAI,cAAc,UAAU;AAC1B,YAAM,SAAS;AAAA,QACb;AAAA,QACA,YAAY,MAAM;AAChB,cAAI,eAAe;AAAA,QACrB;AAAA,MAAA,CACD;AAAA,IACH;AAEO,WAAA,EAAE,MAAAD,OAAM,UAAU,OAAO,KAAK,QAAAD,SAAQ,KAAAE;EAAI,CAElD;AAEK,QAAA,WAAW,YAAY,MAAM;AAEjC,UAAM,EAAE,QAAQ,QAAQ,IAAI,SAAS,SAAS;AAE9C,WAAO,OAAO,gBAAgB;AAE9B;AAAA,MACE,OAAO;AAAA,MACP,OAAO;AAAA,MACP;AAAA,MACA,OAAO;AAAA,MACP,OAAO;AAAA,IAAA;AAAA,EACT,CAED;AAEK,QAAA,WAAW,YAAY,MAAM;AACjC,SAAK,QAAQ;AAAA,EAAA,CACd;AAED,mBAAiB,UAAU,EAAC,WAAW,UAAU,SAAS,CAAA;AAG1D,YAAU,MAAM;AACd,QAAI,cAAc;AAAU;AAC5B,UAAM,WAAW,SAAS;AAC1B,UAAM,EAAE,WAAA,IAAe,SAAS,SAAS;AAChC,aAAA;AAAA,MACP;AAAA,MACA,YAAY,MAAM;AAChB,YAAI,eAAe;AAAA,MACrB;AAAA,IAAA,CACD;AACD,WAAO,MAAM;AACX,eAAS,EAAE,WAAW,SAAS,WAAY,CAAA;AAAA,IAAA;AAAA,EAC7C,GACC,CAAC,SAAS,CAAC;AAGd,YAAU,MAAM;AACV,QAAA,GAAG,UAAU,QAAQ;AACzB,WAAO,MAAM;AACP,UAAA,IAAI,UAAU,QAAQ;AAAA,IAAA;AAAA,EAE9B,GAAG,CAAE,CAAA;AAGL,YAAU,MAAM;AACd,SAAK,OAAO,oBAAA,UAAA,EACT,UAAM,MAAA,SACT,CAAA,CAAG;AAAA,EAAA,GACF,CAAC,MAAM,QAAQ,CAAC;AAEZ,SAAA,EAAE,UAAU,UAAU;AAC/B;"}
1
+ {"version":3,"file":"main17.mjs","sources":["../../node_modules/@vis.gl/react-mapbox/dist/components/use-map.js"],"sourcesContent":["import * as React from 'react';\nimport { useState, useCallback, useMemo, useContext } from 'react';\nimport { MapContext } from \"./map.js\";\nexport const MountedMapsContext = React.createContext(null);\nexport const MapProvider = props => {\n const [maps, setMaps] = useState({});\n const onMapMount = useCallback((map, id = 'default') => {\n setMaps(currMaps => {\n if (id === 'current') {\n throw new Error(\"'current' cannot be used as map id\");\n }\n if (currMaps[id]) {\n throw new Error(`Multiple maps with the same id: ${id}`);\n }\n return { ...currMaps, [id]: map };\n });\n }, []);\n const onMapUnmount = useCallback((id = 'default') => {\n setMaps(currMaps => {\n if (currMaps[id]) {\n const nextMaps = { ...currMaps };\n delete nextMaps[id];\n return nextMaps;\n }\n return currMaps;\n });\n }, []);\n return (React.createElement(MountedMapsContext.Provider, { value: {\n maps,\n onMapMount,\n onMapUnmount\n } }, props.children));\n};\nexport function useMap() {\n const maps = useContext(MountedMapsContext)?.maps;\n const currentMap = useContext(MapContext);\n const mapsWithCurrent = useMemo(() => {\n return { ...maps, current: currentMap?.map };\n }, [maps, currentMap]);\n return mapsWithCurrent;\n}\n//# sourceMappingURL=use-map.js.map"],"names":[],"mappings":";;;AAGY,MAAC,qBAAqB,MAAM,cAAc,IAAI;AA8BnD,SAAS,SAAS;;AACrB,QAAM,QAAO,gBAAW,kBAAkB,MAA7B,mBAAgC;AAC7C,QAAM,aAAa,WAAW,UAAU;AACxC,QAAM,kBAAkB,QAAQ,MAAM;AAClC,WAAO,EAAE,GAAG,MAAM,SAAS,yCAAY,IAAG;AAAA,EAClD,GAAO,CAAC,MAAM,UAAU,CAAC;AACrB,SAAO;AACX;","x_google_ignoreList":[0]}
@@ -1,66 +1,26 @@
1
- import { jsxs, jsx } from "react/jsx-runtime";
2
- import { Canvas } from "@react-three/fiber";
3
- import { memo, useState } from "react";
4
- import { events } from "./main20.mjs";
5
- import { useFunction } from "./main10.mjs";
6
- import { InitR3M } from "./main21.mjs";
7
- import { SyncCameraFC } from "./main22.mjs";
8
- const CanvasPortal = memo(({
9
- children,
10
- latitude,
11
- longitude,
12
- altitude,
13
- setOnRender,
14
- map,
15
- fromLngLat,
16
- ...props
17
- }) => {
18
- const mapCanvas = map.getCanvas();
19
- const eventSource = mapCanvas.parentElement;
20
- const [ready, setReady] = useState(false);
21
- const onReady = useFunction(() => {
22
- setReady(true);
1
+ import { useCoordsToMatrix } from "./main22.mjs";
2
+ import { useRender } from "./main26.mjs";
3
+ import { useRoot } from "./main27.mjs";
4
+ function useCanvasInLayer(props, fromLngLat, map) {
5
+ const { latitude, longitude, altitude, frameloop } = props;
6
+ const origin = useCoordsToMatrix({
7
+ latitude,
8
+ longitude,
9
+ altitude,
10
+ fromLngLat
23
11
  });
24
- return /* @__PURE__ */ jsxs(
25
- Canvas,
26
- {
27
- camera: {
28
- matrixAutoUpdate: false,
29
- matrixWorldAutoUpdate: false
30
- },
31
- events,
32
- eventSource,
33
- ...props,
34
- gl: { autoClear: false, ...props.gl },
35
- children: [
36
- /* @__PURE__ */ jsx(
37
- InitR3M,
38
- {
39
- map,
40
- fromLngLat,
41
- latitude,
42
- longitude,
43
- altitude
44
- }
45
- ),
46
- /* @__PURE__ */ jsx(
47
- SyncCameraFC,
48
- {
49
- latitude,
50
- longitude,
51
- altitude,
52
- setOnRender,
53
- onReady,
54
- map
55
- }
56
- ),
57
- ready && children
58
- ]
59
- }
60
- );
61
- });
62
- CanvasPortal.displayName = "CanvasPortal";
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
+ };
22
+ }
63
23
  export {
64
- CanvasPortal
24
+ useCanvasInLayer
65
25
  };
66
26
  //# sourceMappingURL=main18.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"main18.mjs","sources":["../../src/core/canvas-overlay/canvas-portal.tsx"],"sourcesContent":["import { Canvas } from \"@react-three/fiber\";\nimport { memo, useState } from \"react\";\nimport { Matrix4Tuple } from \"three\";\nimport { CanvasProps } from \"../../api/canvas-props\";\nimport { events } from \"../events\";\nimport { FromLngLat, MapInstance } from \"../generic-map\";\nimport { useFunction } from \"../use-function\";\nimport { InitR3M } from \"./init-r3m\";\nimport { SyncCameraFC } from \"./sync-camera-fc\";\n\ninterface CanvasPortalProps extends CanvasProps {\n setOnRender: (callback: () => (mx: Matrix4Tuple) => void) => void,\n map: MapInstance,\n fromLngLat: FromLngLat,\n}\n\nexport const CanvasPortal = memo<CanvasPortalProps>(({\n children, latitude, longitude, altitude,\n setOnRender, map, fromLngLat, ...props\n}) => {\n\n const mapCanvas = map.getCanvas();\n const eventSource = mapCanvas.parentElement!; // eslint-disable-line @typescript-eslint/no-non-null-assertion\n\n const [ready, setReady] = useState(false);\n\n const onReady = useFunction(() => {\n setReady(true);\n })\n\n return <Canvas\n camera={{\n matrixAutoUpdate: false,\n matrixWorldAutoUpdate: false,\n }}\n events={events}\n eventSource={eventSource}\n {...props}\n gl={{ autoClear: false, ...props.gl }}\n >\n <InitR3M\n map={map}\n fromLngLat={fromLngLat}\n latitude={latitude}\n longitude={longitude}\n altitude={altitude}\n />\n <SyncCameraFC\n latitude={latitude}\n longitude={longitude}\n altitude={altitude}\n setOnRender={setOnRender}\n onReady={onReady}\n map={map}\n />\n {ready && children}\n </Canvas>\n})\nCanvasPortal.displayName = 'CanvasPortal';\n"],"names":[],"mappings":";;;;;;;AAgBa,MAAA,eAAe,KAAwB,CAAC;AAAA,EACnD;AAAA,EAAU;AAAA,EAAU;AAAA,EAAW;AAAA,EAC/B;AAAA,EAAa;AAAA,EAAK;AAAA,EAAY,GAAG;AACnC,MAAM;AAEE,QAAA,YAAY,IAAI;AACtB,QAAM,cAAc,UAAU;AAE9B,QAAM,CAAC,OAAO,QAAQ,IAAI,SAAS,KAAK;AAElC,QAAA,UAAU,YAAY,MAAM;AAChC,aAAS,IAAI;AAAA,EAAA,CACd;AAEM,SAAA;AAAA,IAAC;AAAA,IAAA;AAAA,MACN,QAAQ;AAAA,QACN,kBAAkB;AAAA,QAClB,uBAAuB;AAAA,MACzB;AAAA,MACA;AAAA,MACA;AAAA,MACC,GAAG;AAAA,MACJ,IAAI,EAAE,WAAW,OAAO,GAAG,MAAM,GAAG;AAAA,MAEpC,UAAA;AAAA,QAAA;AAAA,UAAC;AAAA,UAAA;AAAA,YACC;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UAAA;AAAA,QACF;AAAA,QACA;AAAA,UAAC;AAAA,UAAA;AAAA,YACC;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UAAA;AAAA,QACF;AAAA,QACC,SAAS;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAEd,CAAC;AACD,aAAa,cAAc;"}
1
+ {"version":3,"file":"main18.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;"}
@@ -1,23 +1,30 @@
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
- }
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 "./main28.mjs";
5
+ const InitCanvasFC = memo((props) => {
6
+ const canvas = props.map.getCanvas();
7
+ const [el] = useState(() => {
8
+ const el2 = document.createElement("div");
9
+ el2.style.position = "absolute";
10
+ el2.style.top = "0";
11
+ el2.style.bottom = "0";
12
+ el2.style.left = "0";
13
+ el2.style.right = "0";
14
+ el2.style.pointerEvents = "none";
15
+ return el2;
16
+ });
17
+ useEffect(() => {
18
+ const parent = canvas.parentElement;
19
+ parent.appendChild(el);
20
+ return () => {
21
+ parent.removeChild(el);
22
+ };
23
+ }, []);
24
+ return /* @__PURE__ */ jsx(Fragment, { children: createPortal(/* @__PURE__ */ jsx(CanvasPortal, { ...props }), el) });
25
+ });
26
+ InitCanvasFC.displayName = "InitCanvasFC";
20
27
  export {
21
- coordsToMatrix
28
+ InitCanvasFC
22
29
  };
23
30
  //# sourceMappingURL=main19.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"main19.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;"}
1
+ {"version":3,"file":"main19.mjs","sources":["../../src/core/canvas-overlay/init-canvas-fc.tsx"],"sourcesContent":["import { memo, useEffect, useState } from \"react\";\nimport { createPortal } from 'react-dom';\nimport { Matrix4Tuple } from \"three\";\nimport { CanvasProps } from \"../../api/canvas-props\";\nimport { FromLngLat, MapInstance } from \"../generic-map\";\nimport { CanvasPortal } from \"./canvas-portal\";\n\ninterface InitCanvasFCProps extends CanvasProps {\n map: MapInstance,\n setOnRender: (callback: () => (mx: Matrix4Tuple) => void) => void,\n frameloop?: 'always' | 'demand',\n fromLngLat: FromLngLat,\n}\nexport const InitCanvasFC = memo<InitCanvasFCProps>((props) => {\n const canvas = props.map.getCanvas() // eslint-disable-line @typescript-eslint/no-non-null-assertion\n\n const [el] = useState(() => {\n const el = document.createElement('div');\n el.style.position = 'absolute';\n el.style.top = '0';\n el.style.bottom = '0';\n el.style.left = '0';\n el.style.right = '0';\n el.style.pointerEvents = 'none';\n return el\n })\n\n useEffect(() => {\n const parent = canvas.parentElement!; // eslint-disable-line @typescript-eslint/no-non-null-assertion\n parent.appendChild(el);\n return () => {\n parent.removeChild(el);\n }\n }, []) // eslint-disable-line react-hooks/exhaustive-deps\n return <>\n {createPortal((\n <CanvasPortal {...props} />\n ), el)}\n </>\n})\nInitCanvasFC.displayName = 'InitCanvasFC';\n"],"names":["el"],"mappings":";;;;AAaa,MAAA,eAAe,KAAwB,CAAC,UAAU;AACvD,QAAA,SAAS,MAAM,IAAI,UAAU;AAEnC,QAAM,CAAC,EAAE,IAAI,SAAS,MAAM;AACpBA,UAAAA,MAAK,SAAS,cAAc,KAAK;AACvCA,QAAG,MAAM,WAAW;AACpBA,QAAG,MAAM,MAAM;AACfA,QAAG,MAAM,SAAS;AAClBA,QAAG,MAAM,OAAO;AAChBA,QAAG,MAAM,QAAQ;AACjBA,QAAG,MAAM,gBAAgB;AAClBA,WAAAA;AAAAA,EAAA,CACR;AAED,YAAU,MAAM;AACd,UAAM,SAAS,OAAO;AACtB,WAAO,YAAY,EAAE;AACrB,WAAO,MAAM;AACX,aAAO,YAAY,EAAE;AAAA,IAAA;AAAA,EAEzB,GAAG,CAAE,CAAA;AACE,SAAA,oBAAA,UAAA,EACJ,uBACE,oBAAA,cAAA,EAAc,GAAG,MAAO,CAAA,GACxB,EAAE,EACP,CAAA;AACF,CAAC;AACD,aAAa,cAAc;"}
@@ -1,27 +1,12 @@
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
- };
1
+ import { useRef, useCallback } from "react";
2
+ const useFunction = (callback) => {
3
+ const callbackRef = useRef(callback);
4
+ callbackRef.current = callback;
5
+ return useCallback((...args) => {
6
+ return callbackRef.current(...args);
7
+ }, []);
23
8
  };
24
9
  export {
25
- events
10
+ useFunction
26
11
  };
27
12
  //# sourceMappingURL=main20.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"main20.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;"}
1
+ {"version":3,"file":"main20.mjs","sources":["../../src/core/use-function.ts"],"sourcesContent":["import { useCallback, useRef } from 'react';\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\nexport const useFunction = <T extends (...args: any[]) => any>(callback: T): T => {\n const callbackRef = useRef(callback);\n callbackRef.current = callback;\n return useCallback((...args: any[]) => {\n return callbackRef.current(...args);\n }, []) as T;\n};\n"],"names":[],"mappings":";AAGa,MAAA,cAAc,CAAoC,aAAmB;AAC1E,QAAA,cAAc,OAAO,QAAQ;AACnC,cAAY,UAAU;AACf,SAAA,YAAY,IAAI,SAAgB;AAC9B,WAAA,YAAY,QAAQ,GAAG,IAAI;AAAA,EACpC,GAAG,CAAE,CAAA;AACP;"}
@@ -1,19 +1,37 @@
1
- import { jsx, Fragment } from "react/jsx-runtime";
2
- import { memo } from "react";
3
- import { useInitR3M } from "./main13.mjs";
4
- import { useSetCoords } from "./main15.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";
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;
33
+ }
16
34
  export {
17
- InitR3M
35
+ syncCamera
18
36
  };
19
37
  //# sourceMappingURL=main21.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"main21.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
+ {"version":3,"file":"main21.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,83 +1,15 @@
1
- import { jsx, Fragment } from "react/jsx-runtime";
2
- import { useThree, useFrame } from "@react-three/fiber";
3
- import { memo, useRef, useMemo, useEffect, useLayoutEffect } from "react";
4
- import { syncCamera } from "./main11.mjs";
5
- import { useCoordsToMatrix } from "./main12.mjs";
6
- import { useFunction } from "./main10.mjs";
7
- import { useR3M } from "./main13.mjs";
8
- const SyncCameraFC = memo(({
9
- latitude,
10
- longitude,
11
- altitude = 0,
12
- setOnRender,
13
- manualRender,
14
- onReady,
15
- map
16
- }) => {
17
- const mapCanvas = map.getCanvas();
18
- const r3m = useR3M();
19
- const camRef = useRef(null);
20
- const camera = useThree((s) => s.camera);
21
- const gl = useThree((s) => s.gl);
22
- const threeCanvas = useThree((s) => s.gl.domElement);
23
- const scene = useThree((s) => s.scene);
24
- const advance = useThree((s) => s.advance);
25
- const setSize = useThree((s) => s.setSize);
26
- const set = useThree((s) => s.set);
27
- const origin = useCoordsToMatrix({ latitude, longitude, altitude, fromLngLat: r3m.fromLngLat });
28
- const ready = useRef(false);
29
- const triggerRepaint = useMemo(() => map.triggerRepaint, [map]);
30
- const mapPaintRequests = useRef(0);
31
- const triggerRepaintOff = useFunction(() => {
32
- mapPaintRequests.current++;
33
- });
34
- useFrame(() => {
35
- syncCamera(camera, origin, r3m.viewProjMx);
36
- if (manualRender)
37
- gl.render(scene, camera);
38
- map.triggerRepaint = triggerRepaint;
39
- if (mapPaintRequests.current > 0) {
40
- mapPaintRequests.current = 0;
41
- map.triggerRepaint();
42
- }
43
- }, -Infinity);
44
- const onRender = useFunction((viewProjMx) => {
45
- map.triggerRepaint = triggerRepaintOff;
46
- if (threeCanvas.width !== mapCanvas.width || threeCanvas.height !== mapCanvas.height) {
47
- setSize(
48
- mapCanvas.clientWidth,
49
- mapCanvas.clientHeight,
50
- true,
51
- mapCanvas.offsetTop,
52
- mapCanvas.offsetLeft
53
- );
54
- }
55
- r3m.viewProjMx = viewProjMx;
56
- if (!ready.current && onReady) {
57
- ready.current = true;
58
- onReady();
59
- }
60
- advance(Date.now() * 1e-3, true);
61
- });
62
- useEffect(() => {
63
- setOnRender && setOnRender(() => onRender);
64
- }, [setOnRender, onRender]);
65
- useLayoutEffect(() => {
66
- if (!manualRender)
67
- return;
68
- set({ camera: camRef.current });
69
- }, []);
70
- return /* @__PURE__ */ jsx(Fragment, { children: manualRender && /* @__PURE__ */ jsx(
71
- "perspectiveCamera",
72
- {
73
- ref: camRef,
74
- matrixAutoUpdate: false,
75
- matrixWorldAutoUpdate: false
76
- }
77
- ) });
78
- });
79
- SyncCameraFC.displayName = "SyncCameraFC";
1
+ import { useMemo } from "react";
2
+ import { coordsToMatrix } from "./main29.mjs";
3
+ function useCoordsToMatrix({ latitude, longitude, altitude, fromLngLat }) {
4
+ const m4 = useMemo(() => coordsToMatrix({
5
+ latitude,
6
+ longitude,
7
+ altitude,
8
+ fromLngLat
9
+ }), [latitude, longitude, altitude, fromLngLat]);
10
+ return m4;
11
+ }
80
12
  export {
81
- SyncCameraFC
13
+ useCoordsToMatrix
82
14
  };
83
15
  //# sourceMappingURL=main22.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"main22.mjs","sources":["../../src/core/canvas-overlay/sync-camera-fc.tsx"],"sourcesContent":["import { useFrame, useThree } from \"@react-three/fiber\";\nimport { memo, useEffect, useLayoutEffect, useMemo, useRef } from \"react\";\nimport { Matrix4Tuple, PerspectiveCamera } from \"three\";\nimport { Coords } from \"../../api/coords\";\nimport { MapInstance } from \"../generic-map\";\nimport { syncCamera } from \"../sync-camera\";\nimport { useCoordsToMatrix } from \"../use-coords-to-matrix\";\nimport { useFunction } from \"../use-function\";\nimport { useR3M } from \"../use-r3m\";\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 map: MapInstance,\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, map\n}) => {\n\n const mapCanvas = map.getCanvas();\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 const triggerRepaint = useMemo(() => map.triggerRepaint, [map]);\n const mapPaintRequests = useRef(0);\n const triggerRepaintOff = useFunction(() => {\n mapPaintRequests.current++;\n })\n\n useFrame(() => {\n syncCamera(camera, origin, r3m.viewProjMx)\n\n if (manualRender) gl.render(scene, camera);\n\n map.triggerRepaint = triggerRepaint;\n if (mapPaintRequests.current > 0) {\n mapPaintRequests.current = 0;\n map.triggerRepaint();\n }\n }, -Infinity)\n\n const onRender = useFunction((viewProjMx: Matrix4Tuple) => {\n map.triggerRepaint = triggerRepaintOff;\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":";;;;;;;AAmBa,MAAA,eAAe,KAAwB,CAAC;AAAA,EACnD;AAAA,EAAU;AAAA,EAAW,WAAW;AAAA,EAAG;AAAA,EAAa;AAAA,EAAc;AAAA,EAAS;AACzE,MAAM;AAEE,QAAA,YAAY,IAAI;AAEtB,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,QAAM,iBAAiB,QAAQ,MAAM,IAAI,gBAAgB,CAAC,GAAG,CAAC;AACxD,QAAA,mBAAmB,OAAO,CAAC;AAC3B,QAAA,oBAAoB,YAAY,MAAM;AACzB,qBAAA;AAAA,EAAA,CAClB;AAED,WAAS,MAAM;AACF,eAAA,QAAQ,QAAQ,IAAI,UAAU;AAErC,QAAA;AAAiB,SAAA,OAAO,OAAO,MAAM;AAEzC,QAAI,iBAAiB;AACjB,QAAA,iBAAiB,UAAU,GAAG;AAChC,uBAAiB,UAAU;AAC3B,UAAI,eAAe;AAAA,IACrB;AAAA,EAAA,GACC,SAAS;AAEN,QAAA,WAAW,YAAY,CAAC,eAA6B;AACzD,QAAI,iBAAiB;AAErB,QAAI,YAAY,UAAU,UAAU,SAAS,YAAY,WAAW,UAAU,QAAQ;AACpF;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;"}
1
+ {"version":3,"file":"main22.mjs","sources":["../../src/core/use-coords-to-matrix.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 useCoordsToMatrix({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,kBAAkB,EAAC,UAAU,WAAW,UAAU,cAAoB;AAC9E,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;"}
@@ -0,0 +1,26 @@
1
+ import { useThree, _roots } from "@react-three/fiber";
2
+ import { useState } from "react";
3
+ import { Matrix4 } from "three";
4
+ function useR3M() {
5
+ const r3m = useThree((s) => s.r3m);
6
+ return r3m;
7
+ }
8
+ function useInitR3M(props) {
9
+ const canvas = useThree((s) => s.gl.domElement);
10
+ useState(() => {
11
+ const store = _roots.get(canvas).store;
12
+ initR3M({ ...props, store });
13
+ });
14
+ }
15
+ function initR3M({ store, ...props }) {
16
+ const viewProjMx = new Matrix4().identity().toArray();
17
+ const r3m = { ...props, viewProjMx };
18
+ store.setState({ r3m });
19
+ return r3m;
20
+ }
21
+ export {
22
+ initR3M,
23
+ useInitR3M,
24
+ useR3M
25
+ };
26
+ //# sourceMappingURL=main23.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"main23.mjs","sources":["../../src/core/use-r3m.ts"],"sourcesContent":["import { RootState, _roots, useThree } from \"@react-three/fiber\";\nimport { useState } from \"react\";\nimport { Matrix4, Matrix4Tuple } from \"three\";\nimport { UseBoundStore } from 'zustand';\nimport { FromLngLat, MapInstance } from \"./generic-map\";\n\nexport interface R3M<T extends MapInstance = MapInstance> {\n /** Map provider */\n map: T,\n /** view projection matrix coming from the map provider */\n viewProjMx: Matrix4Tuple,\n fromLngLat: FromLngLat,\n}\n\nexport function useR3M<T extends MapInstance> () {\n const r3m = useThree(s=>(s as any).r3m) as R3M<T>; // eslint-disable-line @typescript-eslint/no-explicit-any\n return r3m;\n}\n\n/** init `useR3M` hook */\nexport function useInitR3M<T extends MapInstance>(props: {\n map: T; fromLngLat: FromLngLat;\n}) {\n const canvas = useThree(s => s.gl.domElement);\n // to run only once\n useState(()=>{\n const store = _roots.get(canvas)!.store; // eslint-disable-line @typescript-eslint/no-non-null-assertion\n initR3M({...props, store})\n })\n}\n\nexport function initR3M<T extends MapInstance>({store, ...props}: {\n map: T;\n fromLngLat: FromLngLat;\n store: UseBoundStore<RootState>;\n}) {\n const viewProjMx = new Matrix4().identity().toArray();\n const r3m : R3M<T> = { ...props, viewProjMx };\n store.setState({r3m} as any); // eslint-disable-line @typescript-eslint/no-explicit-any\n return r3m;\n}"],"names":[],"mappings":";;;AAcO,SAAS,SAAiC;AAC/C,QAAM,MAAM,SAAS,CAAI,MAAA,EAAU,GAAG;AAC/B,SAAA;AACT;AAGO,SAAS,WAAkC,OAE/C;AACD,QAAM,SAAS,SAAS,CAAK,MAAA,EAAE,GAAG,UAAU;AAE5C,WAAS,MAAI;AACX,UAAM,QAAQ,OAAO,IAAI,MAAM,EAAG;AAClC,YAAQ,EAAC,GAAG,OAAO,MAAM,CAAA;AAAA,EAAA,CAC1B;AACH;AAEO,SAAS,QAA+B,EAAC,OAAO,GAAG,SAIvD;AACD,QAAM,aAAa,IAAI,QAAA,EAAU,WAAW,QAAQ;AACpD,QAAM,MAAe,EAAE,GAAG,OAAO,WAAW;AACtC,QAAA,SAAS,EAAC,IAAA,CAAW;AACpB,SAAA;AACT;"}
@@ -0,0 +1,5 @@
1
+ const earthRadius = 63710088e-1;
2
+ export {
3
+ earthRadius
4
+ };
5
+ //# sourceMappingURL=main24.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"main24.mjs","sources":["../../src/core/earth-radius.ts"],"sourcesContent":["export const earthRadius = 6371008.8;\n"],"names":[],"mappings":"AAAO,MAAM,cAAc;"}
@@ -0,0 +1,33 @@
1
+ import { useThree, _roots } from "@react-three/fiber";
2
+ import { useMemo } from "react";
3
+ function useCoords() {
4
+ const coords = useThree((s) => s.coords);
5
+ return coords;
6
+ }
7
+ function useSetCoords({ longitude, latitude, altitude }) {
8
+ const canvas = useThree((s) => s.gl.domElement);
9
+ useMemo(() => {
10
+ const store = _roots.get(canvas).store;
11
+ const coords = { longitude, latitude, altitude };
12
+ setCoords(store, coords);
13
+ }, [longitude, latitude, altitude]);
14
+ }
15
+ function useSetRootCoords(store, {
16
+ longitude,
17
+ latitude,
18
+ altitude
19
+ }) {
20
+ useMemo(() => {
21
+ setCoords(store, { longitude, latitude, altitude });
22
+ }, [longitude, latitude, altitude]);
23
+ }
24
+ function setCoords(store, coords) {
25
+ store.setState({ coords });
26
+ }
27
+ export {
28
+ setCoords,
29
+ useCoords,
30
+ useSetCoords,
31
+ useSetRootCoords
32
+ };
33
+ //# sourceMappingURL=main25.mjs.map