UNPKG

rc-js-util

Version:

A collection of TS and C++ utilities to help writing performant and correct applications, achieved through strict typing and (removable) invariant checking.

314 lines (277 loc) 7.25 kB
import { ATypedArrayTuple, TTypedArrayTupleMutativeMethods } from "../a-typed-array-tuple.js"; import { TTypedArray } from "../t-typed-array.js"; import { IReadonlyMat3 } from "../mat3/mat3.js"; import { ITypedArrayTupleFactory } from "../i-typed-array-tuple-factory.js"; import { getVec2Ctor } from "./get-vec2-ctor.js"; import { TTypedArrayCtor } from "../t-typed-array-ctor.js"; import { IReadonlyRange2d } from "../2d/range2d/range2d.js"; import { TPickExcept } from "../../../typescript/t-pick-except.js"; import { populateTypedArrayConstructorMap } from "../../../runtime/rtti-interop.js"; /** * @public */ export type TVec2CtorArgs = [x: number, y: number]; /** * @public * Constructor for {@link Vec2}. */ export interface IVec2Ctor<TArray extends TTypedArray> { readonly BASE: TTypedArrayCtor; /** * The size in bytes of each element in the array. */ readonly BYTES_PER_ELEMENT: number; readonly prototype: Vec2<TArray>; readonly factory: ITypedArrayTupleFactory<Vec2<TArray>, TVec2CtorArgs>; new(): Vec2<TArray>; } /** * @public * {@link Vec2}. */ export interface IReadonlyVec2<TArray extends TTypedArray> extends TPickExcept<Readonly<Vec2<TArray>>, | "update" | "setX" | "setY" | "bound2d" | "translate2d" | "copyFromBuffer" | TTypedArrayTupleMutativeMethods> { } /** * @public * Vector 2. * * @remarks * See static properties for constructors. Instances are not an extension of this class, but of the static members. */ export abstract class Vec2<TArray extends TTypedArray> extends ATypedArrayTuple<2, TArray> { public static f64: IVec2Ctor<Float64Array> = getVec2Ctor(Float64Array); public static f32: IVec2Ctor<Float32Array> = getVec2Ctor(Float32Array); public static i64 = null; // not supported public static u64 = null; // not supported public static u32: IVec2Ctor<Uint32Array> = getVec2Ctor(Uint32Array); public static i32: IVec2Ctor<Int32Array> = getVec2Ctor(Int32Array); public static u16: IVec2Ctor<Uint16Array> = getVec2Ctor(Uint16Array); public static i16: IVec2Ctor<Int16Array> = getVec2Ctor(Int16Array); public static u8c: IVec2Ctor<Uint8ClampedArray> = getVec2Ctor(Uint8ClampedArray); public static u8: IVec2Ctor<Uint8Array> = getVec2Ctor(Uint8Array); public static i8: IVec2Ctor<Int8Array> = getVec2Ctor(Int8Array); public static getCtor<TCtor extends TTypedArrayCtor>(ctor: TCtor): IVec2Ctor<InstanceType<TCtor>> { return Vec2.constructors.get(ctor) as IVec2Ctor<InstanceType<TCtor>>; } protected static constructors = populateTypedArrayConstructorMap(Vec2); public ["constructor"]!: IVec2Ctor<TArray>; /** * x */ public 0!: number; /** * y */ public 1!: number; /** * Component-wise equals. */ public isEqualTo(_other: Vec2<TTypedArray>): boolean { throw new Error(); } public getX(): number { throw new Error(); } public getY(): number { throw new Error(); } public getMagnitude(): number { throw new Error(); } public getMagnitudeSquared(): number { throw new Error(); } public update(_x: number, _y: number): void { throw new Error(); } public setX(_x: number): void { throw new Error(); } public setY(_y: number): void { throw new Error(); } public add<TResult extends TTypedArray = TArray> ( _vec: IReadonlyVec2<TTypedArray>, _result?: Vec2<TResult>, ) : Vec2<TResult> { throw new Error(); } public subtract<TResult extends TTypedArray = TArray> ( _vec: IReadonlyVec2<TTypedArray>, _result?: Vec2<TResult>, ) : Vec2<TResult> { throw new Error(); } public scalarMultiply<TResult extends TTypedArray = TArray> ( _value: number, _result?: Vec2<TResult>, ) : Vec2<TResult> { throw new Error(); } /** * Multiply `this` by `_value`. */ public vec2Multiply<TResult extends TTypedArray = TArray> ( _value: IReadonlyVec2<TTypedArray>, _result?: Vec2<TResult>, ) : Vec2<TResult> { throw new Error(); } public scalarDivide<TResult extends TTypedArray = TArray> ( _value: number, _result?: Vec2<TResult>, ) : Vec2<TResult> { throw new Error(); } /** * Divide `this` by `_value`. */ public vec2Divide<TResult extends TTypedArray = TArray> ( _value: IReadonlyVec2<TTypedArray>, _result?: Vec2<TResult>, ) : Vec2<TResult> { throw new Error(); } /** * Returns a unit vector in the direction of this vector. */ public normalize<TResult extends TTypedArray = TArray> ( _result?: Vec2<TResult>, ) : Vec2<TResult> { throw new Error(); } /** * Returns the normal to this vector. */ public getNormal<TResult extends TTypedArray = TArray> ( _result?: Vec2<TResult>, ) : Vec2<TResult> { throw new Error(); } public dotProduct ( _vec: IReadonlyVec2<TTypedArray>, ) : number { throw new Error(); } public mat3Multiply<TResult extends TTypedArray = TArray> ( _mat: IReadonlyMat3<TTypedArray>, _result?: Vec2<TResult>, ) : Vec2<TResult> { throw new Error(); } /** * If this point is outside of the range, set that dimension to the extrema of the range. * @param _range - The range to be bound to, inclusive. */ public bound2d(_range: IReadonlyRange2d<TTypedArray>): void { throw new Error(); } /** * Shifts this position by the arguments. */ public translate2d(_dx: number, _dy: number): void { throw new Error(); } public getLoggableValue(): number[][] { throw new Error(); } /** * If endianness is not supplied the platform's endianness will be used. */ public copyFromBuffer ( _memoryDataView: DataView, _pointer: number, _littleEndian?: boolean, ) : void { throw new Error(); } /** * If endianness is not supplied the platform's endianness will be used. */ public copyToBuffer ( _memoryDataView: DataView, _pointer: number, _littleEndian?: boolean, ) : void { throw new Error(); } /** * Although the typed array tuples extend a typed array, they are not structurally compatible. * This function returns the argument passed without modification but cast as the underlying storage type, e.g. Float32Array. */ public castToBaseType(): TArray { throw new Error(); } public TTypeGuardVec2!: true; } /** * @public * Float32 {@link Vec2}. */ export type TF32Vec2 = Vec2<Float32Array>; /** * @public * Float64 {@link Vec2}. */ export type TF64Vec2 = Vec2<Float64Array>;