refactor cam stock visualization

This commit is contained in:
Stewart Allen 2020-11-14 11:12:12 -05:00
commit 8a1118d6c1
12 changed files with 253 additions and 189 deletions

View file

@ -9,16 +9,35 @@
CAM = KIRI.driver.CAM,
PRO = CAM.process,
newPolygon = BASE.newPolygon,
newPoint = BASE.newPoint;
newPoint = BASE.newPoint,
isArrange,
isCamMode,
camStock,
API, SPACE, MODES, VIEWS, UI, UC;
CAM.init = function(kiri, api) {
// console.log({kiri,api})
SPACE = api.const.SPACE;
MODES = api.const.MODES;
VIEWS = api.const.VIEWS;
UI = api.ui;
UC = api.uc;
API = api;
api.event.on("mode.set", (mode) => {
const isCAM = mode === 'CAM';
$('set-tools').style.display = isCAM ? '' : 'none';
kiri.space.platform.setColor(isCAM ? 0xeeeeee : 0xcccccc);
isCamMode = mode === 'CAM';
$('set-tools').style.display = isCamMode ? '' : 'none';
kiri.space.platform.setColor(isCamMode ? 0xeeeeee : 0xcccccc);
updateStock(undefined, 'internal');
});
api.event.on("view.set", (mode) => {
isArrange = (mode === VIEWS.ARRANGE);
});
api.event.on("settings.saved", (settings) => {
const proc = settings.process;
// show/hide dots in enabled process pop buttons
api.ui.camTabs.marker.style.display = proc.camTabsOn ? 'flex' : 'none';
api.ui.camRough.marker.style.display = proc.camRoughOn ? 'flex' : 'none';
api.ui.camDrill.marker.style.display =
@ -26,32 +45,142 @@
api.ui.camOutline.marker.style.display = proc.camOutlineOn ? 'flex' : 'none';
api.ui.camContour.marker.style.display =
proc.camContourXOn || proc.camContourYOn ? 'flex' : 'none';
updateStock(settings, 'settings.saved.internal');
});
function updateStock() {
const STACKS = api.const.STACKS;
const SPACE = api.const.SPACE;
const stock = api.conf.get().stock;
const {x, y, z} = stock;
if (x && y && z) {
const render = new KIRI.Render().setLayer('bounds', { face: 0xaaaaaa, line: 0xaaaaaa }, true);
const stack = STACKS.create('bounds', SPACE.platform.world);
stack.add(render.addPolys([
newPolygon().centerRectangle({x:0, y:0, z:0}, x, y),
newPolygon().centerRectangle({x:0, y:0, z}, x, y)
], { thin: true } ));
const hx = x/2, hy = y/2;
stack.add(render.addLines([
newPoint( hx, -hy, 0), newPoint( hx, -hy, stock.z),
newPoint( hx, hy, 0), newPoint( hx, hy, stock.z),
newPoint(-hx, -hy, 0), newPoint(-hx, -hy, stock.z),
newPoint(-hx, hy, 0), newPoint(-hx, hy, stock.z),
], { thin: true }));
}
}
api.event.on("slice.end", updateStock);
api.event.on("preview.end", updateStock);
api.event.on([
"init-done",
// update stock when modes change?
"slice.end",
"preview.end",
// update stock when preferences change
// "boolean.click",
"boolean.update",
// update stock when objects move
"platform.layout",
"selection.drag",
"selection.move",
// force bounds update, too
"selection.scale",
"selection.rotate"
], updateStock);
};
function updateStock(args, event) {
const SPACE = API.const.SPACE;
if (!isCamMode) {
if (camStock) {
SPACE.platform.remove(camStock);
camStock = null;
}
return;
}
const STACKS = API.const.STACKS;
const refresh = (event === "selection.scale" || event === 'selection.rotate');
let settings = API.conf.get();
let widgets = API.widgets.all();
let proc = settings.process;
let enabled = UI.camStockOn.checked;
let offset = UI.camStockOffset.checked;
let stockSet = offset || (proc.camStockX && proc.camStockY && proc.camStockZ > 0);
let scale = API.view.unit_scale();
let topZ = API.platform.top_z();
let delta = 0;
let csox = 0;
let csoy = 0;
let stock = settings.stock = { };
// create/inject cam stock if stock size other than default
if (enabled && stockSet && widgets.length) {
// UI.stock.style.display = offset ? 'inline-block' : 'none';
let csx = proc.camStockX * scale;
let csy = proc.camStockY * scale;
let csz = proc.camStockZ * scale;
if (offset) {
let min = { x: Infinity, y: Infinity, z: 0 };
let max = { x: -Infinity, y: -Infinity, z: -Infinity };
widgets.forEach(function(widget) {
let wbnd = widget.getBoundingBox(refresh);
let wpos = widget.track.pos;
min = {
x: Math.min(min.x, wpos.x + wbnd.min.x),
y: Math.min(min.y, wpos.y + wbnd.min.y),
z: 0
};
max = {
x: Math.max(max.x, wpos.x + wbnd.max.x),
y: Math.max(max.y, wpos.y + wbnd.max.y),
z: Math.max(max.z, wbnd.max.z)
};
});
csx += max.x - min.x;
csy += max.y - min.y;
csz += max.z - min.z;
csox = min.x + ((max.x - min.x) / 2);
csoy = min.y + ((max.y - min.y) / 2);
}
if (!camStock) {
let geo = new THREE.BoxGeometry(1, 1, 1);
let mat = new THREE.MeshBasicMaterial({
color: 0x777777,
opacity: 0.2,
transparent: true,
side:THREE.DoubleSide
});
camStock = new THREE.Mesh(geo, mat);
camStock.renderOrder = 2;
SPACE.platform.add(camStock);
}
stock = settings.stock = {
x: csx,
y: csy,
z: csz,
center: {
x: csox,
y: csoy,
z: csz / 2
}
};
camStock.scale.x = csx + 0.005;
camStock.scale.y = csy + 0.005;
camStock.scale.z = csz + 0.005;
camStock.position.x = csox;
camStock.position.y = csoy;
camStock.position.z = csz / 2;
delta = csz - topZ;
} else if (camStock) {
SPACE.platform.remove(camStock);
camStock = null;
delta = 0;
}
if (isArrange) {
STACKS.clear();
}
const {x, y, z} = stock;
if (x && y && z) {
const render = new KIRI.Render().setLayer('bounds', { face: 0xaaaaaa, line: 0xaaaaaa });
const stack = STACKS.create('bounds', SPACE.platform.world);
stack.add(render.addPolys([
newPolygon().centerRectangle({x:csox, y:csoy, z:0}, x, y),
newPolygon().centerRectangle({x:csox, y:csoy, z}, x, y)
], { thin: true } ));
const hx = x/2, hy = y/2;
stack.add(render.addLines([
newPoint(csox + hx, csoy - hy, 0), newPoint(csox + hx, csoy - hy, stock.z),
newPoint(csox + hx, csoy + hy, 0), newPoint(csox + hx, csoy + hy, stock.z),
newPoint(csox - hx, csoy - hy, 0), newPoint(csox - hx, csoy - hy, stock.z),
newPoint(csox - hx, csoy + hy, 0), newPoint(csox - hx, csoy + hy, stock.z),
], { thin: true }));
}
API.platform.update_top_z(delta);
API.platform.update_origin();
SPACE.update();
}
})();