| Crates.io | asset-importer |
| lib.rs | asset-importer |
| version | 0.5.0 |
| created_at | 2025-09-17 15:10:28.508951+00 |
| updated_at | 2025-12-18 05:58:51.684897+00 |
| description | Comprehensive Rust bindings for the Assimp library |
| homepage | https://github.com/Latias94/asset-importer |
| repository | https://github.com/Latias94/asset-importer |
| max_upload_size | |
| id | 1843461 |
| size | 571,868 |
A comprehensive Rust binding for the latest Assimp 3D asset import library.
This crate provides safe, high-level Rust bindings for Assimp v6.0.2, implementing the vast majority of the C API with idiomatic Rust interfaces.
See Model Viewer (asset-importer + wgpu) - A practical model viewer built on top of this Assimp Rust binding. It serves as a real-world sample and testbed to validate asset-importer across common 3D formats.
⚠️ Early Development: This library is functional but lacks extensive real-world testing. Use with caution in production environments.
glam and mint via opt-in Cargo featuresAdd to your Cargo.toml:
[dependencies]
# Default – Use prebuilt binaries (fastest)
asset-importer = "0.5"
# Or build from source (best compatibility; mutually exclusive build mode)
asset-importer = { version = "0.5", default-features = false, features = ["build-assimp"] }
# Or link a system-installed Assimp (requires libclang/bindgen; mutually exclusive build mode)
asset-importer = { version = "0.5", default-features = false, features = ["system"] }
Basic usage:
use asset_importer::Importer;
use asset_importer::postprocess::PostProcessSteps;
fn main() -> Result<(), Box<dyn std::error::Error>> {
let scene = Importer::new().import_file("model.obj")?;
println!("Loaded {} meshes", scene.num_meshes());
for mesh in scene.meshes() {
// Zero-copy options are available:
// - mesh.vertices_raw(): &[asset_importer::raw::AiVector3D]
// - mesh.vertices_iter(): Iterator<Item = Vector3D>
let vertices = mesh.vertices();
println!("Mesh has {} vertices (copied)", vertices.len());
}
Ok(())
}
Builder-style usage (no repeated path):
use asset_importer::{Importer, postprocess::PostProcessSteps};
fn main() -> Result<(), Box<dyn std::error::Error>> {
let scene = Importer::new().read_file("model.fbx")
.with_post_process(PostProcessSteps::TRIANGULATE | PostProcessSteps::FLIP_UVS)
.import()?;
Ok(())
}
Scene and all scene-backed view types (Mesh, Material, Node, Texture, etc.) are Send + Sync
and can be shared across threads (e.g. behind Arc) for read-only access.
Important: do not mutate Assimp-owned scene memory through raw Assimp bindings (asset_importer::sys with feature raw-sys,
or the asset-importer-sys crate) while a Scene (or any
scene-backed view type) is shared across threads. Doing so violates the crate's safety contract and may cause
undefined behavior.
Practical guidance:
Mesh::*_raw() / *_iter() / MaterialPropertyRef, etc.).raw-sys when you explicitly need raw bindings, and treat the returned pointers as read-only.asset-importer = "0.5"
asset-importer = { version = "0.5", default-features = false, features = ["build-assimp"] }
asset-importer = { version = "0.5", default-features = false, features = ["system"] }
brew install assimp (macOS), apt install libassimp-dev (Ubuntu)asset-importer = {
version = "0.5",
default-features = false,
features = [
"build-assimp", # Choose exactly one build mode (or use default prebuilt)
"export", # Enable export functionality
"type-extensions", # Enable convenience methods on types
"raw-sys", # Expose raw bindings as `asset_importer::sys` (unsafe contract)
"glam", # Enable `glam` conversions
"mint", # Enable mint math library integration
"bytemuck", # Enable zero-copy byte casts for raw views
"static-link", # Prefer static linking (source/prebuilt)
"nozlib" # Disable zlib compression support
]
}
See asset-importer/examples/README.md for a guided, step-by-step set of examples and recommended
commands for each build mode.
When building from source (build-assimp feature), you'll need:
xcode-select --install)sudo apt install build-essential cmake on Ubuntu)For detailed platform-specific instructions and troubleshooting, see the asset-importer-sys README.
# .cargo/config.toml
[target.x86_64-pc-windows-msvc]
rustflags = ["-C", "target-feature=+crt-static"]
or per-build:
RUSTFLAGS="-C target-feature=+crt-static" cargo build --release
Prebuilt binaries: we publish both MD and MT variants on Windows. Filenames include a -md or -mt suffix, for example:
asset-importer-<version>-x86_64-pc-windows-msvc-<static|dylib>-md.tar.gz.
The build script auto-selects the variant matching your current CRT and falls back to old names if needed.
vcpkg (with features=["system"]):
x64-windows → /MD (dynamic)x64-windows-static → /MT (static)vcpkg install assimp:x64-windows or assimp:x64-windows-static.crt-static to avoid LNK2038.If you need more control or compatibility, use:
--no-default-features --features build-assimp to build from source (best compatibility)--no-default-features --features system to link an existing installationFor development work or when prebuilt binaries are not available:
# Use this for development
asset-importer = { version = "0.5", default-features = false, features = ["build-assimp"] }
This ensures you can always build from source regardless of release availability.
Importer::read_from_memory(&[u8]) stores an owned copy internally so the builder can be 'static and support .import().
If you already have an owned buffer, prefer Importer::read_from_memory_owned(Vec<u8>) or
Importer::import_from_memory_owned(Vec<u8>, hint) to avoid an extra copy.
This crate provides a high-level safe API. For low-level FFI bindings, see asset-importer-sys.
This project aims to provide the most comprehensive and up-to-date Rust binding for Assimp, supporting both import and export functionality with modern Rust practices.
This workspace uses independent versioning for each crate:
asset-importer-sys: Tracks Assimp versions and FFI binding changesasset-importer: Tracks high-level API changes and featuresSee VERSIONING.md for detailed versioning strategy and release process.
Contributions welcome! Areas needing help:
If you're working with graphics and UI in Rust, you might also be interested in: