80 lines
2.2 KiB
JavaScript
80 lines
2.2 KiB
JavaScript
define([
|
|
'Core/BoundingRectangle',
|
|
'Core/Color',
|
|
'Core/defined',
|
|
'Renderer/ClearCommand',
|
|
'Renderer/Pass',
|
|
'Scene/CreditDisplay',
|
|
'Scene/FrameState',
|
|
'Scene/JobScheduler',
|
|
'Scene/PickFramebuffer'
|
|
], function(
|
|
BoundingRectangle,
|
|
Color,
|
|
defined,
|
|
ClearCommand,
|
|
Pass,
|
|
CreditDisplay,
|
|
FrameState,
|
|
JobScheduler,
|
|
PickFramebuffer) {
|
|
'use strict';
|
|
|
|
function executeCommands(context, passState, commands) {
|
|
var length = commands.length;
|
|
for (var i = 0; i < length; ++i) {
|
|
commands[i].execute(context, passState);
|
|
}
|
|
}
|
|
|
|
function pick(frameState, primitives, x, y) {
|
|
frameState.commandList.length = 0;
|
|
|
|
var context = frameState.context;
|
|
|
|
var rectangle = new BoundingRectangle(x, y, 1, 1);
|
|
var pickFramebuffer = new PickFramebuffer(context);
|
|
var passState = pickFramebuffer.begin(rectangle);
|
|
|
|
var 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);
|
|
|
|
var clear = new ClearCommand({
|
|
color : new Color(0.0, 0.0, 0.0, 0.0),
|
|
depth : 1.0,
|
|
stencil : 1.0
|
|
});
|
|
clear.execute(context, passState);
|
|
|
|
var i;
|
|
var renderCommands = new Array(Pass.NUMBER_OF_PASSES);
|
|
for (i = 0; i < Pass.NUMBER_OF_PASSES; ++i) {
|
|
renderCommands[i] = [];
|
|
}
|
|
|
|
var commands = frameState.commandList;
|
|
var length = commands.length;
|
|
for (i = 0; i < length; i++) {
|
|
var command = commands[i];
|
|
var 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;
|
|
|
|
var p = pickFramebuffer.end(rectangle);
|
|
pickFramebuffer.destroy();
|
|
|
|
return p;
|
|
}
|
|
|
|
return pick;
|
|
});
|