|
@@ -4,9 +4,11 @@
|
|
|
* @author David Sehnal <david.sehnal@gmail.com>
|
|
|
*/
|
|
|
|
|
|
-interface Tensor extends Array<number> { '@type': 'tensor' }
|
|
|
+import { Mat4, Vec3, Vec4 } from './3d'
|
|
|
|
|
|
-namespace Tensor {
|
|
|
+export interface Tensor extends Array<number> { '@type': 'tensor' }
|
|
|
+
|
|
|
+export namespace Tensor {
|
|
|
export type ArrayCtor = { new (size: number): ArrayLike<number> }
|
|
|
|
|
|
export interface Space {
|
|
@@ -47,6 +49,32 @@ namespace Tensor {
|
|
|
export function ColumnMajorMatrix(rows: number, cols: number, ctor?: ArrayCtor) { return Space([rows, cols], [1, 0], ctor); }
|
|
|
export function RowMajorMatrix(rows: number, cols: number, ctor?: ArrayCtor) { return Space([rows, cols], [0, 1], ctor); }
|
|
|
|
|
|
+ export function toMat4(space: Space, data: Tensor): Mat4 {
|
|
|
+ if (space.rank !== 2) throw new Error('Invalid tensor rank');
|
|
|
+ const mat = Mat4.zero();
|
|
|
+ const d0 = Math.min(4, space.dimensions[0]), d1 = Math.min(4, space.dimensions[1]);
|
|
|
+ for (let i = 0; i < d0; i++) {
|
|
|
+ for (let j = 0; j < d1; j++) Mat4.setValue(mat, i, j, space.get(data, i, j));
|
|
|
+ }
|
|
|
+ return mat;
|
|
|
+ }
|
|
|
+
|
|
|
+ export function toVec3(space: Space, data: Tensor): Vec3 {
|
|
|
+ if (space.rank !== 1) throw new Error('Invalid tensor rank');
|
|
|
+ const vec = Vec3.zero();
|
|
|
+ const d0 = Math.min(3, space.dimensions[0]);
|
|
|
+ for (let i = 0; i < d0; i++) vec[i] = data[i];
|
|
|
+ return vec;
|
|
|
+ }
|
|
|
+
|
|
|
+ export function toVec4(space: Space, data: Tensor): Vec4 {
|
|
|
+ if (space.rank !== 1) throw new Error('Invalid tensor rank');
|
|
|
+ const vec = Vec4.zero();
|
|
|
+ const d0 = Math.min(4, space.dimensions[0]);
|
|
|
+ for (let i = 0; i < d0; i++) vec[i] = data[i];
|
|
|
+ return vec;
|
|
|
+ }
|
|
|
+
|
|
|
function accessors(layout: Layout): { get: Space['get'], set: Space['set'] } {
|
|
|
const { dimensions, axisOrderFastToSlow: ao } = layout;
|
|
|
switch (dimensions.length) {
|
|
@@ -113,6 +141,4 @@ namespace Tensor {
|
|
|
}
|
|
|
return o;
|
|
|
}
|
|
|
-}
|
|
|
-
|
|
|
-export default Tensor
|
|
|
+}
|