@threeify/math
Version:
Computer graphics oriented, High performance, tree-shakeable, TypeScript 3D vector math library.
149 lines (141 loc) • 3.32 kB
text/typescript
import { arrayToMat3, mat3ToArray } from '../Mat3.Functions.js';
import { Mat3 } from '../Mat3.js';
import { arrayToMat4, mat4ToArray } from '../Mat4.Functions.js';
import { Mat4 } from '../Mat4.js';
import { arrayToQuat, quatToArray } from '../Quat.Functions.js';
import { Quat } from '../Quat.js';
import { arrayToVec2, vec2ToArray } from '../Vec2.Functions.js';
import { Vec2 } from '../Vec2.js';
import { arrayToVec3, vec3ToArray } from '../Vec3.Functions.js';
import { Vec3 } from '../Vec3.js';
type DataArray = ArrayBuffer | Float32Array;
export class PrimitiveView<PrimitiveType> {
readonly floatArray: Float32Array;
readonly count: number;
constructor(
dataArray: DataArray,
floatPerPrimitive = -1,
public floatStride: number = -1,
public floatOffset: number = -1,
private primitiveToArray: (
p: PrimitiveType,
a: Float32Array,
i: number
) => void,
private arrayToPrimitive: (
a: Float32Array,
i: number,
p: PrimitiveType
) => void
) {
if (dataArray instanceof Float32Array) {
this.floatArray = dataArray;
} else if (dataArray instanceof ArrayBuffer) {
this.floatArray = new Float32Array(dataArray);
} else {
throw new TypeError('unsupported value');
}
if (floatPerPrimitive < 0) {
throw new Error(
'must specify bytesPerPrimitive or provide an Attribute argument'
);
}
if (this.floatStride < 0) {
this.floatStride = floatPerPrimitive;
}
if (this.floatOffset < 0) {
this.floatOffset = 0;
}
this.count = this.floatArray.length / this.floatStride;
}
set(index: number, v: PrimitiveType): this {
this.primitiveToArray(
v,
this.floatArray,
index * this.floatStride + this.floatOffset
);
return this;
}
get(index: number, v: PrimitiveType): PrimitiveType {
this.arrayToPrimitive(
this.floatArray,
index * this.floatStride + this.floatOffset,
v
);
return v;
}
clear(): this {
this.floatArray.fill(0);
return this;
}
}
export function makeVec2View(
dataArray: DataArray,
floatStride = -1,
floatOffset = -1
): PrimitiveView<Vec2> {
return new PrimitiveView<Vec2>(
dataArray,
2,
floatStride,
floatOffset,
vec2ToArray,
arrayToVec2
);
}
export function makeVec3View(
dataArray: DataArray,
floatStride = -1,
floatOffset = -1
): PrimitiveView<Vec3> {
return new PrimitiveView<Vec3>(
dataArray,
3,
floatStride,
floatOffset,
vec3ToArray,
arrayToVec3
);
}
export function makeQuatView(
dataArray: DataArray,
floatStride = -1,
floatOffset = -1
): PrimitiveView<Quat> {
return new PrimitiveView<Quat>(
dataArray,
4,
floatStride,
floatOffset,
quatToArray,
arrayToQuat
);
}
export function makeMat3View(
dataArray: DataArray,
floatStride = -1,
floatOffset = -1
): PrimitiveView<Mat3> {
return new PrimitiveView<Mat3>(
dataArray,
9,
floatStride,
floatOffset,
mat3ToArray,
arrayToMat3
);
}
export function makeMat4View(
dataArray: DataArray,
floatStride = -1,
floatOffset = -1
): PrimitiveView<Mat4> {
return new PrimitiveView<Mat4>(
dataArray,
16,
floatStride,
floatOffset,
mat4ToArray,
arrayToMat4
);
}