#[derive(Copy, Clone, Debug, Default)]
#[repr(C)]
pub struct DrawingVertex {
position: [f32; 2],
color: [f32; 3],
tex_coord: [i32; 2],
}
impl DrawingVertex {
#[allow(dead_code)]
#[inline]
pub fn color(&self) -> [f32; 3] {
self.color
}
#[inline]
pub fn position(&self) -> [f32; 2] {
self.position
}
#[inline]
pub fn set_position(&mut self, position: [f32; 2]) {
self.position = position;
}
#[inline]
pub fn tex_coord(&self) -> [i32; 2] {
self.tex_coord
}
#[inline]
pub fn set_tex_coord(&mut self, tex_coord: [i32; 2]) {
self.tex_coord = tex_coord;
}
#[inline]
pub fn new_with_color(color: u32) -> Self {
let mut s = Self::default();
s.color_from_u32(color);
s
}
#[inline]
pub fn position_from_u32(&mut self, position: u32) {
self.position = vertex_position_from_u32(position);
}
#[inline]
pub fn color_from_u32(&mut self, color: u32) {
let r = (color & 0xFF) as u8;
let g = ((color >> 8) & 0xFF) as u8;
let b = ((color >> 16) & 0xFF) as u8;
self.color = [r as f32 / 255.0, g as f32 / 255.0, b as f32 / 255.0];
}
#[inline]
pub fn tex_coord_from_u32(&mut self, tex_coord: u32) {
self.tex_coord = [(tex_coord & 0xFF) as i32, ((tex_coord >> 8) & 0xFF) as i32];
}
}
#[derive(Copy, Clone, Debug, Default)]
pub struct DrawingTextureParams {
pub clut_base: [u32; 2],
pub tex_page_base: [u32; 2],
pub semi_transparency_mode: u8,
pub tex_page_color_mode: u8,
pub texture_disable: bool,
}
impl DrawingTextureParams {
#[inline]
pub fn tex_page_from_gpustat(&mut self, param: u32) {
let x = param & 0xF;
let y = (param >> 4) & 1;
self.tex_page_base = [x * 64, y * 256];
self.semi_transparency_mode = ((param >> 5) & 3) as u8;
self.tex_page_color_mode = ((param >> 7) & 3) as u8;
self.texture_disable = (param >> 11) & 1 == 1;
}
#[inline]
pub fn tex_page_from_u32(&mut self, param: u32) {
let param = param >> 16;
self.tex_page_from_gpustat(param);
}
#[inline]
pub fn clut_from_u32(&mut self, param: u32) {
let param = param >> 16;
let x = param & 0x3F;
let y = (param >> 6) & 0x1FF;
self.clut_base = [x * 16, y];
}
}
#[inline]
pub fn vertex_position_from_u32(position: u32) -> [f32; 2] {
let x = position & 0x7ff;
let sign_extend = 0xfffff800 * ((x >> 10) & 1);
let x = (x | sign_extend) as i32;
let y = (position >> 16) & 0x7ff;
let sign_extend = 0xfffff800 * ((y >> 10) & 1);
let y = (y | sign_extend) as i32;
[x as f32, y as f32]
}