mirror of https://github.com/AxioDL/metaforce.git
194 lines
5.2 KiB
Rust
194 lines
5.2 KiB
Rust
use bytemuck_derive::{Pod, Zeroable};
|
|
use cxx::{type_id, ExternType};
|
|
|
|
use crate::util::{Vec2, Vec3};
|
|
|
|
#[derive(Debug, Copy, Clone, Pod, Zeroable, Default)]
|
|
#[repr(C)]
|
|
pub struct CVector2f {
|
|
pub x: f32,
|
|
pub y: f32,
|
|
_p1: f32,
|
|
_p2: f32,
|
|
}
|
|
impl CVector2f {
|
|
pub const fn new(x: f32, y: f32) -> Self { Self { x, y, _p1: 0.0, _p2: 0.0 } }
|
|
}
|
|
unsafe impl ExternType for CVector2f {
|
|
type Id = type_id!("zeus::CVector2f");
|
|
type Kind = cxx::kind::Trivial;
|
|
}
|
|
|
|
#[derive(Debug, Copy, Clone, Pod, Zeroable, Default)]
|
|
#[repr(C)]
|
|
pub struct CVector3f {
|
|
pub x: f32,
|
|
pub y: f32,
|
|
pub z: f32,
|
|
_p: f32,
|
|
}
|
|
impl CVector3f {
|
|
pub const fn new(x: f32, y: f32, z: f32) -> Self { Self { x, y, z, _p: 0.0 } }
|
|
}
|
|
unsafe impl ExternType for CVector3f {
|
|
type Id = type_id!("zeus::CVector3f");
|
|
type Kind = cxx::kind::Trivial;
|
|
}
|
|
|
|
#[derive(Debug, Copy, Clone, Pod, Zeroable, Default)]
|
|
#[repr(C)]
|
|
pub struct CVector4f {
|
|
pub x: f32,
|
|
pub y: f32,
|
|
pub z: f32,
|
|
pub w: f32,
|
|
}
|
|
impl CVector4f {
|
|
pub const fn new(x: f32, y: f32, z: f32, w: f32) -> Self { Self { x, y, z, w } }
|
|
}
|
|
unsafe impl ExternType for CVector4f {
|
|
type Id = type_id!("zeus::CVector4f");
|
|
type Kind = cxx::kind::Trivial;
|
|
}
|
|
|
|
#[derive(Debug, Copy, Clone, Pod, Zeroable, Default)]
|
|
#[repr(C)]
|
|
pub struct CColor {
|
|
pub r: f32,
|
|
pub g: f32,
|
|
pub b: f32,
|
|
pub a: f32,
|
|
}
|
|
impl CColor {
|
|
pub const fn new(r: f32, g: f32, b: f32, a: f32) -> Self { Self { r, g, b, a } }
|
|
}
|
|
unsafe impl ExternType for CColor {
|
|
type Id = type_id!("zeus::CColor");
|
|
type Kind = cxx::kind::Trivial;
|
|
}
|
|
|
|
#[derive(Debug, Copy, Clone, Pod, Zeroable, Default)]
|
|
#[repr(C)]
|
|
pub struct CRectangle {
|
|
pub position: CVector2f,
|
|
pub size: CVector2f,
|
|
}
|
|
impl CRectangle {
|
|
pub const fn new(x: f32, y: f32, w: f32, h: f32) -> Self {
|
|
Self { position: CVector2f::new(x, y), size: CVector2f::new(w, h) }
|
|
}
|
|
}
|
|
unsafe impl ExternType for CRectangle {
|
|
type Id = type_id!("zeus::CRectangle");
|
|
type Kind = cxx::kind::Trivial;
|
|
}
|
|
|
|
#[derive(Debug, Copy, Clone, Pod, Zeroable, Default)]
|
|
#[repr(C)]
|
|
pub struct CAABox {
|
|
pub min: CVector3f,
|
|
pub max: CVector3f,
|
|
}
|
|
impl CAABox {
|
|
pub const fn new(min: CVector3f, max: CVector3f) -> Self { Self { min, max } }
|
|
}
|
|
unsafe impl ExternType for CAABox {
|
|
type Id = type_id!("zeus::CAABox");
|
|
type Kind = cxx::kind::Trivial;
|
|
}
|
|
|
|
pub const IDENTITY_MATRIX4F: CMatrix4f = CMatrix4f {
|
|
x: CVector4f::new(1.0, 0.0, 0.0, 0.0),
|
|
y: CVector4f::new(0.0, 1.0, 0.0, 0.0),
|
|
z: CVector4f::new(0.0, 0.0, 1.0, 0.0),
|
|
w: CVector4f::new(0.0, 0.0, 0.0, 1.0),
|
|
};
|
|
#[derive(Debug, Copy, Clone, Pod, Zeroable)]
|
|
#[repr(C)]
|
|
pub struct CMatrix4f {
|
|
pub x: CVector4f,
|
|
pub y: CVector4f,
|
|
pub z: CVector4f,
|
|
pub w: CVector4f,
|
|
}
|
|
impl CMatrix4f {
|
|
pub const fn new(x: CVector4f, y: CVector4f, z: CVector4f, w: CVector4f) -> Self {
|
|
Self { x, y, z, w }
|
|
}
|
|
}
|
|
impl Default for CMatrix4f {
|
|
fn default() -> Self { IDENTITY_MATRIX4F }
|
|
}
|
|
unsafe impl ExternType for CMatrix4f {
|
|
type Id = type_id!("zeus::CMatrix4f");
|
|
type Kind = cxx::kind::Trivial;
|
|
}
|
|
|
|
#[cxx::bridge(namespace = "zeus")]
|
|
mod ffi {
|
|
unsafe extern "C++" {
|
|
include!("zeus/CVector2f.hpp");
|
|
include!("zeus/CVector3f.hpp");
|
|
include!("zeus/CVector4f.hpp");
|
|
include!("zeus/CMatrix4f.hpp");
|
|
include!("zeus/CColor.hpp");
|
|
include!("zeus/CRectangle.hpp");
|
|
include!("zeus/CAABox.hpp");
|
|
type CVector2f = crate::zeus::CVector2f;
|
|
type CVector3f = crate::zeus::CVector3f;
|
|
type CVector4f = crate::zeus::CVector4f;
|
|
type CMatrix4f = crate::zeus::CMatrix4f;
|
|
type CColor = crate::zeus::CColor;
|
|
type CRectangle = crate::zeus::CRectangle;
|
|
type CAABox = crate::zeus::CAABox;
|
|
}
|
|
}
|
|
|
|
impl From<cgmath::Vector4<f32>> for CVector4f {
|
|
fn from(v: cgmath::Vector4<f32>) -> Self { Self { x: v.x, y: v.y, z: v.z, w: v.w } }
|
|
}
|
|
impl From<CVector4f> for cgmath::Vector4<f32> {
|
|
fn from(v: CVector4f) -> Self { Self { x: v.x, y: v.y, z: v.z, w: v.w } }
|
|
}
|
|
|
|
impl From<cgmath::Matrix4<f32>> for CMatrix4f {
|
|
fn from(m: cgmath::Matrix4<f32>) -> Self {
|
|
Self {
|
|
x: CVector4f::from(m.x),
|
|
y: CVector4f::from(m.y),
|
|
z: CVector4f::from(m.z),
|
|
w: CVector4f::from(m.w),
|
|
}
|
|
}
|
|
}
|
|
impl From<CMatrix4f> for cgmath::Matrix4<f32> {
|
|
fn from(m: CMatrix4f) -> Self {
|
|
Self {
|
|
x: cgmath::Vector4::from(m.x),
|
|
y: cgmath::Vector4::from(m.y),
|
|
z: cgmath::Vector4::from(m.z),
|
|
w: cgmath::Vector4::from(m.w),
|
|
}
|
|
}
|
|
}
|
|
|
|
impl From<Vec2<f32>> for CVector2f {
|
|
fn from(v: Vec2<f32>) -> Self { Self { x: v.x, y: v.y, _p1: 0.0, _p2: 0.0 } }
|
|
}
|
|
impl From<CVector2f> for Vec2<f32> {
|
|
fn from(v: CVector2f) -> Self { Self { x: v.x, y: v.y } }
|
|
}
|
|
impl From<&CVector2f> for Vec2<f32> {
|
|
fn from(v: &CVector2f) -> Self { Self { x: v.x, y: v.y } }
|
|
}
|
|
|
|
impl From<Vec3<f32>> for CVector3f {
|
|
fn from(v: Vec3<f32>) -> Self { Self { x: v.x, y: v.y, z: v.z, _p: 0.0 } }
|
|
}
|
|
impl From<CVector3f> for Vec3<f32> {
|
|
fn from(v: CVector3f) -> Self { Self { x: v.x, y: v.y, z: v.z } }
|
|
}
|
|
impl From<&CVector3f> for Vec3<f32> {
|
|
fn from(v: &CVector3f) -> Self { Self { x: v.x, y: v.y, z: v.z } }
|
|
}
|