react-three-map 0.7.2 → 0.8.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (151) hide show
  1. package/CHANGELOG.md +16 -0
  2. package/README.md +57 -4
  3. package/dist/cjs/main.js +386 -181
  4. package/dist/es/main.mjs +9 -3
  5. package/dist/es/main.mjs.map +1 -1
  6. package/dist/es/main10.mjs +8 -20
  7. package/dist/es/main10.mjs.map +1 -1
  8. package/dist/es/main11.mjs +33 -19
  9. package/dist/es/main11.mjs.map +1 -1
  10. package/dist/es/main12.mjs +11 -87
  11. package/dist/es/main12.mjs.map +1 -1
  12. package/dist/es/main13.mjs +23 -9
  13. package/dist/es/main13.mjs.map +1 -1
  14. package/dist/es/main14.mjs +2 -68
  15. package/dist/es/main14.mjs.map +1 -1
  16. package/dist/es/main15.mjs +33 -0
  17. package/dist/es/main15.mjs.map +1 -0
  18. package/dist/es/main16.mjs +26 -0
  19. package/dist/es/main16.mjs.map +1 -0
  20. package/dist/es/main17.mjs +98 -0
  21. package/dist/es/main17.mjs.map +1 -0
  22. package/dist/es/main18.mjs +66 -0
  23. package/dist/es/main18.mjs.map +1 -0
  24. package/dist/es/main19.mjs +23 -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 +27 -0
  28. package/dist/es/main20.mjs.map +1 -0
  29. package/dist/es/main21.mjs +19 -0
  30. package/dist/es/main21.mjs.map +1 -0
  31. package/dist/es/main22.mjs +83 -0
  32. package/dist/es/main22.mjs.map +1 -0
  33. package/dist/es/main3.mjs +43 -50
  34. package/dist/es/main3.mjs.map +1 -1
  35. package/dist/es/main4.mjs +50 -24
  36. package/dist/es/main4.mjs.map +1 -1
  37. package/dist/es/main5.mjs +12 -3
  38. package/dist/es/main5.mjs.map +1 -1
  39. package/dist/es/main6.mjs +19 -34
  40. package/dist/es/main6.mjs.map +1 -1
  41. package/dist/es/main7.mjs +10 -11
  42. package/dist/es/main7.mjs.map +1 -1
  43. package/dist/es/main8.mjs +17 -16
  44. package/dist/es/main8.mjs.map +1 -1
  45. package/dist/es/main9.mjs +27 -15
  46. package/dist/es/main9.mjs.map +1 -1
  47. package/dist/maplibre/cjs/main.js +386 -181
  48. package/dist/maplibre/es/main.mjs +9 -3
  49. package/dist/maplibre/es/main.mjs.map +1 -1
  50. package/dist/maplibre/es/main10.mjs +9 -20
  51. package/dist/maplibre/es/main10.mjs.map +1 -1
  52. package/dist/maplibre/es/main11.mjs +33 -14
  53. package/dist/maplibre/es/main11.mjs.map +1 -1
  54. package/dist/maplibre/es/main12.mjs +11 -87
  55. package/dist/maplibre/es/main12.mjs.map +1 -1
  56. package/dist/maplibre/es/main13.mjs +23 -9
  57. package/dist/maplibre/es/main13.mjs.map +1 -1
  58. package/dist/maplibre/es/main14.mjs +2 -68
  59. package/dist/maplibre/es/main14.mjs.map +1 -1
  60. package/dist/maplibre/es/main15.mjs +33 -0
  61. package/dist/maplibre/es/main15.mjs.map +1 -0
  62. package/dist/maplibre/es/main16.mjs +26 -0
  63. package/dist/maplibre/es/main16.mjs.map +1 -0
  64. package/dist/maplibre/es/main17.mjs +98 -0
  65. package/dist/maplibre/es/main17.mjs.map +1 -0
  66. package/dist/maplibre/es/main18.mjs +66 -0
  67. package/dist/maplibre/es/main18.mjs.map +1 -0
  68. package/dist/maplibre/es/main19.mjs +23 -0
  69. package/dist/maplibre/es/main19.mjs.map +1 -0
  70. package/dist/maplibre/es/main2.mjs.map +1 -1
  71. package/dist/maplibre/es/main20.mjs +27 -0
  72. package/dist/maplibre/es/main20.mjs.map +1 -0
  73. package/dist/maplibre/es/main21.mjs +19 -0
  74. package/dist/maplibre/es/main21.mjs.map +1 -0
  75. package/dist/maplibre/es/main22.mjs +83 -0
  76. package/dist/maplibre/es/main22.mjs.map +1 -0
  77. package/dist/maplibre/es/main3.mjs +43 -50
  78. package/dist/maplibre/es/main3.mjs.map +1 -1
  79. package/dist/maplibre/es/main4.mjs +50 -24
  80. package/dist/maplibre/es/main4.mjs.map +1 -1
  81. package/dist/maplibre/es/main5.mjs +12 -3
  82. package/dist/maplibre/es/main5.mjs.map +1 -1
  83. package/dist/maplibre/es/main6.mjs +19 -34
  84. package/dist/maplibre/es/main6.mjs.map +1 -1
  85. package/dist/maplibre/es/main7.mjs +10 -11
  86. package/dist/maplibre/es/main7.mjs.map +1 -1
  87. package/dist/maplibre/es/main8.mjs +17 -16
  88. package/dist/maplibre/es/main8.mjs.map +1 -1
  89. package/dist/maplibre/es/main9.mjs +25 -19
  90. package/dist/maplibre/es/main9.mjs.map +1 -1
  91. package/dist/maplibre/types/api/canvas-props.d.ts +4 -4
  92. package/dist/maplibre/types/api/coords-to-vector-3.d.ts +3 -0
  93. package/dist/maplibre/types/api/coords.d.ts +5 -0
  94. package/dist/maplibre/types/api/index.d.ts +6 -0
  95. package/dist/maplibre/types/api/near-coordinates.d.ts +3 -0
  96. package/dist/maplibre/types/api/use-map.d.ts +1 -1
  97. package/dist/maplibre/types/api/vector-3-to-coords.d.ts +3 -0
  98. package/dist/maplibre/types/core/canvas-in-layer/use-canvas-in-layer.d.ts +11 -0
  99. package/dist/maplibre/types/core/canvas-in-layer/use-render.d.ts +12 -0
  100. package/dist/maplibre/types/core/canvas-in-layer/use-root.d.ts +7 -0
  101. package/dist/maplibre/types/core/canvas-overlay/canvas-portal.d.ts +11 -0
  102. package/dist/maplibre/types/core/canvas-overlay/init-canvas-fc.d.ts +12 -0
  103. package/dist/maplibre/types/core/canvas-overlay/init-r3m.d.ts +10 -0
  104. package/dist/maplibre/types/core/canvas-overlay/render.d.ts +1 -0
  105. package/dist/maplibre/types/core/canvas-overlay/sync-camera-fc.d.ts +14 -0
  106. package/dist/maplibre/types/core/coords-to-matrix.d.ts +2 -4
  107. package/dist/maplibre/types/core/earth-radius.d.ts +1 -0
  108. package/dist/maplibre/types/core/events.d.ts +4 -0
  109. package/dist/maplibre/types/core/use-coords-to-matrix.d.ts +5 -0
  110. package/dist/maplibre/types/core/use-coords.d.ts +7 -5
  111. package/dist/maplibre/types/core/use-r3m.d.ts +22 -0
  112. package/dist/maplibre/types/{maplibre → mapbox}/canvas.d.ts +1 -1
  113. package/dist/maplibre/types/maplibre.index.d.ts +3 -4
  114. package/dist/types/api/canvas-props.d.ts +4 -4
  115. package/dist/types/api/coords-to-vector-3.d.ts +3 -0
  116. package/dist/types/api/coords.d.ts +5 -0
  117. package/dist/types/api/index.d.ts +6 -0
  118. package/dist/types/api/near-coordinates.d.ts +3 -0
  119. package/dist/types/api/use-map.d.ts +1 -1
  120. package/dist/types/api/vector-3-to-coords.d.ts +3 -0
  121. package/dist/types/core/canvas-in-layer/use-canvas-in-layer.d.ts +11 -0
  122. package/dist/types/core/canvas-in-layer/use-render.d.ts +12 -0
  123. package/dist/types/core/canvas-in-layer/use-root.d.ts +7 -0
  124. package/dist/types/core/canvas-overlay/canvas-portal.d.ts +11 -0
  125. package/dist/types/core/canvas-overlay/init-canvas-fc.d.ts +12 -0
  126. package/dist/types/core/canvas-overlay/init-r3m.d.ts +10 -0
  127. package/dist/types/core/canvas-overlay/render.d.ts +1 -0
  128. package/dist/types/core/canvas-overlay/sync-camera-fc.d.ts +14 -0
  129. package/dist/types/core/coords-to-matrix.d.ts +2 -4
  130. package/dist/types/core/earth-radius.d.ts +1 -0
  131. package/dist/types/core/events.d.ts +4 -0
  132. package/dist/types/core/use-coords-to-matrix.d.ts +5 -0
  133. package/dist/types/core/use-coords.d.ts +7 -5
  134. package/dist/types/core/use-r3m.d.ts +22 -0
  135. package/dist/types/mapbox.index.d.ts +2 -3
  136. package/package.json +12 -12
  137. package/stories/package.json +15 -8
  138. package/stories/yarn.lock +2033 -1194
  139. package/vitest.config.ts +1 -5
  140. package/dist/maplibre/types/core/create-events.d.ts +0 -3
  141. package/dist/maplibre/types/core/store.d.ts +0 -12
  142. package/dist/maplibre/types/core/use-canvas.d.ts +0 -11
  143. package/dist/maplibre/types/core/use-create-root.d.ts +0 -13
  144. package/dist/maplibre/types/core/use-on-add.d.ts +0 -10
  145. package/dist/maplibre/types/core/use-render.d.ts +0 -4
  146. package/dist/types/core/create-events.d.ts +0 -3
  147. package/dist/types/core/store.d.ts +0 -12
  148. package/dist/types/core/use-canvas.d.ts +0 -11
  149. package/dist/types/core/use-create-root.d.ts +0 -13
  150. package/dist/types/core/use-on-add.d.ts +0 -10
  151. package/dist/types/core/use-render.d.ts +0 -4
package/dist/cjs/main.js CHANGED
@@ -2,10 +2,11 @@
2
2
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
3
  const fiber = require("@react-three/fiber");
4
4
  const jsxRuntime = require("react/jsx-runtime");
5
- const react = require("react");
6
- const THREE = require("three");
7
5
  const mapboxGl = require("mapbox-gl");
6
+ const react = require("react");
8
7
  const reactMapGl = require("react-map-gl");
8
+ const THREE = require("three");
9
+ const reactDom = require("react-dom");
9
10
  function _interopNamespaceDefault(e) {
10
11
  const n = Object.create(null, { [Symbol.toStringTag]: { value: "Module" } });
11
12
  if (e) {
@@ -27,15 +28,14 @@ const useMap$1 = () => fiber.useThree((s) => {
27
28
  var _a;
28
29
  return (_a = s.r3m) == null ? void 0 : _a.map;
29
30
  });
30
- const useR3M = () => fiber.useThree((s) => s.r3m);
31
31
  const originMx = new THREE.Matrix4();
32
32
  const projByView = new THREE.Matrix4();
33
- const projByViewInv$1 = new THREE.Matrix4();
33
+ const projByViewInv = new THREE.Matrix4();
34
34
  const fwd = new THREE.Vector3();
35
35
  function syncCamera(camera, origin, mapCamMx) {
36
36
  projByView.fromArray(mapCamMx).multiply(originMx.fromArray(origin));
37
- projByViewInv$1.copy(projByView).invert();
38
- updateCamera(camera, projByViewInv$1);
37
+ projByViewInv.copy(projByView).invert();
38
+ updateCamera(camera, projByViewInv);
39
39
  camera.updateMatrix();
40
40
  camera.updateMatrixWorld(true);
41
41
  camera.projectionMatrix.copy(camera.matrix).premultiply(projByView);
@@ -46,7 +46,7 @@ function syncCamera(camera, origin, mapCamMx) {
46
46
  camera.near
47
47
  );
48
48
  camera.userData.projByView = projByView.toArray();
49
- camera.userData.projByViewInv = projByViewInv$1.toArray();
49
+ camera.userData.projByViewInv = projByViewInv.toArray();
50
50
  }
51
51
  const updateCamera = (target, projByViewInv2) => {
52
52
  target.position.setScalar(0).applyMatrix4(projByViewInv2);
@@ -65,7 +65,12 @@ const euler = new THREE.Euler();
65
65
  const pos = new THREE.Vector3();
66
66
  const scale = new THREE.Vector3();
67
67
  const m4 = new THREE.Matrix4();
68
- function coordsToMatrix({ longitude, latitude, altitude, fromLngLat: fromLngLat2 }) {
68
+ function coordsToMatrix({
69
+ longitude,
70
+ latitude,
71
+ altitude,
72
+ fromLngLat: fromLngLat2
73
+ }) {
69
74
  const center = fromLngLat2([longitude, latitude], altitude);
70
75
  const scaleUnit = center.meterInMercatorCoordinateUnits();
71
76
  pos.set(center.x, center.y, center.z || 0);
@@ -73,7 +78,7 @@ function coordsToMatrix({ longitude, latitude, altitude, fromLngLat: fromLngLat2
73
78
  quat.setFromEuler(euler.set(-Math.PI * 0.5, 0, 0));
74
79
  return m4.compose(pos, quat, scale).toArray();
75
80
  }
76
- function useCoords({ latitude, longitude, altitude, fromLngLat: fromLngLat2 }) {
81
+ function useCoordsToMatrix({ latitude, longitude, altitude, fromLngLat: fromLngLat2 }) {
77
82
  const m42 = react.useMemo(() => coordsToMatrix({
78
83
  latitude,
79
84
  longitude,
@@ -82,6 +87,23 @@ function useCoords({ latitude, longitude, altitude, fromLngLat: fromLngLat2 }) {
82
87
  }), [latitude, longitude, altitude, fromLngLat2]);
83
88
  return m42;
84
89
  }
90
+ function useR3M() {
91
+ const r3m = fiber.useThree((s) => s.r3m);
92
+ return r3m;
93
+ }
94
+ function useInitR3M(props) {
95
+ const canvas = fiber.useThree((s) => s.gl.domElement);
96
+ react.useState(() => {
97
+ const store = fiber._roots.get(canvas).store;
98
+ initR3M({ ...props, store });
99
+ });
100
+ }
101
+ function initR3M({ store, ...props }) {
102
+ const viewProjMx = new THREE.Matrix4().identity().toArray();
103
+ const r3m = { ...props, viewProjMx };
104
+ store.setState({ r3m });
105
+ return r3m;
106
+ }
85
107
  const Coordinates = react.memo(({
86
108
  latitude,
87
109
  longitude,
@@ -90,7 +112,7 @@ const Coordinates = react.memo(({
90
112
  }) => {
91
113
  const [scene] = react.useState(() => new THREE.Scene());
92
114
  const r3m = useR3M();
93
- const origin = useCoords({
115
+ const origin = useCoordsToMatrix({
94
116
  latitude,
95
117
  longitude,
96
118
  altitude,
@@ -106,11 +128,9 @@ function RenderAtCoords({ r3m, origin }) {
106
128
  const { gl, scene, set } = fiber.useThree();
107
129
  const cameraRef = react.useRef(null);
108
130
  fiber.useFrame(() => {
109
- if (!r3m.mapCamMx)
110
- return;
111
131
  if (!cameraRef.current)
112
132
  return;
113
- syncCamera(cameraRef.current, origin, r3m.mapCamMx);
133
+ syncCamera(cameraRef.current, origin, r3m.viewProjMx);
114
134
  gl.render(scene, cameraRef.current);
115
135
  });
116
136
  react.useLayoutEffect(() => {
@@ -127,70 +147,61 @@ function RenderAtCoords({ r3m, origin }) {
127
147
  }, [set, r3m]);
128
148
  return /* @__PURE__ */ jsxRuntime.jsx("perspectiveCamera", { ref: cameraRef });
129
149
  }
130
- const DOM_EVENTS = {
131
- onClick: ["click", false],
132
- onContextMenu: ["contextmenu", false],
133
- onDoubleClick: ["dblclick", false],
134
- onWheel: ["wheel", true],
135
- onPointerDown: ["pointerdown", true],
136
- onPointerUp: ["pointerup", true],
137
- onPointerLeave: ["pointerleave", true],
138
- onPointerMove: ["pointermove", true],
139
- onPointerCancel: ["pointercancel", true],
140
- onLostPointerCapture: ["lostpointercapture", true]
141
- };
142
- const projByViewInv = new THREE.Matrix4();
143
- function createEvents() {
144
- return (store) => {
145
- const { handlePointer } = fiber.createEvents(store);
146
- return {
147
- priority: 1,
148
- enabled: true,
149
- compute(event, state) {
150
- state.pointer.x = event.offsetX / state.size.width * 2 - 1;
151
- state.pointer.y = 1 - event.offsetY / state.size.height * 2;
152
- if (state.camera.userData.projByViewInv)
153
- projByViewInv.fromArray(state.camera.userData.projByViewInv);
154
- state.raycaster.camera = state.camera;
155
- state.raycaster.ray.origin.setScalar(0).applyMatrix4(projByViewInv);
156
- state.raycaster.ray.direction.set(state.pointer.x, state.pointer.y, 1).applyMatrix4(projByViewInv).sub(state.raycaster.ray.origin).normalize();
157
- },
158
- connected: void 0,
159
- handlers: Object.keys(DOM_EVENTS).reduce(
160
- (acc, key) => ({ ...acc, [key]: handlePointer(key) }),
161
- {}
162
- ),
163
- update: () => {
164
- var _a;
165
- const { events, internal } = store.getState();
166
- if (((_a = internal.lastEvent) == null ? void 0 : _a.current) && events.handlers) {
167
- events.handlers.onPointerMove(internal.lastEvent.current);
168
- }
169
- },
170
- connect: (target) => {
171
- var _a;
172
- const { set, events } = store.getState();
173
- (_a = events.disconnect) == null ? void 0 : _a.call(events);
174
- set((state) => ({ events: { ...state.events, connected: target.parentNode } }));
175
- Object.entries(events.handlers ?? []).forEach(([name, event]) => {
176
- const [eventName, passive] = DOM_EVENTS[name];
177
- target.addEventListener(eventName, event, { passive });
178
- });
179
- },
180
- disconnect: () => {
181
- const { set, events } = store.getState();
182
- if (events.connected) {
183
- Object.entries(events.handlers ?? []).forEach(([name, event]) => {
184
- if (events && events.connected instanceof HTMLElement) {
185
- const [eventName] = DOM_EVENTS[name];
186
- events.connected.removeEventListener(eventName, event);
187
- }
188
- });
189
- set((state) => ({ events: { ...state.events, connected: void 0 } }));
190
- }
191
- }
192
- };
193
- };
150
+ const earthRadius = 6378137;
151
+ function coordsToVector3(point, origin) {
152
+ const latitudeDiff = (point.latitude - origin.latitude) * THREE.MathUtils.DEG2RAD;
153
+ const longitudeDiff = (point.longitude - origin.longitude) * THREE.MathUtils.DEG2RAD;
154
+ const altitudeDiff = (point.altitude || 0) - (origin.altitude || 0);
155
+ const x = longitudeDiff * earthRadius * Math.cos(origin.latitude * THREE.MathUtils.DEG2RAD);
156
+ const y = altitudeDiff;
157
+ const z = -latitudeDiff * earthRadius;
158
+ return [x, y, z];
159
+ }
160
+ function useCoords() {
161
+ const coords = fiber.useThree((s) => s.coords);
162
+ return coords;
163
+ }
164
+ function useSetCoords({ longitude, latitude, altitude }) {
165
+ const canvas = fiber.useThree((s) => s.gl.domElement);
166
+ react.useMemo(() => {
167
+ const store = fiber._roots.get(canvas).store;
168
+ const coords = { longitude, latitude, altitude };
169
+ setCoords(store, coords);
170
+ }, [longitude, latitude, altitude]);
171
+ }
172
+ function useSetRootCoords(store, {
173
+ longitude,
174
+ latitude,
175
+ altitude
176
+ }) {
177
+ react.useMemo(() => {
178
+ setCoords(store, { longitude, latitude, altitude });
179
+ }, [longitude, latitude, altitude]);
180
+ }
181
+ function setCoords(store, coords) {
182
+ store.setState({ coords });
183
+ }
184
+ const NearCoordinates = react.memo(({ children, ...coords }) => {
185
+ const { latitude, longitude, altitude } = useCoords();
186
+ const pos2 = react.useMemo(() => coordsToVector3(coords, { latitude, longitude, altitude }), [
187
+ // eslint-disable-line react-hooks/exhaustive-deps
188
+ latitude,
189
+ longitude,
190
+ altitude,
191
+ coords.latitude,
192
+ coords.longitude,
193
+ coords.altitude
194
+ ]);
195
+ return /* @__PURE__ */ jsxRuntime.jsx("object3D", { position: pos2, children });
196
+ });
197
+ NearCoordinates.displayName = "NearCoordinates";
198
+ function vector3ToCoords(position, origin) {
199
+ const [x, y, z] = position;
200
+ const latitude = origin.latitude + -z / earthRadius * THREE.MathUtils.RAD2DEG;
201
+ const longitude = origin.longitude + x / earthRadius * THREE.MathUtils.RAD2DEG / Math.cos(origin.latitude * THREE.MathUtils.DEG2RAD);
202
+ const altitude = (origin.altitude || 0) + y;
203
+ const coords = { latitude, longitude, altitude };
204
+ return coords;
194
205
  }
195
206
  const useFunction = (callback) => {
196
207
  const callbackRef = react.useRef(callback);
@@ -199,23 +210,62 @@ const useFunction = (callback) => {
199
210
  return callbackRef.current(...args);
200
211
  }, []);
201
212
  };
202
- function useOnAdd(fromLngLat2, { frameloop, ...renderProps }) {
203
- const [mounted, setMounted] = react.useState(false);
204
- const r3mRef = react.useRef({ fromLngLat: fromLngLat2 });
205
- const onAdd = useFunction((map, gl) => {
206
- const canvas = map.getCanvas();
207
- const root = fiber.createRoot(canvas);
208
- root.configure({
213
+ function useRender({
214
+ map,
215
+ origin,
216
+ useThree,
217
+ frameloop,
218
+ r3m
219
+ }) {
220
+ const render = useFunction((_gl, projViewMx) => {
221
+ r3m.viewProjMx.splice(0, 16, ...projViewMx);
222
+ const state = useThree.getState();
223
+ const camera = state.camera;
224
+ const { gl, advance } = state;
225
+ syncCamera(camera, origin, projViewMx);
226
+ gl.resetState();
227
+ advance(Date.now() * 1e-3, true);
228
+ if (!frameloop || frameloop === "always")
229
+ map.triggerRepaint();
230
+ });
231
+ return render;
232
+ }
233
+ const projViewInv = new THREE.Matrix4();
234
+ const events = (store) => {
235
+ const originalEvents = fiber.events(store);
236
+ return {
237
+ ...originalEvents,
238
+ connect: (target) => {
239
+ if (!originalEvents.connect)
240
+ return;
241
+ originalEvents.connect(target.parentElement);
242
+ },
243
+ compute: (event, state) => {
244
+ state.pointer.x = event.offsetX / state.size.width * 2 - 1;
245
+ state.pointer.y = 1 - event.offsetY / state.size.height * 2;
246
+ if (state.camera.userData.projByViewInv)
247
+ projViewInv.fromArray(state.camera.userData.projByViewInv);
248
+ state.raycaster.camera = state.camera;
249
+ state.raycaster.ray.origin.setScalar(0).applyMatrix4(projViewInv);
250
+ state.raycaster.ray.direction.set(state.pointer.x, state.pointer.y, 1).applyMatrix4(projViewInv).sub(state.raycaster.ray.origin).normalize();
251
+ }
252
+ };
253
+ };
254
+ function useRoot(fromLngLat2, map, { frameloop, longitude, latitude, altitude, ...props }) {
255
+ const [{ root, useThree, canvas, r3m }] = react.useState(() => {
256
+ const canvas2 = map.getCanvas();
257
+ const gl = canvas2.getContext("webgl2") || canvas2.getContext("webgl");
258
+ const root2 = fiber.createRoot(canvas2);
259
+ root2.configure({
209
260
  dpr: window.devicePixelRatio,
210
- events: createEvents(),
211
- ...renderProps,
261
+ events,
262
+ ...props,
212
263
  frameloop: "never",
213
264
  gl: {
214
265
  context: gl,
215
- depth: true,
216
266
  autoClear: false,
217
267
  antialias: true,
218
- ...renderProps == null ? void 0 : renderProps.gl
268
+ ...props == null ? void 0 : props.gl
219
269
  },
220
270
  onCreated: (state) => {
221
271
  state.gl.forceContextLoss = () => {
@@ -226,19 +276,17 @@ function useOnAdd(fromLngLat2, { frameloop, ...renderProps }) {
226
276
  near: 0
227
277
  },
228
278
  size: {
229
- width: canvas.clientWidth,
230
- height: canvas.clientHeight,
231
- top: 0,
232
- left: 0,
279
+ width: canvas2.clientWidth,
280
+ height: canvas2.clientHeight,
281
+ top: canvas2.offsetTop,
282
+ left: canvas2.offsetLeft,
233
283
  updateStyle: false,
234
- ...renderProps == null ? void 0 : renderProps.size
284
+ ...props == null ? void 0 : props.size
235
285
  }
236
286
  });
237
- const store = fiber._roots.get(canvas).store;
238
- r3mRef.current.map = map;
239
- r3mRef.current.root = root;
240
- r3mRef.current.state = store.getState();
241
- store.setState({ r3m: r3mRef.current });
287
+ const store = fiber._roots.get(canvas2).store;
288
+ const r3m2 = initR3M({ map, fromLngLat: fromLngLat2, store });
289
+ setCoords(store, { longitude, latitude, altitude });
242
290
  if (frameloop === "demand") {
243
291
  store.setState({
244
292
  frameloop,
@@ -247,111 +295,268 @@ function useOnAdd(fromLngLat2, { frameloop, ...renderProps }) {
247
295
  }
248
296
  });
249
297
  }
250
- map.on("resize", onResize);
251
- setTimeout(() => setMounted(true));
298
+ return { root: root2, useThree: store, map, canvas: canvas2, r3m: r3m2 };
252
299
  });
253
300
  const onResize = useFunction(() => {
254
- if (!r3mRef.current.map)
255
- return;
256
- if (!r3mRef.current.state)
257
- return;
258
- const map = r3mRef.current.map;
259
- const canvas = map.getCanvas();
260
- let updateDPR = canvas.classList.contains("mapboxgl-canvas");
261
- if (!updateDPR && map.getPixelRatio && map.getPixelRatio() === window.devicePixelRatio) {
262
- updateDPR = true;
263
- }
264
- if (updateDPR) {
265
- r3mRef.current.state.setDpr(window.devicePixelRatio);
266
- }
267
- r3mRef.current.state.setSize(
301
+ const { setDpr, setSize } = useThree.getState();
302
+ setDpr(window.devicePixelRatio);
303
+ setSize(
268
304
  canvas.clientWidth,
269
305
  canvas.clientHeight,
270
- false
306
+ false,
307
+ canvas.offsetTop,
308
+ canvas.offsetLeft
271
309
  );
272
310
  });
273
311
  const onRemove = useFunction(() => {
274
- if (!r3mRef.current.root)
275
- return;
276
- r3mRef.current.root.unmount();
277
- r3mRef.current.root = void 0;
278
- if (!r3mRef.current.map)
279
- return;
280
- r3mRef.current.map.off("resize", onResize);
312
+ root.unmount();
281
313
  });
282
- react.useEffect(() => () => onRemove(), [onRemove]);
283
- return { onAdd, onRemove, mounted, r3mRef };
284
- }
285
- const useCreateRoot = ({
286
- children,
287
- frameloop,
288
- fromLngLat: fromLngLat2,
289
- ...renderProps
290
- }) => {
291
- const id = react.useId();
292
- const { onAdd, onRemove, mounted, r3mRef } = useOnAdd(fromLngLat2, { frameloop, ...renderProps });
314
+ useSetRootCoords(useThree, { longitude, latitude, altitude });
293
315
  react.useEffect(() => {
294
- if (!mounted)
316
+ if (frameloop !== "demand")
295
317
  return;
296
- if (!r3mRef.current.root)
297
- return;
298
- r3mRef.current.root.render(/* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children }));
299
- }, [r3mRef, mounted, children]);
300
- return { id, onAdd, onRemove, r3mRef };
301
- };
302
- function useRender(origin, r3mRef, frameloop) {
303
- const render = useFunction((_gl, mapCamMx) => {
304
- const r3m = r3mRef.current;
305
- if (!r3m.state || !r3m.map)
306
- return;
307
- const camera = r3m.state.camera;
308
- const gl = r3m.state.gl;
309
- const advance = r3m.state.advance;
310
- r3m.mapCamMx = mapCamMx;
311
- syncCamera(camera, origin, mapCamMx);
312
- gl.resetState();
313
- advance(Date.now() * 1e-3, true);
314
- if (frameloop === "always")
315
- r3m.map.triggerRepaint();
316
- });
317
- return render;
318
+ const setState = useThree.setState;
319
+ const { invalidate } = useThree.getState();
320
+ setState({
321
+ frameloop,
322
+ invalidate: () => {
323
+ map.triggerRepaint();
324
+ }
325
+ });
326
+ return () => {
327
+ setState({ frameloop: "never", invalidate });
328
+ };
329
+ }, [frameloop]);
330
+ react.useEffect(() => {
331
+ map.on("resize", onResize);
332
+ return () => {
333
+ map.off("resize", onResize);
334
+ };
335
+ }, []);
336
+ react.useEffect(() => {
337
+ root.render(/* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children: props.children }));
338
+ }, [props.children]);
339
+ return { onRemove, useThree, r3m };
318
340
  }
319
- function useCanvas({
320
- longitude,
321
- latitude,
322
- altitude = 0,
323
- frameloop = "always",
324
- fromLngLat: fromLngLat2,
325
- ...renderProps
326
- }) {
327
- const m42 = useCoords({
341
+ function useCanvasInLayer(props, fromLngLat2, map) {
342
+ const { latitude, longitude, altitude, frameloop } = props;
343
+ const origin = useCoordsToMatrix({
328
344
  latitude,
329
345
  longitude,
330
346
  altitude,
331
347
  fromLngLat: fromLngLat2
332
348
  });
333
- const { id, onAdd, onRemove, r3mRef } = useCreateRoot({ frameloop, fromLngLat: fromLngLat2, ...renderProps });
334
- const render = useRender(m42, r3mRef, frameloop);
335
- return { id, onAdd, onRemove, render };
349
+ const { onRemove, useThree, r3m } = useRoot(fromLngLat2, map, props);
350
+ const render = useRender({ origin, frameloop, useThree, map, r3m });
351
+ return {
352
+ id: props.id,
353
+ beforeId: props.beforeId,
354
+ onRemove,
355
+ render,
356
+ type: "custom",
357
+ renderingMode: "3d"
358
+ };
336
359
  }
337
- fiber.extend(THREE__namespace);
338
- const fromLngLat = mapboxGl.MercatorCoordinate.fromLngLat;
339
- const Canvas = react.memo(({ id, beforeId, ...props }) => {
340
- const { id: reactId, onAdd, onRemove, render } = useCanvas({ ...props, fromLngLat });
341
- return /* @__PURE__ */ jsxRuntime.jsx(
342
- reactMapGl.Layer,
360
+ const InitR3M = react.memo(({
361
+ longitude,
362
+ latitude,
363
+ altitude,
364
+ ...props
365
+ }) => {
366
+ useInitR3M(props);
367
+ useSetCoords({ longitude, latitude, altitude });
368
+ return /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, {});
369
+ });
370
+ InitR3M.displayName = "InitR3M";
371
+ const SyncCameraFC = react.memo(({
372
+ latitude,
373
+ longitude,
374
+ altitude = 0,
375
+ setOnRender,
376
+ manualRender,
377
+ onReady,
378
+ map
379
+ }) => {
380
+ const mapCanvas = map.getCanvas();
381
+ const r3m = useR3M();
382
+ const camRef = react.useRef(null);
383
+ const camera = fiber.useThree((s) => s.camera);
384
+ const gl = fiber.useThree((s) => s.gl);
385
+ const threeCanvas = fiber.useThree((s) => s.gl.domElement);
386
+ const scene = fiber.useThree((s) => s.scene);
387
+ const advance = fiber.useThree((s) => s.advance);
388
+ const setSize = fiber.useThree((s) => s.setSize);
389
+ const set = fiber.useThree((s) => s.set);
390
+ const origin = useCoordsToMatrix({ latitude, longitude, altitude, fromLngLat: r3m.fromLngLat });
391
+ const ready = react.useRef(false);
392
+ const triggerRepaint = react.useMemo(() => map.triggerRepaint, [map]);
393
+ const mapPaintRequests = react.useRef(0);
394
+ const triggerRepaintOff = useFunction(() => {
395
+ mapPaintRequests.current++;
396
+ });
397
+ fiber.useFrame(() => {
398
+ syncCamera(camera, origin, r3m.viewProjMx);
399
+ if (manualRender)
400
+ gl.render(scene, camera);
401
+ map.triggerRepaint = triggerRepaint;
402
+ if (mapPaintRequests.current > 0) {
403
+ mapPaintRequests.current = 0;
404
+ map.triggerRepaint();
405
+ }
406
+ }, -Infinity);
407
+ const onRender = useFunction((viewProjMx) => {
408
+ map.triggerRepaint = triggerRepaintOff;
409
+ if (threeCanvas.width !== mapCanvas.width || threeCanvas.height !== mapCanvas.height) {
410
+ setSize(
411
+ mapCanvas.clientWidth,
412
+ mapCanvas.clientHeight,
413
+ true,
414
+ mapCanvas.offsetTop,
415
+ mapCanvas.offsetLeft
416
+ );
417
+ }
418
+ r3m.viewProjMx = viewProjMx;
419
+ if (!ready.current && onReady) {
420
+ ready.current = true;
421
+ onReady();
422
+ }
423
+ advance(Date.now() * 1e-3, true);
424
+ });
425
+ react.useEffect(() => {
426
+ setOnRender && setOnRender(() => onRender);
427
+ }, [setOnRender, onRender]);
428
+ react.useLayoutEffect(() => {
429
+ if (!manualRender)
430
+ return;
431
+ set({ camera: camRef.current });
432
+ }, []);
433
+ return /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children: manualRender && /* @__PURE__ */ jsxRuntime.jsx(
434
+ "perspectiveCamera",
435
+ {
436
+ ref: camRef,
437
+ matrixAutoUpdate: false,
438
+ matrixWorldAutoUpdate: false
439
+ }
440
+ ) });
441
+ });
442
+ SyncCameraFC.displayName = "SyncCameraFC";
443
+ const CanvasPortal = react.memo(({
444
+ children,
445
+ latitude,
446
+ longitude,
447
+ altitude,
448
+ setOnRender,
449
+ map,
450
+ fromLngLat: fromLngLat2,
451
+ ...props
452
+ }) => {
453
+ const mapCanvas = map.getCanvas();
454
+ const eventSource = mapCanvas.parentElement;
455
+ const [ready, setReady] = react.useState(false);
456
+ const onReady = useFunction(() => {
457
+ setReady(true);
458
+ });
459
+ return /* @__PURE__ */ jsxRuntime.jsxs(
460
+ fiber.Canvas,
343
461
  {
344
- id: id || reactId,
345
- beforeId,
346
- type: "custom",
347
- renderingMode: "3d",
348
- onAdd,
349
- onRemove,
350
- render
462
+ camera: {
463
+ matrixAutoUpdate: false,
464
+ matrixWorldAutoUpdate: false
465
+ },
466
+ events,
467
+ eventSource,
468
+ ...props,
469
+ gl: { autoClear: false, ...props.gl },
470
+ children: [
471
+ /* @__PURE__ */ jsxRuntime.jsx(
472
+ InitR3M,
473
+ {
474
+ map,
475
+ fromLngLat: fromLngLat2,
476
+ latitude,
477
+ longitude,
478
+ altitude
479
+ }
480
+ ),
481
+ /* @__PURE__ */ jsxRuntime.jsx(
482
+ SyncCameraFC,
483
+ {
484
+ latitude,
485
+ longitude,
486
+ altitude,
487
+ setOnRender,
488
+ onReady,
489
+ map
490
+ }
491
+ ),
492
+ ready && children
493
+ ]
351
494
  }
352
495
  );
353
496
  });
497
+ CanvasPortal.displayName = "CanvasPortal";
498
+ const InitCanvasFC = react.memo((props) => {
499
+ const canvas = props.map.getCanvas();
500
+ const [el] = react.useState(() => {
501
+ const el2 = document.createElement("div");
502
+ el2.style.position = "absolute";
503
+ el2.style.top = "0";
504
+ el2.style.bottom = "0";
505
+ el2.style.left = "0";
506
+ el2.style.right = "0";
507
+ el2.style.pointerEvents = "none";
508
+ return el2;
509
+ });
510
+ react.useEffect(() => {
511
+ const parent = canvas.parentElement;
512
+ parent.appendChild(el);
513
+ return () => {
514
+ parent.removeChild(el);
515
+ };
516
+ }, []);
517
+ return /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children: reactDom.createPortal(/* @__PURE__ */ jsxRuntime.jsx(CanvasPortal, { ...props }), el) });
518
+ });
519
+ InitCanvasFC.displayName = "InitCanvasFC";
520
+ fiber.extend(THREE__namespace);
521
+ const fromLngLat = mapboxGl.MercatorCoordinate.fromLngLat;
522
+ const Canvas = react.memo(({ overlay, ...props }) => {
523
+ const map = reactMapGl.useMap().current.getMap();
524
+ return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
525
+ overlay && /* @__PURE__ */ jsxRuntime.jsx(CanvasOverlay, { map, ...props }),
526
+ !overlay && /* @__PURE__ */ jsxRuntime.jsx(CanvasInLayer, { map, ...props })
527
+ ] });
528
+ });
529
+ Canvas.displayName = "Canvas";
530
+ const CanvasInLayer = react.memo(({ map, ...props }) => {
531
+ const layerProps = useCanvasInLayer(props, fromLngLat, map);
532
+ return /* @__PURE__ */ jsxRuntime.jsx(reactMapGl.Layer, { ...layerProps });
533
+ });
534
+ CanvasInLayer.displayName = "CanvasInLayer";
535
+ const CanvasOverlay = react.memo(({ map, id, beforeId, ...props }) => {
536
+ const [onRender, setOnRender] = react.useState();
537
+ const render = useFunction((_gl, mx) => {
538
+ if (!onRender)
539
+ return;
540
+ onRender(mx);
541
+ });
542
+ return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
543
+ /* @__PURE__ */ jsxRuntime.jsx(reactMapGl.Layer, { id, beforeId, type: "custom", render }),
544
+ /* @__PURE__ */ jsxRuntime.jsx(
545
+ InitCanvasFC,
546
+ {
547
+ ...props,
548
+ setOnRender,
549
+ map,
550
+ fromLngLat
551
+ }
552
+ )
553
+ ] });
554
+ });
555
+ CanvasInLayer.displayName = "CanvasInLayer";
354
556
  const useMap = useMap$1;
355
557
  exports.Canvas = Canvas;
356
558
  exports.Coordinates = Coordinates;
559
+ exports.NearCoordinates = NearCoordinates;
560
+ exports.coordsToVector3 = coordsToVector3;
357
561
  exports.useMap = useMap;
562
+ exports.vector3ToCoords = vector3ToCoords;