quackie 0.2.1

A duck for your terminal! 🦆
Documentation
use std::sync::Arc;

use crate::geometry::{matrix::Matrix3D, triangle::Triangle2D, vector::Vector2D};

use super::{image_buffer::ImageBuffer, pixel_data::PixelData};

#[derive(Clone, Debug)]
pub struct TexturedTriangle2D {
    geometry: Triangle2D,
    uv_geometry: Triangle2D,
    texture: Arc<ImageBuffer>,
}

impl TexturedTriangle2D {
    pub fn new(geometry: Triangle2D, uv_geometry: Triangle2D, texture: Arc<ImageBuffer>) -> Self {
        Self {
            geometry,
            uv_geometry,
            texture,
        }
    }
    pub fn unipixeled(geometry: Triangle2D, pixel_data: PixelData) -> Self {
        Self::new(
            geometry,
            Triangle2D::default(),
            Arc::new(ImageBuffer::new(0, 0, pixel_data)),
        )
    }
    pub fn is_point_inside(&self, point: &Vector2D) -> bool {
        self.geometry.is_point_inside(point)
    }
    pub fn get_pixel_at(&self, point: &Vector2D) -> PixelData {
        let uv = self.geometry.to_uv_point(&self.uv_geometry, point);
        let u = (uv.x.max(0.)) as usize;
        let v = (uv.y.max(0.)) as usize;
        self.texture.get_pixel_at(u, v)
    }
    pub fn transform(&mut self, matrix: Matrix3D) {
        self.geometry = matrix * self.geometry;
    }
}