@ifc-lite/wasm
v1.1.7
Published
WebAssembly bindings for IFC-Lite
Readme
Overview
IFC-Lite is a next-generation IFC (Industry Foundation Classes) platform built with Rust + WebAssembly for parsing, geometry processing, and WebGPU for 3D visualization. It's designed to be a 95x smaller and significantly faster alternative to existing web-based IFC solutions.
Features
| Feature | Description | |---------|-------------| | STEP/IFC Parsing | Zero-copy tokenization at ~1,259 MB/s with full IFC4 schema support (776 entities) | | Streaming Pipeline | Progressive geometry processing - first triangles render in 300-500ms | | WebGPU Rendering | Modern GPU-accelerated 3D visualization with depth testing and frustum culling | | Columnar Storage | Memory-efficient TypedArray storage with 30% string deduplication | | Zero-Copy GPU | Direct WASM memory binding to GPU buffers |
Quick Start
Prerequisites
- Node.js 18.0+ with pnpm 8.0+
- Rust toolchain with wasm32-unknown-unknown target
- Modern browser with WebGPU support (Chrome 113+, Edge 113+, Firefox 127+, Safari 18+)
Installation
# Clone the repository
git clone https://github.com/louistrue/ifc-lite.git
cd ifc-lite
# Install dependencies
pnpm install
# Build all packages
pnpm build
# Run the viewer
cd apps/viewer
pnpm devBasic Usage
import { IfcParser } from '@ifc-lite/parser';
import { Renderer } from '@ifc-lite/renderer';
// Parse IFC file
const parser = new IfcParser();
const result = await parser.parse(ifcArrayBuffer);
// Access entities
const walls = result.entities.filter(e => e.type === 'IFCWALL');
console.log(`Found ${walls.length} walls`);
// Render geometry
const renderer = new Renderer(canvas);
await renderer.loadGeometry(result.geometry);
renderer.render();Documentation
| Resource | Description | |----------|-------------| | User Guide | Complete guide with tutorials and examples | | API Reference | Rustdoc API documentation | | Architecture | System design and data flow | | Contributing | How to contribute to the project |
Architecture
IFC files flow through three layers:
Parser (Rust/WASM) — Zero-copy STEP tokenizer, entity scanner, and geometry processor using nom, earcutr, and nalgebra.
Data (TypeScript) — Columnar TypedArrays for properties, CSR graph for relationships, GPU-ready geometry buffers.
Output — WebGPU renderer, Parquet analytics, glTF/JSON-LD/CSV export.
Project Structure
ifc-lite/
├── rust/ # Rust/WASM backend
│ ├── core/ # IFC/STEP parsing (~2,000 LOC)
│ ├── geometry/ # Geometry processing (~2,500 LOC)
│ └── wasm-bindings/ # JavaScript API (~800 LOC)
│
├── packages/ # TypeScript packages
│ ├── parser/ # High-level IFC parser
│ ├── geometry/ # Geometry bridge (WASM)
│ ├── renderer/ # WebGPU rendering
│ ├── query/ # Query system
│ ├── data/ # Columnar data structures
│ ├── spatial/ # Spatial indexing
│ ├── export/ # Export formats
│ └── codegen/ # Schema generator
│
├── apps/
│ └── viewer/ # React web application
│
├── docs/ # Documentation (MkDocs)
└── plan/ # Technical specificationsPerformance
Bundle Size Comparison
| Library | Size | Gzipped | |---------|------|---------| | IFC-Lite | ~86 KB | ~28 KB | | Traditional WASM | 8+ MB | N/A | | Reduction | 93% | - |
Parse Performance
| Model Size | IFC-Lite | Notes | |------------|----------|-------| | 10 MB | ~800ms | Small models | | 50 MB | ~2.7s | Typical models | | 100+ MB | ~5s+ | Complex geometry |
Geometry Processing
- 1.9x faster mesh extraction than traditional solutions
- Streaming pipeline with batched processing (100 meshes/batch)
- First triangles visible in 300-500ms
Browser Requirements
| Browser | Minimum Version | WebGPU | |---------|----------------|--------| | Chrome | 113+ | ✅ | | Edge | 113+ | ✅ | | Firefox | 127+ | ✅ | | Safari | 18+ | ✅ |
Development
# Watch mode for all packages
pnpm -r dev
# Build specific package
cd packages/parser && pnpm build
# Run tests
pnpm test
# Build Rust/WASM
cd rust && cargo build --release --target wasm32-unknown-unknown
# Generate Rustdoc
cd rust && cargo doc --no-deps --open
# Build documentation site
cd docs && mkdocs servePackages
| Package | Description | Status |
|---------|-------------|--------|
| @ifc-lite/parser | STEP tokenizer & entity extraction | ✅ Stable |
| @ifc-lite/geometry | Geometry processing bridge | ✅ Stable |
| @ifc-lite/renderer | WebGPU rendering pipeline | ✅ Stable |
| @ifc-lite/query | Fluent & SQL query system | 🚧 Beta |
| @ifc-lite/data | Columnar data structures | ✅ Stable |
| @ifc-lite/spatial | Spatial indexing & culling | 🚧 Beta |
| @ifc-lite/export | Export (glTF, Parquet, etc.) | 🚧 Beta |
Rust Crates
| Crate | Description | Status |
|-------|-------------|--------|
| ifc-lite-core | STEP/IFC parsing | ✅ Stable |
| ifc-lite-geometry | Mesh triangulation | ✅ Stable |
| ifc-lite-wasm | WASM bindings | ✅ Stable |
Contributing
We welcome contributions! Please see our Contributing Guide for details.
# Fork and clone
git clone https://github.com/YOUR_USERNAME/ifc-lite.git
# Create a branch
git checkout -b feature/my-feature
# Make changes and test
pnpm test
# Submit a pull requestLicense
This project is licensed under the Mozilla Public License 2.0.
Acknowledgments
- Built with nom for parsing
- earcutr for polygon triangulation
- nalgebra for linear algebra
- wasm-bindgen for Rust/JS interop
