terriajs
Version:
Geospatial data visualization platform.
84 lines • 3.73 kB
JavaScript
import { jsx as _jsx } from "react/jsx-runtime";
import { useEffect, useState } from "react";
import { useTranslation } from "react-i18next";
import Cartographic from "terriajs-cesium/Source/Core/Cartographic";
import EllipsoidTerrainProvider from "terriajs-cesium/Source/Core/EllipsoidTerrainProvider";
import sampleTerrainMostDetailed from "terriajs-cesium/Source/Core/sampleTerrainMostDetailed";
import ScreenSpaceEventHandler from "terriajs-cesium/Source/Core/ScreenSpaceEventHandler";
import ScreenSpaceEventType from "terriajs-cesium/Source/Core/ScreenSpaceEventType";
import isDefined from "../../../Core/isDefined";
import MouseTooltip from "./MouseTooltip";
const DropPedestrianToGround = (props) => {
const cesium = props.cesium;
const scene = cesium.scene;
const eventHandler = new ScreenSpaceEventHandler(scene.canvas);
const [t] = useTranslation();
const [showMouseTooltip, setShowMouseTooltip] = useState(true);
useEffect(function setupEventHandlers() {
// Pause feature picking while we select a drop point on the map.
cesium.isFeaturePickingPaused = true;
const dropPedestrian = ({ position: mousePosition }) => {
// Convert mouse position to a point on the globe.
const pickRay = scene.camera.getPickRay(mousePosition);
const pickPosition = isDefined(pickRay)
? scene.globe.pick(pickRay, scene)
: undefined;
if (!pickPosition)
return;
setShowMouseTooltip(false);
// Get the precise position and fly to it.
getPrecisePosition(scene, pickPosition).then((cartographic) => {
cartographic.height += props.pedestrianHeight;
const position = Cartographic.toCartesian(cartographic);
flyTo(scene, position, {
orientation: {
heading: scene.camera.heading,
pitch: 0,
roll: 0
}
}).then(props.afterDrop);
});
};
const onKeyDown = (ev) => {
if (ev.key === "Escape")
props.onDropCancelled();
};
eventHandler.setInputAction(dropPedestrian, ScreenSpaceEventType.LEFT_CLICK);
eventHandler.setInputAction(props.onDropCancelled, ScreenSpaceEventType.RIGHT_CLICK);
document.addEventListener("keydown", onKeyDown);
return () => {
document.removeEventListener("keydown", onKeyDown);
eventHandler.destroy();
cesium.isFeaturePickingPaused = false;
};
});
return showMouseTooltip ? (_jsx(MouseTooltip, { scene: scene, text: t("pedestrianMode.dropPedestrianTooltipMessage") })) : null;
};
async function getPrecisePosition(scene, position) {
const terrainProvider = scene.terrainProvider;
const cartographic = Cartographic.fromCartesian(position);
let preciseCartographic;
if (terrainProvider === undefined ||
terrainProvider instanceof EllipsoidTerrainProvider) {
preciseCartographic = cartographic;
preciseCartographic.height = Math.max(0, preciseCartographic.height);
}
else {
[preciseCartographic] = await sampleTerrainMostDetailed(terrainProvider, [
cartographic
]);
}
return preciseCartographic;
}
async function flyTo(scene, destination, options) {
return new Promise((resolve) => scene.camera.flyTo({
destination,
...options,
complete: () => {
scene.requestRender();
resolve();
}
}));
}
export default DropPedestrianToGround;
//# sourceMappingURL=DropPedestrianToGround.js.map