jsketcher/web/app/cad/scene/views/shellView.js
2022-06-25 15:19:48 -07:00

88 lines
No EOL
2.5 KiB
JavaScript

import {View} from './view';
import * as SceneGraph from 'scene/sceneGraph';
import {getAttribute, setAttribute} from 'scene/objectData';
import {FaceView, SELECTION_COLOR} from './faceView';
import {EdgeView} from './edgeView';
import {FACE, LOOP, SHELL} from '../../model/entities';
import {Mesh} from 'three';
import {VertexView} from "./vertexView";
import {MSketchLoop} from "cad/model/mloop";
export class ShellView extends View {
constructor(ctx, shell, skin) {
super(ctx, shell);
this.rootGroup = SceneGraph.createGroup();
this.edgeGroup = SceneGraph.createGroup();
this.vertexGroup = SceneGraph.createGroup();
this.faceViews = [];
this.edgeViews = [];
this.vertexViews = [];
SceneGraph.addToGroup(this.rootGroup, this.edgeGroup);
SceneGraph.addToGroup(this.rootGroup, this.vertexGroup);
setAttribute(this.rootGroup, SHELL, this);
setAttribute(this.rootGroup, View.MARKER, this);
for (let face of shell.faces) {
const faceView = new FaceView(ctx, face, this, skin);
this.faceViews.push(faceView);
this.rootGroup.add(faceView.rootGroup);
}
for (let edge of shell.edges) {
const edgeView = new EdgeView(ctx, edge);
SceneGraph.addToGroup(this.edgeGroup, edgeView.rootGroup);
this.edgeViews.push(edgeView);
}
for (let vertex of shell.vertices) {
const vertexView = new VertexView(ctx, vertex);
SceneGraph.addToGroup(this.vertexGroup, vertexView.rootGroup);
this.vertexViews.push(vertexView);
}
this.rootGroup.matrixAutoUpdate = false;
this.model.location$.attach(loc => {
loc.setToMatrix4x4(this.rootGroup.matrix);
this.rootGroup.matrixWorldNeedsUpdate = true;
ctx.viewer.requestRender();
});
}
traverse(visitor, includeSelf = true) {
super.traverse(visitor, includeSelf);
this.faceViews.forEach(f => f.traverse(visitor));
this.edgeViews.forEach(e => e.traverse(visitor));
this.vertexViews.forEach(e => e.traverse(visitor));
}
updateVisuals() {
super.updateVisuals();
this.faceViews.forEach(f => f.updateVisuals());
}
dispose() {
for (let faceView of this.faceViews) {
faceView.dispose();
}
for (let edgeView of this.edgeViews) {
edgeView.dispose();
}
for (let vertexView of this.vertexViews) {
vertexView.dispose();
}
super.dispose();
}
}
export class SketchMesh extends Mesh {
constructor(geometry, material) {
super(geometry, material);
}
}