react-babylon-map 0.0.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.
- package/.claude/settings.local.json +78 -0
- package/demo.html +161 -0
- package/dist/cjs/main.js +520 -0
- package/dist/es/main.mjs +20 -0
- package/dist/es/main.mjs.map +1 -0
- package/dist/es/main10.mjs +33 -0
- package/dist/es/main10.mjs.map +1 -0
- package/dist/es/main11.mjs +12 -0
- package/dist/es/main11.mjs.map +1 -0
- package/dist/es/main12.mjs +14 -0
- package/dist/es/main12.mjs.map +1 -0
- package/dist/es/main13.mjs +12 -0
- package/dist/es/main13.mjs.map +1 -0
- package/dist/es/main14.mjs +5 -0
- package/dist/es/main14.mjs.map +1 -0
- package/dist/es/main15.mjs +12 -0
- package/dist/es/main15.mjs.map +1 -0
- package/dist/es/main16.mjs +25 -0
- package/dist/es/main16.mjs.map +1 -0
- package/dist/es/main17.mjs +54 -0
- package/dist/es/main17.mjs.map +1 -0
- package/dist/es/main18.mjs +88 -0
- package/dist/es/main18.mjs.map +1 -0
- package/dist/es/main19.mjs +18 -0
- package/dist/es/main19.mjs.map +1 -0
- package/dist/es/main2.mjs +9 -0
- package/dist/es/main2.mjs.map +1 -0
- package/dist/es/main20.mjs +21 -0
- package/dist/es/main20.mjs.map +1 -0
- package/dist/es/main21.mjs +61 -0
- package/dist/es/main21.mjs.map +1 -0
- package/dist/es/main3.mjs +46 -0
- package/dist/es/main3.mjs.map +1 -0
- package/dist/es/main4.mjs +23 -0
- package/dist/es/main4.mjs.map +1 -0
- package/dist/es/main5.mjs +69 -0
- package/dist/es/main5.mjs.map +1 -0
- package/dist/es/main6.mjs +35 -0
- package/dist/es/main6.mjs.map +1 -0
- package/dist/es/main7.mjs +65 -0
- package/dist/es/main7.mjs.map +1 -0
- package/dist/es/main8.mjs +14 -0
- package/dist/es/main8.mjs.map +1 -0
- package/dist/es/main9.mjs +26 -0
- package/dist/es/main9.mjs.map +1 -0
- package/dist/maplibre/cjs/main.js +520 -0
- package/dist/maplibre/es/main.mjs +20 -0
- package/dist/maplibre/es/main.mjs.map +1 -0
- package/dist/maplibre/es/main10.mjs +33 -0
- package/dist/maplibre/es/main10.mjs.map +1 -0
- package/dist/maplibre/es/main11.mjs +12 -0
- package/dist/maplibre/es/main11.mjs.map +1 -0
- package/dist/maplibre/es/main12.mjs +14 -0
- package/dist/maplibre/es/main12.mjs.map +1 -0
- package/dist/maplibre/es/main13.mjs +12 -0
- package/dist/maplibre/es/main13.mjs.map +1 -0
- package/dist/maplibre/es/main14.mjs +5 -0
- package/dist/maplibre/es/main14.mjs.map +1 -0
- package/dist/maplibre/es/main15.mjs +12 -0
- package/dist/maplibre/es/main15.mjs.map +1 -0
- package/dist/maplibre/es/main16.mjs +25 -0
- package/dist/maplibre/es/main16.mjs.map +1 -0
- package/dist/maplibre/es/main17.mjs +54 -0
- package/dist/maplibre/es/main17.mjs.map +1 -0
- package/dist/maplibre/es/main18.mjs +88 -0
- package/dist/maplibre/es/main18.mjs.map +1 -0
- package/dist/maplibre/es/main19.mjs +18 -0
- package/dist/maplibre/es/main19.mjs.map +1 -0
- package/dist/maplibre/es/main2.mjs +9 -0
- package/dist/maplibre/es/main2.mjs.map +1 -0
- package/dist/maplibre/es/main20.mjs +61 -0
- package/dist/maplibre/es/main20.mjs.map +1 -0
- package/dist/maplibre/es/main21.mjs +21 -0
- package/dist/maplibre/es/main21.mjs.map +1 -0
- package/dist/maplibre/es/main3.mjs +46 -0
- package/dist/maplibre/es/main3.mjs.map +1 -0
- package/dist/maplibre/es/main4.mjs +23 -0
- package/dist/maplibre/es/main4.mjs.map +1 -0
- package/dist/maplibre/es/main5.mjs +69 -0
- package/dist/maplibre/es/main5.mjs.map +1 -0
- package/dist/maplibre/es/main6.mjs +35 -0
- package/dist/maplibre/es/main6.mjs.map +1 -0
- package/dist/maplibre/es/main7.mjs +65 -0
- package/dist/maplibre/es/main7.mjs.map +1 -0
- package/dist/maplibre/es/main8.mjs +14 -0
- package/dist/maplibre/es/main8.mjs.map +1 -0
- package/dist/maplibre/es/main9.mjs +26 -0
- package/dist/maplibre/es/main9.mjs.map +1 -0
- package/dist/maplibre/types/api/canvas-props.d.ts +9 -0
- package/dist/maplibre/types/api/coordinates.d.ts +13 -0
- package/dist/maplibre/types/api/coords-to-vector-3.d.ts +3 -0
- package/dist/maplibre/types/api/coords.d.ts +5 -0
- package/dist/maplibre/types/api/index.d.ts +7 -0
- package/dist/maplibre/types/api/near-coordinates.d.ts +13 -0
- package/dist/maplibre/types/api/use-map.d.ts +3 -0
- package/dist/maplibre/types/api/vector-3-to-coords.d.ts +2 -0
- package/dist/maplibre/types/core/canvas-in-layer/use-canvas-in-layer.d.ts +15 -0
- package/dist/maplibre/types/core/canvas-in-layer/use-render.d.ts +15 -0
- package/dist/maplibre/types/core/canvas-in-layer/use-root.d.ts +11 -0
- package/dist/maplibre/types/core/canvas-overlay/canvas-portal.d.ts +10 -0
- package/dist/maplibre/types/core/canvas-overlay/init-canvas-fc.d.ts +11 -0
- package/dist/maplibre/types/core/canvas-overlay/render.d.ts +1 -0
- package/dist/maplibre/types/core/canvas-overlay/sync-camera-fc.d.ts +12 -0
- package/dist/maplibre/types/core/coords-to-matrix.d.ts +9 -0
- package/dist/maplibre/types/core/earth-radius.d.ts +1 -0
- package/dist/maplibre/types/core/generic-map.d.ts +49 -0
- package/dist/maplibre/types/core/matrix-utils.d.ts +7 -0
- package/dist/maplibre/types/core/sync-camera.d.ts +7 -0
- package/dist/maplibre/types/core/use-babylon-map.d.ts +32 -0
- package/dist/maplibre/types/core/use-coords-to-matrix.d.ts +6 -0
- package/dist/maplibre/types/core/use-coords.d.ts +5 -0
- package/dist/maplibre/types/core/use-function.d.ts +1 -0
- package/dist/maplibre/types/maplibre/canvas.d.ts +4 -0
- package/dist/maplibre/types/maplibre.index.d.ts +4 -0
- package/dist/types/api/canvas-props.d.ts +9 -0
- package/dist/types/api/coordinates.d.ts +13 -0
- package/dist/types/api/coords-to-vector-3.d.ts +3 -0
- package/dist/types/api/coords.d.ts +5 -0
- package/dist/types/api/index.d.ts +7 -0
- package/dist/types/api/near-coordinates.d.ts +13 -0
- package/dist/types/api/use-map.d.ts +3 -0
- package/dist/types/api/vector-3-to-coords.d.ts +2 -0
- package/dist/types/core/canvas-in-layer/use-canvas-in-layer.d.ts +15 -0
- package/dist/types/core/canvas-in-layer/use-render.d.ts +15 -0
- package/dist/types/core/canvas-in-layer/use-root.d.ts +11 -0
- package/dist/types/core/canvas-overlay/canvas-portal.d.ts +10 -0
- package/dist/types/core/canvas-overlay/init-canvas-fc.d.ts +11 -0
- package/dist/types/core/canvas-overlay/render.d.ts +1 -0
- package/dist/types/core/canvas-overlay/sync-camera-fc.d.ts +12 -0
- package/dist/types/core/coords-to-matrix.d.ts +9 -0
- package/dist/types/core/earth-radius.d.ts +1 -0
- package/dist/types/core/generic-map.d.ts +49 -0
- package/dist/types/core/matrix-utils.d.ts +7 -0
- package/dist/types/core/sync-camera.d.ts +7 -0
- package/dist/types/core/use-babylon-map.d.ts +32 -0
- package/dist/types/core/use-coords-to-matrix.d.ts +6 -0
- package/dist/types/core/use-coords.d.ts +5 -0
- package/dist/types/core/use-function.d.ts +1 -0
- package/dist/types/mapbox/canvas.d.ts +4 -0
- package/dist/types/mapbox.index.d.ts +4 -0
- package/package.json +58 -0
- package/plan.md +719 -0
- package/src/api/canvas-props.ts +10 -0
- package/src/api/coordinates.tsx +83 -0
- package/src/api/coords-to-vector-3.ts +39 -0
- package/src/api/coords.tsx +6 -0
- package/src/api/index.ts +7 -0
- package/src/api/near-coordinates.tsx +87 -0
- package/src/api/use-map.ts +8 -0
- package/src/api/vector-3-to-coords.ts +13 -0
- package/src/core/canvas-in-layer/use-canvas-in-layer.tsx +27 -0
- package/src/core/canvas-in-layer/use-render.ts +43 -0
- package/src/core/canvas-in-layer/use-root.tsx +82 -0
- package/src/core/canvas-overlay/canvas-portal.tsx +98 -0
- package/src/core/canvas-overlay/init-canvas-fc.tsx +45 -0
- package/src/core/canvas-overlay/render.tsx +1 -0
- package/src/core/canvas-overlay/sync-camera-fc.tsx +83 -0
- package/src/core/coords-to-matrix.ts +21 -0
- package/src/core/earth-radius.ts +1 -0
- package/src/core/events.ts +55 -0
- package/src/core/generic-map.ts +59 -0
- package/src/core/map-engine.tsx +70 -0
- package/src/core/matrix-utils.ts +22 -0
- package/src/core/sync-camera.ts +29 -0
- package/src/core/use-babylon-map.ts +46 -0
- package/src/core/use-coords-to-matrix.ts +13 -0
- package/src/core/use-coords.tsx +22 -0
- package/src/core/use-function.ts +10 -0
- package/src/mapbox/canvas.tsx +59 -0
- package/src/mapbox.index.ts +7 -0
- package/src/maplibre/canvas.tsx +59 -0
- package/src/maplibre.index.ts +7 -0
- package/src/vite-env.d.ts +1 -0
- package/stories/.ladle/components.tsx +50 -0
- package/stories/.ladle/style.css +63 -0
- package/stories/package.json +31 -0
- package/stories/pnpm-lock.yaml +5450 -0
- package/stories/sandbox.config.json +3 -0
- package/stories/src/adaptive-dpr.tsx +34 -0
- package/stories/src/billboard.stories.tsx +111 -0
- package/stories/src/buildings-3d.stories.tsx +280 -0
- package/stories/src/canvas/mapbox.stories.tsx +113 -0
- package/stories/src/canvas/maplibre.stories.tsx +93 -0
- package/stories/src/comparison.stories.tsx +161 -0
- package/stories/src/extrude/chaillot.ts +8 -0
- package/stories/src/exude-coordinates.stories.tsx +139 -0
- package/stories/src/free-3d-buildings/get-buildings-data.ts +49 -0
- package/stories/src/html-on-top.stories.tsx +156 -0
- package/stories/src/ifc/ifc-to-babylon.ts +97 -0
- package/stories/src/ifc/ifc.main.ts +904 -0
- package/stories/src/ifc/ifc2bb.ts +343 -0
- package/stories/src/ifc/model.ifc +14155 -0
- package/stories/src/ifc.stories.tsx +276 -0
- package/stories/src/mapbox/story-mapbox.tsx +97 -0
- package/stories/src/maplibre/story-maplibre.tsx +36 -0
- package/stories/src/multi-coordinates.stories.tsx +115 -0
- package/stories/src/pivot-controls.stories.tsx +148 -0
- package/stories/src/postprocessing.stories.tsx +125 -0
- package/stories/src/render-on-demand.stories.tsx +76 -0
- package/stories/src/story-map.tsx +44 -0
- package/stories/src/sunlight.stories.tsx +215 -0
- package/stories/src/vite-env.d.ts +1 -0
- package/stories/tsconfig.json +32 -0
- package/stories/tsconfig.node.json +10 -0
- package/stories/vite.config.ts +27 -0
- package/tsconfig.json +31 -0
- package/tsconfig.mapbox.json +7 -0
- package/tsconfig.maplibre.json +7 -0
- package/tsconfig.node.json +10 -0
- package/tsconfig.types.json +25 -0
- package/vite.config.ts +65 -0
package/dist/cjs/main.js
ADDED
|
@@ -0,0 +1,520 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
+
const react = require("react");
|
|
4
|
+
const jsxRuntime = require("react/jsx-runtime");
|
|
5
|
+
const mapboxGl = require("mapbox-gl");
|
|
6
|
+
const mapbox = require("react-map-gl/mapbox");
|
|
7
|
+
const core = require("@babylonjs/core");
|
|
8
|
+
const require$$0 = require("react-dom");
|
|
9
|
+
const BabylonMapContext = react.createContext(null);
|
|
10
|
+
function useBabylonMap() {
|
|
11
|
+
const ctx = react.useContext(BabylonMapContext);
|
|
12
|
+
if (!ctx)
|
|
13
|
+
throw new Error("useBabylonMap must be used inside a <Canvas>");
|
|
14
|
+
return ctx;
|
|
15
|
+
}
|
|
16
|
+
function createBabylonMap(opts) {
|
|
17
|
+
return {
|
|
18
|
+
map: opts.map,
|
|
19
|
+
viewProjMx: new Array(16).fill(0),
|
|
20
|
+
fromLngLat: opts.fromLngLat,
|
|
21
|
+
engine: opts.engine,
|
|
22
|
+
scene: opts.scene
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
const useMap$1 = () => {
|
|
26
|
+
const ctx = useBabylonMap();
|
|
27
|
+
return ctx.map;
|
|
28
|
+
};
|
|
29
|
+
const tmpCameraMx = core.Matrix.Identity();
|
|
30
|
+
const tmpWvpMx = core.Matrix.Identity();
|
|
31
|
+
function syncCamera(camera, origin, mapCamMx) {
|
|
32
|
+
core.Matrix.FromArrayToRef(mapCamMx, 0, tmpCameraMx);
|
|
33
|
+
origin.multiplyToRef(tmpCameraMx, tmpWvpMx);
|
|
34
|
+
camera.freezeProjectionMatrix(tmpWvpMx);
|
|
35
|
+
camera.minZ = 0;
|
|
36
|
+
camera.maxZ = 1e6;
|
|
37
|
+
}
|
|
38
|
+
function coordsToMatrix({
|
|
39
|
+
longitude,
|
|
40
|
+
latitude,
|
|
41
|
+
altitude,
|
|
42
|
+
fromLngLat: fromLngLat2
|
|
43
|
+
}) {
|
|
44
|
+
const center = fromLngLat2([longitude, latitude], altitude);
|
|
45
|
+
const scaleUnit = center.meterInMercatorCoordinateUnits();
|
|
46
|
+
const position = new core.Vector3(center.x, center.y, center.z || 0);
|
|
47
|
+
const scaling = new core.Vector3(scaleUnit, scaleUnit, scaleUnit);
|
|
48
|
+
const rotation = core.Quaternion.FromEulerAngles(Math.PI / 2, 0, 0);
|
|
49
|
+
return core.Matrix.Compose(scaling, rotation, position);
|
|
50
|
+
}
|
|
51
|
+
function useCoordsToMatrix({ latitude, longitude, altitude, fromLngLat: fromLngLat2 }) {
|
|
52
|
+
return react.useMemo(
|
|
53
|
+
() => coordsToMatrix({ latitude, longitude, altitude, fromLngLat: fromLngLat2 }),
|
|
54
|
+
[latitude, longitude, altitude, fromLngLat2]
|
|
55
|
+
);
|
|
56
|
+
}
|
|
57
|
+
const Coordinates = react.memo(({
|
|
58
|
+
latitude,
|
|
59
|
+
longitude,
|
|
60
|
+
altitude = 0,
|
|
61
|
+
children
|
|
62
|
+
}) => {
|
|
63
|
+
const babylonMap = useBabylonMap();
|
|
64
|
+
const origin = useCoordsToMatrix({
|
|
65
|
+
latitude,
|
|
66
|
+
longitude,
|
|
67
|
+
altitude,
|
|
68
|
+
fromLngLat: babylonMap.fromLngLat
|
|
69
|
+
});
|
|
70
|
+
const [subScene] = react.useState(() => {
|
|
71
|
+
if (!babylonMap.engine)
|
|
72
|
+
return null;
|
|
73
|
+
const sub = new core.Scene(babylonMap.engine);
|
|
74
|
+
sub.autoClear = false;
|
|
75
|
+
sub.clearColor = new core.Color4(0, 0, 0, 0);
|
|
76
|
+
return sub;
|
|
77
|
+
});
|
|
78
|
+
const cameraRef = react.useRef(null);
|
|
79
|
+
react.useEffect(() => {
|
|
80
|
+
if (!subScene)
|
|
81
|
+
return;
|
|
82
|
+
const cam = new core.FreeCamera("coordsCam", core.Vector3.Zero(), subScene);
|
|
83
|
+
cam.inputs.clear();
|
|
84
|
+
cam.minZ = 0;
|
|
85
|
+
cameraRef.current = cam;
|
|
86
|
+
const light = new core.HemisphericLight("coordsLight", new core.Vector3(0, 1, 0), subScene);
|
|
87
|
+
light.intensity = 1;
|
|
88
|
+
return () => {
|
|
89
|
+
cam.dispose();
|
|
90
|
+
light.dispose();
|
|
91
|
+
};
|
|
92
|
+
}, [subScene]);
|
|
93
|
+
react.useEffect(() => {
|
|
94
|
+
if (!subScene || !babylonMap.scene)
|
|
95
|
+
return;
|
|
96
|
+
const mainScene = babylonMap.scene;
|
|
97
|
+
const observer = mainScene.onBeforeRenderObservable.add(() => {
|
|
98
|
+
var _a;
|
|
99
|
+
if (!cameraRef.current)
|
|
100
|
+
return;
|
|
101
|
+
syncCamera(cameraRef.current, origin, babylonMap.viewProjMx);
|
|
102
|
+
(_a = babylonMap.engine) == null ? void 0 : _a.wipeCaches(true);
|
|
103
|
+
subScene.render(false);
|
|
104
|
+
});
|
|
105
|
+
return () => {
|
|
106
|
+
mainScene.onBeforeRenderObservable.remove(observer);
|
|
107
|
+
};
|
|
108
|
+
}, [subScene, babylonMap.scene, origin, babylonMap]);
|
|
109
|
+
const childMap = {
|
|
110
|
+
...babylonMap,
|
|
111
|
+
scene: subScene || void 0
|
|
112
|
+
};
|
|
113
|
+
return /* @__PURE__ */ jsxRuntime.jsx(BabylonMapContext.Provider, { value: childMap, children });
|
|
114
|
+
});
|
|
115
|
+
Coordinates.displayName = "Coordinates";
|
|
116
|
+
const earthRadius = 63710088e-1;
|
|
117
|
+
const DEG2RAD$1 = Math.PI / 180;
|
|
118
|
+
const mercatorScaleLookup = {};
|
|
119
|
+
function getMercatorScale(lat) {
|
|
120
|
+
const index = Math.round(lat * 1e3);
|
|
121
|
+
if (mercatorScaleLookup[index] === void 0) {
|
|
122
|
+
mercatorScaleLookup[index] = 1 / Math.cos(lat * DEG2RAD$1);
|
|
123
|
+
}
|
|
124
|
+
return mercatorScaleLookup[index];
|
|
125
|
+
}
|
|
126
|
+
function averageMercatorScale(originLat, pointLat, steps = 10) {
|
|
127
|
+
let totalScale = 0;
|
|
128
|
+
const latStep = (pointLat - originLat) / steps;
|
|
129
|
+
for (let i = 0; i <= steps; i++) {
|
|
130
|
+
const lat = originLat + latStep * i;
|
|
131
|
+
totalScale += getMercatorScale(lat);
|
|
132
|
+
}
|
|
133
|
+
return totalScale / (steps + 1);
|
|
134
|
+
}
|
|
135
|
+
function coordsToVector3(point, origin) {
|
|
136
|
+
const latitudeDiff = (point.latitude - origin.latitude) * DEG2RAD$1;
|
|
137
|
+
const longitudeDiff = (point.longitude - origin.longitude) * DEG2RAD$1;
|
|
138
|
+
const altitudeDiff = (point.altitude || 0) - (origin.altitude || 0);
|
|
139
|
+
const x = longitudeDiff * earthRadius * Math.cos(origin.latitude * DEG2RAD$1);
|
|
140
|
+
const y = altitudeDiff;
|
|
141
|
+
const steps = Math.ceil(Math.abs(point.latitude - origin.latitude)) * 100 + 1;
|
|
142
|
+
const avgScale = averageMercatorScale(origin.latitude, point.latitude, steps);
|
|
143
|
+
const z = -latitudeDiff * earthRadius / getMercatorScale(origin.latitude) * avgScale;
|
|
144
|
+
return [x, y, z];
|
|
145
|
+
}
|
|
146
|
+
function useCoords() {
|
|
147
|
+
const ctx = react.useContext(BabylonMapContext);
|
|
148
|
+
if (!ctx)
|
|
149
|
+
throw new Error("useCoords must be used inside a <Canvas>");
|
|
150
|
+
return ctx.coords;
|
|
151
|
+
}
|
|
152
|
+
const NearCoordinates = react.memo(({ children, ...coords }) => {
|
|
153
|
+
const { latitude, longitude, altitude } = useCoords();
|
|
154
|
+
const babylonMap = useBabylonMap();
|
|
155
|
+
const pos = coordsToVector3(coords, { latitude, longitude, altitude });
|
|
156
|
+
const [subScene] = react.useState(() => {
|
|
157
|
+
if (!babylonMap.engine)
|
|
158
|
+
return null;
|
|
159
|
+
const sub = new core.Scene(babylonMap.engine);
|
|
160
|
+
sub.autoClear = false;
|
|
161
|
+
sub.clearColor = new core.Color4(0, 0, 0, 0);
|
|
162
|
+
return sub;
|
|
163
|
+
});
|
|
164
|
+
const cameraRef = react.useRef(null);
|
|
165
|
+
react.useEffect(() => {
|
|
166
|
+
if (!subScene)
|
|
167
|
+
return;
|
|
168
|
+
const cam = new core.FreeCamera("nearCoordsCam", new core.Vector3(pos[0], pos[1], pos[2]), subScene);
|
|
169
|
+
cam.inputs.clear();
|
|
170
|
+
cam.minZ = 0;
|
|
171
|
+
cameraRef.current = cam;
|
|
172
|
+
const light = new core.HemisphericLight("nearCoordsLight", new core.Vector3(0, 1, 0), subScene);
|
|
173
|
+
light.intensity = 1;
|
|
174
|
+
return () => {
|
|
175
|
+
cam.dispose();
|
|
176
|
+
light.dispose();
|
|
177
|
+
};
|
|
178
|
+
}, [subScene]);
|
|
179
|
+
react.useEffect(() => {
|
|
180
|
+
if (!cameraRef.current)
|
|
181
|
+
return;
|
|
182
|
+
cameraRef.current.position.set(pos[0], pos[1], pos[2]);
|
|
183
|
+
}, [pos]);
|
|
184
|
+
react.useEffect(() => {
|
|
185
|
+
if (!subScene || !babylonMap.scene)
|
|
186
|
+
return;
|
|
187
|
+
const mainScene = babylonMap.scene;
|
|
188
|
+
const observer = mainScene.onBeforeRenderObservable.add(() => {
|
|
189
|
+
var _a;
|
|
190
|
+
if (!cameraRef.current)
|
|
191
|
+
return;
|
|
192
|
+
cameraRef.current.freezeProjectionMatrix(babylonMap.scene.activeCamera.getProjectionMatrix());
|
|
193
|
+
(_a = babylonMap.engine) == null ? void 0 : _a.wipeCaches(true);
|
|
194
|
+
subScene.render(false);
|
|
195
|
+
});
|
|
196
|
+
return () => {
|
|
197
|
+
mainScene.onBeforeRenderObservable.remove(observer);
|
|
198
|
+
};
|
|
199
|
+
}, [subScene, babylonMap.scene, babylonMap]);
|
|
200
|
+
const childMap = {
|
|
201
|
+
...babylonMap,
|
|
202
|
+
scene: subScene || void 0
|
|
203
|
+
};
|
|
204
|
+
return /* @__PURE__ */ jsxRuntime.jsx(BabylonMapContext.Provider, { value: childMap, children });
|
|
205
|
+
});
|
|
206
|
+
NearCoordinates.displayName = "NearCoordinates";
|
|
207
|
+
const DEG2RAD = Math.PI / 180;
|
|
208
|
+
const RAD2DEG = 180 / Math.PI;
|
|
209
|
+
function vector3ToCoords(position, origin) {
|
|
210
|
+
const [x, y, z] = position;
|
|
211
|
+
const latitude = origin.latitude + -z / earthRadius * RAD2DEG;
|
|
212
|
+
const longitude = origin.longitude + x / earthRadius * RAD2DEG / Math.cos(origin.latitude * DEG2RAD);
|
|
213
|
+
const altitude = (origin.altitude || 0) + y;
|
|
214
|
+
return { latitude, longitude, altitude };
|
|
215
|
+
}
|
|
216
|
+
const useFunction = (callback) => {
|
|
217
|
+
const callbackRef = react.useRef(callback);
|
|
218
|
+
callbackRef.current = callback;
|
|
219
|
+
return react.useCallback((...args) => {
|
|
220
|
+
return callbackRef.current(...args);
|
|
221
|
+
}, []);
|
|
222
|
+
};
|
|
223
|
+
function useRender({
|
|
224
|
+
map,
|
|
225
|
+
origin,
|
|
226
|
+
scene,
|
|
227
|
+
camera,
|
|
228
|
+
frameloop,
|
|
229
|
+
babylonMap
|
|
230
|
+
}) {
|
|
231
|
+
const render = useFunction((_gl, projViewMx) => {
|
|
232
|
+
const pVMx = "defaultProjectionData" in projViewMx ? Object.values(projViewMx.defaultProjectionData.mainMatrix) : projViewMx;
|
|
233
|
+
babylonMap.viewProjMx = pVMx;
|
|
234
|
+
syncCamera(camera, origin, pVMx);
|
|
235
|
+
scene.getEngine().wipeCaches(true);
|
|
236
|
+
scene.render(false);
|
|
237
|
+
if (!frameloop || frameloop === "always")
|
|
238
|
+
map.triggerRepaint();
|
|
239
|
+
});
|
|
240
|
+
return render;
|
|
241
|
+
}
|
|
242
|
+
var createRoot;
|
|
243
|
+
var m = require$$0;
|
|
244
|
+
if (process.env.NODE_ENV === "production") {
|
|
245
|
+
createRoot = m.createRoot;
|
|
246
|
+
m.hydrateRoot;
|
|
247
|
+
} else {
|
|
248
|
+
var i = m.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED;
|
|
249
|
+
createRoot = function(c, o) {
|
|
250
|
+
i.usingClientEntryPoint = true;
|
|
251
|
+
try {
|
|
252
|
+
return m.createRoot(c, o);
|
|
253
|
+
} finally {
|
|
254
|
+
i.usingClientEntryPoint = false;
|
|
255
|
+
}
|
|
256
|
+
};
|
|
257
|
+
}
|
|
258
|
+
function useRoot(fromLngLat2, map, { longitude, latitude, altitude, frameloop, ...props }) {
|
|
259
|
+
const [{ engine, scene, camera, reactRoot, babylonMap }] = react.useState(() => {
|
|
260
|
+
const canvas = map.getCanvas();
|
|
261
|
+
const gl = canvas.getContext("webgl2") || canvas.getContext("webgl");
|
|
262
|
+
const engine2 = new core.Engine(
|
|
263
|
+
gl,
|
|
264
|
+
true,
|
|
265
|
+
{ useHighPrecisionMatrix: true },
|
|
266
|
+
true
|
|
267
|
+
);
|
|
268
|
+
const scene2 = new core.Scene(engine2);
|
|
269
|
+
scene2.autoClear = false;
|
|
270
|
+
scene2.clearColor = new core.Color4(0, 0, 0, 0);
|
|
271
|
+
scene2.detachControl();
|
|
272
|
+
const camera2 = new core.FreeCamera("cam", core.Vector3.Zero(), scene2);
|
|
273
|
+
camera2.inputs.clear();
|
|
274
|
+
camera2.minZ = 0;
|
|
275
|
+
const babylonMap2 = createBabylonMap({ map, fromLngLat: fromLngLat2, engine: engine2, scene: scene2 });
|
|
276
|
+
const container = document.createElement("div");
|
|
277
|
+
const reactRoot2 = createRoot(container);
|
|
278
|
+
return { engine: engine2, scene: scene2, camera: camera2, reactRoot: reactRoot2, container, babylonMap: babylonMap2 };
|
|
279
|
+
});
|
|
280
|
+
const onResize = useFunction(() => {
|
|
281
|
+
engine.resize();
|
|
282
|
+
});
|
|
283
|
+
const onRemove = useFunction(() => {
|
|
284
|
+
reactRoot.unmount();
|
|
285
|
+
scene.dispose();
|
|
286
|
+
engine.dispose();
|
|
287
|
+
});
|
|
288
|
+
babylonMap.coords = { longitude, latitude, altitude };
|
|
289
|
+
react.useEffect(() => {
|
|
290
|
+
map.on("resize", onResize);
|
|
291
|
+
return () => {
|
|
292
|
+
map.off("resize", onResize);
|
|
293
|
+
};
|
|
294
|
+
}, []);
|
|
295
|
+
react.useEffect(() => {
|
|
296
|
+
reactRoot.render(
|
|
297
|
+
/* @__PURE__ */ jsxRuntime.jsx(BabylonMapContext.Provider, { value: babylonMap, children: props.children })
|
|
298
|
+
);
|
|
299
|
+
}, [props.children]);
|
|
300
|
+
return { onRemove, engine, scene, camera, babylonMap };
|
|
301
|
+
}
|
|
302
|
+
function useCanvasInLayer(props, fromLngLat2, map) {
|
|
303
|
+
const { latitude, longitude, altitude, frameloop } = props;
|
|
304
|
+
const origin = useCoordsToMatrix({
|
|
305
|
+
latitude,
|
|
306
|
+
longitude,
|
|
307
|
+
altitude,
|
|
308
|
+
fromLngLat: fromLngLat2
|
|
309
|
+
});
|
|
310
|
+
const { onRemove, scene, camera, babylonMap } = useRoot(fromLngLat2, map, props);
|
|
311
|
+
const render = useRender({ origin, frameloop, scene, camera, map, babylonMap });
|
|
312
|
+
return {
|
|
313
|
+
id: props.id,
|
|
314
|
+
beforeId: props.beforeId,
|
|
315
|
+
onRemove,
|
|
316
|
+
render,
|
|
317
|
+
type: "custom",
|
|
318
|
+
renderingMode: "3d"
|
|
319
|
+
};
|
|
320
|
+
}
|
|
321
|
+
const SyncCameraFC = react.memo(({
|
|
322
|
+
latitude,
|
|
323
|
+
longitude,
|
|
324
|
+
altitude = 0,
|
|
325
|
+
setOnRender,
|
|
326
|
+
onReady,
|
|
327
|
+
map,
|
|
328
|
+
canvasRef
|
|
329
|
+
}) => {
|
|
330
|
+
const mapCanvas = map.getCanvas();
|
|
331
|
+
const babylonMap = useBabylonMap();
|
|
332
|
+
const scene = babylonMap.scene;
|
|
333
|
+
const engine = babylonMap.engine;
|
|
334
|
+
const origin = useCoordsToMatrix({ latitude, longitude, altitude, fromLngLat: babylonMap.fromLngLat });
|
|
335
|
+
const ready = react.useRef(false);
|
|
336
|
+
const triggerRepaint = react.useMemo(() => map.triggerRepaint, [map]);
|
|
337
|
+
const mapPaintRequests = react.useRef(0);
|
|
338
|
+
const triggerRepaintOff = useFunction(() => {
|
|
339
|
+
mapPaintRequests.current++;
|
|
340
|
+
});
|
|
341
|
+
const onRender = useFunction((viewProjMx) => {
|
|
342
|
+
map.triggerRepaint = triggerRepaintOff;
|
|
343
|
+
if (canvasRef.current && engine) {
|
|
344
|
+
if (canvasRef.current.width !== mapCanvas.width || canvasRef.current.height !== mapCanvas.height) {
|
|
345
|
+
canvasRef.current.width = mapCanvas.clientWidth * window.devicePixelRatio;
|
|
346
|
+
canvasRef.current.height = mapCanvas.clientHeight * window.devicePixelRatio;
|
|
347
|
+
canvasRef.current.style.width = `${mapCanvas.clientWidth}px`;
|
|
348
|
+
canvasRef.current.style.height = `${mapCanvas.clientHeight}px`;
|
|
349
|
+
engine.resize();
|
|
350
|
+
}
|
|
351
|
+
}
|
|
352
|
+
const pVMx = "defaultProjectionData" in viewProjMx ? Object.values(viewProjMx.defaultProjectionData.mainMatrix) : viewProjMx;
|
|
353
|
+
babylonMap.viewProjMx = pVMx;
|
|
354
|
+
syncCamera(scene.activeCamera, origin, babylonMap.viewProjMx);
|
|
355
|
+
engine.wipeCaches(true);
|
|
356
|
+
scene.render(false);
|
|
357
|
+
if (!ready.current && onReady) {
|
|
358
|
+
ready.current = true;
|
|
359
|
+
onReady();
|
|
360
|
+
}
|
|
361
|
+
map.triggerRepaint = triggerRepaint;
|
|
362
|
+
if (mapPaintRequests.current > 0) {
|
|
363
|
+
mapPaintRequests.current = 0;
|
|
364
|
+
map.triggerRepaint();
|
|
365
|
+
}
|
|
366
|
+
});
|
|
367
|
+
react.useEffect(() => {
|
|
368
|
+
setOnRender && setOnRender(() => onRender);
|
|
369
|
+
}, [setOnRender, onRender]);
|
|
370
|
+
return null;
|
|
371
|
+
});
|
|
372
|
+
SyncCameraFC.displayName = "SyncCameraFC";
|
|
373
|
+
const canvasStyle = {
|
|
374
|
+
position: "absolute",
|
|
375
|
+
top: 0,
|
|
376
|
+
left: 0,
|
|
377
|
+
width: "100%",
|
|
378
|
+
height: "100%",
|
|
379
|
+
pointerEvents: "none"
|
|
380
|
+
};
|
|
381
|
+
const CanvasPortal = react.memo(({
|
|
382
|
+
children,
|
|
383
|
+
latitude,
|
|
384
|
+
longitude,
|
|
385
|
+
altitude,
|
|
386
|
+
setOnRender,
|
|
387
|
+
map,
|
|
388
|
+
fromLngLat: fromLngLat2
|
|
389
|
+
}) => {
|
|
390
|
+
const canvasRef = react.useRef(null);
|
|
391
|
+
const mapCanvas = map.getCanvas();
|
|
392
|
+
const [babylonMap, setBabylonMap] = react.useState(null);
|
|
393
|
+
const [ready, setReady] = react.useState(false);
|
|
394
|
+
react.useEffect(() => {
|
|
395
|
+
const canvas = canvasRef.current;
|
|
396
|
+
const engine = new core.Engine(canvas, true, { preserveDrawingBuffer: true, stencil: true, useHighPrecisionMatrix: true });
|
|
397
|
+
const scene = new core.Scene(engine);
|
|
398
|
+
scene.clearColor = new core.Color4(0, 0, 0, 0);
|
|
399
|
+
const camera = new core.FreeCamera("cam", core.Vector3.Zero(), scene);
|
|
400
|
+
camera.inputs.clear();
|
|
401
|
+
camera.minZ = 0;
|
|
402
|
+
setBabylonMap(createBabylonMap({ map, fromLngLat: fromLngLat2, engine, scene }));
|
|
403
|
+
return () => {
|
|
404
|
+
scene.dispose();
|
|
405
|
+
engine.dispose();
|
|
406
|
+
};
|
|
407
|
+
}, []);
|
|
408
|
+
react.useEffect(() => {
|
|
409
|
+
if (!(babylonMap == null ? void 0 : babylonMap.engine))
|
|
410
|
+
return;
|
|
411
|
+
const engine = babylonMap.engine;
|
|
412
|
+
const onResize = () => {
|
|
413
|
+
const c = canvasRef.current;
|
|
414
|
+
if (!c)
|
|
415
|
+
return;
|
|
416
|
+
c.width = mapCanvas.clientWidth * window.devicePixelRatio;
|
|
417
|
+
c.height = mapCanvas.clientHeight * window.devicePixelRatio;
|
|
418
|
+
c.style.width = `${mapCanvas.clientWidth}px`;
|
|
419
|
+
c.style.height = `${mapCanvas.clientHeight}px`;
|
|
420
|
+
engine.resize();
|
|
421
|
+
};
|
|
422
|
+
onResize();
|
|
423
|
+
map.on("resize", onResize);
|
|
424
|
+
return () => {
|
|
425
|
+
map.off("resize", onResize);
|
|
426
|
+
};
|
|
427
|
+
}, [babylonMap, map, mapCanvas]);
|
|
428
|
+
const onReady = useFunction(() => {
|
|
429
|
+
setReady(true);
|
|
430
|
+
});
|
|
431
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
432
|
+
/* @__PURE__ */ jsxRuntime.jsx("canvas", { ref: canvasRef, style: canvasStyle }),
|
|
433
|
+
babylonMap && /* @__PURE__ */ jsxRuntime.jsxs(BabylonMapContext.Provider, { value: babylonMap, children: [
|
|
434
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
435
|
+
SyncCameraFC,
|
|
436
|
+
{
|
|
437
|
+
latitude,
|
|
438
|
+
longitude,
|
|
439
|
+
altitude,
|
|
440
|
+
setOnRender,
|
|
441
|
+
onReady,
|
|
442
|
+
map,
|
|
443
|
+
canvasRef
|
|
444
|
+
}
|
|
445
|
+
),
|
|
446
|
+
ready && children
|
|
447
|
+
] })
|
|
448
|
+
] });
|
|
449
|
+
});
|
|
450
|
+
CanvasPortal.displayName = "CanvasPortal";
|
|
451
|
+
const InitCanvasFC = react.memo((props) => {
|
|
452
|
+
const canvas = props.map.getCanvas();
|
|
453
|
+
const [el] = react.useState(() => {
|
|
454
|
+
const el2 = document.createElement("div");
|
|
455
|
+
el2.style.position = "absolute";
|
|
456
|
+
el2.style.top = "0";
|
|
457
|
+
el2.style.bottom = "0";
|
|
458
|
+
el2.style.left = "0";
|
|
459
|
+
el2.style.right = "0";
|
|
460
|
+
el2.style.pointerEvents = "none";
|
|
461
|
+
return el2;
|
|
462
|
+
});
|
|
463
|
+
react.useEffect(() => {
|
|
464
|
+
const parent = canvas.parentElement;
|
|
465
|
+
parent.appendChild(el);
|
|
466
|
+
return () => {
|
|
467
|
+
parent.removeChild(el);
|
|
468
|
+
};
|
|
469
|
+
}, []);
|
|
470
|
+
return /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children: require$$0.createPortal(
|
|
471
|
+
/* @__PURE__ */ jsxRuntime.jsx(CanvasPortal, { ...props }),
|
|
472
|
+
el
|
|
473
|
+
) });
|
|
474
|
+
});
|
|
475
|
+
InitCanvasFC.displayName = "InitCanvasFC";
|
|
476
|
+
const fromLngLat = mapboxGl.MercatorCoordinate.fromLngLat;
|
|
477
|
+
const Canvas = react.memo(({ overlay, ...props }) => {
|
|
478
|
+
const map = mapbox.useMap().current.getMap();
|
|
479
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
480
|
+
overlay && /* @__PURE__ */ jsxRuntime.jsx(CanvasOverlay, { map, ...props }),
|
|
481
|
+
!overlay && /* @__PURE__ */ jsxRuntime.jsx(CanvasInLayer, { map, ...props })
|
|
482
|
+
] });
|
|
483
|
+
});
|
|
484
|
+
Canvas.displayName = "Canvas";
|
|
485
|
+
const CanvasInLayer = react.memo(({ map, ...props }) => {
|
|
486
|
+
const layerProps = useCanvasInLayer(props, fromLngLat, map);
|
|
487
|
+
return /* @__PURE__ */ jsxRuntime.jsx(mapbox.Layer, { ...layerProps });
|
|
488
|
+
});
|
|
489
|
+
CanvasInLayer.displayName = "CanvasInLayer";
|
|
490
|
+
const CanvasOverlay = react.memo(({ map, id, beforeId, ...props }) => {
|
|
491
|
+
const [onRender, setOnRender] = react.useState();
|
|
492
|
+
const render = useFunction((_gl, mx) => {
|
|
493
|
+
if (!onRender)
|
|
494
|
+
return;
|
|
495
|
+
onRender(mx);
|
|
496
|
+
});
|
|
497
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
498
|
+
/* @__PURE__ */ jsxRuntime.jsx(mapbox.Layer, { id, beforeId, type: "custom", render }),
|
|
499
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
500
|
+
InitCanvasFC,
|
|
501
|
+
{
|
|
502
|
+
...props,
|
|
503
|
+
setOnRender,
|
|
504
|
+
map,
|
|
505
|
+
fromLngLat
|
|
506
|
+
}
|
|
507
|
+
)
|
|
508
|
+
] });
|
|
509
|
+
});
|
|
510
|
+
CanvasOverlay.displayName = "CanvasOverlay";
|
|
511
|
+
const useMap = useMap$1;
|
|
512
|
+
exports.BabylonMapContext = BabylonMapContext;
|
|
513
|
+
exports.Canvas = Canvas;
|
|
514
|
+
exports.Coordinates = Coordinates;
|
|
515
|
+
exports.NearCoordinates = NearCoordinates;
|
|
516
|
+
exports.averageMercatorScale = averageMercatorScale;
|
|
517
|
+
exports.coordsToVector3 = coordsToVector3;
|
|
518
|
+
exports.useBabylonMap = useBabylonMap;
|
|
519
|
+
exports.useMap = useMap;
|
|
520
|
+
exports.vector3ToCoords = vector3ToCoords;
|
package/dist/es/main.mjs
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { useMap as useMap$1 } from "./main2.mjs";
|
|
2
|
+
import { Canvas } from "./main3.mjs";
|
|
3
|
+
import { BabylonMapContext, useBabylonMap } from "./main4.mjs";
|
|
4
|
+
import { Coordinates } from "./main5.mjs";
|
|
5
|
+
import { averageMercatorScale, coordsToVector3 } from "./main6.mjs";
|
|
6
|
+
import { NearCoordinates } from "./main7.mjs";
|
|
7
|
+
import { vector3ToCoords } from "./main8.mjs";
|
|
8
|
+
const useMap = useMap$1;
|
|
9
|
+
export {
|
|
10
|
+
BabylonMapContext,
|
|
11
|
+
Canvas,
|
|
12
|
+
Coordinates,
|
|
13
|
+
NearCoordinates,
|
|
14
|
+
averageMercatorScale,
|
|
15
|
+
coordsToVector3,
|
|
16
|
+
useBabylonMap,
|
|
17
|
+
useMap,
|
|
18
|
+
vector3ToCoords
|
|
19
|
+
};
|
|
20
|
+
//# sourceMappingURL=main.mjs.map
|
|
@@ -0,0 +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';\nexport * from './mapbox/canvas';\n\nexport const useMap = useMapGeneric<Map>;\n"],"names":["useMapGeneric"],"mappings":";;;;;;;AAMO,MAAM,SAASA;"}
|
|
@@ -0,0 +1,33 @@
|
|
|
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 "./main18.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(
|
|
25
|
+
/* @__PURE__ */ jsx(CanvasPortal, { ...props }),
|
|
26
|
+
el
|
|
27
|
+
) });
|
|
28
|
+
});
|
|
29
|
+
InitCanvasFC.displayName = "InitCanvasFC";
|
|
30
|
+
export {
|
|
31
|
+
InitCanvasFC
|
|
32
|
+
};
|
|
33
|
+
//# sourceMappingURL=main10.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"main10.mjs","sources":["../../src/core/canvas-overlay/init-canvas-fc.tsx"],"sourcesContent":["import { memo, useEffect, useState } from 'react';\nimport { createPortal } from 'react-dom';\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: number[]) => void) => void;\n frameloop?: 'always' | 'demand';\n fromLngLat: FromLngLat;\n}\n\nexport const InitCanvasFC = memo<InitCanvasFCProps>((props) => {\n const canvas = props.map.getCanvas();\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\n return (\n <>\n {createPortal(\n <CanvasPortal {...props} />,\n el,\n )}\n </>\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;AAEL,SAEK,oBAAA,UAAA,EAAA,UAAA;AAAA,IACC,oBAAC,cAAc,EAAA,GAAG,OAAO;AAAA,IACzB;AAAA,EAEJ,EAAA,CAAA;AAEJ,CAAC;AACD,aAAa,cAAc;"}
|
|
@@ -0,0 +1,12 @@
|
|
|
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
|
+
};
|
|
9
|
+
export {
|
|
10
|
+
useFunction
|
|
11
|
+
};
|
|
12
|
+
//# sourceMappingURL=main11.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"main11.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;"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { Matrix } from "@babylonjs/core";
|
|
2
|
+
const tmpCameraMx = Matrix.Identity();
|
|
3
|
+
const tmpWvpMx = Matrix.Identity();
|
|
4
|
+
function syncCamera(camera, origin, mapCamMx) {
|
|
5
|
+
Matrix.FromArrayToRef(mapCamMx, 0, tmpCameraMx);
|
|
6
|
+
origin.multiplyToRef(tmpCameraMx, tmpWvpMx);
|
|
7
|
+
camera.freezeProjectionMatrix(tmpWvpMx);
|
|
8
|
+
camera.minZ = 0;
|
|
9
|
+
camera.maxZ = 1e6;
|
|
10
|
+
}
|
|
11
|
+
export {
|
|
12
|
+
syncCamera
|
|
13
|
+
};
|
|
14
|
+
//# sourceMappingURL=main12.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"main12.mjs","sources":["../../src/core/sync-camera.ts"],"sourcesContent":["import { FreeCamera, Matrix } from '@babylonjs/core';\n\nconst tmpCameraMx = Matrix.Identity();\nconst tmpWvpMx = Matrix.Identity();\n\n/** Synchronise a Babylon camera with the map's view-projection matrix.\n * @param camera The Babylon camera to update.\n * @param origin Babylon world matrix for the Canvas origin.\n * @param mapCamMx Flat array from MapLibre's view-projection (column-major).\n */\nexport function syncCamera(\n camera: FreeCamera,\n origin: Matrix,\n mapCamMx: number[],\n): void {\n\n // Matrix.FromArray reads column-major data (same layout as MapLibre provides)\n Matrix.FromArrayToRef(mapCamMx, 0, tmpCameraMx);\n\n // world-view-projection = origin * camera (same as demo: worldMatrix.multiply(cameraMatrix))\n origin.multiplyToRef(tmpCameraMx, tmpWvpMx);\n\n // Freeze the projection to the composed matrix so Babylon's own\n // projection math is bypassed.\n camera.freezeProjectionMatrix(tmpWvpMx);\n\n camera.minZ = 0;\n camera.maxZ = 1e6;\n}\n"],"names":[],"mappings":";AAEA,MAAM,cAAc,OAAO;AAC3B,MAAM,WAAW,OAAO;AAOR,SAAA,WACd,QACA,QACA,UACM;AAGC,SAAA,eAAe,UAAU,GAAG,WAAW;AAGvC,SAAA,cAAc,aAAa,QAAQ;AAI1C,SAAO,uBAAuB,QAAQ;AAEtC,SAAO,OAAO;AACd,SAAO,OAAO;AAChB;"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { useMemo } from "react";
|
|
2
|
+
import { coordsToMatrix } from "./main19.mjs";
|
|
3
|
+
function useCoordsToMatrix({ latitude, longitude, altitude, fromLngLat }) {
|
|
4
|
+
return useMemo(
|
|
5
|
+
() => coordsToMatrix({ latitude, longitude, altitude, fromLngLat }),
|
|
6
|
+
[latitude, longitude, altitude, fromLngLat]
|
|
7
|
+
);
|
|
8
|
+
}
|
|
9
|
+
export {
|
|
10
|
+
useCoordsToMatrix
|
|
11
|
+
};
|
|
12
|
+
//# sourceMappingURL=main13.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"main13.mjs","sources":["../../src/core/use-coords-to-matrix.ts"],"sourcesContent":["import { useMemo } from 'react';\nimport { Matrix } from '@babylonjs/core';\nimport { coordsToMatrix } from './coords-to-matrix';\n\ntype Props = Parameters<typeof coordsToMatrix>[0];\n\n/** Calculate a Babylon Matrix from coordinates (memoised). */\nexport function useCoordsToMatrix({ latitude, longitude, altitude, fromLngLat }: Props): Matrix {\n return useMemo(\n () => coordsToMatrix({ latitude, longitude, altitude, fromLngLat }),\n [latitude, longitude, altitude, fromLngLat],\n );\n}\n"],"names":[],"mappings":";;AAOO,SAAS,kBAAkB,EAAE,UAAU,WAAW,UAAU,cAA6B;AACvF,SAAA;AAAA,IACL,MAAM,eAAe,EAAE,UAAU,WAAW,UAAU,YAAY;AAAA,IAClE,CAAC,UAAU,WAAW,UAAU,UAAU;AAAA,EAAA;AAE9C;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"main14.mjs","sources":["../../src/core/earth-radius.ts"],"sourcesContent":["export const earthRadius = 6371008.8;\n"],"names":[],"mappings":"AAAO,MAAM,cAAc;"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { useContext } from "react";
|
|
2
|
+
import { BabylonMapContext } from "./main4.mjs";
|
|
3
|
+
function useCoords() {
|
|
4
|
+
const ctx = useContext(BabylonMapContext);
|
|
5
|
+
if (!ctx)
|
|
6
|
+
throw new Error("useCoords must be used inside a <Canvas>");
|
|
7
|
+
return ctx.coords;
|
|
8
|
+
}
|
|
9
|
+
export {
|
|
10
|
+
useCoords
|
|
11
|
+
};
|
|
12
|
+
//# sourceMappingURL=main15.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"main15.mjs","sources":["../../src/core/use-coords.tsx"],"sourcesContent":["import { useContext, useMemo } from 'react';\nimport { Coords } from '../api/coords';\nimport { BabylonMapContext, BabylonMap } from './use-babylon-map';\n\n/** Read the current coordinates from context. */\nexport function useCoords(): Coords {\n const ctx = useContext(BabylonMapContext);\n if (!ctx) throw new Error('useCoords must be used inside a <Canvas>');\n return (ctx as any).coords as Coords; // eslint-disable-line @typescript-eslint/no-explicit-any\n}\n\n/** Update the coordinates stored on the context. */\nexport function useSetCoords({ longitude, latitude, altitude }: Coords) {\n // Coordinates are now stored directly on the BabylonMap context object\n // so downstream hooks can read them.\n useMemo(() => {\n const ctx = (BabylonMapContext as any)._currentValue as BabylonMap | null; // eslint-disable-line @typescript-eslint/no-explicit-any\n if (ctx) {\n (ctx as any).coords = { longitude, latitude, altitude }; // eslint-disable-line @typescript-eslint/no-explicit-any\n }\n }, [longitude, latitude, altitude]);\n}\n"],"names":[],"mappings":";;AAKO,SAAS,YAAoB;AAC5B,QAAA,MAAM,WAAW,iBAAiB;AACxC,MAAI,CAAC;AAAW,UAAA,IAAI,MAAM,0CAA0C;AACpE,SAAQ,IAAY;AACtB;"}
|