Compare commits

...

10 Commits

Author SHA1 Message Date
Kim Kulling
e73a537081 Merge branch 'master' into feature/rust_bindings 2026-04-06 16:20:25 +02:00
Kim Kulling
48515a4aa1 Merge branch 'master' into feature/rust_bindings 2026-02-26 15:33:51 +01:00
Kim Kulling
1ed019b869 Remove generated file 2026-02-26 15:29:58 +01:00
Kim Kulling
7c7a1233f5 Fix formatting in Cargo.toml 2026-02-26 15:28:14 +01:00
Kim Kulling
3e6482bca0 Update build.rs 2026-02-23 21:28:49 +01:00
Kim Kulling
c0d273cb3b Apply suggestion from @coderabbitai[bot]
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
2026-02-23 21:28:00 +01:00
Kim Kulling
e730b7803c Add missing includes for the rust bindings. 2026-02-23 16:20:04 +01:00
Kim Kulling
cedc5a8d10 Merge branch 'master' into feature/rust_bindings 2026-02-04 11:38:57 +01:00
Kim Kulling
4d3a694807 Fix bindgen usage. 2026-02-03 21:06:25 +01:00
Kim Kulling
517fb1b242 Add files for assimp rust wrapper 2026-01-27 21:33:02 +01:00
60 changed files with 105 additions and 447 deletions

View File

@@ -1,6 +0,0 @@
# This file is automatically @generated by Cargo.
# It is not intended for manual editing.
[[package]]
name = "assimp_rs"
version = "0.1.0"

View File

@@ -6,4 +6,5 @@ edition = "2018"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies] [build-dependencies]
bindgen = "*"

40
port/assimp_rs/build.rs Normal file
View File

@@ -0,0 +1,40 @@
extern crate bindgen;
use std::env;
use std::path::PathBuf;
fn main() {
// Rerun if wrapper header changes
println!("cargo:rerun-if-changed=./src/assimp_wrapper.h");
// Tell cargo to look for shared libraries in the specified directory
println!("cargo:rustc-link-search=../../bin/");
// Tell cargo to tell rustc to link the assimp shared library.
println!("cargo:rustc-link-lib=assimp");
// The bindgen::Builder is the main entry point
// to bindgen, and lets you build up options for
// the resulting bindings.
let bindings = bindgen::Builder::default()
// The input header we would like to generate
// bindings for.
.header("./src/assimp_wrapper.h").clang_arg("-I../../include/")
// Tell cargo to invalidate the built crate whenever any of the
// included header files changed.
.parse_callbacks(Box::new(bindgen::CargoCallbacks::new()))
.blocklist_item("FP_ZERO")
.blocklist_item("FP_SUBNORMAL")
.blocklist_item("FP_NORMAL")
.blocklist_item("FP_INFINITE")
.blocklist_item("FP_NAN")
// Finish the builder and generate the bindings.
.generate()
// Unwrap the Result and panic on failure.
.expect("Unable to generate bindings");
// Write the bindings to the $OUT_DIR/bindings.rs file.
let out_path = PathBuf::from(env::var("OUT_DIR").unwrap());
bindings
.write_to_file(out_path.join("bindings.rs"))
.expect("Couldn't write bindings!");
}

View File

@@ -0,0 +1,48 @@
#ifndef ASSIMP_WRAPPER_H_INC
#define ASSIMP_WRAPPER_H_INC
#include <assimp/defs.h>
#include <assimp/camera.h>
#include <assimp/scene.h>
#include <assimp/types.h>
#include <assimp/vector3.h>
#include <assimp/matrix4x4.h>
#include <assimp/quaternion.h>
#include <assimp/color4.h>
#include <assimp/mesh.h>
#include <assimp/anim.h>
#include <assimp/metadata.h>
#include <assimp/light.h>
#include <assimp/material.h>
#include <assimp/texture.h>
#include <assimp/postprocess.h>
#include <assimp/version.h>
#include <assimp/importerdesc.h>
#include <assimp/aabb.h>
#include <assimp/anim.h>
#include <assimp/camera.h>
#include <assimp/cexport.h>
#include <assimp/cfileio.h>
#include <assimp/cimport.h>
#include <assimp/color4.h>
#include <assimp/commonMetaData.h>
#include <assimp/defs.h>
#include <assimp/importerdesc.h>
#include <assimp/light.h>
#include <assimp/material.h>
#include <assimp/matrix3x3.h>
#include <assimp/matrix4x4.h>
#include <assimp/mesh.h>
#include <assimp/metadata.h>
#include <assimp/pbrmaterial.h>
#include <assimp/postprocess.h>
#include <assimp/quaternion.h>
#include <assimp/revision.h>
#include <assimp/scene.h>
#include <assimp/texture.h>
#include <assimp/types.h>
#include <assimp/vector2.h>
#include <assimp/vector3.h>
#include <assimp/version.h>
#endif // ASSIMP_WRAPPER_H_INC

View File

@@ -1 +0,0 @@
pub use self::structs::{Camera};

View File

@@ -1,17 +1,21 @@
pub mod camera;
pub mod core; #![allow(non_upper_case_globals)]
pub mod errors; #![allow(non_camel_case_types)]
pub mod formats; #![allow(non_snake_case)]
pub mod material;
pub mod postprocess; include!(concat!(env!("OUT_DIR"), "/bindings.rs"));
pub mod shims;
pub mod socket;
pub mod structs;
#[cfg(test)] #[cfg(test)]
mod tests { mod tests {
#[test] #[test]
fn it_works() { fn import_test() {
assert_eq!(true, true); unsafe {
use crate::aiImportFile;
let mut file: *mut dyn const i8 = std::ptr::null_mut();
//let file = String::from("test.obj");
//let (ptr, len, cap) = file.into_raw_parts();
//let raw_file = unsafe{String::from_raw_parts}
let asset = aiImportFile(file, 0);
}
} }
} }

View File

@@ -1,44 +0,0 @@
pub struct Animation<'mA, 'mMA, 'nA> {
/* The name of the animation. If the modeling package this data was
* exported from does support only a single animation channel, this
* name is usually empty (length is zero).
*/
m_name: Option<String>,
// Duration of the animation in ticks
m_duration: f64,
// Ticks per second. Zero (0.000... ticks/second) if not
// specified in the imported file
m_ticks_per_second: Option<f64>,
/* Number of bone animation channels.
Each channel affects a single node.
*/
m_num_channels: u64,
/* Node animation channels. Each channel
affects a single node.
?? -> The array is m_num_channels in size.
(maybe refine to a derivative type of usize?)
*/
m_channels: &'nA NodeAnim,
/* Number of mesh animation channels. Each
channel affects a single mesh and defines
vertex-based animation.
*/
m_num_mesh_channels: u64,
/* The mesh animation channels. Each channel
affects a single mesh.
The array is m_num_mesh_channels in size
(maybe refine to a derivative of usize?)
*/
m_mesh_channels: &'mA MeshAnim,
/* The number of mesh animation channels. Each channel
affects a single mesh and defines some morphing animation.
*/
m_num_morph_mesh_channels: u64,
/* The morph mesh animation channels. Each channel affects a single mesh.
The array is mNumMorphMeshChannels in size.
*/
m_morph_mesh_channels: &'mMA MeshMorphAnim
}
pub struct NodeAnim {}
pub struct MeshAnim {}
pub struct MeshMorphAnim {}

View File

@@ -1,6 +0,0 @@
mod anim;
pub use self::anim::{
Animation,
NodeAnim,
MeshAnim,
MeshMorphAnim};

View File

@@ -1,2 +0,0 @@
mod blob;

View File

@@ -1,2 +0,0 @@
mod bone;

View File

@@ -1,2 +0,0 @@
mod camera;

View File

@@ -1,27 +0,0 @@
#[derive(Clone, Debug, Copy)]
struct Color3D {
r: f32,
g: f32,
b: f32
}
impl Color3D {
pub fn new(r_f32: f32, g_f32: f32, b_f32: f32) -> Color3D {
Color3D {r: r_f32, g: g_f32, b: b_f32 }
}
}
#[derive(Clone, Debug, Copy)]
struct Color4D {
r: f32,
g: f32,
b: f32,
a: f32
}
impl Color4D {
pub fn new(r_f32: f32, g_f32: f32, b_f32: f32, a_f32: f32) -> Color4D {
Color4D {r: r_f32, g: g_f32, b: b_f32, a: a_f32 }
}
}

View File

@@ -1,5 +0,0 @@
mod color;
pub use self::color::{
Color3D,
Color4D
};

View File

@@ -1,2 +0,0 @@
mod face;

View File

@@ -1,2 +0,0 @@
mod key;

View File

@@ -1,2 +0,0 @@
mod light;

View File

@@ -1,2 +0,0 @@
mod material;

View File

@@ -1,64 +0,0 @@
#[derive(Clone, Debug, Copy)]
struct Matrix3x3 {
a1: f32,
a2: f32,
a3: f32,
b1: f32,
b2: f32,
b3: f32,
c1: f32,
c2: f32,
c3: f32
}
#[derive(Clone, Debug, Copy)]
struct Matrix4x4 {
a1: f32,
a2: f32,
a3: f32,
a4: f32,
b1: f32,
b2: f32,
b3: f32,
b4: f32,
c1: f32,
c2: f32,
c3: f32,
c4: f32,
d1: f32,
d2: f32,
d3: f32,
d4: f32
}
impl Matrix3x3 {
pub fn new(
a1_f32: f32, a2_f32: f32, a3_f32: f32,
b1_f32: f32, b2_f32: f32, b3_f32: f32,
c1_f32: f32, c2_f32: f32, c3_f32: f32
) -> Matrix3x3 {
Matrix3x3 {
a1: a1_f32, a2: a2_f32, a3: a3_f32,
b1: b1_f32, b2: b2_f32, b3: b3_f32,
c1: c1_f32, c2: c2_f32, c3: c3_f32
}
}
}
impl Matrix4x4 {
pub fn new(
a1_f32: f32, a2_f32: f32, a3_f32: f32, a4_f32: f32,
b1_f32: f32, b2_f32: f32, b3_f32: f32, b4_f32: f32,
c1_f32: f32, c2_f32: f32, c3_f32: f32, c4_f32: f32,
d1_f32: f32, d2_f32: f32, d3_f32: f32, d4_f32: f32
) -> Matrix4x4 {
Matrix4x4 {
a1: a1_f32, a2: a2_f32, a3: a3_f32, a4: a4_f32,
b1: b1_f32, b2: b2_f32, b3: b3_f32, b4: b4_f32,
c1: c1_f32, c2: c2_f32, c3: c3_f32, c4: c4_f32,
d1: d1_f32, d2: d2_f32, d3: d3_f32, d4: d4_f32
}
}
}

View File

@@ -1,4 +0,0 @@
mod matrix;
pub use self::matrix::{
Matrix3x3,
Matrix4x4};

View File

@@ -1,35 +0,0 @@
#[derive(Clone, Debug, Copy)]
struct MemoryInfo {
textures: u32,
materials: u32,
meshes: u32,
nodes: u32,
animations: u32,
cameras: u32,
lights: u32,
total: u32
}
impl MemoryInfo {
pub fn new(
textures_uint: u32,
materials_uint: u32,
meshes_uint: u32,
nodes_uint: u32,
animations_uint: u32,
cameras_uint: u32,
lights_uint: u32,
total_uint: u32) -> MemoryInfo {
MemoryInfo {
textures: textures_uint,
materials: materials_uint,
meshes: meshes_uint,
nodes: nodes_uint,
animations: animations_uint,
cameras: cameras_uint,
lights: lights_uint,
total: total_uint
}
}
}

View File

@@ -1,2 +0,0 @@
mod memory;
pub use self::memory::MemoryInfo;

View File

@@ -1,3 +0,0 @@
mod mesh;

View File

@@ -1,2 +0,0 @@
mod meta;

View File

@@ -1,61 +0,0 @@
mod anim;
/* Animation
* NodeAnim
* MeshAnim
* MeshMorphAnim
*/
mod blob;
/* ExportDataBlob
*/
mod vec;
/* Vector2d
* Vector3d
* */
mod matrix;
/* Matrix3by3
* Matrix4by4
*/
mod camera;
/* Camera */
mod color;
/* Color3d
* Color4d
*/
mod key;
/* MeshKey
* MeshMorphKey
* QuatKey
* VectorKey
*/
mod texel;
mod plane;
mod string;
/* String
*/
mod material;
/* Material
* MaterialPropery
* MaterialPropertyString
*/
mod mem;
mod quaternion;
mod face;
mod vertex_weight;
mod mesh;
/* Mesh
*/
mod meta;
/* Metadata
* MetadataEntry
*/
mod node;
/* Node
* */
mod light;
mod texture;
mod ray;
mod transform;
/* UVTransform */
mod bone;
mod scene;
/* Scene */

View File

@@ -1,2 +0,0 @@
mod node;

View File

@@ -1,2 +0,0 @@
mod plane;

View File

@@ -1,23 +0,0 @@
#[derive(Clone, Debug, Copy)]
struct Plane {
a: f32,
b: f32,
c: f32,
d: f32
}
impl Plane {
pub fn new(
a_f32: f32,
b_f32: f32,
c_f32: f32,
d_f32: f32
) -> Plane {
Plane {
a: a_f32,
b: b_f32,
c: b_f32,
d: d_f32
}
}
}

View File

@@ -1,3 +0,0 @@
mod quaternion;
pub use self::quaternion::Quaternion;

View File

@@ -1,7 +0,0 @@
use crate::vec;
#[derive(Clone, Debug, Copy)]
pub struct Quaternion {
_coordinates: vec::Vector4d
}

View File

@@ -1,2 +0,0 @@
mod ray;

View File

@@ -1,2 +0,0 @@
mod scene;

View File

@@ -1,3 +0,0 @@
mod string;
pub use self::string::MAXLEN;
pub use self::string::Str;

View File

@@ -1,41 +0,0 @@
pub const MAXLEN: usize = 1024;
/// Want to consider replacing `Vec<char>`
/// with a comparable definition at
/// https://doc.rust-lang.org/src/alloc/string.rs.html#415-417
#[derive(Clone, Debug)]
struct Str {
length: usize,
data: Vec<char>
}
impl Str {
pub fn new(len_u32: usize, data_string: String) -> Str {
Str {
length: len_u32,
data: data_string.chars().collect()
}
}
}
/// MaterialPropertyStr
/// The size of length is truncated to 4 bytes on a 64-bit platform when used as a
/// material property (see MaterialSystem.cpp, as aiMaterial::AddProperty() ).
#[derive(Clone, Debug)]
struct MaterialPropertyStr {
length: usize,
data: Vec<char>
}
impl MaterialPropertyStr {
pub fn new(len_u32: usize, data_string: String) -> MaterialPropertyStr {
MaterialPropertyStr {
length: len_u32,
data: data_string.chars().collect()
}
}
}

View File

@@ -1,3 +0,0 @@
mod texture;
pub use self::texture::Texel;

View File

@@ -1,19 +0,0 @@
#[derive(Clone, Debug, Copy)]
struct Texel {
b: u32,
g: u32,
r: u32,
a: u32
}
impl Texel {
pub fn new(b_u32: u32, g_u32: u32,
r_u32: u32, a_u32: u32) -> Texel {
Texel {
b: b_u32,
g: g_u32,
r: r_u32,
a: a_u32
}
}
}

View File

@@ -1,2 +0,0 @@
mod transform;

View File

@@ -1,2 +0,0 @@
mod vec;

View File

@@ -1,48 +0,0 @@
struct Vector2d {
x: f32,
y: f32
}
struct Vector3d {
x: f32,
y: f32,
z: f32
}
struct Vector4d {
x: f32,
y: f32,
z: f32,
w: f32
}
impl Vector2d {
pub fn new(x_f32: f32, y_f32: f32) -> Vector2d {
Vector2d {
x: x_f32,
y: y_f32
}
}
}
impl Vector3d {
pub fn new(x_f32: f32, y_f32: f32, z_f32: f32) -> Vector3d {
Vector3d {
x: x_f32,
y: y_f32,
z: z_f32
}
}
}
impl Vector4d {
pub fn new(x_f32: f32, y_f32: f32, z_f32: f32, w_f32: f32) -> Vector4d {
Vector4d {
x: x_f32,
y: y_f32,
z: z_f32,
w: w_f32
}
}
}

View File

@@ -1,2 +0,0 @@
mod vertex;
// pub use self::vertex::