@thi.ng/matrices
Advanced tools
Comparing version 2.3.37 to 2.4.0
# Change Log | ||
- **Last updated**: 2024-05-08T18:24:32Z | ||
- **Last updated**: 2024-06-21T19:34:38Z | ||
- **Generator**: [thi.ng/monopub](https://thi.ng/monopub) | ||
@@ -12,2 +12,13 @@ | ||
## [2.4.0](https://github.com/thi-ng/umbrella/tree/@thi.ng/matrices@2.4.0) (2024-06-21) | ||
#### 🚀 Features | ||
- add AxisOrder type for quadFromEuler() ([f9722dd](https://github.com/thi-ng/umbrella/commit/f9722dd)) | ||
#### ♻️ Refactoring | ||
- rename various rest args to be more semantically meaningful ([8088a56](https://github.com/thi-ng/umbrella/commit/8088a56)) | ||
- enforce uniform naming convention of internal functions ([56992b2](https://github.com/thi-ng/umbrella/commit/56992b2)) | ||
### [2.3.34](https://github.com/thi-ng/umbrella/tree/@thi.ng/matrices@2.3.34) (2024-04-20) | ||
@@ -14,0 +25,0 @@ |
import type { Mat, ReadonlyMat } from "./api.js"; | ||
/** | ||
* Concatenates / multiplies given matrices in left-to-right order. A | ||
* minimum of 2 input matrices must be given. If `out` is null, writes | ||
* Concatenates / multiplies given matrices (min. 2 required) in left-to-right | ||
* order. A minimum of 2 input matrices must be given. If `out` is null, writes | ||
* result into `a`. | ||
@@ -10,5 +10,5 @@ * | ||
* @param b - | ||
* @param xs - | ||
* @param rest - | ||
*/ | ||
export declare const concat: (out: Mat | null, a: ReadonlyMat, b: ReadonlyMat, ...xs: ReadonlyMat[]) => Mat; | ||
export declare const concat: (out: Mat | null, a: ReadonlyMat, b: ReadonlyMat, ...rest: ReadonlyMat[]) => Mat; | ||
//# sourceMappingURL=concat.d.ts.map |
import { mulM } from "./mulm.js"; | ||
const concat = (out, a, b, ...xs) => xs.reduce((acc, x) => mulM(acc, acc, x), mulM(out, a, b)); | ||
const concat = (out, a, b, ...rest) => rest.reduce((acc, x) => mulM(acc, acc, x), mulM(out, a, b)); | ||
export { | ||
concat | ||
}; |
import { dotC4, dotC6 } from "@thi.ng/vectors/dotc"; | ||
const dp4 = dotC4; | ||
const dp6 = dotC6; | ||
const det22 = (m) => dp4(m[0], m[3], -m[1], m[2]); | ||
const det22 = (m) => dotC4(m[0], m[3], -m[1], m[2]); | ||
const det23 = det22; | ||
const det33 = (m) => { | ||
const [m00, m01, m02, m10, m11, m12, m20, m21, m22] = m; | ||
const d01 = dp4(m22, m11, -m12, m21); | ||
const d11 = dp4(m12, m20, -m22, m10); | ||
const d21 = dp4(m21, m10, -m11, m20); | ||
return dp6(m00, d01, m01, d11, m02, d21); | ||
const d01 = dotC4(m22, m11, -m12, m21); | ||
const d11 = dotC4(m12, m20, -m22, m10); | ||
const d21 = dotC4(m21, m10, -m11, m20); | ||
return dotC6(m00, d01, m01, d11, m02, d21); | ||
}; | ||
@@ -33,17 +31,17 @@ const detCoeffs44 = (m) => { | ||
return [ | ||
dp4(m00, m11, -m01, m10), | ||
dp4(m00, m12, -m02, m10), | ||
dp4(m00, m13, -m03, m10), | ||
dp4(m01, m12, -m02, m11), | ||
dp4(m01, m13, -m03, m11), | ||
dp4(m02, m13, -m03, m12), | ||
dp4(m20, m31, -m21, m30), | ||
dp4(m20, m32, -m22, m30), | ||
dp4(m20, m33, -m23, m30), | ||
dp4(m21, m32, -m22, m31), | ||
dp4(m21, m33, -m23, m31), | ||
dp4(m22, m33, -m23, m32) | ||
dotC4(m00, m11, -m01, m10), | ||
dotC4(m00, m12, -m02, m10), | ||
dotC4(m00, m13, -m03, m10), | ||
dotC4(m01, m12, -m02, m11), | ||
dotC4(m01, m13, -m03, m11), | ||
dotC4(m02, m13, -m03, m12), | ||
dotC4(m20, m31, -m21, m30), | ||
dotC4(m20, m32, -m22, m30), | ||
dotC4(m20, m33, -m23, m30), | ||
dotC4(m21, m32, -m22, m31), | ||
dotC4(m21, m33, -m23, m31), | ||
dotC4(m22, m33, -m23, m32) | ||
]; | ||
}; | ||
const det44FromCoeffs = (d) => dp6(d[0], d[11], -d[1], d[10], d[2], d[9]) + dp6(d[3], d[8], -d[4], d[7], d[5], d[6]); | ||
const det44FromCoeffs = (d) => dotC6(d[0], d[11], -d[1], d[10], d[2], d[9]) + dotC6(d[3], d[8], -d[4], d[7], d[5], d[6]); | ||
const det44 = (m) => det44FromCoeffs(detCoeffs44(m)); | ||
@@ -50,0 +48,0 @@ export { |
@@ -6,8 +6,6 @@ import { dotC4, dotC6 } from "@thi.ng/vectors/dotc"; | ||
import { det44FromCoeffs, detCoeffs44 } from "./determinant.js"; | ||
const dp4 = dotC4; | ||
const dp6 = dotC6; | ||
const invert = vop(1); | ||
const invert22 = invert.add(4, (out, m) => { | ||
const [m00, m01, m10, m11] = m; | ||
let det = dp4(m00, m11, -m01, m10); | ||
let det = dotC4(m00, m11, -m01, m10); | ||
if (det === 0) return; | ||
@@ -19,3 +17,3 @@ det = 1 / det; | ||
const [m00, m01, m10, m11, m20, m21] = m; | ||
let det = dp4(m00, m11, -m01, m10); | ||
let det = dotC4(m00, m11, -m01, m10); | ||
if (det === 0) return; | ||
@@ -29,4 +27,4 @@ det = 1 / det; | ||
m00 * det, | ||
dp4(m10, m21, -m11, m20) * det, | ||
dp4(m01, m20, -m00, m21) * det | ||
dotC4(m10, m21, -m11, m20) * det, | ||
dotC4(m01, m20, -m00, m21) * det | ||
); | ||
@@ -36,6 +34,6 @@ }); | ||
const [m00, m01, m02, m10, m11, m12, m20, m21, m22] = m; | ||
const d01 = dp4(m22, m11, -m12, m21); | ||
const d11 = dp4(m12, m20, -m22, m10); | ||
const d21 = dp4(m21, m10, -m11, m20); | ||
let det = dp6(m00, d01, m01, d11, m02, d21); | ||
const d01 = dotC4(m22, m11, -m12, m21); | ||
const d11 = dotC4(m12, m20, -m22, m10); | ||
const d21 = dotC4(m21, m10, -m11, m20); | ||
let det = dotC6(m00, d01, m01, d11, m02, d21); | ||
if (det === 0) return; | ||
@@ -46,10 +44,10 @@ det = 1 / det; | ||
d01 * det, | ||
dp4(-m22, m01, m02, m21) * det, | ||
dp4(m12, m01, -m02, m11) * det, | ||
dotC4(-m22, m01, m02, m21) * det, | ||
dotC4(m12, m01, -m02, m11) * det, | ||
d11 * det, | ||
dp4(m22, m00, -m02, m20) * det, | ||
dp4(-m12, m00, m02, m10) * det, | ||
dotC4(m22, m00, -m02, m20) * det, | ||
dotC4(-m12, m00, m02, m10) * det, | ||
d21 * det, | ||
dp4(-m21, m00, m01, m20) * det, | ||
dp4(m11, m00, -m01, m10) * det | ||
dotC4(-m21, m00, m01, m20) * det, | ||
dotC4(m11, m00, -m01, m10) * det | ||
); | ||
@@ -83,18 +81,18 @@ }); | ||
out || m, | ||
dp6(m11, d11, -m12, d10, m13, d09) * det, | ||
dp6(-m01, d11, m02, d10, -m03, d09) * det, | ||
dp6(m31, d05, -m32, d04, m33, d03) * det, | ||
dp6(-m21, d05, m22, d04, -m23, d03) * det, | ||
dp6(-m10, d11, m12, d08, -m13, d07) * det, | ||
dp6(m00, d11, -m02, d08, m03, d07) * det, | ||
dp6(-m30, d05, m32, d02, -m33, d01) * det, | ||
dp6(m20, d05, -m22, d02, m23, d01) * det, | ||
dp6(m10, d10, -m11, d08, m13, d06) * det, | ||
dp6(-m00, d10, m01, d08, -m03, d06) * det, | ||
dp6(m30, d04, -m31, d02, m33, d00) * det, | ||
dp6(-m20, d04, m21, d02, -m23, d00) * det, | ||
dp6(-m10, d09, m11, d07, -m12, d06) * det, | ||
dp6(m00, d09, -m01, d07, m02, d06) * det, | ||
dp6(-m30, d03, m31, d01, -m32, d00) * det, | ||
dp6(m20, d03, -m21, d01, m22, d00) * det | ||
dotC6(m11, d11, -m12, d10, m13, d09) * det, | ||
dotC6(-m01, d11, m02, d10, -m03, d09) * det, | ||
dotC6(m31, d05, -m32, d04, m33, d03) * det, | ||
dotC6(-m21, d05, m22, d04, -m23, d03) * det, | ||
dotC6(-m10, d11, m12, d08, -m13, d07) * det, | ||
dotC6(m00, d11, -m02, d08, m03, d07) * det, | ||
dotC6(-m30, d05, m32, d02, -m33, d01) * det, | ||
dotC6(m20, d05, -m22, d02, m23, d01) * det, | ||
dotC6(m10, d10, -m11, d08, m13, d06) * det, | ||
dotC6(-m00, d10, m01, d08, -m03, d06) * det, | ||
dotC6(m30, d04, -m31, d02, m33, d00) * det, | ||
dotC6(-m20, d04, m21, d02, -m23, d00) * det, | ||
dotC6(-m10, d09, m11, d07, -m12, d06) * det, | ||
dotC6(m00, d09, -m01, d07, m02, d06) * det, | ||
dotC6(-m30, d03, m31, d01, -m32, d00) * det, | ||
dotC6(m20, d03, -m21, d01, m22, d00) * det | ||
); | ||
@@ -105,3 +103,3 @@ }); | ||
d = d > 0 ? -1 / d : 0; | ||
return setC4(out || a, a[0] * d, a[1] * d, a[2] * d, a[3] * -d); | ||
return setC4(out || a, a[0] * d, a[1] * d, a[2] * d, -a[3] * d); | ||
}; | ||
@@ -108,0 +106,0 @@ export { |
{ | ||
"name": "@thi.ng/matrices", | ||
"version": "2.3.37", | ||
"version": "2.4.0", | ||
"description": "Matrix & quaternion operations for 2D/3D geometry processing", | ||
@@ -13,3 +13,3 @@ "type": "module", | ||
}, | ||
"homepage": "https://github.com/thi-ng/umbrella/tree/develop/packages/matrices#readme", | ||
"homepage": "https://thi.ng/matrices", | ||
"funding": [ | ||
@@ -40,12 +40,12 @@ { | ||
"dependencies": { | ||
"@thi.ng/api": "^8.11.2", | ||
"@thi.ng/checks": "^3.6.4", | ||
"@thi.ng/math": "^5.10.13", | ||
"@thi.ng/vectors": "^7.10.31" | ||
"@thi.ng/api": "^8.11.3", | ||
"@thi.ng/checks": "^3.6.5", | ||
"@thi.ng/math": "^5.11.0", | ||
"@thi.ng/vectors": "^7.11.0" | ||
}, | ||
"devDependencies": { | ||
"@microsoft/api-extractor": "^7.43.2", | ||
"esbuild": "^0.21.1", | ||
"@microsoft/api-extractor": "^7.47.0", | ||
"esbuild": "^0.21.5", | ||
"typedoc": "^0.25.13", | ||
"typescript": "^5.4.5" | ||
"typescript": "^5.5.2" | ||
}, | ||
@@ -280,3 +280,3 @@ "keywords": [ | ||
}, | ||
"gitHead": "df34b4a9e650cc7323575356de207d78933bdcf3\n" | ||
"gitHead": "154c95cf9d6bab32174498ec3b5b5d87e42be7f9\n" | ||
} |
@@ -1,9 +0,2 @@ | ||
declare const axisOrder: { | ||
xyz: import("@thi.ng/vectors/api").ReadonlyVec[]; | ||
yxz: import("@thi.ng/vectors/api").ReadonlyVec[]; | ||
xzy: import("@thi.ng/vectors/api").ReadonlyVec[]; | ||
zxy: import("@thi.ng/vectors/api").ReadonlyVec[]; | ||
yzx: import("@thi.ng/vectors/api").ReadonlyVec[]; | ||
zyx: import("@thi.ng/vectors/api").ReadonlyVec[]; | ||
}; | ||
export type AxisOrder = "xyz" | "yxz" | "xzy" | "zxy" | "yzx" | "zyx"; | ||
/** | ||
@@ -18,4 +11,3 @@ * Constructs a quaternion from given rotation angles in specified | ||
*/ | ||
export declare const quatFromEuler: (order: keyof typeof axisOrder, a: number, b: number, c: number) => import("@thi.ng/vectors/api").Vec; | ||
export {}; | ||
export declare const quatFromEuler: (order: AxisOrder, a: number, b: number, c: number) => import("@thi.ng/vectors/api").Vec; | ||
//# sourceMappingURL=quat-euler.d.ts.map |
import { X3, Y3, Z3 } from "@thi.ng/vectors/api"; | ||
import { mulQ } from "./mulq.js"; | ||
import { quatFromAxisAngle } from "./quat-axis-angle.js"; | ||
const axisOrder = { | ||
const AXIS_ORDER = { | ||
xyz: [X3, Y3, Z3], | ||
@@ -13,3 +13,3 @@ yxz: [Y3, X3, Z3], | ||
const quatFromEuler = (order, a, b, c) => { | ||
const [aa, ab, ac] = axisOrder[order]; | ||
const [aa, ab, ac] = AXIS_ORDER[order]; | ||
return mulQ( | ||
@@ -16,0 +16,0 @@ null, |
@@ -10,3 +10,3 @@ <!-- This file is generated - DO NOT EDIT! --> | ||
> [!NOTE] | ||
> This is one of 192 standalone projects, maintained as part | ||
> This is one of 193 standalone projects, maintained as part | ||
> of the [@thi.ng/umbrella](https://github.com/thi-ng/umbrella/) monorepo | ||
@@ -96,3 +96,3 @@ > and anti-framework. | ||
Package sizes (brotli'd, pre-treeshake): ESM: 5.08 KB | ||
Package sizes (brotli'd, pre-treeshake): ESM: 5.06 KB | ||
@@ -112,19 +112,21 @@ ## Dependencies | ||
| Screenshot | Description | Live demo | Source | | ||
|:-------------------------------------------------------------------------------------------------------------------------------------|:---------------------------------------------------------------------------------------------|:---------------------------------------------------------|:--------------------------------------------------------------------------------------| | ||
| <img src="https://raw.githubusercontent.com/thi-ng/umbrella/develop/assets/examples/geom-sdf-logo.jpg" width="240"/> | (Re)Constructing the thi.ng logo using a 2D signed-distance field | [Demo](https://demo.thi.ng/umbrella/geom-sdf-logo/) | [Source](https://github.com/thi-ng/umbrella/tree/develop/examples/geom-sdf-logo) | | ||
| <img src="https://raw.githubusercontent.com/thi-ng/umbrella/develop/assets/hdom-canvas/hdom-canvas-shapes-results.png" width="240"/> | Various hdom-canvas shape drawing examples & SVG conversion / export | [Demo](https://demo.thi.ng/umbrella/hdom-canvas-shapes/) | [Source](https://github.com/thi-ng/umbrella/tree/develop/examples/hdom-canvas-shapes) | | ||
| <img src="https://raw.githubusercontent.com/thi-ng/umbrella/develop/assets/examples/ifs-fractal.jpg" width="240"/> | Barnsley fern IFS fractal renderer | [Demo](https://demo.thi.ng/umbrella/ifs-fractal/) | [Source](https://github.com/thi-ng/umbrella/tree/develop/examples/ifs-fractal) | | ||
| <img src="https://raw.githubusercontent.com/thi-ng/umbrella/develop/assets/examples/pointfree-geom.jpg" width="240"/> | Live coding playground for 2D geometry generation using @thi.ng/pointfree-lang | [Demo](https://demo.thi.ng/umbrella/pointfree-geom/) | [Source](https://github.com/thi-ng/umbrella/tree/develop/examples/pointfree-geom) | | ||
| <img src="https://raw.githubusercontent.com/thi-ng/umbrella/develop/assets/examples/scenegraph.png" width="240"/> | 2D scenegraph & shape picking | [Demo](https://demo.thi.ng/umbrella/scenegraph/) | [Source](https://github.com/thi-ng/umbrella/tree/develop/examples/scenegraph) | | ||
| <img src="https://raw.githubusercontent.com/thi-ng/umbrella/develop/assets/examples/scenegraph-image.png" width="240"/> | 2D scenegraph & image map based geometry manipulation | [Demo](https://demo.thi.ng/umbrella/scenegraph-image/) | [Source](https://github.com/thi-ng/umbrella/tree/develop/examples/scenegraph-image) | | ||
| <img src="https://raw.githubusercontent.com/thi-ng/umbrella/develop/assets/examples/shader-graph.jpg" width="240"/> | Minimal shader graph developed during livestream #2 | [Demo](https://demo.thi.ng/umbrella/shader-graph/) | [Source](https://github.com/thi-ng/umbrella/tree/develop/examples/shader-graph) | | ||
| <img src="https://raw.githubusercontent.com/thi-ng/umbrella/develop/assets/examples/simd-plot.png" width="240"/> | Fitting, transforming & plotting 10k data points per frame using SIMD | [Demo](https://demo.thi.ng/umbrella/simd-plot/) | [Source](https://github.com/thi-ng/umbrella/tree/develop/examples/simd-plot) | | ||
| <img src="https://raw.githubusercontent.com/thi-ng/umbrella/develop/assets/examples/soa-ecs-100k.png" width="240"/> | Entity Component System w/ 100k 3D particles | [Demo](https://demo.thi.ng/umbrella/soa-ecs/) | [Source](https://github.com/thi-ng/umbrella/tree/develop/examples/soa-ecs) | | ||
| <img src="https://raw.githubusercontent.com/thi-ng/umbrella/develop/assets/examples/text-canvas.png" width="240"/> | 3D wireframe textmode demo | [Demo](https://demo.thi.ng/umbrella/text-canvas/) | [Source](https://github.com/thi-ng/umbrella/tree/develop/examples/text-canvas) | | ||
| <img src="https://raw.githubusercontent.com/thi-ng/umbrella/develop/assets/examples/unbiased-normals.png" width="240"/> | Visual comparison of biased vs. unbiased normal vectors projected on the surface of a sphere | [Demo](https://demo.thi.ng/umbrella/unbiased-normals/) | [Source](https://github.com/thi-ng/umbrella/tree/develop/examples/unbiased-normals) | | ||
| <img src="https://raw.githubusercontent.com/thi-ng/umbrella/develop/assets/examples/webgl-cube.png" width="240"/> | WebGL multi-colored cube mesh | [Demo](https://demo.thi.ng/umbrella/webgl-cube/) | [Source](https://github.com/thi-ng/umbrella/tree/develop/examples/webgl-cube) | | ||
| <img src="https://raw.githubusercontent.com/thi-ng/umbrella/develop/assets/examples/webgl-cubemap.jpg" width="240"/> | WebGL cube maps with async texture loading | [Demo](https://demo.thi.ng/umbrella/webgl-cubemap/) | [Source](https://github.com/thi-ng/umbrella/tree/develop/examples/webgl-cubemap) | | ||
| <img src="https://raw.githubusercontent.com/thi-ng/umbrella/develop/assets/examples/webgl-grid.jpg" width="240"/> | WebGL instancing, animated grid | [Demo](https://demo.thi.ng/umbrella/webgl-grid/) | [Source](https://github.com/thi-ng/umbrella/tree/develop/examples/webgl-grid) | | ||
| <img src="https://raw.githubusercontent.com/thi-ng/umbrella/develop/assets/examples/webgl-msdf.jpg" width="240"/> | WebGL MSDF text rendering & particle system | [Demo](https://demo.thi.ng/umbrella/webgl-msdf/) | [Source](https://github.com/thi-ng/umbrella/tree/develop/examples/webgl-msdf) | | ||
| Screenshot | Description | Live demo | Source | | ||
|:-------------------------------------------------------------------------------------------------------------------------------------|:---------------------------------------------------------------------------------------------|:-------------------------------------------------------------|:------------------------------------------------------------------------------------------| | ||
| <img src="https://raw.githubusercontent.com/thi-ng/umbrella/develop/assets/examples/geom-sdf-logo.jpg" width="240"/> | (Re)Constructing the thi.ng logo using a 2D signed-distance field | [Demo](https://demo.thi.ng/umbrella/geom-sdf-logo/) | [Source](https://github.com/thi-ng/umbrella/tree/develop/examples/geom-sdf-logo) | | ||
| <img src="https://raw.githubusercontent.com/thi-ng/umbrella/develop/assets/examples/geom-webgl-attrib-pool.jpg" width="240"/> | Augmenting thi.ng/geom shapes for WebGL, using instancing & attribute buffers | [Demo](https://demo.thi.ng/umbrella/geom-webgl-attrib-pool/) | [Source](https://github.com/thi-ng/umbrella/tree/develop/examples/geom-webgl-attrib-pool) | | ||
| <img src="https://raw.githubusercontent.com/thi-ng/umbrella/develop/assets/examples/geom-webgl-basics.jpg" width="240"/> | Converting thi.ng/geom shape types for WebGL | [Demo](https://demo.thi.ng/umbrella/geom-webgl-basics/) | [Source](https://github.com/thi-ng/umbrella/tree/develop/examples/geom-webgl-basics) | | ||
| <img src="https://raw.githubusercontent.com/thi-ng/umbrella/develop/assets/hdom-canvas/hdom-canvas-shapes-results.png" width="240"/> | Various hdom-canvas shape drawing examples & SVG conversion / export | [Demo](https://demo.thi.ng/umbrella/hdom-canvas-shapes/) | [Source](https://github.com/thi-ng/umbrella/tree/develop/examples/hdom-canvas-shapes) | | ||
| <img src="https://raw.githubusercontent.com/thi-ng/umbrella/develop/assets/examples/ifs-fractal.jpg" width="240"/> | Barnsley fern IFS fractal renderer | [Demo](https://demo.thi.ng/umbrella/ifs-fractal/) | [Source](https://github.com/thi-ng/umbrella/tree/develop/examples/ifs-fractal) | | ||
| <img src="https://raw.githubusercontent.com/thi-ng/umbrella/develop/assets/examples/pointfree-geom.jpg" width="240"/> | Live coding playground for 2D geometry generation using @thi.ng/pointfree-lang | [Demo](https://demo.thi.ng/umbrella/pointfree-geom/) | [Source](https://github.com/thi-ng/umbrella/tree/develop/examples/pointfree-geom) | | ||
| <img src="https://raw.githubusercontent.com/thi-ng/umbrella/develop/assets/examples/scenegraph.png" width="240"/> | 2D scenegraph & shape picking | [Demo](https://demo.thi.ng/umbrella/scenegraph/) | [Source](https://github.com/thi-ng/umbrella/tree/develop/examples/scenegraph) | | ||
| <img src="https://raw.githubusercontent.com/thi-ng/umbrella/develop/assets/examples/scenegraph-image.png" width="240"/> | 2D scenegraph & image map based geometry manipulation | [Demo](https://demo.thi.ng/umbrella/scenegraph-image/) | [Source](https://github.com/thi-ng/umbrella/tree/develop/examples/scenegraph-image) | | ||
| <img src="https://raw.githubusercontent.com/thi-ng/umbrella/develop/assets/examples/shader-graph.jpg" width="240"/> | Minimal shader graph developed during livestream #2 | [Demo](https://demo.thi.ng/umbrella/shader-graph/) | [Source](https://github.com/thi-ng/umbrella/tree/develop/examples/shader-graph) | | ||
| <img src="https://raw.githubusercontent.com/thi-ng/umbrella/develop/assets/examples/simd-plot.png" width="240"/> | Fitting, transforming & plotting 10k data points per frame using SIMD | [Demo](https://demo.thi.ng/umbrella/simd-plot/) | [Source](https://github.com/thi-ng/umbrella/tree/develop/examples/simd-plot) | | ||
| <img src="https://raw.githubusercontent.com/thi-ng/umbrella/develop/assets/examples/soa-ecs-100k.png" width="240"/> | Entity Component System w/ 100k 3D particles | [Demo](https://demo.thi.ng/umbrella/soa-ecs/) | [Source](https://github.com/thi-ng/umbrella/tree/develop/examples/soa-ecs) | | ||
| <img src="https://raw.githubusercontent.com/thi-ng/umbrella/develop/assets/examples/text-canvas.png" width="240"/> | 3D wireframe textmode demo | [Demo](https://demo.thi.ng/umbrella/text-canvas/) | [Source](https://github.com/thi-ng/umbrella/tree/develop/examples/text-canvas) | | ||
| <img src="https://raw.githubusercontent.com/thi-ng/umbrella/develop/assets/examples/unbiased-normals.png" width="240"/> | Visual comparison of biased vs. unbiased normal vectors projected on the surface of a sphere | [Demo](https://demo.thi.ng/umbrella/unbiased-normals/) | [Source](https://github.com/thi-ng/umbrella/tree/develop/examples/unbiased-normals) | | ||
| <img src="https://raw.githubusercontent.com/thi-ng/umbrella/develop/assets/examples/webgl-cube.png" width="240"/> | WebGL multi-colored cube mesh | [Demo](https://demo.thi.ng/umbrella/webgl-cube/) | [Source](https://github.com/thi-ng/umbrella/tree/develop/examples/webgl-cube) | | ||
| <img src="https://raw.githubusercontent.com/thi-ng/umbrella/develop/assets/examples/webgl-cubemap.jpg" width="240"/> | WebGL cube maps with async texture loading | [Demo](https://demo.thi.ng/umbrella/webgl-cubemap/) | [Source](https://github.com/thi-ng/umbrella/tree/develop/examples/webgl-cubemap) | | ||
| <img src="https://raw.githubusercontent.com/thi-ng/umbrella/develop/assets/examples/webgl-grid.jpg" width="240"/> | WebGL instancing, animated grid | [Demo](https://demo.thi.ng/umbrella/webgl-grid/) | [Source](https://github.com/thi-ng/umbrella/tree/develop/examples/webgl-grid) | | ||
| <img src="https://raw.githubusercontent.com/thi-ng/umbrella/develop/assets/examples/webgl-msdf.jpg" width="240"/> | WebGL MSDF text rendering & particle system | [Demo](https://demo.thi.ng/umbrella/webgl-msdf/) | [Source](https://github.com/thi-ng/umbrella/tree/develop/examples/webgl-msdf) | | ||
@@ -131,0 +133,0 @@ ## API |
109425
254
2499
Updated@thi.ng/api@^8.11.3
Updated@thi.ng/checks@^3.6.5
Updated@thi.ng/math@^5.11.0
Updated@thi.ng/vectors@^7.11.0