add selected / unselected visual states

This commit is contained in:
Stewart Allen 2021-12-31 17:14:55 -05:00
commit f3403ebe5c
3 changed files with 39 additions and 5 deletions

View file

@ -22,24 +22,41 @@ let groups = [];
let selected = []; let selected = [];
let selection = { let selection = {
// @returns {MeshObject[]}
list() { list() {
return selected.slice() return selected.slice()
}, },
// @param group {MeshObject[]}
set(objects) { set(objects) {
selected = objects; selected = objects;
this.update();
}, },
// @param group {MeshObject}
add(object) { add(object) {
selected.addOnce(object); selected.addOnce(object);
this.update();
}, },
// @param group {MeshObject}
remove(object) { remove(object) {
selected.remove(object); selected.remove(object);
this.update();
}, },
clear() { clear() {
selected = []; selected = [];
this.update();
},
update() {
for (let group of groups) {
group.material(mesh.material.unselected);
}
for (let object of selected) {
object.material(mesh.material.selected);
}
}, },
move(dx = 0, dy = 0, dz = 0) { move(dx = 0, dy = 0, dz = 0) {
@ -129,7 +146,7 @@ let api = mesh.api = {
// @param object {THREE.Object3D | THREE.Object3D[]} // @param object {THREE.Object3D | THREE.Object3D[]}
focus: (object) => { focus: (object) => {
let { center } = util.bounds(object); let { center } = util.bounds(object);
// when no objects supplied // when no valid objects supplied
if (isNaN(center.x * center.y * center.z)) { if (isNaN(center.x * center.y * center.z)) {
return; return;
} }
@ -157,7 +174,7 @@ let api = mesh.api = {
let util = mesh.util = { let util = mesh.util = {
// @param object {THREE.Object3D | THREE.Object3D[]} // @param object {THREE.Object3D | THREE.Object3D[] | MeshObject | MeshObject[]}
// @returns bounds modified for moto.Space // @returns bounds modified for moto.Space
bounds: (object) => { bounds: (object) => {
let box = new THREE.Box3(); let box = new THREE.Box3();

View file

@ -74,6 +74,12 @@ mesh.group = class MeshGroup extends mesh.object {
model.wireframe(...arguments); model.wireframe(...arguments);
} }
} }
material() {
for (let model of this.models) {
model.material(...arguments);
}
}
}; };
})(); })();

View file

@ -16,13 +16,20 @@ let mesh = self.mesh = self.mesh || {};
if (mesh.model) return; if (mesh.model) return;
/** default materials **/ /** default materials **/
mesh.material = { let materials = mesh.material = {
solid: new THREE.MeshPhongMaterial({ unselected: new THREE.MeshPhongMaterial({
transparent: true, transparent: true,
shininess: 100, shininess: 100,
specular: 0x181818, specular: 0x181818,
color: 0xffff00, color: 0xffff00,
opacity: 1 opacity: 1
}),
selected: new THREE.MeshPhongMaterial({
transparent: true,
shininess: 100,
specular: 0x181818,
color: 0x00ff00,
opacity: 1
}) })
}; };
@ -50,7 +57,7 @@ mesh.model = class MeshModel extends mesh.object {
if (indices) geo.setIndex(new THREE.BufferAttribute(indices, 1)); if (indices) geo.setIndex(new THREE.BufferAttribute(indices, 1));
geo.setAttribute('position', new THREE.BufferAttribute(vertices, 3)); geo.setAttribute('position', new THREE.BufferAttribute(vertices, 3));
geo.setAttribute('normal', undefined); geo.setAttribute('normal', undefined);
let meh = new THREE.Mesh(geo, mesh.material.solid); let meh = new THREE.Mesh(geo, materials.unselected);
geo.computeFaceNormals(); geo.computeFaceNormals();
geo.computeVertexNormals(); geo.computeVertexNormals();
meh.material.side = THREE.DoubleSide; meh.material.side = THREE.DoubleSide;
@ -114,6 +121,10 @@ mesh.model = class MeshModel extends mesh.object {
moto.Space.update(); moto.Space.update();
} }
material(mat) {
this.mesh.material = mat;
}
remove() { remove() {
mesh.api.model.remove(this); mesh.api.model.remove(this);
} }