obja/src/Model.js

66 lines
2.1 KiB
JavaScript

class Model extends THREE.Mesh {
constructor() {
let geometry = new THREE.Geometry();
let materials = [
new THREE.MeshLambertMaterial( { color: 0xffffff, side: THREE.DoubleSide } ),
new THREE.MeshBasicMaterial( { transparent: true, opacity: 0 } )
];
super(geometry, materials);
this.frustumCulled = false;
this.vertices = [];
}
manageElement(element) {
switch (element.type) {
case Element.AddVertex:
this.geometry.vertices.push(element.value);
this.geometry.verticesNeedUpdate = true;
break;
case Element.EditVertex:
this.geometry.vertices[element.id].copy(element.value);
this.geometry.verticesNeedUpdate = true;
break;
case Element.AddFace:
let vertices = this.geometry.vertices;
let f = element.value;
let normal =
vertices[f.b].clone().sub(vertices[f.a])
.cross(vertices[f.c].clone().sub(vertices[f.a]));
normal.normalize();
f.normal = normal;
f.materialIndex = 0;
this.geometry.faces.push(f);
this.geometry.elementsNeedUpdate = true;
break;
case Element.EditFace:
vertices = this.geometry.vertices;
f = element.value;
normal =
vertices[f.b].clone().sub(vertices[f.a])
.cross(vertices[f.c].clone().sub(vertices[f.a]));
normal.normalize();
f.normal = normal;
this.geometry.faces[element.id] = f;
this.geometry.elementsNeedUpdate = true;
break;
case Element.DeleteFace:
this.geometry.faces[element.id].materialIndex = 1;
this.geometry.elementsNeedUpdate = true;
break;
default:
throw new Error("unknown element type: " + element.type);
}
}
}