mirror of https://github.com/CesiumGS/cesium.git
75 lines
1.7 KiB
JavaScript
75 lines
1.7 KiB
JavaScript
import {
|
|
BoundingRectangle,
|
|
Color,
|
|
defined,
|
|
ClearCommand,
|
|
Pass,
|
|
CreditDisplay,
|
|
FrameState,
|
|
JobScheduler,
|
|
PickFramebuffer,
|
|
} from "@cesium/engine";
|
|
|
|
function executeCommands(context, passState, commands) {
|
|
const length = commands.length;
|
|
for (let i = 0; i < length; ++i) {
|
|
commands[i].execute(context, passState);
|
|
}
|
|
}
|
|
|
|
function pick(frameState, primitives, x, y) {
|
|
frameState.commandList.length = 0;
|
|
|
|
const context = frameState.context;
|
|
|
|
const rectangle = new BoundingRectangle(x, y, 1, 1);
|
|
const pickFramebuffer = new PickFramebuffer(context);
|
|
const passState = pickFramebuffer.begin(rectangle);
|
|
|
|
const oldPasses = frameState.passes;
|
|
frameState.passes = new FrameState(
|
|
new CreditDisplay(
|
|
document.createElement("div"),
|
|
undefined,
|
|
document.createElement("div")
|
|
),
|
|
new JobScheduler()
|
|
).passes;
|
|
frameState.passes.pick = true;
|
|
|
|
primitives.update(frameState);
|
|
|
|
const clear = new ClearCommand({
|
|
color: new Color(0.0, 0.0, 0.0, 0.0),
|
|
depth: 1.0,
|
|
stencil: 1.0,
|
|
});
|
|
clear.execute(context, passState);
|
|
|
|
let i;
|
|
const renderCommands = new Array(Pass.NUMBER_OF_PASSES);
|
|
for (i = 0; i < Pass.NUMBER_OF_PASSES; ++i) {
|
|
renderCommands[i] = [];
|
|
}
|
|
|
|
const commands = frameState.commandList;
|
|
const length = commands.length;
|
|
for (i = 0; i < length; i++) {
|
|
const command = commands[i];
|
|
const pass = defined(command.pass) ? command.pass : Pass.OPAQUE;
|
|
renderCommands[pass].push(command);
|
|
}
|
|
|
|
for (i = 0; i < Pass.NUMBER_OF_PASSES; ++i) {
|
|
executeCommands(context, passState, renderCommands[i]);
|
|
}
|
|
|
|
frameState.passes = oldPasses;
|
|
|
|
const p = pickFramebuffer.end(rectangle);
|
|
pickFramebuffer.destroy();
|
|
|
|
return p;
|
|
}
|
|
export default pick;
|