@cgtk/gp 0.0.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (4) hide show
  1. package/gp.wasm +0 -0
  2. package/index.d.ts +77 -0
  3. package/index.js +75 -0
  4. package/package.json +26 -0
package/gp.wasm ADDED
Binary file
package/index.d.ts ADDED
@@ -0,0 +1,77 @@
1
+ import type { Fn, FnV, Resource, TypedArray } from "@cgtk/std/types";
2
+ import { type View, type Struct } from "@cgtk/std/struct";
3
+ import { type Constructor } from "@cgtk/std/typedarray";
4
+ import type { IndexedMesh } from "@cgtk/geometry/types";
5
+ export declare const wasmInit: <T>(source: Response | PromiseLike<Response>, imports?: WebAssembly.Imports) => Promise<T>;
6
+ interface Mod {
7
+ memory: WebAssembly.Memory;
8
+ malloc(size: number): number;
9
+ free(ptr: number, size: number): number;
10
+ }
11
+ interface Alloc<T> {
12
+ ptr: number;
13
+ value: T;
14
+ }
15
+ export interface GP extends Mod {
16
+ vertex_position_geometry: FnV<[number, number], number>;
17
+ free_vertex_position_geometry: Fn<number, void>;
18
+ n_faces: Fn<number, number>;
19
+ n_halfedges: Fn<number, number>;
20
+ h2f: FnV<[number, number], number>;
21
+ f2h: FnV<[number, number], number>;
22
+ h_next: FnV<[number, number], number>;
23
+ h_twin: FnV<[number, number], number>;
24
+ double_area: FnV<[number, number], number>;
25
+ double_areas: FnV<[number, number], void>;
26
+ face_normals: FnV<[number, number], void>;
27
+ internal_angles: FnV<[number, number], void>;
28
+ vertex_normals_area_weighted: FnV<[number, number], void>;
29
+ vertex_normals_angle_weighted: FnV<[number, number], void>;
30
+ angle_defects: FnV<[number, number], void>;
31
+ }
32
+ export declare const allocators: (mod: Mod) => {
33
+ struct: <T extends Struct<any>>(s: T) => Resource<Alloc<View<T>>>;
34
+ array: <T extends TypedArray>(ctor: Constructor<T>, length: number) => Resource<Alloc<T>>;
35
+ data: <T extends TypedArray>(vals: T) => Resource<Alloc<T>>;
36
+ slice: <T extends TypedArray>(a: Alloc<T>) => Resource<Alloc<{
37
+ ptr: number;
38
+ len: number;
39
+ }>>;
40
+ dataSlice: <T extends TypedArray>(data: T) => Resource<Alloc<{
41
+ ptr: number;
42
+ len: number;
43
+ }>>;
44
+ };
45
+ export declare const init: (url?: any, imports?: WebAssembly.Imports) => Promise<{
46
+ alloc: {
47
+ struct: <T extends Struct<any>>(s: T) => Resource<Alloc<View<T>>>;
48
+ array: <T extends TypedArray>(ctor: Constructor<T>, length: number) => Resource<Alloc<T>>;
49
+ data: <T extends TypedArray>(vals: T) => Resource<Alloc<T>>;
50
+ slice: <T extends TypedArray>(a: Alloc<T>) => Resource<Alloc<{
51
+ ptr: number;
52
+ len: number;
53
+ }>>;
54
+ dataSlice: <T extends TypedArray>(data: T) => Resource<Alloc<{
55
+ ptr: number;
56
+ len: number;
57
+ }>>;
58
+ };
59
+ vertexPositionGeometry: (mesh: IndexedMesh<{
60
+ position: Float32Array;
61
+ }, Uint32Array>) => Resource<{
62
+ nFaces: () => number;
63
+ nHalfedges: () => number;
64
+ h2f: (i: number) => number;
65
+ hNext: (i: number) => number;
66
+ hTwin: (i: number) => number;
67
+ f2h: (i: number) => number;
68
+ doubleArea: (i: number) => number;
69
+ doubleAreas: <T extends TypedArray>(res: T) => T;
70
+ faceNormals: <T extends TypedArray>(res: T) => T;
71
+ internalAngles: <T extends TypedArray>(res: T) => T;
72
+ vertexNormalsAreaWeighted: <T extends TypedArray>(res: T) => T;
73
+ vertexNormalsAngleWeighted: <T extends TypedArray>(res: T) => T;
74
+ angleDefects: <T extends TypedArray>(res: T) => T;
75
+ }>;
76
+ }>;
77
+ export {};
package/index.js ADDED
@@ -0,0 +1,75 @@
1
+ import { bind } from "@cgtk/std/fn";
2
+ import { resource, map, flatMap, combine } from "@cgtk/std/resource";
3
+ import { struct, view, u32 } from "@cgtk/std/struct";
4
+ import { ctor } from "@cgtk/std/typedarray";
5
+ import wasmURL from './gp.wasm?url';
6
+ export const wasmInit = async (source, imports) => (await WebAssembly.instantiateStreaming(source, imports)).instance.exports;
7
+ ;
8
+ const allocStruct = (mod, s) => {
9
+ const ptr = mod.malloc(s.size);
10
+ const value = view(s, mod.memory.buffer, ptr);
11
+ return resource({ ptr, value }, () => mod.free(ptr, s.size));
12
+ };
13
+ const allocArray = (mod, ctor, length) => {
14
+ const ptr = mod.malloc(ctor.BYTES_PER_ELEMENT * length);
15
+ const value = new ctor(mod.memory.buffer, ptr, length);
16
+ return resource({ ptr, value }, () => mod.free(ptr, value.byteLength));
17
+ };
18
+ const allocdata = (mod, data) => map(allocArray(mod, ctor(data), data.length), p => {
19
+ p.value.set(data);
20
+ return p;
21
+ });
22
+ const Slice = struct([["ptr", u32()], ["len", u32()]]);
23
+ const allocSlice = (mod, a) => map(allocStruct(mod, Slice), x => {
24
+ x.value.ptr = a.ptr;
25
+ x.value.len = a.value.length;
26
+ return x;
27
+ });
28
+ const allocDataSlice = (mod, data) => flatMap(allocdata(mod, data), bind((allocSlice), mod));
29
+ export const allocators = (mod) => ({
30
+ struct: (s) => allocStruct(mod, s),
31
+ array: (ctor, length) => allocArray(mod, ctor, length),
32
+ data: (vals) => allocdata(mod, vals),
33
+ slice: (a) => allocSlice(mod, a),
34
+ dataSlice: (data) => allocDataSlice(mod, data),
35
+ });
36
+ export const init = async (url = wasmURL, imports = {
37
+ env: {
38
+ memory: new WebAssembly.Memory({ initial: 20, maximum: 100 })
39
+ },
40
+ console: { log: console.log },
41
+ }) => {
42
+ const mod = await wasmInit(fetch(url), imports);
43
+ const alloc = allocators(mod);
44
+ return {
45
+ alloc,
46
+ vertexPositionGeometry: (mesh) => flatMap(combine({
47
+ pFace: alloc.dataSlice(mesh.indices),
48
+ pPos: alloc.dataSlice(mesh.attribs.position)
49
+ }), ({ pFace, pPos }) => {
50
+ const ptr = mod.vertex_position_geometry(pFace.ptr, pPos.ptr);
51
+ const withResult = (res, f) => {
52
+ alloc.array(ctor(res), res.length)(data => alloc.slice(data)(s => {
53
+ f(s);
54
+ res.set(data.value);
55
+ }))();
56
+ return res;
57
+ };
58
+ return resource({
59
+ nFaces: () => mod.n_faces(ptr),
60
+ nHalfedges: () => mod.n_halfedges(ptr),
61
+ h2f: (i) => mod.h2f(ptr, i),
62
+ hNext: (i) => mod.h_next(ptr, i),
63
+ hTwin: (i) => mod.h_twin(ptr, i),
64
+ f2h: (i) => mod.f2h(ptr, i),
65
+ doubleArea: (i) => mod.double_area(ptr, i),
66
+ doubleAreas: (res) => withResult(res, s => mod.double_areas(ptr, s.ptr)),
67
+ faceNormals: (res) => withResult(res, s => mod.face_normals(ptr, s.ptr)),
68
+ internalAngles: (res) => withResult(res, s => mod.internal_angles(ptr, s.ptr)),
69
+ vertexNormalsAreaWeighted: (res) => withResult(res, s => mod.vertex_normals_area_weighted(ptr, s.ptr)),
70
+ vertexNormalsAngleWeighted: (res) => withResult(res, s => mod.vertex_normals_angle_weighted(ptr, s.ptr)),
71
+ angleDefects: (res) => withResult(res, s => mod.angle_defects(ptr, s.ptr)),
72
+ }, () => mod.free_vertex_position_geometry(ptr));
73
+ })
74
+ };
75
+ };
package/package.json ADDED
@@ -0,0 +1,26 @@
1
+ {
2
+ "name": "@cgtk/gp",
3
+ "version": "0.0.13",
4
+ "type": "module",
5
+ "main": "./index.js",
6
+ "exports": {
7
+ ".": "./index.js"
8
+ },
9
+ "files": [
10
+ "**/*.js",
11
+ "**/*.d.ts",
12
+ "**/*.wasm"
13
+ ],
14
+ "dependencies": {
15
+ "@cgtk/geometry": "~0.0.19",
16
+ "@cgtk/std": "~0.0.188"
17
+ },
18
+ "devDependencies": {
19
+ "@types/bun": "^1.3.8",
20
+ "@types/node": "^25.2.1",
21
+ "typescript": "^5.9.3"
22
+ },
23
+ "publishConfig": {
24
+ "access": "public"
25
+ }
26
+ }