@woosh/meep-engine
Version:
Pure JavaScript game engine. Fully featured and production ready.
70 lines (54 loc) • 2.19 kB
JavaScript
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;
}