UNPKG

@polygonjs/polygonjs

Version:

node-based WebGL 3D engine https://polygonjs.com

76 lines (69 loc) 2.46 kB
// this preset works well with an input being a line with many points const LINE_TWIST = ` const otherPos = new Vector3(); const currentPos = new Vector3(); const tangent = new Vector3(); const tangentOffset = new Vector3(); const normalVector = new Vector3(); export class CodeSopProcessor extends BaseCodeSopProcessor { override initializeProcessor() {} override cook(inputCoreGroups: CoreGroup[]) { const inputCoreGroup = inputCoreGroups[0]; const objects = inputCoreGroup.threejsObjectsWithGeo(); for (let object of objects) { this._processObject(object); } this.setCoreGroup(inputCoreGroup); } private _processObject(object: Object3DWithGeometry) { const geometry = object.geometry; const position = geometry.getAttribute('position'); const restP = geometry.getAttribute('restP'); if (!position) { return; } if (!restP) { return console.warn('no restP'); } const {mult, twist} = this.pv; const restPArray = restP.array; const positionArray = position.array; const stride = 3; const pointsCount = position.count; for (let i = 0; i < pointsCount; i++) { if (i < pointsCount - 1) { currentPos.fromArray(restPArray, i * stride); otherPos.fromArray(restPArray, (i + 1) * stride); tangent.copy(currentPos).sub(otherPos); } else { currentPos.fromArray(restPArray, i * stride); otherPos.fromArray(restPArray, (i - 1) * stride); tangent.copy(otherPos).sub(currentPos); } tangent.normalize(); tangentOffset.copy(tangent); tangentOffset.x += 0.1; tangentOffset.normalize(); normalVector.crossVectors(tangentOffset, tangent); normalVector.normalize(); normalVector.applyAxisAngle(tangent, i * twist); currentPos.add(normalVector.multiplyScalar(mult)); currentPos.toArray(positionArray, i * stride); } } } `; import {CodeSopNode} from '../../../src/engine/nodes/sop/Code'; import {BasePreset, NodePresetsCollection, PresetRegister, PresetsCollectionFactory} from '../BasePreset'; const codeSopNodePresetsCollectionFactory: PresetsCollectionFactory<CodeSopNode> = (node: CodeSopNode) => { const collection = new NodePresetsCollection(); const lineTwist = new BasePreset().addEntry(node.p.codeTypescript, LINE_TWIST); collection.setPresets({ lineTwist, }); return collection; }; export const codeSopPresetRegister: PresetRegister<typeof CodeSopNode, CodeSopNode> = { nodeClass: CodeSopNode, setupFunc: codeSopNodePresetsCollectionFactory, };