jsketcher/web/app/cad/scene/views/faceView.js
2022-11-26 23:10:23 -08:00

121 lines
3.5 KiB
JavaScript

import {brepFaceToGeom, tessDataToGeom} from './viewUtils';
import * as SceneGraph from 'scene/sceneGraph';
import {SketchObjectView} from './sketchObjectView';
import {View} from './view';
import {SketchLoopView} from './sketchLoopView';
import {createSolidMaterial} from "cad/scene/views/viewUtils";
import {SketchMesh} from "cad/scene/views/shellView";
import {FACE} from "cad/model/entities";
import {setAttribute} from "scene/objectData";
import {ViewMode} from "cad/scene/viewer";
import {SketchPoint} from "cad/sketch/sketchModel";
import {SketchPointView} from "cad/scene/views/sketchPointView";
export class SketchingView extends View {
constructor(ctx, face, parent) {
super(ctx, face, parent);
this.sketchGroup = SceneGraph.createGroup();
this.sketchObjectViews = [];
this.sketchLoopViews = [];
this.rootGroup = SceneGraph.createGroup();
SceneGraph.addToGroup(this.rootGroup, this.sketchGroup);
this.updateSketch();
const stream = ctx.attributesService.streams.get(this.model.id);
this.addDisposer(stream.attach(attr => {
if (this.mesh) {
this.setColor(attr.color);
ctx.viewer.requestRender();
}
}));
}
updateSketch() {
SceneGraph.emptyGroup(this.sketchGroup);
this.disposeSketch();
const sketchTr = this.model.sketchToWorldTransformation;
for (const sketchObject of this.model.sketchObjects) {
let sov;
if (sketchObject.sketchPrimitive instanceof SketchPoint) {
sov = new SketchPointView(this.ctx, sketchObject, sketchTr);
} else {
sov = new SketchObjectView(this.ctx, sketchObject, sketchTr);
}
SceneGraph.addToGroup(this.sketchGroup, sov.rootGroup);
this.sketchObjectViews.push(sov);
}
this.model.sketchLoops.forEach(mLoop => {
const loopView = new SketchLoopView(this.ctx, mLoop);
SceneGraph.addToGroup(this.sketchGroup, loopView.rootGroup);
this.sketchLoopViews.push(loopView);
});
}
updateVisuals() {
this.mesh.material.color.set(this.markColor||this.parent.markColor||this.color||this.parent.color||NULL_COLOR);
}
disposeSketch() {
this.sketchObjectViews.forEach(o => o.dispose());
this.sketchLoopViews.forEach(o => o.dispose());
this.sketchObjectViews = [];
this.sketchLoopViews = [];
}
dispose() {
this.disposeSketch();
super.dispose();
}
}
export class FaceView extends SketchingView {
constructor(ctx, face, parent, skin) {
super(ctx, face, parent);
let geom;
if (face.brepFace.data.tessellation) {
geom = tessDataToGeom(face.brepFace.data.tessellation.data)
} else {
geom = brepFaceToGeom(face.brepFace);
}
this.geometry = geom;
this.material = createSolidMaterial(skin);
this.mesh = new SketchMesh(geom, this.material);
setAttribute(this.mesh, FACE, this);
this.mesh.onMouseEnter = () => {
this.ctx.highlightService.highlight(this.model.id);
}
this.mesh.onMouseLeave = () => {
this.ctx.highlightService.unHighlight(this.model.id);
}
this.rootGroup.add(this.mesh);
this.addDisposer(ctx.viewer.viewMode$.attach(mode => {
this.mesh.visible = (mode === ViewMode.SHADED_WITH_EDGES || mode === ViewMode.SHADED);
}));
}
dispose() {
super.dispose();
this.material.dispose();
this.geometry.dispose();
}
}
export function setFacesColor(faces, color) {
for (const face of faces) {
if (color === null) {
face.color.set(NULL_COLOR);
} else {
face.color.set( color );
}
}
}
const NULL_COLOR = 0xbfbfbf;