mirror of
https://github.com/xibyte/jsketcher
synced 2025-12-16 21:43:08 +01:00
105 lines
No EOL
3 KiB
JavaScript
105 lines
No EOL
3 KiB
JavaScript
import {BufferAttribute, BufferGeometry, DoubleSide} from "three";
|
|
|
|
import brepTess from '../../tess/brep-tess';
|
|
import tessellateSurface from 'geom/surfaces/surfaceTess';
|
|
import * as vec from 'math/vec';
|
|
|
|
|
|
export function createSolidMaterial(skin) {
|
|
return new THREE.MeshPhongMaterial(Object.assign({
|
|
// vertexColors: THREE.FaceColors,
|
|
color: 0xaeaeae,
|
|
shininess: 0,
|
|
polygonOffset : true,
|
|
polygonOffsetFactor : 1,
|
|
polygonOffsetUnits : 2,
|
|
side: DoubleSide,
|
|
}, skin));
|
|
}
|
|
|
|
const SMOOTH_RENDERING = true;
|
|
|
|
export function tessDataToGeom(tessellation) {
|
|
const vertices = [];
|
|
const normals3 = [];
|
|
for (const [tr, normales] of tessellation) {
|
|
tr.forEach(p => vertices.push(...p));
|
|
|
|
if (normales && SMOOTH_RENDERING) {
|
|
normales.forEach(n => normals3.push(...n));
|
|
} else {
|
|
const n = vec.normal3(tr);
|
|
normals3.push(...n, ...n, ...n);
|
|
}
|
|
}
|
|
|
|
const geometry = new BufferGeometry();
|
|
geometry.setAttribute('position', new BufferAttribute( new Float32Array(vertices), 3));
|
|
geometry.setAttribute('normal', new BufferAttribute( new Float32Array(normals3), 3));
|
|
return geometry;
|
|
}
|
|
|
|
export function brepFaceToGeom(brepFace) {
|
|
const polygons = brepTess(brepFace);
|
|
return surfaceAndPolygonsToGeom(brepFace.surface, polygons);
|
|
}
|
|
|
|
export function surfaceAndPolygonsToGeom(surface, polygons) {
|
|
|
|
const vertices = [];
|
|
const normals = [];
|
|
const index = [];
|
|
|
|
const isPlane = surface.simpleSurface && surface.simpleSurface.isPlane;
|
|
const planeNormal = isPlane ? surface.normalInMiddle().data() : null;
|
|
function pushVertex(vtx) {
|
|
vertices.push(vtx.x, vtx.y, vtx.z);
|
|
if (!isPlane) {
|
|
const normal = surface.normal(vtx);
|
|
normals.push(normal.x, normal.y, normal.z);
|
|
} else {
|
|
normals.push(...planeNormal);
|
|
}
|
|
|
|
}
|
|
for (let p = 0; p < polygons.length; ++p) {
|
|
const off = vertices.length / 3;
|
|
const poly = polygons[p];
|
|
const vLength = poly.length;
|
|
if (vLength < 3) continue;
|
|
|
|
const firstVertex = poly[0];
|
|
|
|
pushVertex(firstVertex)
|
|
|
|
for (let i = 2; i < vLength; i++) {
|
|
|
|
const pVert = poly[i - 1];
|
|
const iVert = poly[i];
|
|
pushVertex(pVert);
|
|
pushVertex(iVert);
|
|
const a = off;
|
|
const b = (i - 1) + off;
|
|
const c = i + off;
|
|
index.push(a, b, c);
|
|
}
|
|
//view.setFaceColor(sceneFace, utils.isSmoothPiece(group.shared) ? 0xFF0000 : null);
|
|
}
|
|
|
|
const geometry = new BufferGeometry();
|
|
geometry.setAttribute('position', new BufferAttribute( new Float32Array(vertices), 3));
|
|
geometry.setAttribute('normal', new BufferAttribute( new Float32Array(normals), 3));
|
|
geometry.setIndex( index );
|
|
return geometry;
|
|
|
|
}
|
|
|
|
export function surfaceToThreeGeom(srf, geom) {
|
|
const off = geom.vertices.length;
|
|
const tess = tessellateSurface(srf);
|
|
tess.points.forEach(p => geom.vertices.push(new THREE.Vector3().fromArray(p)));
|
|
for (const faceIndices of tess.faces) {
|
|
const face = new THREE.Face3(faceIndices[0] + off, faceIndices[1] + off, faceIndices[2] + off);
|
|
geom.faces.push(face);
|
|
}
|
|
} |