From 45d59d0bbc8ceb889797da1fb783d6a033df9f04 Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Fri, 31 Dec 2021 14:12:42 -0500 Subject: [PATCH] proof of concept key bindings --- src/main/mesh.js | 21 +++++++- src/mesh/api.js | 123 ++++++++++++++++++++++++++++++++++++--------- src/mesh/group.js | 2 + src/mesh/object.js | 12 +++++ 4 files changed, 133 insertions(+), 25 deletions(-) diff --git a/src/main/mesh.js b/src/main/mesh.js index 809c7f0d..72f1aed5 100644 --- a/src/main/mesh.js +++ b/src/main/mesh.js @@ -54,6 +54,7 @@ function init() { broker.subscribe('space_init', data => { let { space, platform } = data; let platcolor = 0x00ff00; + let api = mesh.api; // add file drop handler space.event.addHandlers(self, [ 'drop', (evt) => { @@ -78,13 +79,31 @@ broker.subscribe('space_init', data => { }, 'dragleave', evt => { platform.setColor(platcolor); + }, + 'keypress', evt => { + }, + 'keydown', evt => { + switch (evt.code) { + case 'ArrowUp': + api.selection.rotate(-0.2,0,0).floor(); + break; + case 'ArrowDown': + api.selection.rotate(0.2,0,0).floor(); + break; + case 'ArrowLeft': + api.selection.rotate(0,0,0.2).floor(); + break; + case 'ArrowRight': + api.selection.rotate(0,0,-0.2).floor(); + break; + } } ]); }); // add object loader broker.subscribe('space_load', data => { - mesh.api.group.new(data.flat().map(el => new mesh.model(el))); + mesh.api.group.new(data.flat().map(el => new mesh.model(el))).centerXY().floor(); }); // remove version cache bust from url diff --git a/src/mesh/api.js b/src/mesh/api.js index d75b1c69..2dfa4407 100644 --- a/src/mesh/api.js +++ b/src/mesh/api.js @@ -19,35 +19,110 @@ if (mesh.api) return; let space = moto.Space; let groups = []; +let selected = []; + +let selection = { + list() { + return selected.slice() + }, + + set(objects) { + selected = objects; + }, + + add(object) { + selected.addOnce(object); + }, + + remove(object) { + selected.remove(object); + }, + + clear() { + selected = []; + }, + + move(dx = 0, dy = 0, dz = 0) { + for (let s of selected) { + s.move(dx, dy, dz); + } + return selection; + }, + + rotate(dx = 0, dy = 0, dz = 0) { + for (let s of selected) { + let { x, y, z } = s.rotation(); + s.rotation(x + dx, y + dy, z + dz); + } + return selection; + }, + + scale(dx = 0, dy = 0, dz = 0) { + for (let s of selected) { + let { x, y, z } = s.scale(); + s.scale(x + dx, y + dy, z + dz); + } + return selection; + }, + + floor() { + for (let s of selected) { + s.floor(...arguments); + } + return selection; + }, + + centerXY() { + for (let s of selected) { + s.floor(...arguments); + } + return selection; + }, + + home() { + return selection.centerXY().floor(); + } +}; + +let group = { + // @returns {MeshGroup[]} + list() { + return groups.slice(); + }, + + // @param group {MeshModel[]} + new: (models) => { + return group.add(new mesh.group(models)); + }, + + // @param group {MeshGroup} + add: (group) => { + groups.addOnce(group); + space.world.add(group.group); + space.update(); + selection.set([group]); + return group; + }, + + // @param group {MeshGroup} + remove: (group) => { + groups.remove(group); + space.world.remove(group.group); + space.update(); + } +}; let api = mesh.api = { - - group: { - // @returns {MeshGroup[]} - list() { - return groups.slice(); - }, - - // @param group {MeshModel[]} - new: (models) => { - api.group.add(new mesh.group(models)); - }, - - // @param group {MeshGroup} - add: (group) => { - groups.addOnce(group); - space.world.add(group.group); - space.update(); - }, - - // @param group {MeshGroup} - remove: (group) => { - groups.remove(group); - space.world.remove(group.group); - space.update(); + clear: () => { + for (let group of group.list()) { + group.remove(group); } }, + selection, + + group, + model: { // @returns {MeshModel[]} list() { diff --git a/src/mesh/group.js b/src/mesh/group.js index cb794bfc..5056b589 100644 --- a/src/mesh/group.js +++ b/src/mesh/group.js @@ -37,6 +37,7 @@ mesh.group = class MeshGroup extends mesh.object { this.models.addOnce(model); this.group.add(model.mesh); moto.Space.update(); + return this; } // @param model {MeshModel} @@ -49,6 +50,7 @@ mesh.group = class MeshGroup extends mesh.object { mesh.api.group.remove(this); } moto.Space.update(); + return this; } }; diff --git a/src/mesh/object.js b/src/mesh/object.js index 9f284755..1adf82bf 100644 --- a/src/mesh/object.js +++ b/src/mesh/object.js @@ -38,6 +38,7 @@ mesh.object = class MeshObject { move(x = 0, y = 0, z = 0) { let pos = this.position(); pos.set(pos.x + x, pos.y + y, pos.z + z); + moto.Space.update(); return this; } @@ -47,6 +48,16 @@ mesh.object = class MeshObject { return scale; } scale.set(...arguments); + moto.Space.update(); + } + + rotation() { + let rot = this.object().rotation; + if (arguments.length === 0) { + return rot; + } + rot.set(...arguments); + moto.Space.update(); } position() { @@ -55,6 +66,7 @@ mesh.object = class MeshObject { return pos; } pos.set(...arguments); + moto.Space.update(); } };