wilhelm_renderer 0.8.0

A minimalist 2D data rendering engine
Documentation
use std::rc::Rc;
use glam::Mat4;

use crate::core::{geometry::Geometry, shader::Shader};
use crate::core::color::Color;
use crate::core::engine::opengl::{gl_get_uniform_location, gl_uniform_4f};
use crate::core::engine::opengl::GLuint;

pub struct Mesh {
    pub geometry: Geometry,
    pub shader: Rc<Shader>,
    transform: Mat4,
    screen_offset: Option<(f32, f32)>,
    scale: f32,
    rotation: f32,
    pub color: Option<Color>,
    pub texture: Option<GLuint>,
}

impl Mesh {
    
    pub fn new(shader: Rc<Shader>, geometry: Geometry) -> Self {
        Self {
            geometry,
            shader,
            transform: Mat4::IDENTITY,
            screen_offset: None,
            scale: 1.0,
            rotation: 0.0,
            color: None,
            texture: None
        }
    }

    pub fn with_color(shader: Rc<Shader>, geometry: Geometry, color: Option<Color>) -> Self {
        Self {
            geometry,
            shader,
            transform: Mat4::IDENTITY,
            screen_offset: None,
            scale: 1.0,
            rotation: 0.0,
            color,
            texture: None
        }
    }

    pub fn with_texture(shader: Rc<Shader>, geometry: Geometry, texture: Option<GLuint>)->Self{
        Self {
            geometry,
            shader,
            transform: Mat4::IDENTITY,
            screen_offset: None,
            scale: 1.0,
            rotation: 0.0,
            color: None,
            texture
        }
    }

    // needs to go into renderer!
    pub fn set_uniform_4f(&self, location: &str, vec4: &[f32; 4]) {
        let loc = gl_get_uniform_location(self.shader.program(), location);
        gl_uniform_4f(loc, vec4[0], vec4[1], vec4[2], vec4[3]);
    }

    pub fn set_transform(&mut self, transform: Mat4) {
        self.transform = transform
    }

    pub fn transform(&self) -> Mat4 {
        self.transform
    }

    pub fn set_screen_offset(&mut self, x: f32, y: f32) {
        self.screen_offset = Some((x, y));
    }
    pub fn screen_offset(&self) -> (f32, f32) {
        self.screen_offset.unwrap_or((0.0, 0.0))
    }

    pub fn set_scale(&mut self, scale: f32) {
        self.scale = scale;
    }
    pub fn scale(&self) -> f32 {
        self.scale
    }

    pub fn set_rotation(&mut self, angle: f32) {
        self.rotation = angle;
    }
    pub fn rotation(&self) -> f32 {
        self.rotation
    }
}