proof of concept key bindings
This commit is contained in:
parent
a5ddd78299
commit
45d59d0bbc
4 changed files with 130 additions and 22 deletions
|
|
@ -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
|
||||
|
|
|
|||
123
src/mesh/api.js
123
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() {
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
}
|
||||
};
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue