oxihuman-wasm
Part of the OxiHuman workspace — privacy-first, client-side human body generator in pure Rust.
Status: Stable | Tests: 168 passing | API: 68 WasmEngine methods | Version: 0.1.1 | Updated: 2026-03-13
WebAssembly bindings for OxiHuman — full browser-ready API via wasm-bindgen. A single WasmEngine struct exposes the entire OxiHuman pipeline to JavaScript/TypeScript, enabling privacy-preserving, client-side human body generation with no server round-trips.
Feature Flags
[features]
default = []
wasm = ["dep:wasm-bindgen", "dep:js-sys"]
The wasm feature is optional. Enable it when targeting browser/Node.js environments via wasm-bindgen. Without it, the crate still compiles for testing and native use.
Installation
[dependencies]
oxihuman-wasm = { version = "0.1.1", features = ["wasm"] }
Structs
WasmEngine
Main body generator. Exposes the full OxiHuman pipeline as 68 public #[wasm_bindgen] methods. Holds base mesh data, loaded morph targets, parameter state, physics proxies, and animation frame buffer.
ParticleSystem
Point particle system with configurable emit_rate and lifetime control. Created via WasmEngine::create_particle_system() and stepped via step_particles().
Particle
Represents a single active particle. Carries position (Float32Array), velocity (Float32Array), and age (f32).
WasmEngine API — 68 Methods
Initialization (4)
| Method |
Description |
new_from_obj_bytes(bytes) |
Create engine from raw OBJ mesh bytes |
new_strict() |
Create engine with strict validation policy profile |
load_target_bytes(name, bytes) |
Load a morph target from raw .target file bytes |
load_zip_pack_bytes(bytes) |
Load a ZIP asset pack; returns the number of targets loaded |
Target Management (8)
| Method |
Description |
list_loaded_targets() |
Return JSON array of all loaded target names |
loaded_target_count() |
Return count of currently loaded targets |
load_target_from_json(json) |
Load a morph target from JSON descriptor |
unload_target(name) |
Remove a named target from the engine |
set_target_weight_by_name(name, weight) |
Set blend weight [0.0–1.0] for a named target |
get_target_weight_by_name(name) |
Get current blend weight for a named target |
target_count() |
Total number of registered targets (loaded + unloaded) |
get_loaded_target_names() |
Return JS array of loaded target name strings |
Parameter Control (7)
| Method |
Description |
set_height(value) |
Set body height parameter (metres) |
set_weight(value) |
Set body weight parameter (normalized) |
set_muscle(value) |
Set musculature parameter |
set_age(value) |
Set age parameter |
set_param(key, value) |
Set any named parameter by string key |
reset_params() |
Reset all body parameters to defaults |
reset_all_weights() |
Reset all morph target blend weights to zero |
JSON Import/Export (4)
| Method |
Description |
export_params_json() |
Serialize current parameter state to JSON |
import_params_json(json) |
Restore parameter state from JSON |
get_measurements_json() |
Return computed body measurements (height, circumferences, etc.) as JSON |
export_anim_json() |
Serialize recorded animation frames to JSON |
Mesh Building (3)
| Method |
Description |
build_mesh_bytes() |
Build binary mesh buffer containing positions, normals, UVs, and indices |
export_quantized_bytes() |
Export mesh in QMSH quantized binary format (compact, lossy) |
get_scene_json() |
Return scene description JSON (nodes, cameras, lights) |
Physics (5)
| Method |
Description |
get_physics_proxies_json() |
Return collision proxy shapes as JSON |
get_physics_rig_json() |
Return full physics rig descriptor as JSON |
get_capsule_chains_json() |
Return capsule chain descriptors for limbs as JSON |
step_physics(dt) |
Step physics simulation by dt seconds (stub) |
set_wind(x, y, z) |
Set wind force vector for cloth/particle systems (stub) |
Animation (7)
| Method |
Description |
record_anim_frame() |
Record current parameter state as an animation frame |
clear_anim_frames() |
Clear all recorded animation frames |
anim_frame_count() |
Return number of recorded frames |
seek_anim_frame(index) |
Restore parameter state to a recorded frame by index |
play_anim_step() |
Advance playback by one frame, wrapping at end |
get_anim_fps() |
Get current animation playback rate (frames per second) |
set_anim_fps(fps) |
Set animation playback rate |
Query & Analysis (6)
| Method |
Description |
get_vertex_count() |
Return number of vertices in the built mesh |
get_index_count() |
Return number of triangle indices in the built mesh |
get_curvature_map() |
Return per-vertex curvature values as Float32Array |
get_geodesic_distances(origin_index) |
Return geodesic distances from origin vertex as Float32Array |
query_sphere_near_point(x, y, z, radius) |
Return JSON array of vertex indices within sphere |
get_mesh_segments() |
Return JSON segment map (body part regions by vertex range) |
Presets & Proportions (5)
| Method |
Description |
set_params_from_preset(preset_name) |
Apply a named parameter preset (e.g., "athletic", "average") |
apply_preset_by_name(name) |
Apply preset including morph target weights |
get_body_proportions_json() |
Return computed proportional ratios as JSON |
get_param_summary_json() |
Return a summary of all parameters and their current values as JSON |
set_allowlist(names) |
Restrict which targets are eligible for blending |
LOD & Shaders (2)
| Method |
Description |
get_lod_scene_json() |
Return multi-LOD scene JSON (LOD0–LOD3 meshes) |
list_builtin_shaders() |
Return JSON array of built-in shader descriptor names |
Cache (2)
| Method |
Description |
has_cached_mesh() |
Return true if a built mesh is cached and parameters are unchanged |
reset_incremental_cache() |
Invalidate the incremental mesh build cache |
Particles (2)
| Method |
Description |
create_particle_system(emit_rate, lifetime) |
Create a new ParticleSystem with given parameters |
step_particles(system, dt) |
Advance a particle system by dt seconds |
Expressions (2)
| Method |
Description |
apply_expression_blend(expression_json) |
Apply a facial expression blend from JSON descriptor |
get_cloth_state() |
Return current cloth simulation state as JSON (stub) |
Free Functions
| Function |
Description |
parse_mesh_bytes_header(buffer) |
Parse the format header from a binary mesh buffer; returns JSON with format version and field offsets |
JavaScript/TypeScript Usage
import init, { WasmEngine } from "oxihuman-wasm";
await init();
const objBytes = new Uint8Array(await fetch("human_base.obj").then(r => r.arrayBuffer()));
const engine = WasmEngine.new_from_obj_bytes(objBytes);
const packBytes = new Uint8Array(await fetch("targets.zip").then(r => r.arrayBuffer()));
const count = engine.load_zip_pack_bytes(packBytes);
console.log(`Loaded ${count} targets`);
engine.set_height(1.75);
engine.set_weight(0.4);
engine.set_muscle(0.6);
engine.set_age(30.0);
const meshBytes = engine.build_mesh_bytes();
const paramsJson = engine.export_params_json();
console.log(JSON.parse(paramsJson));
const measurements = JSON.parse(engine.get_measurements_json());
console.log(measurements);
Architecture Notes
- All heavy computation runs in the browser's WebAssembly sandbox — no server communication, no data leakage.
WasmEngine is !Send and single-threaded by design. For parallel workloads, use multiple instances in separate Web Workers.
- Physics methods (
step_physics, set_wind) and get_cloth_state are currently stubs returning placeholder data; full simulation is implemented in oxihuman-physics.
- The
wasm feature gate keeps native builds free of wasm-bindgen overhead, allowing the crate to be used in test harnesses and CLI pipelines without a browser target.
v0.1.1 Internal Refactor
engine.rs is now a thin re-export module (7 lines). The implementation has been split into four focused source files with no public API changes:
| File |
Contents |
engine_core.rs |
WasmEngine, ParticleSystem, Particle struct definitions and initialization |
engine_anim.rs |
Animation recording, playback, and frame management methods |
engine_targets.rs |
Morph target loading, unloading, and weight management methods |
engine_io.rs |
JSON import/export, mesh building, physics, query, and preset methods |
Tests were moved to wasm_tests.rs. All public #[wasm_bindgen] method signatures are unchanged.
License
Apache-2.0 — Copyright (C) 2026 COOLJAPAN OU (Team KitaSan)