UNPKG

awv3

Version:
56 lines (49 loc) 2.31 kB
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(); } };