proof of concept key bindings

This commit is contained in:
Stewart Allen 2021-12-31 14:12:42 -05:00
commit 45d59d0bbc
4 changed files with 130 additions and 22 deletions

View file

@ -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

View file

@ -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() {

View file

@ -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;
}
};

View file

@ -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();
}
};