use std::marker::PhantomData;
use crate::asset_id::{AppAssetId, IdU16};
use super::geom::Affine;
use super::render_buffer::RenderBuffer;
use super::core_renderer::CoreRenderer;
pub struct Renderer<A: AppAssetId> { b: RenderBuffer, c: CoreRenderer, phantom: PhantomData<A> }
impl<A: AppAssetId> Renderer<A> {
pub(crate) fn new(buffer: RenderBuffer, core_renderer: CoreRenderer) -> Renderer<A> {
let mut result = Renderer { b: buffer, c: core_renderer, phantom: PhantomData };
result.set_scissor();
result
}
pub fn clear(&mut self, color: (u8, u8, u8)) {
self.b.flush(&mut self.c);
self.c.clear(color);
}
pub fn sprite_mode(&mut self) -> SpriteRenderer<A> {
SpriteRenderer { r: self }
}
pub(crate) fn app_dims(&self) -> (f64, f64) { self.b.dims.dims }
pub(crate) fn native_px(&self) -> f64 { 1. / self.b.dims.pixel_scalar }
pub(crate) fn to_app_pos(&self, raw_x: i32, raw_y: i32) -> (f64, f64) {
self.b.dims.to_app_pos(raw_x, raw_y)
}
pub(crate) fn flush(&mut self) {
self.b.flush(&mut self.c);
}
pub(crate) fn set_screen_dims(&mut self, dims: (u32, u32)) {
if dims != self.b.dims.native_dims {
self.b.dims.set_native_dims(dims);
self.set_scissor();
}
}
fn set_scissor(&mut self) {
let dims = &self.b.dims;
self.c.set_scissor(
dims.native_pre_pad.0,
dims.native_pre_pad.1,
dims.used_native_dims.0,
dims.used_native_dims.1,
);
}
}
pub struct SpriteRenderer<'a, A: AppAssetId + 'a> {
r: &'a mut Renderer<A>,
}
impl<'a, A: AppAssetId + 'a> SpriteRenderer<'a, A> {
pub fn draw(&mut self, affine: &Affine, sprite: A::Sprite) {
self.draw_flash(affine, sprite, 0.);
}
pub fn draw_flash(&mut self, affine: &Affine, sprite: A::Sprite, flash_ratio: f64) {
self.r.b.append_sprite(&mut self.r.c, affine, sprite.id_u16(), flash_ratio);
}
}