UNPKG

@woosh/meep-engine

Version:

Pure JavaScript game engine. Fully featured and production ready.

74 lines (50 loc) 1.81 kB
import { BufferGeometry, Float32BufferAttribute } from "three"; import { max2 } from "../../../src/core/math/max2.js"; /** * * @param {number[]} vertices * @param {number} radius * @param {number} angle0 * @param {number} angle1 * @param {number} component0 * @param {number} component1 * @param {number} offset * @param {number} count */ function addArc(vertices, radius, angle0, angle1, component0, component1, offset, count) { /** * * @type {number} */ const angleSpan = angle1 - angle0; const offset3 = offset * 3; for (var i = 0; i < count; ++i) { const address = i * 3 + offset3; const f = i / (count - 1); const angle = angle0 + angleSpan * f; vertices[address + component0] = Math.cos(angle) * radius; vertices[address + component1] = Math.sin(angle) * radius; } } /** * * @param {number} [radius] * @param {number} [resolution] * @returns {BufferGeometry} */ export function makeHelperSphereGeometry(radius = 1, resolution = 64) { const geometry = new BufferGeometry(); const r_4 = max2(2, Math.floor(resolution / 4)); const pointCount = r_4 * 4 * 3; const vertices = new Float32Array(pointCount * 3); let offset = 0; addArc(vertices, radius, 0, Math.PI * 2, 0, 1, offset, r_4 * 4); offset += r_4 * 4; addArc(vertices, radius, 0, Math.PI * 1.5, 0, 2, offset, r_4 * 3); offset += r_4 * 3; addArc(vertices, radius, -Math.PI * 0.5, Math.PI * 1.5, 1, 2, offset, r_4 * 4); offset += r_4 * 4; addArc(vertices, radius, Math.PI * 1.5, Math.PI * 2, 0, 2, offset, r_4); geometry.setAttribute('position', new Float32BufferAttribute(vertices, 3)); return geometry; }