cesium/Specs/pick.js

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;