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
@@ -1 +1 @@
1
- {"version":3,"file":"main.mjs","sources":["../../src/mapbox.index.ts"],"sourcesContent":["import type { Map } from 'mapbox-gl';\nimport { useMap as useMapGeneric } from './api/use-map';\n\nexport * from './api/canvas-props';\nexport * from './api/coordinates';\nexport * from './mapbox/canvas';\n\nexport const useMap = useMapGeneric<Map>;\n"],"names":["useMapGeneric"],"mappings":";;;AAOO,MAAM,SAASA;"}
1
+ {"version":3,"file":"main.mjs","sources":["../../src/mapbox.index.ts"],"sourcesContent":["import type { Map } from 'mapbox-gl';\nimport { useMap as useMapGeneric } from './api/use-map';\n\nexport * from './api';\nexport * from './mapbox/canvas';\n\nexport const useMap = useMapGeneric<Map>;\n"],"names":["useMapGeneric"],"mappings":";;;;;AAMO,MAAM,SAASA;"}
@@ -1,24 +1,37 @@
1
- import { jsx, Fragment } from "react/jsx-runtime";
2
- import { useId, useEffect } from "react";
3
- import { useOnAdd } from "./main12.mjs";
4
- const useCreateRoot = ({
5
- children,
6
- frameloop,
7
- fromLngLat,
8
- ...renderProps
9
- }) => {
10
- const id = useId();
11
- const { onAdd, onRemove, mounted, r3mRef } = useOnAdd(fromLngLat, { frameloop, ...renderProps });
12
- useEffect(() => {
13
- if (!mounted)
14
- return;
15
- if (!r3mRef.current.root)
16
- return;
17
- r3mRef.current.root.render(/* @__PURE__ */ jsx(Fragment, { children }));
18
- }, [r3mRef, mounted, children]);
19
- return { id, onAdd, onRemove, r3mRef };
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);
20
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
+ }
21
34
  export {
22
- useCreateRoot
35
+ syncCamera
23
36
  };
24
37
  //# sourceMappingURL=main10.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"main10.mjs","sources":["../../src/core/use-create-root.tsx"],"sourcesContent":["import { RenderProps } from \"@react-three/fiber\";\nimport { PropsWithChildren, useEffect, useId } from \"react\";\nimport { FromLngLat } from \"./generic-map\";\nimport { useOnAdd } from \"./use-on-add\";\n\nexport interface useCanvasProps extends Omit<RenderProps<HTMLCanvasElement>, 'frameloop'>, PropsWithChildren {\n frameloop: 'always' | 'demand',\n fromLngLat: FromLngLat\n}\n\nexport const useCreateRoot = (({\n children, frameloop, fromLngLat, ...renderProps\n}: useCanvasProps) => {\n\n const id = useId();\n\n const { onAdd, onRemove, mounted, r3mRef } = useOnAdd(fromLngLat, { frameloop, ...renderProps });\n\n useEffect(() => {\n if (!mounted) return;\n if (!r3mRef.current.root) return;\n r3mRef.current.root.render(<>\n {children}\n </>);\n }, [r3mRef, mounted, children])\n\n return { id, onAdd, onRemove, r3mRef }\n})"],"names":[],"mappings":";;;AAUO,MAAM,gBAAiB,CAAC;AAAA,EAC7B;AAAA,EAAU;AAAA,EAAW;AAAA,EAAY,GAAG;AACtC,MAAsB;AAEpB,QAAM,KAAK;AAEX,QAAM,EAAE,OAAO,UAAU,SAAS,OAAO,IAAI,SAAS,YAAY,EAAE,WAAW,GAAG,YAAa,CAAA;AAE/F,YAAU,MAAM;AACd,QAAI,CAAC;AAAS;AACV,QAAA,CAAC,OAAO,QAAQ;AAAM;AAC1B,WAAO,QAAQ,KAAK,OAAO,oBAAA,UAAA,EACxB,SACH,CAAA,CAAG;AAAA,EACF,GAAA,CAAC,QAAQ,SAAS,QAAQ,CAAC;AAE9B,SAAO,EAAE,IAAI,OAAO,UAAU,OAAO;AACvC;"}
1
+ {"version":3,"file":"main10.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,23 +1,15 @@
1
- import { syncCamera } from "./main6.mjs";
2
- import { useFunction } from "./main13.mjs";
3
- function useRender(origin, r3mRef, frameloop) {
4
- const render = useFunction((_gl, mapCamMx) => {
5
- const r3m = r3mRef.current;
6
- if (!r3m.state || !r3m.map)
7
- return;
8
- const camera = r3m.state.camera;
9
- const gl = r3m.state.gl;
10
- const advance = r3m.state.advance;
11
- r3m.mapCamMx = mapCamMx;
12
- syncCamera(camera, origin, mapCamMx);
13
- gl.resetState();
14
- advance(Date.now() * 1e-3, true);
15
- if (frameloop === "always")
16
- r3m.map.triggerRepaint();
17
- });
18
- return render;
1
+ import { useMemo } from "react";
2
+ import { coordsToMatrix } from "./main17.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;
19
11
  }
20
12
  export {
21
- useRender
13
+ useCoordsToMatrix
22
14
  };
23
15
  //# sourceMappingURL=main11.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"main11.mjs","sources":["../../src/core/use-render.ts"],"sourcesContent":["import { MutableRefObject } from \"react\";\nimport { Matrix4Tuple, PerspectiveCamera } from \"three\";\nimport { R3mStore } from \"./store\";\nimport { syncCamera } from \"./sync-camera\";\nimport { useFunction } from \"./use-function\";\n\nexport function useRender(\n origin: Matrix4Tuple, r3mRef: MutableRefObject<R3mStore>, frameloop: 'always' | 'demand'\n) {\n\n const render = useFunction((_gl: WebGL2RenderingContext, mapCamMx: number[]) => {\n const r3m = r3mRef.current;\n if (!r3m.state || !r3m.map) return;\n const camera = r3m.state.camera;\n const gl = r3m.state.gl;\n const advance = r3m.state.advance;\n r3m.mapCamMx = mapCamMx as Matrix4Tuple;\n syncCamera(camera as PerspectiveCamera, origin, mapCamMx as Matrix4Tuple);\n gl.resetState();\n advance(Date.now() * 0.001, true);\n if (frameloop === 'always') r3m.map.triggerRepaint();\n })\n\n return render;\n\n}"],"names":[],"mappings":";;AAMgB,SAAA,UACd,QAAsB,QAAoC,WAC1D;AAEA,QAAM,SAAS,YAAY,CAAC,KAA6B,aAAuB;AAC9E,UAAM,MAAM,OAAO;AACnB,QAAI,CAAC,IAAI,SAAS,CAAC,IAAI;AAAK;AACtB,UAAA,SAAS,IAAI,MAAM;AACnB,UAAA,KAAK,IAAI,MAAM;AACf,UAAA,UAAU,IAAI,MAAM;AAC1B,QAAI,WAAW;AACJ,eAAA,QAA6B,QAAQ,QAAwB;AACxE,OAAG,WAAW;AACd,YAAQ,KAAK,IAAQ,IAAA,MAAO,IAAI;AAChC,QAAI,cAAc;AAAU,UAAI,IAAI;EAAe,CACpD;AAEM,SAAA;AAET;"}
1
+ {"version":3,"file":"main11.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;"}
@@ -1,91 +1,26 @@
1
- import { createRoot, _roots } from "@react-three/fiber";
2
- import { useState, useRef, useEffect } from "react";
3
- import { createEvents } from "./main14.mjs";
4
- import { useFunction } from "./main13.mjs";
5
- function useOnAdd(fromLngLat, { frameloop, ...renderProps }) {
6
- const [mounted, setMounted] = useState(false);
7
- const r3mRef = useRef({ fromLngLat });
8
- const onAdd = useFunction((map, gl) => {
9
- const canvas = map.getCanvas();
10
- const root = createRoot(canvas);
11
- root.configure({
12
- dpr: window.devicePixelRatio,
13
- events: createEvents(),
14
- ...renderProps,
15
- frameloop: "never",
16
- gl: {
17
- context: gl,
18
- depth: true,
19
- autoClear: false,
20
- antialias: true,
21
- ...renderProps == null ? void 0 : renderProps.gl
22
- },
23
- onCreated: (state) => {
24
- state.gl.forceContextLoss = () => {
25
- };
26
- },
27
- camera: {
28
- matrixAutoUpdate: false,
29
- near: 0
30
- },
31
- size: {
32
- width: canvas.clientWidth,
33
- height: canvas.clientHeight,
34
- top: 0,
35
- left: 0,
36
- updateStyle: false,
37
- ...renderProps == null ? void 0 : renderProps.size
38
- }
39
- });
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(() => {
40
11
  const store = _roots.get(canvas).store;
41
- r3mRef.current.map = map;
42
- r3mRef.current.root = root;
43
- r3mRef.current.state = store.getState();
44
- store.setState({ r3m: r3mRef.current });
45
- if (frameloop === "demand") {
46
- store.setState({
47
- frameloop,
48
- invalidate: () => {
49
- map.triggerRepaint();
50
- }
51
- });
52
- }
53
- map.on("resize", onResize);
54
- setTimeout(() => setMounted(true));
55
- });
56
- const onResize = useFunction(() => {
57
- if (!r3mRef.current.map)
58
- return;
59
- if (!r3mRef.current.state)
60
- return;
61
- const map = r3mRef.current.map;
62
- const canvas = map.getCanvas();
63
- let updateDPR = canvas.classList.contains("mapboxgl-canvas");
64
- if (!updateDPR && map.getPixelRatio && map.getPixelRatio() === window.devicePixelRatio) {
65
- updateDPR = true;
66
- }
67
- if (updateDPR) {
68
- r3mRef.current.state.setDpr(window.devicePixelRatio);
69
- }
70
- r3mRef.current.state.setSize(
71
- canvas.clientWidth,
72
- canvas.clientHeight,
73
- false
74
- );
12
+ initR3M({ ...props, store });
75
13
  });
76
- const onRemove = useFunction(() => {
77
- if (!r3mRef.current.root)
78
- return;
79
- r3mRef.current.root.unmount();
80
- r3mRef.current.root = void 0;
81
- if (!r3mRef.current.map)
82
- return;
83
- r3mRef.current.map.off("resize", onResize);
84
- });
85
- useEffect(() => () => onRemove(), [onRemove]);
86
- return { onAdd, onRemove, mounted, r3mRef };
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;
87
20
  }
88
21
  export {
89
- useOnAdd
22
+ initR3M,
23
+ useInitR3M,
24
+ useR3M
90
25
  };
91
26
  //# sourceMappingURL=main12.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"main12.mjs","sources":["../../src/core/use-on-add.ts"],"sourcesContent":["import { RenderProps, _roots, createRoot } from \"@react-three/fiber\";\nimport { useEffect, useRef, useState } from \"react\";\nimport { createEvents } from \"./create-events\";\nimport { FromLngLat, MapInstance } from \"./generic-map\";\nimport { R3mStore } from \"./store\";\nimport { useFunction } from \"./use-function\";\n\nexport function useOnAdd(\n fromLngLat: FromLngLat,\n { frameloop, ...renderProps }: RenderProps<HTMLCanvasElement>\n) {\n\n const [mounted, setMounted] = useState(false);\n\n const r3mRef = useRef<R3mStore>({ fromLngLat });\n\n const onAdd = useFunction((map: MapInstance, gl: WebGLRenderingContext) => {\n\n const canvas = map.getCanvas();\n const root = createRoot(canvas);\n root.configure({\n dpr: window.devicePixelRatio,\n events: createEvents(),\n ...renderProps,\n frameloop: 'never',\n gl: {\n context: gl,\n depth: true,\n autoClear: false,\n antialias: true,\n ...renderProps?.gl,\n },\n onCreated: (state) => {\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n state.gl.forceContextLoss = () => { };\n },\n camera: {\n matrixAutoUpdate: false,\n near: 0,\n },\n size: {\n width: canvas.clientWidth,\n height: canvas.clientHeight,\n top: 0,\n left: 0,\n updateStyle: false,\n ...renderProps?.size,\n },\n });\n\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const store = _roots.get(canvas)!.store;\n\n r3mRef.current.map = map;\n r3mRef.current.root = root;\n r3mRef.current.state = store.getState();\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n store.setState({ r3m: r3mRef.current } as any);\n\n if (frameloop === 'demand') {\n store.setState({\n frameloop,\n invalidate: () => {\n map.triggerRepaint();\n },\n })\n }\n\n map.on('resize', onResize)\n\n setTimeout(() => setMounted(true));\n\n })\n\n const onResize = useFunction(() => {\n if (!r3mRef.current.map) return;\n if (!r3mRef.current.state) return;\n const map = r3mRef.current.map;\n const canvas = map.getCanvas();\n\n // update DPR only on mapbox\n let updateDPR = canvas.classList.contains('mapboxgl-canvas');\n\n // or on newer versions of MapLibre that take this into account\n if(!updateDPR && map.getPixelRatio && map.getPixelRatio() === window.devicePixelRatio) {\n updateDPR = true;\n } \n\n if(updateDPR) {\n r3mRef.current.state.setDpr(window.devicePixelRatio);\n }\n\n r3mRef.current.state.setSize(\n canvas.clientWidth,\n canvas.clientHeight,\n false\n );\n\n })\n\n const onRemove = useFunction(() => {\n if (!r3mRef.current.root) return;\n r3mRef.current.root.unmount();\n r3mRef.current.root = undefined;\n if (!r3mRef.current.map) return;\n r3mRef.current.map.off('resize', onResize)\n })\n\n // on unmount\n useEffect(() => () => onRemove(), [onRemove])\n\n return { onAdd, onRemove, mounted, r3mRef };\n}"],"names":[],"mappings":";;;;AAOO,SAAS,SACd,YACA,EAAE,WAAW,GAAG,eAChB;AAEA,QAAM,CAAC,SAAS,UAAU,IAAI,SAAS,KAAK;AAE5C,QAAM,SAAS,OAAiB,EAAE,WAAY,CAAA;AAE9C,QAAM,QAAQ,YAAY,CAAC,KAAkB,OAA8B;AAEnE,UAAA,SAAS,IAAI;AACb,UAAA,OAAO,WAAW,MAAM;AAC9B,SAAK,UAAU;AAAA,MACb,KAAK,OAAO;AAAA,MACZ,QAAQ,aAAa;AAAA,MACrB,GAAG;AAAA,MACH,WAAW;AAAA,MACX,IAAI;AAAA,QACF,SAAS;AAAA,QACT,OAAO;AAAA,QACP,WAAW;AAAA,QACX,WAAW;AAAA,QACX,GAAG,2CAAa;AAAA,MAClB;AAAA,MACA,WAAW,CAAC,UAAU;AAEd,cAAA,GAAG,mBAAmB,MAAM;AAAA,QAAA;AAAA,MACpC;AAAA,MACA,QAAQ;AAAA,QACN,kBAAkB;AAAA,QAClB,MAAM;AAAA,MACR;AAAA,MACA,MAAM;AAAA,QACJ,OAAO,OAAO;AAAA,QACd,QAAQ,OAAO;AAAA,QACf,KAAK;AAAA,QACL,MAAM;AAAA,QACN,aAAa;AAAA,QACb,GAAG,2CAAa;AAAA,MAClB;AAAA,IAAA,CACD;AAGD,UAAM,QAAQ,OAAO,IAAI,MAAM,EAAG;AAElC,WAAO,QAAQ,MAAM;AACrB,WAAO,QAAQ,OAAO;AACf,WAAA,QAAQ,QAAQ,MAAM,SAAS;AAGtC,UAAM,SAAS,EAAE,KAAK,OAAO,QAAgB,CAAA;AAE7C,QAAI,cAAc,UAAU;AAC1B,YAAM,SAAS;AAAA,QACb;AAAA,QACA,YAAY,MAAM;AAChB,cAAI,eAAe;AAAA,QACrB;AAAA,MAAA,CACD;AAAA,IACH;AAEI,QAAA,GAAG,UAAU,QAAQ;AAEd,eAAA,MAAM,WAAW,IAAI,CAAC;AAAA,EAAA,CAElC;AAEK,QAAA,WAAW,YAAY,MAAM;AAC7B,QAAA,CAAC,OAAO,QAAQ;AAAK;AACrB,QAAA,CAAC,OAAO,QAAQ;AAAO;AACrB,UAAA,MAAM,OAAO,QAAQ;AACrB,UAAA,SAAS,IAAI;AAGnB,QAAI,YAAY,OAAO,UAAU,SAAS,iBAAiB;AAGxD,QAAA,CAAC,aAAa,IAAI,iBAAiB,IAAI,cAAc,MAAM,OAAO,kBAAkB;AACzE,kBAAA;AAAA,IACd;AAEA,QAAG,WAAW;AACZ,aAAO,QAAQ,MAAM,OAAO,OAAO,gBAAgB;AAAA,IACrD;AAEA,WAAO,QAAQ,MAAM;AAAA,MACnB,OAAO;AAAA,MACP,OAAO;AAAA,MACP;AAAA,IAAA;AAAA,EACF,CAED;AAEK,QAAA,WAAW,YAAY,MAAM;AAC7B,QAAA,CAAC,OAAO,QAAQ;AAAM;AACnB,WAAA,QAAQ,KAAK;AACpB,WAAO,QAAQ,OAAO;AAClB,QAAA,CAAC,OAAO,QAAQ;AAAK;AACzB,WAAO,QAAQ,IAAI,IAAI,UAAU,QAAQ;AAAA,EAAA,CAC1C;AAGD,YAAU,MAAM,MAAM,SAAY,GAAA,CAAC,QAAQ,CAAC;AAE5C,SAAO,EAAE,OAAO,UAAU,SAAS,OAAO;AAC5C;"}
1
+ {"version":3,"file":"main12.mjs","sources":["../../src/core/use-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;"}
@@ -1,12 +1,33 @@
1
- import { useRef, useCallback } from "react";
2
- const useFunction = (callback) => {
3
- const callbackRef = useRef(callback);
4
- callbackRef.current = callback;
5
- return useCallback((...args) => {
6
- return callbackRef.current(...args);
7
- }, []);
8
- };
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
+ }
9
27
  export {
10
- useFunction
28
+ setCoords,
29
+ useCoords,
30
+ useSetCoords,
31
+ useSetRootCoords
11
32
  };
12
33
  //# sourceMappingURL=main13.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"main13.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
+ {"version":3,"file":"main13.mjs","sources":["../../src/core/use-coords.tsx"],"sourcesContent":["import { RootState, _roots, useThree } from \"@react-three/fiber\";\nimport { useMemo } from \"react\";\nimport { UseBoundStore } from 'zustand';\nimport { Coords } from \"../api/coords\";\n\nexport function useCoords() {\n const coords = useThree(s=>(s as any).coords) as Coords; // eslint-disable-line @typescript-eslint/no-explicit-any\n return coords;\n}\n\nexport function useSetCoords({longitude, latitude, altitude}: Coords) {\n \n const canvas = useThree(s => s.gl.domElement);\n useMemo(()=>{\n const store = _roots.get(canvas)!.store; // eslint-disable-line @typescript-eslint/no-non-null-assertion\n const coords : Coords = { longitude, latitude, altitude };\n setCoords(store, coords);\n }, [longitude, latitude, altitude]) // eslint-disable-line react-hooks/exhaustive-deps\n}\n\nexport function useSetRootCoords(store:UseBoundStore<RootState>, {\n longitude, latitude, altitude\n}: Coords) {\n useMemo(()=>{\n setCoords(store, {longitude, latitude, altitude});\n }, [longitude, latitude, altitude]) // eslint-disable-line react-hooks/exhaustive-deps\n}\n\nexport function setCoords(store:UseBoundStore<RootState>, coords: Coords) {\n store.setState({coords} as any) // eslint-disable-line @typescript-eslint/no-explicit-any\n}"],"names":[],"mappings":";;AAKO,SAAS,YAAY;AAC1B,QAAM,SAAS,SAAS,CAAI,MAAA,EAAU,MAAM;AACrC,SAAA;AACT;AAEO,SAAS,aAAa,EAAC,WAAW,UAAU,YAAmB;AAEpE,QAAM,SAAS,SAAS,CAAK,MAAA,EAAE,GAAG,UAAU;AAC5C,UAAQ,MAAI;AACV,UAAM,QAAQ,OAAO,IAAI,MAAM,EAAG;AAClC,UAAM,SAAkB,EAAE,WAAW,UAAU,SAAS;AACxD,cAAU,OAAO,MAAM;AAAA,EACtB,GAAA,CAAC,WAAW,UAAU,QAAQ,CAAC;AACpC;AAEO,SAAS,iBAAiB,OAAgC;AAAA,EAC/D;AAAA,EAAW;AAAA,EAAU;AACvB,GAAW;AACT,UAAQ,MAAI;AACV,cAAU,OAAO,EAAC,WAAW,UAAU,SAAS,CAAA;AAAA,EAC/C,GAAA,CAAC,WAAW,UAAU,QAAQ,CAAC;AACpC;AAEgB,SAAA,UAAU,OAAgC,QAAgB;AAClE,QAAA,SAAS,EAAC,OAAA,CAAc;AAChC;"}
@@ -1,71 +1,26 @@
1
- import { createEvents as createEvents$1 } from "@react-three/fiber";
2
- import { Matrix4 } from "three";
3
- const DOM_EVENTS = {
4
- onClick: ["click", false],
5
- onContextMenu: ["contextmenu", false],
6
- onDoubleClick: ["dblclick", false],
7
- onWheel: ["wheel", true],
8
- onPointerDown: ["pointerdown", true],
9
- onPointerUp: ["pointerup", true],
10
- onPointerLeave: ["pointerleave", true],
11
- onPointerMove: ["pointermove", true],
12
- onPointerCancel: ["pointercancel", true],
13
- onLostPointerCapture: ["lostpointercapture", true]
14
- };
15
- const projByViewInv = new Matrix4();
16
- function createEvents() {
17
- return (store) => {
18
- const { handlePointer } = createEvents$1(store);
19
- return {
20
- priority: 1,
21
- enabled: true,
22
- compute(event, state) {
23
- state.pointer.x = event.offsetX / state.size.width * 2 - 1;
24
- state.pointer.y = 1 - event.offsetY / state.size.height * 2;
25
- if (state.camera.userData.projByViewInv)
26
- projByViewInv.fromArray(state.camera.userData.projByViewInv);
27
- state.raycaster.camera = state.camera;
28
- state.raycaster.ray.origin.setScalar(0).applyMatrix4(projByViewInv);
29
- state.raycaster.ray.direction.set(state.pointer.x, state.pointer.y, 1).applyMatrix4(projByViewInv).sub(state.raycaster.ray.origin).normalize();
30
- },
31
- connected: void 0,
32
- handlers: Object.keys(DOM_EVENTS).reduce(
33
- (acc, key) => ({ ...acc, [key]: handlePointer(key) }),
34
- {}
35
- ),
36
- update: () => {
37
- var _a;
38
- const { events, internal } = store.getState();
39
- if (((_a = internal.lastEvent) == null ? void 0 : _a.current) && events.handlers) {
40
- events.handlers.onPointerMove(internal.lastEvent.current);
41
- }
42
- },
43
- connect: (target) => {
44
- var _a;
45
- const { set, events } = store.getState();
46
- (_a = events.disconnect) == null ? void 0 : _a.call(events);
47
- set((state) => ({ events: { ...state.events, connected: target.parentNode } }));
48
- Object.entries(events.handlers ?? []).forEach(([name, event]) => {
49
- const [eventName, passive] = DOM_EVENTS[name];
50
- target.addEventListener(eventName, event, { passive });
51
- });
52
- },
53
- disconnect: () => {
54
- const { set, events } = store.getState();
55
- if (events.connected) {
56
- Object.entries(events.handlers ?? []).forEach(([name, event]) => {
57
- if (events && events.connected instanceof HTMLElement) {
58
- const [eventName] = DOM_EVENTS[name];
59
- events.connected.removeEventListener(eventName, event);
60
- }
61
- });
62
- set((state) => ({ events: { ...state.events, connected: void 0 } }));
63
- }
64
- }
65
- };
66
- };
1
+ import { syncCamera } from "./main10.mjs";
2
+ import { useFunction } from "./main9.mjs";
3
+ function useRender({
4
+ map,
5
+ origin,
6
+ useThree,
7
+ frameloop,
8
+ r3m
9
+ }) {
10
+ const render = useFunction((_gl, projViewMx) => {
11
+ r3m.viewProjMx.splice(0, 16, ...projViewMx);
12
+ const state = useThree.getState();
13
+ const camera = state.camera;
14
+ const { gl, advance } = state;
15
+ syncCamera(camera, origin, projViewMx);
16
+ gl.resetState();
17
+ advance(Date.now() * 1e-3, true);
18
+ if (!frameloop || frameloop === "always")
19
+ map.triggerRepaint();
20
+ });
21
+ return render;
67
22
  }
68
23
  export {
69
- createEvents
24
+ useRender
70
25
  };
71
26
  //# sourceMappingURL=main14.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"main14.mjs","sources":["../../src/core/create-events.ts"],"sourcesContent":["import { Events, RenderProps, RootState, createEvents as createFiberEvents } from \"@react-three/fiber\";\nimport { Matrix4 } from \"three\";\nimport { UseBoundStore } from \"zustand\";\n\ntype DomEvent = PointerEvent | MouseEvent | WheelEvent;\n\nconst DOM_EVENTS = {\n onClick: [\"click\", false],\n onContextMenu: [\"contextmenu\", false],\n onDoubleClick: [\"dblclick\", false],\n onWheel: [\"wheel\", true],\n onPointerDown: [\"pointerdown\", true],\n onPointerUp: [\"pointerup\", true],\n onPointerLeave: [\"pointerleave\", true],\n onPointerMove: [\"pointermove\", true],\n onPointerCancel: [\"pointercancel\", true],\n onLostPointerCapture: [\"lostpointercapture\", true],\n} as const;\n\nconst projByViewInv = new Matrix4()\n\n/** ThreeLayer event manager for MapLibre and Mapbox */\nexport function createEvents(): RenderProps<HTMLCanvasElement>[\"events\"] {\n return (store: UseBoundStore<RootState>) => {\n const { handlePointer } = createFiberEvents(store);\n\n return {\n priority: 1,\n enabled: true,\n compute(event: DomEvent, state: RootState) {\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) projByViewInv.fromArray(state.camera.userData.projByViewInv);\n\n state.raycaster.camera = state.camera;\n state.raycaster.ray.origin.setScalar(0).applyMatrix4(projByViewInv);\n state.raycaster.ray.direction\n .set(state.pointer.x, state.pointer.y, 1)\n .applyMatrix4(projByViewInv)\n .sub(state.raycaster.ray.origin)\n .normalize();\n },\n connected: undefined,\n handlers: Object.keys(DOM_EVENTS).reduce(\n (acc, key) => ({ ...acc, [key]: handlePointer(key) }),\n {}\n ) as unknown as Events,\n update: () => {\n const { events, internal } = store.getState();\n if (internal.lastEvent?.current && events.handlers) {\n events.handlers.onPointerMove(internal.lastEvent.current);\n }\n },\n connect: (target: HTMLElement) => {\n const { set, events } = store.getState();\n events.disconnect?.();\n set((state) => ({ events: { ...state.events, connected: target.parentNode } }));\n Object.entries(events.handlers ?? []).forEach(([name, event]) => {\n const [eventName, passive] = DOM_EVENTS[name as keyof typeof DOM_EVENTS];\n target.addEventListener(eventName, event, { passive });\n });\n },\n disconnect: () => {\n const { set, events } = store.getState();\n if (events.connected) {\n Object.entries(events.handlers ?? []).forEach(([name, event]) => {\n if (events && events.connected instanceof HTMLElement) {\n const [eventName] = DOM_EVENTS[name as keyof typeof DOM_EVENTS];\n events.connected.removeEventListener(eventName, event);\n }\n });\n set((state) => ({ events: { ...state.events, connected: undefined } }));\n }\n },\n };\n };\n}\n"],"names":["createFiberEvents"],"mappings":";;AAMA,MAAM,aAAa;AAAA,EACjB,SAAS,CAAC,SAAS,KAAK;AAAA,EACxB,eAAe,CAAC,eAAe,KAAK;AAAA,EACpC,eAAe,CAAC,YAAY,KAAK;AAAA,EACjC,SAAS,CAAC,SAAS,IAAI;AAAA,EACvB,eAAe,CAAC,eAAe,IAAI;AAAA,EACnC,aAAa,CAAC,aAAa,IAAI;AAAA,EAC/B,gBAAgB,CAAC,gBAAgB,IAAI;AAAA,EACrC,eAAe,CAAC,eAAe,IAAI;AAAA,EACnC,iBAAiB,CAAC,iBAAiB,IAAI;AAAA,EACvC,sBAAsB,CAAC,sBAAsB,IAAI;AACnD;AAEA,MAAM,gBAAgB,IAAI;AAGnB,SAAS,eAAyD;AACvE,SAAO,CAAC,UAAoC;AAC1C,UAAM,EAAE,cAAA,IAAkBA,eAAkB,KAAK;AAE1C,WAAA;AAAA,MACL,UAAU;AAAA,MACV,SAAS;AAAA,MACT,QAAQ,OAAiB,OAAkB;AAEzC,cAAM,QAAQ,IAAK,MAAM,UAAU,MAAM,KAAK,QAAS,IAAI;AAC3D,cAAM,QAAQ,IAAI,IAAK,MAAM,UAAU,MAAM,KAAK,SAAU;AAExD,YAAA,MAAM,OAAO,SAAS;AAAe,wBAAc,UAAU,MAAM,OAAO,SAAS,aAAa;AAE9F,cAAA,UAAU,SAAS,MAAM;AAC/B,cAAM,UAAU,IAAI,OAAO,UAAU,CAAC,EAAE,aAAa,aAAa;AAC5D,cAAA,UAAU,IAAI,UACjB,IAAI,MAAM,QAAQ,GAAG,MAAM,QAAQ,GAAG,CAAC,EACvC,aAAa,aAAa,EAC1B,IAAI,MAAM,UAAU,IAAI,MAAM,EAC9B;MACL;AAAA,MACA,WAAW;AAAA,MACX,UAAU,OAAO,KAAK,UAAU,EAAE;AAAA,QAChC,CAAC,KAAK,SAAS,EAAE,GAAG,KAAK,CAAC,GAAG,GAAG,cAAc,GAAG;QACjD,CAAC;AAAA,MACH;AAAA,MACA,QAAQ,MAAM;;AACZ,cAAM,EAAE,QAAQ,SAAS,IAAI,MAAM,SAAS;AAC5C,cAAI,cAAS,cAAT,mBAAoB,YAAW,OAAO,UAAU;AAClD,iBAAO,SAAS,cAAc,SAAS,UAAU,OAAO;AAAA,QAC1D;AAAA,MACF;AAAA,MACA,SAAS,CAAC,WAAwB;;AAChC,cAAM,EAAE,KAAK,OAAO,IAAI,MAAM,SAAS;AACvC,qBAAO,eAAP;AACA,YAAI,CAAC,WAAW,EAAE,QAAQ,EAAE,GAAG,MAAM,QAAQ,WAAW,OAAO,WAAW,EAAA,EAAI;AACvE,eAAA,QAAQ,OAAO,YAAY,CAAA,CAAE,EAAE,QAAQ,CAAC,CAAC,MAAM,KAAK,MAAM;AAC/D,gBAAM,CAAC,WAAW,OAAO,IAAI,WAAW,IAA+B;AACvE,iBAAO,iBAAiB,WAAW,OAAO,EAAE,QAAS,CAAA;AAAA,QAAA,CACtD;AAAA,MACH;AAAA,MACA,YAAY,MAAM;AAChB,cAAM,EAAE,KAAK,OAAO,IAAI,MAAM,SAAS;AACvC,YAAI,OAAO,WAAW;AACb,iBAAA,QAAQ,OAAO,YAAY,CAAA,CAAE,EAAE,QAAQ,CAAC,CAAC,MAAM,KAAK,MAAM;AAC3D,gBAAA,UAAU,OAAO,qBAAqB,aAAa;AACrD,oBAAM,CAAC,SAAS,IAAI,WAAW,IAA+B;AACvD,qBAAA,UAAU,oBAAoB,WAAW,KAAK;AAAA,YACvD;AAAA,UAAA,CACD;AACG,cAAA,CAAC,WAAW,EAAE,QAAQ,EAAE,GAAG,MAAM,QAAQ,WAAW,OAAU,EAAA,EAAI;AAAA,QACxE;AAAA,MACF;AAAA,IAAA;AAAA,EACF;AAEJ;"}
1
+ {"version":3,"file":"main14.mjs","sources":["../../src/core/canvas-in-layer/use-render.ts"],"sourcesContent":["import { RootState } from \"@react-three/fiber\";\nimport { Matrix4Tuple, PerspectiveCamera } from \"three\";\nimport { UseBoundStore } from \"zustand\";\nimport { MapInstance } from \"../generic-map\";\nimport { syncCamera } from \"../sync-camera\";\nimport { useFunction } from \"../use-function\";\nimport { R3M } from \"../use-r3m\";\n\nexport function useRender({\n map, origin, useThree, frameloop, r3m,\n} :{\n map: MapInstance,\n origin: Matrix4Tuple,\n useThree: UseBoundStore<RootState>,\n frameloop?: 'always' | 'demand',\n r3m: R3M\n}) {\n const render = useFunction((_gl: WebGL2RenderingContext, projViewMx: number[]) => {\n r3m.viewProjMx.splice(0, 16, ...projViewMx)\n const state = useThree.getState();\n const camera = state.camera as PerspectiveCamera;\n const {gl, advance} = state;\n syncCamera(camera as PerspectiveCamera, origin, projViewMx as Matrix4Tuple);\n gl.resetState();\n advance(Date.now() * 0.001, true);\n if (!frameloop || frameloop === 'always') map.triggerRepaint();\n })\n return render;\n}"],"names":[],"mappings":";;AAQO,SAAS,UAAU;AAAA,EACxB;AAAA,EAAK;AAAA,EAAQ;AAAA,EAAU;AAAA,EAAW;AACpC,GAMG;AACD,QAAM,SAAS,YAAY,CAAC,KAA6B,eAAyB;AAChF,QAAI,WAAW,OAAO,GAAG,IAAI,GAAG,UAAU;AACpC,UAAA,QAAQ,SAAS;AACvB,UAAM,SAAS,MAAM;AACf,UAAA,EAAC,IAAI,QAAW,IAAA;AACX,eAAA,QAA6B,QAAQ,UAA0B;AAC1E,OAAG,WAAW;AACd,YAAQ,KAAK,IAAQ,IAAA,MAAO,IAAI;AAC5B,QAAA,CAAC,aAAa,cAAc;AAAU,UAAI,eAAe;AAAA,EAAA,CAC9D;AACM,SAAA;AACT;"}
@@ -0,0 +1,98 @@
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 "./main18.mjs";
5
+ import { setCoords, useSetRootCoords } from "./main13.mjs";
6
+ import { useFunction } from "./main9.mjs";
7
+ import { initR3M } from "./main12.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 };
94
+ }
95
+ export {
96
+ useRoot
97
+ };
98
+ //# sourceMappingURL=main15.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"main15.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;"}
@@ -0,0 +1,66 @@
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 "./main18.mjs";
5
+ import { useFunction } from "./main9.mjs";
6
+ import { InitR3M } from "./main19.mjs";
7
+ import { SyncCameraFC } from "./main20.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);
23
+ });
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
+ mapCanvas
55
+ }
56
+ ),
57
+ ready && children
58
+ ]
59
+ }
60
+ );
61
+ });
62
+ CanvasPortal.displayName = "CanvasPortal";
63
+ export {
64
+ CanvasPortal
65
+ };
66
+ //# sourceMappingURL=main16.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"main16.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 mapCanvas={mapCanvas}\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,MAAI;AAC9B,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,EAAC,WAAW,OAAO,GAAG,MAAM,GAAE;AAAA,MAElC,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;"}