rm dead code. clean up slicing path marginally. bug fix belt support render
This commit is contained in:
parent
9aae90880c
commit
9d6e4a6512
6 changed files with 59 additions and 65 deletions
|
|
@ -132,6 +132,7 @@ FDM.init = function(kiri, api) {
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
api.event.on("function.animate", (mode) => {
|
api.event.on("function.animate", (mode) => {
|
||||||
if (!(isFdmMode && lastView === VIEWS.PREVIEW)) {
|
if (!(isFdmMode && lastView === VIEWS.PREVIEW)) {
|
||||||
return;
|
return;
|
||||||
|
|
@ -145,6 +146,7 @@ FDM.init = function(kiri, api) {
|
||||||
$('anim-slider').value = 500;
|
$('anim-slider').value = 500;
|
||||||
api.const.STACKS.setFraction(0.5);
|
api.const.STACKS.setFraction(0.5);
|
||||||
});
|
});
|
||||||
|
|
||||||
api.event.on("mode.set", mode => {
|
api.event.on("mode.set", mode => {
|
||||||
isFdmMode = mode === 'FDM';
|
isFdmMode = mode === 'FDM';
|
||||||
lastMode = mode;
|
lastMode = mode;
|
||||||
|
|
@ -152,12 +154,13 @@ FDM.init = function(kiri, api) {
|
||||||
for (let el of [...document.getElementsByClassName('mode-fdm')]) {
|
for (let el of [...document.getElementsByClassName('mode-fdm')]) {
|
||||||
api.uc.setClass(el, 'hide', !isFdmMode);
|
api.uc.setClass(el, 'hide', !isFdmMode);
|
||||||
}
|
}
|
||||||
updateVisiblity();
|
updateSupportVisiblity();
|
||||||
});
|
});
|
||||||
|
|
||||||
api.event.on("view.set", view => {
|
api.event.on("view.set", view => {
|
||||||
$('top-slider').style.display = 'none';
|
$('top-slider').style.display = 'none';
|
||||||
lastView = view;
|
lastView = view;
|
||||||
updateVisiblity();
|
updateSupportVisiblity();
|
||||||
filterSynth();
|
filterSynth();
|
||||||
func.sdone();
|
func.sdone();
|
||||||
// let ranges = api.conf.get().process.ranges;
|
// let ranges = api.conf.get().process.ranges;
|
||||||
|
|
@ -175,27 +178,28 @@ FDM.init = function(kiri, api) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
api.event.on("range.updates", updateRanges);
|
api.event.on("range.updates", updateRanges);
|
||||||
|
|
||||||
api.event.on("settings.load", (settings) => {
|
api.event.on("settings.load", (settings) => {
|
||||||
if (settings.mode !== 'FDM') return;
|
if (settings.mode !== 'FDM') return;
|
||||||
restoreSupports(api.widgets.all());
|
restoreSupports(api.widgets.all());
|
||||||
updateRanges(settings.process.ranges);
|
updateRanges(settings.process.ranges);
|
||||||
});
|
});
|
||||||
|
|
||||||
api.event.on("settings.saved", (settings) => {
|
api.event.on("settings.saved", (settings) => {
|
||||||
updateRanges(settings.process.ranges);
|
updateRanges(settings.process.ranges);
|
||||||
});
|
});
|
||||||
|
|
||||||
api.event.on("button.click", target => {
|
api.event.on("button.click", target => {
|
||||||
switch (target) {
|
switch (target) {
|
||||||
case api.ui.ssaGen: return func.sgen();
|
case api.ui.ssaGen: return func.sgen();
|
||||||
case api.ui.ssmAdd: return func.sadd();
|
case api.ui.ssmAdd: return func.sadd();
|
||||||
case api.ui.ssmDun: return func.sdone();
|
case api.ui.ssmDun: return func.sdone();
|
||||||
case api.ui.ssmClr:
|
case api.ui.ssmClr: return func.sclear();
|
||||||
// return api.uc.confirm("clear supports?").then(ok => {
|
|
||||||
// if (ok) func.sclear();
|
|
||||||
// });
|
|
||||||
func.sclear();
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
api.event.on("fdm.supports.detect", func.sgen = () => {
|
api.event.on("fdm.supports.detect", func.sgen = () => {
|
||||||
let alerts = [];
|
let alerts = [];
|
||||||
let { process, device } = api.conf.get();
|
let { process, device } = api.conf.get();
|
||||||
|
|
@ -232,10 +236,12 @@ FDM.init = function(kiri, api) {
|
||||||
api.event.emit("fdm.supports.detected");
|
api.event.emit("fdm.supports.detected");
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
api.event.on("fdm.supports.add", func.sadd = () => {
|
api.event.on("fdm.supports.add", func.sadd = () => {
|
||||||
alert = api.show.alert("[esc] key cancels support editing");
|
alert = api.show.alert("[esc] key cancels support editing");
|
||||||
api.feature.hover = addingSupports = true;
|
api.feature.hover = addingSupports = true;
|
||||||
});
|
});
|
||||||
|
|
||||||
api.event.on("fdm.supports.done", func.sdone = () => {
|
api.event.on("fdm.supports.done", func.sdone = () => {
|
||||||
delbox('intZ');
|
delbox('intZ');
|
||||||
delbox('intW');
|
delbox('intW');
|
||||||
|
|
@ -244,22 +250,22 @@ FDM.init = function(kiri, api) {
|
||||||
api.feature.hover = addingSupports = false;
|
api.feature.hover = addingSupports = false;
|
||||||
fromPillar = undefined;
|
fromPillar = undefined;
|
||||||
});
|
});
|
||||||
|
|
||||||
api.event.on("fdm.supports.clear", func.sclear = () => {
|
api.event.on("fdm.supports.clear", func.sclear = () => {
|
||||||
func.sdone();
|
func.sdone();
|
||||||
if (clearAllWidgetSupports()) {
|
if (clearAllWidgetSupports()) {
|
||||||
api.conf.save();
|
api.conf.save();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
api.event.on("slice.begin", () => {
|
api.event.on("slice.begin", () => {
|
||||||
if (!isFdmMode) {
|
if (!isFdmMode) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
func.sdone();
|
func.sdone();
|
||||||
updateVisiblity();
|
updateSupportVisiblity();
|
||||||
|
|
||||||
// synth support widget for each widget group
|
// synth support widget for each widget group
|
||||||
// iow, create support meshes based on support widget annotation
|
// iow, create support meshes based on support widget annotation
|
||||||
let synth = [];
|
|
||||||
for (let group of kiri.Widget.Groups.list()) {
|
for (let group of kiri.Widget.Groups.list()) {
|
||||||
let merge = group.filter(w => w.sups).map(w => Object.values(w.sups)).flat();
|
let merge = group.filter(w => w.sups).map(w => Object.values(w.sups)).flat();
|
||||||
if (!merge.length) {
|
if (!merge.length) {
|
||||||
|
|
@ -285,27 +291,32 @@ FDM.init = function(kiri, api) {
|
||||||
kiri.space.world.add(sw.mesh);
|
kiri.space.world.add(sw.mesh);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
api.event.on("slice.end", () => {
|
api.event.on("slice.end", () => {
|
||||||
if (!isFdmMode) {
|
if (!isFdmMode) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
api.event.on("key.esc", () => {
|
api.event.on("key.esc", () => {
|
||||||
if (isFdmMode) {
|
if (isFdmMode) {
|
||||||
func.sdone()
|
func.sdone()
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
api.event.on("selection.scale", () => {
|
api.event.on("selection.scale", () => {
|
||||||
if (isFdmMode) {
|
if (isFdmMode) {
|
||||||
clearRanges();
|
clearRanges();
|
||||||
func.sclear();
|
func.sclear();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
api.event.on("widget.delete", widget => {
|
api.event.on("widget.delete", widget => {
|
||||||
if (isFdmMode) {
|
if (isFdmMode) {
|
||||||
clearRanges();
|
clearRanges();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
api.event.on("widget.duplicate", (widget, oldwidget) => {
|
api.event.on("widget.duplicate", (widget, oldwidget) => {
|
||||||
if (!isFdmMode) {
|
if (!isFdmMode) {
|
||||||
return;
|
return;
|
||||||
|
|
@ -318,6 +329,7 @@ FDM.init = function(kiri, api) {
|
||||||
restoreSupports([widget]);
|
restoreSupports([widget]);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
api.event.on("widget.mirror", widget => {
|
api.event.on("widget.mirror", widget => {
|
||||||
if (!isFdmMode) {
|
if (!isFdmMode) {
|
||||||
return;
|
return;
|
||||||
|
|
@ -329,6 +341,7 @@ FDM.init = function(kiri, api) {
|
||||||
wsup.box.position.x = wsup.x = sup.x = -sup.x;
|
wsup.box.position.x = wsup.x = sup.x = -sup.x;
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
api.event.on("widget.rotate", rot => {
|
api.event.on("widget.rotate", rot => {
|
||||||
if (!isFdmMode) {
|
if (!isFdmMode) {
|
||||||
return;
|
return;
|
||||||
|
|
@ -351,6 +364,7 @@ FDM.init = function(kiri, api) {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
api.event.on("mouse.hover.up", func.hoverup = (on = {}) => {
|
api.event.on("mouse.hover.up", func.hoverup = (on = {}) => {
|
||||||
let { event } = on;
|
let { event } = on;
|
||||||
if (!isFdmMode) {
|
if (!isFdmMode) {
|
||||||
|
|
@ -405,6 +419,7 @@ FDM.init = function(kiri, api) {
|
||||||
fromPillar = addWidgetSupport(iw, rec);
|
fromPillar = addWidgetSupport(iw, rec);
|
||||||
api.conf.save();
|
api.conf.save();
|
||||||
});
|
});
|
||||||
|
|
||||||
function addSupportAtPoint(targets, point, ip, angle, id) {
|
function addSupportAtPoint(targets, point, ip, angle, id) {
|
||||||
let up = new Vector3(0,1,0)
|
let up = new Vector3(0,1,0)
|
||||||
let dn = new Vector3(0,-1,0)
|
let dn = new Vector3(0,-1,0)
|
||||||
|
|
@ -432,6 +447,7 @@ FDM.init = function(kiri, api) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
api.event.on("mouse.hover", data => {
|
api.event.on("mouse.hover", data => {
|
||||||
if (!isFdmMode) {
|
if (!isFdmMode) {
|
||||||
return;
|
return;
|
||||||
|
|
@ -489,6 +505,7 @@ FDM.init = function(kiri, api) {
|
||||||
return func.hoverup();
|
return func.hoverup();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
api.event.on("export.debug", msg => {
|
api.event.on("export.debug", msg => {
|
||||||
if (msg.arcQ && msg.arcQ.length > 2) {
|
if (msg.arcQ && msg.arcQ.length > 2) {
|
||||||
if (xpdebug) {
|
if (xpdebug) {
|
||||||
|
|
@ -539,17 +556,6 @@ function scheduleSupportSave(widget) {
|
||||||
}, 50);
|
}, 50);
|
||||||
}
|
}
|
||||||
|
|
||||||
function activeSupports() {
|
|
||||||
const active = [];
|
|
||||||
api.widgets.all().forEach(widget => {
|
|
||||||
Object.values(widget.sups || {}).forEach(support => {
|
|
||||||
active.push(support.box);
|
|
||||||
support.box.support = true;
|
|
||||||
});
|
|
||||||
});
|
|
||||||
return active;
|
|
||||||
}
|
|
||||||
|
|
||||||
function restoreSupports(widgets) {
|
function restoreSupports(widgets) {
|
||||||
widgets.forEach(widget => {
|
widgets.forEach(widget => {
|
||||||
const supports = api.widgets.annotate(widget.id).support || [];
|
const supports = api.widgets.annotate(widget.id).support || [];
|
||||||
|
|
@ -594,10 +600,11 @@ function removeWidgetSupport(widget, rec) {
|
||||||
fromPillar = undefined;
|
fromPillar = undefined;
|
||||||
}
|
}
|
||||||
|
|
||||||
function updateVisiblity() {
|
function updateSupportVisiblity() {
|
||||||
api.widgets.all().forEach(w => {
|
const visible = (lastMode === 'FDM' && lastView === VIEWS.ARRANGE);
|
||||||
setSupportVisiblity(w, lastMode === 'FDM' && lastView === VIEWS.ARRANGE);
|
for (let w of api.widgets.all()) {
|
||||||
});
|
setSupportVisiblity(w, visible);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function setSupportVisiblity(widget, bool) {
|
function setSupportVisiblity(widget, bool) {
|
||||||
|
|
|
||||||
|
|
@ -302,21 +302,7 @@ kiri.worker = {
|
||||||
|
|
||||||
// widget sync
|
// widget sync
|
||||||
sync(data, send) {
|
sync(data, send) {
|
||||||
if (data.valid) {
|
// ensure each widget belongs to at least one group
|
||||||
// remove widgets not present in valid list
|
|
||||||
for (let key in wcache) {
|
|
||||||
if (data.valid.indexOf(key) < 0) {
|
|
||||||
delete wcache[key];
|
|
||||||
for (let [id,group] of Object.entries(wgroup)) {
|
|
||||||
wgroup[id] = group = group.filter(v => v.id !== key);
|
|
||||||
group.id = id;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
send.done(data.id);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
let group = wgroup[data.group];
|
let group = wgroup[data.group];
|
||||||
if (!group) {
|
if (!group) {
|
||||||
group = [];
|
group = [];
|
||||||
|
|
@ -380,13 +366,14 @@ kiri.worker = {
|
||||||
for (let w of group) {
|
for (let w of group) {
|
||||||
w.moveMesh(0, miny, 0);
|
w.moveMesh(0, miny, 0);
|
||||||
}
|
}
|
||||||
|
// rotating the root of the group rotates all widgets in the group
|
||||||
widget.rotate(rotation, 0, 0, true, false);
|
widget.rotate(rotation, 0, 0, true, false);
|
||||||
let minr = gmin(group);
|
|
||||||
widget.belt = {
|
widget.belt = {
|
||||||
angle: 45,
|
angle: 45,
|
||||||
|
// used during prepare
|
||||||
xpos,
|
xpos,
|
||||||
ypos,
|
ypos,
|
||||||
yadd: minr.maxy - minr.miny,
|
// used during slice
|
||||||
dy: - miny - yoff,
|
dy: - miny - yoff,
|
||||||
dz: 0
|
dz: 0
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -155,12 +155,10 @@ const client = exports({
|
||||||
},
|
},
|
||||||
|
|
||||||
// widget sync
|
// widget sync
|
||||||
sync(widgets, copy) {
|
sync(widgets) {
|
||||||
if (!widgets) {
|
if (!widgets) {
|
||||||
widgets = kiri.api.widgets.all();
|
widgets = kiri.api.widgets.all();
|
||||||
}
|
}
|
||||||
// send list of currently valid widgets
|
|
||||||
send("sync", { valid: widgets.map(w => w.id) }, () => {});
|
|
||||||
// sync any widget that has changed
|
// sync any widget that has changed
|
||||||
for (let widget of widgets.filter(w => w.modified || !syncd[w.id])) {
|
for (let widget of widgets.filter(w => w.modified || !syncd[w.id])) {
|
||||||
syncd[widget.id] = true;
|
syncd[widget.id] = true;
|
||||||
|
|
@ -170,7 +168,7 @@ const client = exports({
|
||||||
meta: widget.meta,
|
meta: widget.meta,
|
||||||
group: widget.group.id,
|
group: widget.group.id,
|
||||||
track: widget.track,
|
track: widget.track,
|
||||||
vertices: copy ? vertices.slice() : vertices,
|
vertices,
|
||||||
position: widget.mesh.position,
|
position: widget.mesh.position,
|
||||||
}, done => {
|
}, done => {
|
||||||
widget.modified = false;
|
widget.modified = false;
|
||||||
|
|
|
||||||
|
|
@ -72,7 +72,6 @@ function prepareSlices(callback, scale = 1, offset = 0) {
|
||||||
|
|
||||||
// refresh widget list because 'slice.begin' may generate support widgets
|
// refresh widget list because 'slice.begin' may generate support widgets
|
||||||
const slicing = api.widgets.all()
|
const slicing = api.widgets.all()
|
||||||
.slice()
|
|
||||||
.filter(w => !w.track.ignore && !w.meta.disabled);
|
.filter(w => !w.track.ignore && !w.meta.disabled);
|
||||||
|
|
||||||
if (slicing.length === 0) {
|
if (slicing.length === 0) {
|
||||||
|
|
@ -117,17 +116,13 @@ function prepareSlices(callback, scale = 1, offset = 0) {
|
||||||
process.beltAnchor = process.firstLayerBeltLead;
|
process.beltAnchor = process.firstLayerBeltLead;
|
||||||
}
|
}
|
||||||
|
|
||||||
stacks.clear();
|
stacks.clear(); // clear rendered stacks
|
||||||
|
client.clear(); // clear worker cache
|
||||||
|
client.sync(); // send fresh widget data to worker
|
||||||
|
|
||||||
if (isBelt) {
|
if (isBelt) {
|
||||||
// clearing cache causes data to be re-sent to worker
|
|
||||||
client.clear();
|
|
||||||
// we send copies of vertices in belt mode only (possibly obsolete?)
|
|
||||||
client.sync(undefined, true);
|
|
||||||
// belt op required to rotate meshes for slicing
|
// belt op required to rotate meshes for slicing
|
||||||
client.rotate(settings);
|
client.rotate(settings);
|
||||||
} else {
|
|
||||||
// send updated vertices if widget has been rotated/scaled
|
|
||||||
client.sync();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function sliceNext() {
|
function sliceNext() {
|
||||||
|
|
@ -141,12 +136,9 @@ function prepareSlices(callback, scale = 1, offset = 0) {
|
||||||
}
|
}
|
||||||
|
|
||||||
function sliceWidget(widget) {
|
function sliceWidget(widget) {
|
||||||
widget.stack = stacks.create(widget.id, widget.mesh);
|
// weight each widget progress % by their # vertices
|
||||||
let factor = (widget.getVertices().count / defvert);
|
let factor = (widget.getVertices().count / defvert);
|
||||||
|
|
||||||
// compensate for zcut (widget moved through floor)
|
|
||||||
widget.stack.obj.view.position.z = widget.track.zcut || 0;
|
|
||||||
|
|
||||||
widget.slice(settings, (sliced, error) => {
|
widget.slice(settings, (sliced, error) => {
|
||||||
let mark = Date.now();
|
let mark = Date.now();
|
||||||
// update UI info
|
// update UI info
|
||||||
|
|
@ -229,8 +221,6 @@ function prepareSlices(callback, scale = 1, offset = 0) {
|
||||||
if (scale === 1) {
|
if (scale === 1) {
|
||||||
show.progress(0);
|
show.progress(0);
|
||||||
}
|
}
|
||||||
// cause visuals to update
|
|
||||||
space.scene.active();
|
|
||||||
// mark slicing complete for prep/preview
|
// mark slicing complete for prep/preview
|
||||||
complete.slice = true;
|
complete.slice = true;
|
||||||
event.emit('slice.end', settings.mode);
|
event.emit('slice.end', settings.mode);
|
||||||
|
|
@ -240,9 +230,16 @@ function prepareSlices(callback, scale = 1, offset = 0) {
|
||||||
if (callback && typeof callback === 'function') {
|
if (callback && typeof callback === 'function') {
|
||||||
callback();
|
callback();
|
||||||
}
|
}
|
||||||
|
if (isBelt) {
|
||||||
|
// required to render supports properly (in belt mode)
|
||||||
|
// because this updates widget top z which is affected by rotation
|
||||||
|
api.platform.update_top_z();
|
||||||
|
}
|
||||||
|
// refresh / repaint workspace
|
||||||
|
space.refresh();
|
||||||
}
|
}
|
||||||
|
|
||||||
// kick of slicing chain
|
// kick off slicing chain
|
||||||
sliceNext();
|
sliceNext();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -742,6 +742,10 @@ class Widget {
|
||||||
onupdate(0.0001, "slicing");
|
onupdate(0.0001, "slicing");
|
||||||
|
|
||||||
if (kiri.client && !widget.inWorker) {
|
if (kiri.client && !widget.inWorker) {
|
||||||
|
// store slicing visuals
|
||||||
|
widget.stack = kiri.stacks.create(widget.id, widget.mesh);
|
||||||
|
// compensate for zcut (widget moved through floor)
|
||||||
|
widget.stack.obj.view.position.z = widget.track.zcut || 0;
|
||||||
// in case result of slice is nothing, do not preserve previous
|
// in case result of slice is nothing, do not preserve previous
|
||||||
widget.slices = []
|
widget.slices = []
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1433,26 +1433,27 @@ gapp.register("moto.space", [], (root, exports) => {
|
||||||
|
|
||||||
let animates = 0;
|
let animates = 0;
|
||||||
let rateStart = Date.now();
|
let rateStart = Date.now();
|
||||||
|
|
||||||
let renders = [];
|
|
||||||
let renderStart;
|
let renderStart;
|
||||||
|
let renders = [];
|
||||||
|
|
||||||
function animate() {
|
function animate() {
|
||||||
animates++;
|
animates++;
|
||||||
const now = Date.now();
|
const now = Date.now();
|
||||||
if (now - rateStart > 1000) {
|
if (now - rateStart > 1000) {
|
||||||
|
// compute stats roughly every second
|
||||||
const delta = now - rateStart;
|
const delta = now - rateStart;
|
||||||
fps = 1000 * animates / delta;
|
fps = 1000 * animates / delta;
|
||||||
animates = 0;
|
animates = 0;
|
||||||
rateStart = now;
|
rateStart = now;
|
||||||
|
// look for slowest rendered frame
|
||||||
renderTime = Math.max(0, ...renders);
|
renderTime = Math.max(0, ...renders);
|
||||||
renders.length = 0;
|
renders.length = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
requestAnimationFrame(animate);
|
requestAnimationFrame(animate);
|
||||||
if (docVisible && !freeze && Date.now() - lastAction < 1500) {
|
if (docVisible && !freeze && Date.now() - lastAction < 1500) {
|
||||||
renderStart = Date.now();
|
renderStart = Date.now();
|
||||||
renderer.render(SCENE, camera);
|
renderer.render(SCENE, camera);
|
||||||
|
// track frame render times
|
||||||
renders.push(Date.now() - renderStart);
|
renders.push(Date.now() - renderStart);
|
||||||
} else {
|
} else {
|
||||||
fps = 0;
|
fps = 0;
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue