Add Context abstraction
Former-commit-id: 7bd77bfa85539326f688ead84edaf086c5c88985
This commit is contained in:
parent
b450533bbe
commit
9bbd34b6f6
@ -4,6 +4,7 @@ mod ffi;
|
|||||||
use std::os::raw::*;
|
use std::os::raw::*;
|
||||||
use std::mem;
|
use std::mem;
|
||||||
|
|
||||||
|
/// Rust FFI for the MikkTSpace implementation.
|
||||||
const INTERFACE: ffi::SMikkTSpaceInterface = ffi::SMikkTSpaceInterface {
|
const INTERFACE: ffi::SMikkTSpaceInterface = ffi::SMikkTSpaceInterface {
|
||||||
m_getNumFaces: faces,
|
m_getNumFaces: faces,
|
||||||
m_getNumVerticesOfFace: vertices,
|
m_getNumVerticesOfFace: vertices,
|
||||||
@ -15,7 +16,26 @@ const INTERFACE: ffi::SMikkTSpaceInterface = ffi::SMikkTSpaceInterface {
|
|||||||
};
|
};
|
||||||
|
|
||||||
pub struct Context {
|
pub struct Context {
|
||||||
faces: i32,
|
faces: Box<ExactSizeIterator<Item = Face>>,
|
||||||
|
positions: Box<ExactSizeIterator<Item = [f32; 3]>>,
|
||||||
|
tex_coords: Box<ExactSizeIterator<Item = [f32; 2]>>,
|
||||||
|
normals: Box<ExactSizeIterator<Item = [f32; 3]>>,
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Specifies whether a face is a triangle or a quad.
|
||||||
|
pub enum Face {
|
||||||
|
Triangle,
|
||||||
|
Quad,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Face {
|
||||||
|
/// Returns the number of vertices bound by this face.
|
||||||
|
pub fn vertices(&self) -> i32 {
|
||||||
|
match self {
|
||||||
|
&Face::Triangle { .. } => 3,
|
||||||
|
&Face::Quad { .. } => 4,
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Returns the number of faces (triangles/quads) on the mesh to be processed.
|
/// Returns the number of faces (triangles/quads) on the mesh to be processed.
|
||||||
@ -23,7 +43,7 @@ pub struct Context {
|
|||||||
extern "C" fn faces(pContext: *const ffi::SMikkTSpaceContext) -> c_int {
|
extern "C" fn faces(pContext: *const ffi::SMikkTSpaceContext) -> c_int {
|
||||||
unsafe {
|
unsafe {
|
||||||
let m: *const Context = mem::transmute(pContext);
|
let m: *const Context = mem::transmute(pContext);
|
||||||
(*m).faces as c_int
|
(*m).faces.len() as c_int
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -36,7 +56,7 @@ extern "C" fn vertices(
|
|||||||
) -> c_int {
|
) -> c_int {
|
||||||
unsafe {
|
unsafe {
|
||||||
let _: *const Context = mem::transmute(pContext);
|
let _: *const Context = mem::transmute(pContext);
|
||||||
unimplemented!()
|
3
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -114,16 +134,19 @@ extern "C" fn set_tspace(
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl Context {
|
impl Context {
|
||||||
pub fn new() -> Self {
|
/// Constructor for a MikkTSpace `Context`.
|
||||||
|
pub fn new<F, P, T, N>(faces: F, positions: P, tex_coords: T, normals: N) -> Self
|
||||||
|
where
|
||||||
|
F: 'static + ExactSizeIterator<Item = Face>,
|
||||||
|
P: 'static + ExactSizeIterator<Item = [f32; 3]>,
|
||||||
|
T: 'static + ExactSizeIterator<Item = [f32; 2]>,
|
||||||
|
N: 'static + ExactSizeIterator<Item = [f32; 3]>,
|
||||||
|
{
|
||||||
Context {
|
Context {
|
||||||
faces: 3,
|
faces: Box::new(faces),
|
||||||
|
positions: Box::new(positions),
|
||||||
|
tex_coords: Box::new(tex_coords),
|
||||||
|
normals: Box::new(normals),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(test)]
|
|
||||||
mod tests {
|
|
||||||
#[test]
|
|
||||||
fn it_works() {
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user