Source: geometry/generated-geometry.js

import { Geometry } from './geometry.js';

/**
 * CPU buffers returned by a geometry generator.
 *
 * @typedef {Object} GeneratedGeometryData
 * @property {Float32Array} positions                     - Vertex positions.
 * @property {Float32Array | null} colors                 - Optional vertex colors.
 * @property {Uint16Array | Uint32Array} indicesSolid     - Solid primitive indexes.
 * @property {Uint16Array | Uint32Array} indicesWireframe - Wireframe indexes.
 * @property {Float32Array | null} uvs                    - Optional texture coordinates.
 * @property {Float32Array | null} normals                - Optional vertex normals.
 * @property {Object} [primitiveOptions]                  - Solid and wireframe primitive overrides.
 */

/**
 * Base class for geometries that generate their buffers from constructor arguments.
 * Subclasses implement the static `createGeometryData` method.
 * GPU resources and their lifetime are managed by `Geometry`.
 *
 * @abstract
 */
export class GeneratedGeometry extends Geometry {
    /**
     * @param {WebGL2RenderingContext} webglContext - WebGL2 rendering context.
     * @param {...*} args                           - Arguments passed to the subclass generator.
     */
    constructor(webglContext, ...args) {
        const data = new.target.createGeometryData(...args);

        super(
            webglContext,
            data.positions,
            data.colors,
            data.indicesSolid,
            data.indicesWireframe,
            data.uvs,
            data.normals,
            data.primitiveOptions
        );
    }

    /**
     * Generates CPU buffers before any GPU resources are created.
     * Subclasses define their own input arguments.
     *
     * @returns {GeneratedGeometryData} - Buffers passed to `Geometry`.
     * @throws {Error} When a subclass has not implemented the generator.
     * @abstract
     * @protected
     */
    static createGeometryData() {
        throw new Error('GeneratedGeometry.createGeometryData must be implemented by a subclass.');
    }
}