@polygonjs/polygonjs
Version:
node-based WebGL 3D engine https://polygonjs.com
100 lines (95 loc) • 3.34 kB
text/typescript
import {NamedFunction3} from './_Base';
import {_matchArrayLength} from './_ArrayUtils';
import {Color, Vector2, Vector3, Vector4} from 'three';
type PreviousValueAcceptedType = boolean | number | string | Color | Vector2 | Vector3 | Vector4;
const arrayByLengthByNodePath: Map<string, Map<number, PreviousValueAcceptedType[]>> = new Map();
function _getArray<T extends PreviousValueAcceptedType>(
nodePath: string,
arrayLength: number,
createElement: () => T
): T[] {
let mapForNodePath = arrayByLengthByNodePath.get(nodePath);
if (!mapForNodePath) {
mapForNodePath = new Map();
arrayByLengthByNodePath.set(nodePath, mapForNodePath);
}
let array = mapForNodePath.get(arrayLength);
if (!array) {
array = new Array(arrayLength) as T[];
for (let i = 0; i < arrayLength; i++) {
array[i] = createElement();
}
mapForNodePath.set(arrayLength, array);
}
return array as T[];
}
export class previousValuePrimitive<T extends boolean | number | string> extends NamedFunction3<[string, number, T]> {
static override type() {
return 'previousValuePrimitive';
}
override func(nodePath: string, offset: number, newValue: T): T {
const arrayLength = offset + 1;
const array = _getArray(nodePath, arrayLength, () => newValue);
for (let i = 0; i < arrayLength - 1; i++) {
array[i] = array[i + 1];
}
array[arrayLength - 1] = newValue;
return array[0];
}
}
export class previousValueColor extends NamedFunction3<[string, number, Color]> {
static override type() {
return 'previousValueColor';
}
override func(nodePath: string, offset: number, newValue: Color): Color {
const arrayLength = offset + 1;
const array = _getArray<Color>(nodePath, arrayLength, () => newValue.clone());
for (let i = 0; i < arrayLength - 1; i++) {
array[i].copy(array[i + 1]);
}
array[arrayLength - 1].copy(newValue);
return array[0];
}
}
export class previousValueVector2 extends NamedFunction3<[string, number, Vector2]> {
static override type() {
return 'previousValueVector2';
}
override func(nodePath: string, offset: number, newValue: Vector2): Vector2 {
const arrayLength = offset + 1;
const array = _getArray<Vector2>(nodePath, arrayLength, () => newValue.clone());
for (let i = 0; i < arrayLength - 1; i++) {
array[i].copy(array[i + 1]);
}
array[arrayLength - 1].copy(newValue);
return array[0];
}
}
export class previousValueVector3 extends NamedFunction3<[string, number, Vector3]> {
static override type() {
return 'previousValueVector3';
}
override func(nodePath: string, offset: number, newValue: Vector3): Vector3 {
const arrayLength = offset + 1;
const array = _getArray<Vector3>(nodePath, arrayLength, () => newValue.clone());
for (let i = 0; i < arrayLength - 1; i++) {
array[i].copy(array[i + 1]);
}
array[arrayLength - 1].copy(newValue);
return array[0];
}
}
export class previousValueVector4 extends NamedFunction3<[string, number, Vector4]> {
static override type() {
return 'previousValueVector4';
}
override func(nodePath: string, offset: number, newValue: Vector4): Vector4 {
const arrayLength = offset + 1;
const array = _getArray<Vector4>(nodePath, arrayLength, () => newValue.clone());
for (let i = 0; i < arrayLength - 1; i++) {
array[i].copy(array[i + 1]);
}
array[arrayLength - 1].copy(newValue);
return array[0];
}
}