From d4ca596cdd96b7d32df17afb3713e851dabfc2e1 Mon Sep 17 00:00:00 2001 From: John Gatward Date: Fri, 20 Mar 2026 19:50:57 +0000 Subject: [PATCH] add flocking pkg/ --- projects/flocking/pkg/flocking.d.ts | 67 ++++ projects/flocking/pkg/flocking.js | 388 ++++++++++++++++++++ projects/flocking/pkg/flocking_bg.wasm | Bin 0 -> 54070 bytes projects/flocking/pkg/flocking_bg.wasm.d.ts | 20 + projects/flocking/pkg/package.json | 15 + script.js | 2 +- 6 files changed, 491 insertions(+), 1 deletion(-) create mode 100644 projects/flocking/pkg/flocking.d.ts create mode 100644 projects/flocking/pkg/flocking.js create mode 100644 projects/flocking/pkg/flocking_bg.wasm create mode 100644 projects/flocking/pkg/flocking_bg.wasm.d.ts create mode 100644 projects/flocking/pkg/package.json diff --git a/projects/flocking/pkg/flocking.d.ts b/projects/flocking/pkg/flocking.d.ts new file mode 100644 index 0000000..ba88299 --- /dev/null +++ b/projects/flocking/pkg/flocking.d.ts @@ -0,0 +1,67 @@ +/* tslint:disable */ +/* eslint-disable */ + +export class SimulationWasm { + free(): void; + [Symbol.dispose](): void; + add_boid(): void; + boid_buffer_len(): number; + boid_buffer_ptr(): number; + boid_buffer_stride(): number; + get_align_mult(): number; + get_boid_count(): number; + get_cohesion_mult(): number; + get_separation_mult(): number; + constructor(width: number, height: number, num_boids: number); + remove_boid(): void; + resize(width: number, height: number): void; + set_align_mult(value: number): void; + set_cohesion_mult(value: number): void; + set_separation_mult(value: number): void; + step(): void; +} + +export type InitInput = RequestInfo | URL | Response | BufferSource | WebAssembly.Module; + +export interface InitOutput { + readonly memory: WebAssembly.Memory; + readonly __wbg_simulationwasm_free: (a: number, b: number) => void; + readonly simulationwasm_add_boid: (a: number) => void; + readonly simulationwasm_boid_buffer_len: (a: number) => number; + readonly simulationwasm_boid_buffer_ptr: (a: number) => number; + readonly simulationwasm_boid_buffer_stride: (a: number) => number; + readonly simulationwasm_get_align_mult: (a: number) => number; + readonly simulationwasm_get_boid_count: (a: number) => number; + readonly simulationwasm_get_cohesion_mult: (a: number) => number; + readonly simulationwasm_get_separation_mult: (a: number) => number; + readonly simulationwasm_new: (a: number, b: number, c: number) => number; + readonly simulationwasm_remove_boid: (a: number) => void; + readonly simulationwasm_resize: (a: number, b: number, c: number) => void; + readonly simulationwasm_set_align_mult: (a: number, b: number) => void; + readonly simulationwasm_set_cohesion_mult: (a: number, b: number) => void; + readonly simulationwasm_set_separation_mult: (a: number, b: number) => void; + readonly simulationwasm_step: (a: number) => void; + readonly __wbindgen_export: (a: number) => void; +} + +export type SyncInitInput = BufferSource | WebAssembly.Module; + +/** + * Instantiates the given `module`, which can either be bytes or + * a precompiled `WebAssembly.Module`. + * + * @param {{ module: SyncInitInput }} module - Passing `SyncInitInput` directly is deprecated. + * + * @returns {InitOutput} + */ +export function initSync(module: { module: SyncInitInput } | SyncInitInput): InitOutput; + +/** + * If `module_or_path` is {RequestInfo} or {URL}, makes a request and + * for everything else, calls `WebAssembly.instantiate` directly. + * + * @param {{ module_or_path: InitInput | Promise }} module_or_path - Passing `InitInput` directly is deprecated. + * + * @returns {Promise} + */ +export default function __wbg_init (module_or_path?: { module_or_path: InitInput | Promise } | InitInput | Promise): Promise; diff --git a/projects/flocking/pkg/flocking.js b/projects/flocking/pkg/flocking.js new file mode 100644 index 0000000..a140e05 --- /dev/null +++ b/projects/flocking/pkg/flocking.js @@ -0,0 +1,388 @@ +/* @ts-self-types="./flocking.d.ts" */ + +export class SimulationWasm { + __destroy_into_raw() { + const ptr = this.__wbg_ptr; + this.__wbg_ptr = 0; + SimulationWasmFinalization.unregister(this); + return ptr; + } + free() { + const ptr = this.__destroy_into_raw(); + wasm.__wbg_simulationwasm_free(ptr, 0); + } + add_boid() { + wasm.simulationwasm_add_boid(this.__wbg_ptr); + } + /** + * @returns {number} + */ + boid_buffer_len() { + const ret = wasm.simulationwasm_boid_buffer_len(this.__wbg_ptr); + return ret >>> 0; + } + /** + * @returns {number} + */ + boid_buffer_ptr() { + const ret = wasm.simulationwasm_boid_buffer_ptr(this.__wbg_ptr); + return ret >>> 0; + } + /** + * @returns {number} + */ + boid_buffer_stride() { + const ret = wasm.simulationwasm_boid_buffer_stride(this.__wbg_ptr); + return ret >>> 0; + } + /** + * @returns {number} + */ + get_align_mult() { + const ret = wasm.simulationwasm_get_align_mult(this.__wbg_ptr); + return ret; + } + /** + * @returns {number} + */ + get_boid_count() { + const ret = wasm.simulationwasm_get_boid_count(this.__wbg_ptr); + return ret >>> 0; + } + /** + * @returns {number} + */ + get_cohesion_mult() { + const ret = wasm.simulationwasm_get_cohesion_mult(this.__wbg_ptr); + return ret; + } + /** + * @returns {number} + */ + get_separation_mult() { + const ret = wasm.simulationwasm_get_separation_mult(this.__wbg_ptr); + return ret; + } + /** + * @param {number} width + * @param {number} height + * @param {number} num_boids + */ + constructor(width, height, num_boids) { + const ret = wasm.simulationwasm_new(width, height, num_boids); + this.__wbg_ptr = ret >>> 0; + SimulationWasmFinalization.register(this, this.__wbg_ptr, this); + return this; + } + remove_boid() { + wasm.simulationwasm_remove_boid(this.__wbg_ptr); + } + /** + * @param {number} width + * @param {number} height + */ + resize(width, height) { + wasm.simulationwasm_resize(this.__wbg_ptr, width, height); + } + /** + * @param {number} value + */ + set_align_mult(value) { + wasm.simulationwasm_set_align_mult(this.__wbg_ptr, value); + } + /** + * @param {number} value + */ + set_cohesion_mult(value) { + wasm.simulationwasm_set_cohesion_mult(this.__wbg_ptr, value); + } + /** + * @param {number} value + */ + set_separation_mult(value) { + wasm.simulationwasm_set_separation_mult(this.__wbg_ptr, value); + } + step() { + wasm.simulationwasm_step(this.__wbg_ptr); + } +} +if (Symbol.dispose) SimulationWasm.prototype[Symbol.dispose] = SimulationWasm.prototype.free; + +function __wbg_get_imports() { + const import0 = { + __proto__: null, + __wbg___wbindgen_is_function_3c846841762788c1: function(arg0) { + const ret = typeof(getObject(arg0)) === 'function'; + return ret; + }, + __wbg___wbindgen_is_object_781bc9f159099513: function(arg0) { + const val = getObject(arg0); + const ret = typeof(val) === 'object' && val !== null; + return ret; + }, + __wbg___wbindgen_is_string_7ef6b97b02428fae: function(arg0) { + const ret = typeof(getObject(arg0)) === 'string'; + return ret; + }, + __wbg___wbindgen_is_undefined_52709e72fb9f179c: function(arg0) { + const ret = getObject(arg0) === undefined; + return ret; + }, + __wbg___wbindgen_throw_6ddd609b62940d55: function(arg0, arg1) { + throw new Error(getStringFromWasm0(arg0, arg1)); + }, + __wbg_call_2d781c1f4d5c0ef8: function() { return handleError(function (arg0, arg1, arg2) { + const ret = getObject(arg0).call(getObject(arg1), getObject(arg2)); + return addHeapObject(ret); + }, arguments); }, + __wbg_crypto_38df2bab126b63dc: function(arg0) { + const ret = getObject(arg0).crypto; + return addHeapObject(ret); + }, + __wbg_getRandomValues_c44a50d8cfdaebeb: function() { return handleError(function (arg0, arg1) { + getObject(arg0).getRandomValues(getObject(arg1)); + }, arguments); }, + __wbg_length_ea16607d7b61445b: function(arg0) { + const ret = getObject(arg0).length; + return ret; + }, + __wbg_msCrypto_bd5a034af96bcba6: function(arg0) { + const ret = getObject(arg0).msCrypto; + return addHeapObject(ret); + }, + __wbg_new_with_length_825018a1616e9e55: function(arg0) { + const ret = new Uint8Array(arg0 >>> 0); + return addHeapObject(ret); + }, + __wbg_node_84ea875411254db1: function(arg0) { + const ret = getObject(arg0).node; + return addHeapObject(ret); + }, + __wbg_process_44c7a14e11e9f69e: function(arg0) { + const ret = getObject(arg0).process; + return addHeapObject(ret); + }, + __wbg_prototypesetcall_d62e5099504357e6: function(arg0, arg1, arg2) { + Uint8Array.prototype.set.call(getArrayU8FromWasm0(arg0, arg1), getObject(arg2)); + }, + __wbg_randomFillSync_6c25eac9869eb53c: function() { return handleError(function (arg0, arg1) { + getObject(arg0).randomFillSync(takeObject(arg1)); + }, arguments); }, + __wbg_require_b4edbdcf3e2a1ef0: function() { return handleError(function () { + const ret = module.require; + return addHeapObject(ret); + }, arguments); }, + __wbg_static_accessor_GLOBAL_8adb955bd33fac2f: function() { + const ret = typeof global === 'undefined' ? null : global; + return isLikeNone(ret) ? 0 : addHeapObject(ret); + }, + __wbg_static_accessor_GLOBAL_THIS_ad356e0db91c7913: function() { + const ret = typeof globalThis === 'undefined' ? null : globalThis; + return isLikeNone(ret) ? 0 : addHeapObject(ret); + }, + __wbg_static_accessor_SELF_f207c857566db248: function() { + const ret = typeof self === 'undefined' ? null : self; + return isLikeNone(ret) ? 0 : addHeapObject(ret); + }, + __wbg_static_accessor_WINDOW_bb9f1ba69d61b386: function() { + const ret = typeof window === 'undefined' ? null : window; + return isLikeNone(ret) ? 0 : addHeapObject(ret); + }, + __wbg_subarray_a068d24e39478a8a: function(arg0, arg1, arg2) { + const ret = getObject(arg0).subarray(arg1 >>> 0, arg2 >>> 0); + return addHeapObject(ret); + }, + __wbg_versions_276b2795b1c6a219: function(arg0) { + const ret = getObject(arg0).versions; + return addHeapObject(ret); + }, + __wbindgen_cast_0000000000000001: function(arg0, arg1) { + // Cast intrinsic for `Ref(Slice(U8)) -> NamedExternref("Uint8Array")`. + const ret = getArrayU8FromWasm0(arg0, arg1); + return addHeapObject(ret); + }, + __wbindgen_cast_0000000000000002: function(arg0, arg1) { + // Cast intrinsic for `Ref(String) -> Externref`. + const ret = getStringFromWasm0(arg0, arg1); + return addHeapObject(ret); + }, + __wbindgen_object_clone_ref: function(arg0) { + const ret = getObject(arg0); + return addHeapObject(ret); + }, + __wbindgen_object_drop_ref: function(arg0) { + takeObject(arg0); + }, + }; + return { + __proto__: null, + "./flocking_bg.js": import0, + }; +} + +const SimulationWasmFinalization = (typeof FinalizationRegistry === 'undefined') + ? { register: () => {}, unregister: () => {} } + : new FinalizationRegistry(ptr => wasm.__wbg_simulationwasm_free(ptr >>> 0, 1)); + +function addHeapObject(obj) { + if (heap_next === heap.length) heap.push(heap.length + 1); + const idx = heap_next; + heap_next = heap[idx]; + + heap[idx] = obj; + return idx; +} + +function dropObject(idx) { + if (idx < 1028) return; + heap[idx] = heap_next; + heap_next = idx; +} + +function getArrayU8FromWasm0(ptr, len) { + ptr = ptr >>> 0; + return getUint8ArrayMemory0().subarray(ptr / 1, ptr / 1 + len); +} + +function getStringFromWasm0(ptr, len) { + ptr = ptr >>> 0; + return decodeText(ptr, len); +} + +let cachedUint8ArrayMemory0 = null; +function getUint8ArrayMemory0() { + if (cachedUint8ArrayMemory0 === null || cachedUint8ArrayMemory0.byteLength === 0) { + cachedUint8ArrayMemory0 = new Uint8Array(wasm.memory.buffer); + } + return cachedUint8ArrayMemory0; +} + +function getObject(idx) { return heap[idx]; } + +function handleError(f, args) { + try { + return f.apply(this, args); + } catch (e) { + wasm.__wbindgen_export(addHeapObject(e)); + } +} + +let heap = new Array(1024).fill(undefined); +heap.push(undefined, null, true, false); + +let heap_next = heap.length; + +function isLikeNone(x) { + return x === undefined || x === null; +} + +function takeObject(idx) { + const ret = getObject(idx); + dropObject(idx); + return ret; +} + +let cachedTextDecoder = new TextDecoder('utf-8', { ignoreBOM: true, fatal: true }); +cachedTextDecoder.decode(); +const MAX_SAFARI_DECODE_BYTES = 2146435072; +let numBytesDecoded = 0; +function decodeText(ptr, len) { + numBytesDecoded += len; + if (numBytesDecoded >= MAX_SAFARI_DECODE_BYTES) { + cachedTextDecoder = new TextDecoder('utf-8', { ignoreBOM: true, fatal: true }); + cachedTextDecoder.decode(); + numBytesDecoded = len; + } + return cachedTextDecoder.decode(getUint8ArrayMemory0().subarray(ptr, ptr + len)); +} + +let wasmModule, wasm; +function __wbg_finalize_init(instance, module) { + wasm = instance.exports; + wasmModule = module; + cachedUint8ArrayMemory0 = null; + return wasm; +} + +async function __wbg_load(module, imports) { + if (typeof Response === 'function' && module instanceof Response) { + if (typeof WebAssembly.instantiateStreaming === 'function') { + try { + return await WebAssembly.instantiateStreaming(module, imports); + } catch (e) { + const validResponse = module.ok && expectedResponseType(module.type); + + if (validResponse && module.headers.get('Content-Type') !== 'application/wasm') { + console.warn("`WebAssembly.instantiateStreaming` failed because your server does not serve Wasm with `application/wasm` MIME type. Falling back to `WebAssembly.instantiate` which is slower. Original error:\n", e); + + } else { throw e; } + } + } + + const bytes = await module.arrayBuffer(); + return await WebAssembly.instantiate(bytes, imports); + } else { + const instance = await WebAssembly.instantiate(module, imports); + + if (instance instanceof WebAssembly.Instance) { + return { instance, module }; + } else { + return instance; + } + } + + function expectedResponseType(type) { + switch (type) { + case 'basic': case 'cors': case 'default': return true; + } + return false; + } +} + +function initSync(module) { + if (wasm !== undefined) return wasm; + + + if (module !== undefined) { + if (Object.getPrototypeOf(module) === Object.prototype) { + ({module} = module) + } else { + console.warn('using deprecated parameters for `initSync()`; pass a single object instead') + } + } + + const imports = __wbg_get_imports(); + if (!(module instanceof WebAssembly.Module)) { + module = new WebAssembly.Module(module); + } + const instance = new WebAssembly.Instance(module, imports); + return __wbg_finalize_init(instance, module); +} + +async function __wbg_init(module_or_path) { + if (wasm !== undefined) return wasm; + + + if (module_or_path !== undefined) { + if (Object.getPrototypeOf(module_or_path) === Object.prototype) { + ({module_or_path} = module_or_path) + } else { + console.warn('using deprecated parameters for the initialization function; pass a single object instead') + } + } + + if (module_or_path === undefined) { + module_or_path = new URL('flocking_bg.wasm', import.meta.url); + } + const imports = __wbg_get_imports(); + + if (typeof module_or_path === 'string' || (typeof Request === 'function' && module_or_path instanceof Request) || (typeof URL === 'function' && module_or_path instanceof URL)) { + module_or_path = fetch(module_or_path); + } + + const { instance, module } = await __wbg_load(await module_or_path, imports); + + return __wbg_finalize_init(instance, module); +} + +export { initSync, __wbg_init as default }; diff --git a/projects/flocking/pkg/flocking_bg.wasm b/projects/flocking/pkg/flocking_bg.wasm new file mode 100644 index 0000000000000000000000000000000000000000..1cfb6d14a76763965aaa807469b17e4fdec3852d GIT binary patch literal 54070 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 HL&N_7Zybz! literal 0 HcmV?d00001 diff --git a/projects/flocking/pkg/flocking_bg.wasm.d.ts b/projects/flocking/pkg/flocking_bg.wasm.d.ts new file mode 100644 index 0000000..548d921 --- /dev/null +++ b/projects/flocking/pkg/flocking_bg.wasm.d.ts @@ -0,0 +1,20 @@ +/* tslint:disable */ +/* eslint-disable */ +export const memory: WebAssembly.Memory; +export const __wbg_simulationwasm_free: (a: number, b: number) => void; +export const simulationwasm_add_boid: (a: number) => void; +export const simulationwasm_boid_buffer_len: (a: number) => number; +export const simulationwasm_boid_buffer_ptr: (a: number) => number; +export const simulationwasm_boid_buffer_stride: (a: number) => number; +export const simulationwasm_get_align_mult: (a: number) => number; +export const simulationwasm_get_boid_count: (a: number) => number; +export const simulationwasm_get_cohesion_mult: (a: number) => number; +export const simulationwasm_get_separation_mult: (a: number) => number; +export const simulationwasm_new: (a: number, b: number, c: number) => number; +export const simulationwasm_remove_boid: (a: number) => void; +export const simulationwasm_resize: (a: number, b: number, c: number) => void; +export const simulationwasm_set_align_mult: (a: number, b: number) => void; +export const simulationwasm_set_cohesion_mult: (a: number, b: number) => void; +export const simulationwasm_set_separation_mult: (a: number, b: number) => void; +export const simulationwasm_step: (a: number) => void; +export const __wbindgen_export: (a: number) => void; diff --git a/projects/flocking/pkg/package.json b/projects/flocking/pkg/package.json new file mode 100644 index 0000000..652fc92 --- /dev/null +++ b/projects/flocking/pkg/package.json @@ -0,0 +1,15 @@ +{ + "name": "flocking", + "type": "module", + "version": "0.1.0", + "files": [ + "flocking_bg.wasm", + "flocking.js", + "flocking.d.ts" + ], + "main": "flocking.js", + "types": "flocking.d.ts", + "sideEffects": [ + "./snippets/*" + ] +} \ No newline at end of file diff --git a/script.js b/script.js index 77b4b27..5cff8af 100644 --- a/script.js +++ b/script.js @@ -27,7 +27,7 @@ window.addEventListener('scroll', () => { const filterChips = document.querySelectorAll('.filter-chip'); const projectCards = document.querySelectorAll('#project-grid .project-card'); const seeMoreButton = document.querySelector('#projects-see-more'); -const DEFAULT_VISIBLE_PROJECTS = 8; +const DEFAULT_VISIBLE_PROJECTS = 9; if (filterChips.length > 0 && projectCards.length > 0) { let selectedFilter = 'all';