UNPKG

@woosh/meep-engine

Version:

Pure JavaScript game engine. Fully featured and production ready.

70 lines (54 loc) 2.19 kB
import { assert } from "../../../../core/assert.js"; import { RIBBON_ATTRIBUTE_ADDRESS_AGE, RIBBON_ATTRIBUTE_ADDRESS_COLOR, RIBBON_ATTRIBUTE_ADDRESS_THICKNESS, RIBBON_ATTRIBUTE_ADDRESS_UV_OFFSET } from "../../trail/x/ribbon_attributes_spec.js"; import Trail2D from "./Trail2D.js"; import { Trail2DFlags } from "./Trail2DFlags.js"; /** * * @param {number[]} color * @param {number[]} thickness * @param {number} [duration] * @param {number} [scale] * @param {number[]} position * @param {number[]} ages * @param {string} texture * @returns {Trail2D} */ export function makeGradientTrail({ color, thickness, position, duration = 1, scale = 1, ages, texture }) { const trail2D = new Trail2D(); trail2D.maxAge = duration; trail2D.width = 1; trail2D.textureURL = texture; const point_count = thickness.length; trail2D.build(point_count); const ribbon = trail2D.ribbon; for (let i = 0; i < point_count; i++) { const f = i / (point_count - 1); const i3 = i * 3; ribbon.setPointAlpha(i, 0); ribbon.setPointPosition(i, position[i3], position[i3 + 1], position[i3 + 2]); ribbon.setPointAttribute_Scalar(i, RIBBON_ATTRIBUTE_ADDRESS_AGE, ages[i] * duration); ribbon.setPointAttribute_Scalar(i, RIBBON_ATTRIBUTE_ADDRESS_UV_OFFSET, f); ribbon.setPointAttribute_Scalar(i, RIBBON_ATTRIBUTE_ADDRESS_THICKNESS, thickness[i]); const c_0 = color[i]; assert.isNumber(c_0, `color[i]`); ribbon.setPointAttribute_Vector3(i, RIBBON_ATTRIBUTE_ADDRESS_COLOR, c_0 >> 16, c_0 >> 8, c_0); } // don't spawn more trail segments trail2D.clearFlag(Trail2DFlags.Spawning); trail2D.setFlag(Trail2DFlags.Built); ribbon.computeBoundingBox(trail2D.bvh.bounds); return trail2D; }