use nalgebra_glm::Mat4;
use crate::core::math::mvp;
#[derive(Copy, Clone, Debug)]
pub struct Transform {
object: Mat4,
rotation: Mat4,
scale: Mat4,
x: f32, y: f32, z: f32
}
impl Transform {
pub fn new() -> Transform {
let object = mvp::identity();
let scale = mvp::identity();
let rotation = mvp::identity();
Transform {object, rotation, scale, x: 0.0, y: 0.0, z: 0.0}
}
pub fn set(&mut self, x: f32, y: f32, z: f32) {
let id = mvp::identity();
self.x = x;
self.y = y;
self.z = z;
self.object = mvp::translate(&id, x, y, z);
}
pub fn set_x(&mut self, val: f32) {
let id = mvp::identity();
self.x = val;
self.object = mvp::translate(&id, val, self.y, self.z);
}
pub fn set_y(&mut self, val: f32) {
let id = mvp::identity();
self.y = val;
self.object = mvp::translate(&id, self.x, val, self.z);
}
pub fn set_z(&mut self, val: f32) {
let id = mvp::identity();
self.z = val;
self.object = mvp::translate(&id, self.x, self.y, val);
}
pub fn add(&mut self, x: f32, y: f32, z: f32) {
self.x += x;
self.y += y;
self.z += z;
self.object = mvp::translate(&self.object, x, y, z);
}
pub fn add_x(&mut self, val: f32) {
self.x += val;
self.object = mvp::translate(&self.object, val, 0.0, 0.0);
}
pub fn add_y(&mut self, val: f32) {
self.y += val;
self.object = mvp::translate(&self.object, 0.0, val, 0.0);
}
pub fn add_z(&mut self, val: f32) {
self.z += val;
self.object = mvp::translate(&self.object, 0.0, 0.0, val);
}
pub fn matrix(&self) -> Mat4 {
self.object * self.rotation * self.scale
}
pub fn pos(&self) -> (f32, f32, f32) {
(
self.object[(0, 3)], self.object[(1, 3)], self.object[(2, 3)], )
}
pub fn set_rotation(&mut self, angle: f32, x: f32, y: f32, z: f32) {
let id = mvp::identity();
self.rotation = mvp::rotate(&id, angle, x, y, z);
}
pub fn add_rotation(&mut self, angle: f32, x: f32, y: f32, z: f32) {
self.rotation = mvp::rotate(&self.rotation, angle, x, y, z);
}
pub fn set_scale(&mut self, x: f32, y: f32, z: f32) {
let id = mvp::identity();
self.scale = mvp::scale(&id, x, y, z);
}
pub fn add_scale(&mut self, x: f32, y: f32, z: f32) {
self.scale = mvp::scale(&self.scale, x, y, z);
}
}
impl Default for Transform {
fn default() -> Self {
Transform::new()
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_transform() {
let mut transform = Transform::new();
assert_eq!(transform.x, 0.0);
assert_ne!(transform.y, 1.0);
transform.add_z(50.0);
assert_eq!(transform.z, 50.0);
}
}