awv3
Version:
⚡ AWV3 embedded CAD
56 lines (49 loc) • 2.31 kB
JavaScript
import * as THREE from 'three';
//note: number of vertices is constant in order to use the same vertex buffer
export default class RingGeometry extends THREE.BufferGeometry {
constructor(segments) {
super();
this.parameters = {
thetaSegments: segments,
innerRadius: 1.0,
outerRadius: 2.0,
thetaStart: 0.0,
thetaLength: 2*Math.PI,
};
let vertsCount = (segments + 1) * 2;
let facesCount = segments * 2;
this.setIndex(new THREE.BufferAttribute(new Uint32Array(facesCount * 3), 1));
this.addAttribute('position', new THREE.BufferAttribute(new Float32Array(vertsCount * 3), 3));
this.addAttribute('normal', new THREE.BufferAttribute(new Float32Array(vertsCount * 3), 3));
this.attributes.position.dynamic = true;
let f = 0;
for (let i = 0; i < segments; i++)
for (let idx of [2*i, 2*i+2, 2*i+3, 2*i+3, 2*i+1, 2*i])
this.index.array[f++] = idx;
let n = 0;
for (let i = 0; i < vertsCount; i++)
for (let crd of [0, 0, 1])
this.attributes.normal.array[n++] = crd;
this.updateParameters(this.parameters);
}
updateParameters(newParams) {
Object.assign(this.parameters, newParams);
let segments = this.parameters.thetaSegments;
let vertexBuffer = this.attributes.position.array;
for (let i = 0; i <= segments; i++) {
let angle = this.parameters.thetaStart + this.parameters.thetaLength * i / segments;
let cosA = Math.cos(angle), sinA = Math.sin(angle);
let innerPos = new THREE.Vector3(cosA, sinA, 0).multiplyScalar(this.parameters.innerRadius);
let outerPos = new THREE.Vector3(cosA, sinA, 0).multiplyScalar(this.parameters.outerRadius);
vertexBuffer[6 * i + 0] = innerPos.x;
vertexBuffer[6 * i + 1] = innerPos.y;
vertexBuffer[6 * i + 2] = innerPos.z;
vertexBuffer[6 * i + 3] = outerPos.x;
vertexBuffer[6 * i + 4] = outerPos.y;
vertexBuffer[6 * i + 5] = outerPos.z;
}
this.attributes.position.needsUpdate = true;
//Note: this update may be done faster:
this.computeBoundingSphere();
}
};