vega-scenegraph
Version:
Vega scenegraph and renderers.
60 lines (46 loc) • 1.27 kB
JavaScript
function compare(a, b) {
return a.zindex - b.zindex || a.index - b.index;
}
export function zorder(scene) {
if (!scene.zdirty) return scene.zitems;
var items = scene.items,
output = [], item, i, n;
for (i=0, n=items.length; i<n; ++i) {
item = items[i];
item.index = i;
if (item.zindex) output.push(item);
}
scene.zdirty = false;
return scene.zitems = output.sort(compare);
}
export function visit(scene, visitor) {
var items = scene.items, i, n;
if (!items || !items.length) return;
const zitems = zorder(scene);
if (zitems && zitems.length) {
for (i=0, n=items.length; i<n; ++i) {
if (!items[i].zindex) visitor(items[i]);
}
items = zitems;
}
for (i=0, n=items.length; i<n; ++i) {
visitor(items[i]);
}
}
export function pickVisit(scene, visitor) {
var items = scene.items, hit, i;
if (!items || !items.length) return null;
const zitems = zorder(scene);
if (zitems && zitems.length) items = zitems;
for (i=items.length; --i >= 0;) {
if (hit = visitor(items[i])) return hit;
}
if (items === zitems) {
for (items=scene.items, i=items.length; --i >= 0;) {
if (!items[i].zindex) {
if (hit = visitor(items[i])) return hit;
}
}
}
return null;
}