@polygonjs/polygonjs
Version:
node-based WebGL 3D engine https://polygonjs.com
71 lines (66 loc) • 1.9 kB
text/typescript
/**
* Creates a CSG triangle.
*
*
*/
import {CSGSopNode} from './_BaseCSG';
import {NodeParamsConfig, ParamConfig} from '../utils/params/ParamsConfig';
import {CoreGroup} from '../../../core/geometry/Group';
import {SopType} from '../../poly/registers/nodes/types/Sop';
import type {maths} from '@jscad/modeling';
import {primitives} from '@jscad/modeling';
import {MathUtils} from 'three';
const {degToRad} = MathUtils;
const {triangle} = primitives;
enum TriangleType {
AAA = 'AAA',
AAS = 'AAS',
ASA = 'ASA',
SAS = 'SAS',
SSA = 'SSA',
SSS = 'SSS',
}
const TRIANGLE_TYPES: TriangleType[] = [
TriangleType.AAA,
TriangleType.AAS,
TriangleType.ASA,
TriangleType.SAS,
TriangleType.SSA,
TriangleType.SSS,
];
class CSGTriangleSopParamsConfig extends NodeParamsConfig {
/** @param type */
type = ParamConfig.INTEGER(TRIANGLE_TYPES.indexOf(TriangleType.AAA), {
menu: {entries: TRIANGLE_TYPES.map((name, value) => ({name, value}))},
});
/** @param angles */
angles = ParamConfig.VECTOR2([60, 60]);
}
const ParamsConfig = new CSGTriangleSopParamsConfig();
export class CSGTriangleSopNode extends CSGSopNode<CSGTriangleSopParamsConfig> {
override paramsConfig = ParamsConfig;
static override type() {
return SopType.CSG_TRIANGLE;
}
private _angles: maths.vec3.Vec3 = [0, 0, 0];
override cook(inputCoreGroups: CoreGroup[]) {
try {
const angles = this.pv.angles;
const angle0 = degToRad(angles.x);
const angle1 = degToRad(angles.y);
const angle2 = Math.PI - (angle0 + angle1);
this._angles[0] = angle0;
this._angles[1] = angle1;
this._angles[2] = angle2;
const geo = triangle({
type: TRIANGLE_TYPES[this.pv.type],
values: this._angles,
});
this.setCSGGeometry(geo);
} catch (err) {
const message = err instanceof Error ? err.message : 'failed to create geometry';
this.states.error.set(message);
this.setCSGObjects([]);
}
}
}