add event-driven once keypress actions, split S and V ephemeral overrides, all mesh split at specified value

This commit is contained in:
Stewart Allen 2025-01-21 12:14:05 -08:00
commit 6f9e066d13
2 changed files with 56 additions and 3 deletions

View file

@ -280,6 +280,11 @@ function space_init(data) {
},
'keydown', evt => {
let { shiftKey, metaKey, ctrlKey, code } = evt;
let once = keyOnce[code];
if (once) {
delete keyOnce[code];
return once(evt);
}
let rv = (Math.PI / 12);
if (api.modal.showing) {
if (code === 'Escape') {
@ -598,6 +603,16 @@ function space_load(data) {
}
let metaCache = {};
let keyOnce = {};
function key_once(data) {
const { code, fn } = data;
keyOnce[code] = fn;
}
function key_once_cancel(code) {
delete keyOnce[code];
}
function store_meta() {
mesh.db.admin.put("meta", metaCache);
@ -711,6 +726,8 @@ function set_snap_value(snap) {
// bind functions to topics
broker.listeners({
key_once,
key_once_cancel,
load_files,
object_meta,
object_destroy,

View file

@ -9,15 +9,19 @@
"use strict";
// dep: moto.space
// dep: moto.broker
gapp.register("mesh.split", [], (root, exports) => {
const { broker } = gapp;
const { Mesh, MeshPhongMaterial, PlaneGeometry, DoubleSide, Vector3 } = THREE;
const { mesh, moto } = root;
const { space } = moto;
const { api } = mesh;
let isActive;
const key_once = broker.bind('key_once');
const key_cancel = broker.bind('key_once_cancel');
// split functions
let split = {
active() {
@ -29,6 +33,11 @@ let split = {
return;
}
let { api, util } = mesh;
let { log } = api;
if (api.selection.models().length === 0) {
log.emit('no models selected for splitting');
return;
}
// create split plane visual
let geo, mat, obj = new Mesh(
geo = new PlaneGeometry(1,1),
@ -72,11 +81,36 @@ let split = {
obj.position.set(mid.x, y, -mid.y);
});
isActive = true;
key_once({ code: 'KeyS', fn(evt) {
split.select();
}});
key_once({ code: 'KeyV', fn(evt) {
evt.preventDefault();
let state = split.state;
split.end();
function doit(z) {
state.plane = { z };
split.select(state);
}
api.modal.dialog({
title: "split object Z",
body: [ h.div({ class: "additem" }, [
h.label('Z value'),
h.input({ value: 0, size: 5, id: "_value" }),
h.button({ _: "split", onclick() {
const { _value } = api.modal.bound;
doit(parseFloat(_value.value));
api.modal.hide();
} })
]) ]
});
api.modal.bound._value.focus();
} });
},
select() {
select(state) {
let { log } = mesh.api;
let { models, plane } = split.state;
let { models, plane } = split.state || state;
if (!(models && plane)) {
return split.end();
}
@ -92,6 +126,8 @@ let split = {
if (!isActive) {
return;
}
key_cancel('KeyS');
key_cancel('KeyV');
let space = moto.space;
let { obj } = split.state;
space.scene.remove(obj);