Selected Wgpu as rendering API

* adjusted API to better fit Wgpu's
This commit is contained in:
Steins7 2022-07-02 14:09:19 +02:00
parent 313d311be8
commit 091454922b
3 changed files with 78 additions and 69 deletions

View File

@ -7,7 +7,8 @@ use crate::{
io::{Key, Scroll}, io::{Key, Scroll},
sprite::{Sprite, TextureSprite, TextSprite, ShapeSprite}, sprite::{Sprite, TextureSprite, TextSprite, ShapeSprite},
texture::Texture, texture::Texture,
utils::{Size, Pixel, Position}, utils::{Size, Pixel, Position, Color},
renderer::Renderer,
}; };
use std::{ use std::{
@ -24,13 +25,20 @@ pub trait Application {
} }
//--Canvas struct----------------------------------------------------------------------------------- //--Canvas struct-----------------------------------------------------------------------------------
pub struct Canvas {} pub struct Canvas {
renderer: Renderer,
clear_color: Pixel,
}
impl Canvas { impl Canvas {
pub fn create<W: HasRawWindowHandle>(_window: &W) -> Result<Canvas, &'static str> { pub fn create<W: HasRawWindowHandle>(window: &W) -> Result<Canvas, &'static str> {
let renderer = Renderer::create(window)?;
Ok(Self { Ok(Self {
renderer,
clear_color: Color::WHITE,
}) })
} }
@ -63,16 +71,17 @@ impl Canvas {
} }
//--Output functions-- //--Output functions--
pub fn draw<S: Sprite>(&mut self, _sprite: S) { pub fn draw<S: Sprite>(&mut self, sprite: &S) {
unimplemented!(); //update texture
self.renderer.draw(sprite);
} }
pub fn set_clear_color(&mut self, _color: Pixel) { pub fn set_clear_color(&mut self, color: Pixel) {
unimplemented!(); self.clear_color = color;
} }
pub fn clear(&mut self) { pub fn clear(&mut self) {
unimplemented!(); self.renderer.clear(&self.clear_color);
} }
//--Input functions-- //--Input functions--
@ -105,7 +114,7 @@ impl Canvas {
} }
pub fn update(&mut self) { pub fn update(&mut self) {
//unimplemented!(); self.renderer.finish_frame();
} }
} }

View File

@ -9,15 +9,15 @@ pub mod shape;
pub mod sprite; pub mod sprite;
pub mod texture; pub mod texture;
pub mod utils; pub mod utils;
mod renderer;
use utils::Size; use utils::Size;
pub fn run_vk_canvas<A: 'static + Application>(title: &'static str, size: Size, mut app: A) -> ! { pub fn run_canvas<A: 'static + Application>(title: &'static str, size: Size, mut app: A) -> ! {
use winit::{ use winit::{
event_loop::EventLoop, event_loop::EventLoop,
window::WindowBuilder, window::WindowBuilder,
}; };
// construct window // construct window
let event_loop = EventLoop::new(); let event_loop = EventLoop::new();
let window = WindowBuilder::new() let window = WindowBuilder::new()
@ -109,10 +109,10 @@ mod tests {
} }
#[test] #[test]
fn vk_create() { fn run_no_app() {
use crate::utils::Size; use crate::utils::Size;
crate::run_vk_canvas("vk_create", Size {w: 1280, h: 720}, TestApp {}); crate::run_canvas("vk_create", Size {w: 1280, h: 720}, TestApp {});
} }
} }

View File

@ -42,69 +42,69 @@ impl Application for ExampleApp {
shape::{Shape, Rectangle}, shape::{Shape, Rectangle},
}; };
//// inputs // inputs
//if canvas.key_pressed(Key::A) { if canvas.key_pressed(Key::A) {
// unimplemented!(); unimplemented!();
//} }
//
//if canvas.key_released(Key::A) {
// unimplemented!();
//}
//
//match canvas.get_key_presses() {
// Key::A => unimplemented!(),
// _ => (),
//}
//
//match canvas.get_key_releases() {
// Key::A => unimplemented!(),
// _ => (),
//}
//let _mouse = canvas.get_mouse_position(); if canvas.key_released(Key::A) {
unimplemented!();
}
//// outputs match canvas.get_key_presses() {
//canvas.set_clear_color(Color::BLACK); Key::A => unimplemented!(),
//canvas.clear(); _ => (),
}
//// white rectangle inset by one in the sprite match canvas.get_key_releases() {
//let mut bas_sprite = canvas.create_shape_sprite(); Key::A => unimplemented!(),
//bas_sprite.set_shape(Shape::Rectangle (Rectangle {size: Size {w: 38, h: 38}})); _ => (),
//bas_sprite.set_color(Color::WHITE); }
//canvas.draw(bas_sprite);
//// 20 x 20 sprite of a picture let _mouse = canvas.get_mouse_position();
//let texture = canvas.create_texture_from_file(
// Position {x: 0, y: 0},
// "texture.png",
// Some(Color::WHITE)
//);
//let mut pix_sprite = canvas.create_texture_sprite(Size {w: 20, h: 20}, 1.0);
//pix_sprite.set_texture(texture, Some(Position {x: 0, y: 0}));
//canvas.draw(pix_sprite);
//// scaled sprite of a manually drawed texture // outputs
//let texture = canvas.create_texture(Size {w: 20, h: 20}, Some(Color::WHITE)); canvas.set_clear_color(Color::BLACK);
//texture.borrow_mut().set_pixel(Position {x: 0, y: 0}, Pixel::rgb(0, 255, 0)); canvas.clear();
//let _ = texture.borrow_mut().iter_mut(); //iterate on whole texture
//pix_sprite = canvas.create_texture_sprite(Size {w: 20, h: 20}, 2.0);
//pix_sprite.set_texture(texture, None);
//let _ = pix_sprite.iter_mut(); //only iterate on the part used by the sprite
//canvas.draw(pix_sprite);
//// floating text // white rectangle inset by one in the sprite
//let mut txt_sprite = canvas.create_text_sprite(Size {w: 10, h: 10}, 5.0); let mut bas_sprite = canvas.create_shape_sprite();
//txt_sprite.set_text("text"); bas_sprite.set_shape(Shape::Rectangle (Rectangle {size: Size {w: 38, h: 38}}));
//txt_sprite.set_color(Color::BLACK); bas_sprite.set_color(Color::WHITE);
canvas.draw(&bas_sprite);
//// generic operations // 20 x 20 sprite of a picture
//txt_sprite.set_position(Position {x: 0, y: 0}); let texture = canvas.create_texture_from_file(
//txt_sprite.set_rotation(50.0); Position {x: 0, y: 0},
//txt_sprite.set_alpha(255); "texture.png",
//txt_sprite.set_scale(0.5); Some(Color::WHITE)
//canvas.draw(txt_sprite); );
let mut pix_sprite = canvas.create_texture_sprite(Size {w: 20, h: 20}, 1.0);
pix_sprite.set_texture(texture, Some(Position {x: 0, y: 0}));
canvas.draw(&pix_sprite);
//canvas.update(); // scaled sprite of a manually drawed texture
let texture = canvas.create_texture(Size {w: 20, h: 20}, Some(Color::WHITE));
texture.borrow_mut().set_pixel(Position {x: 0, y: 0}, Pixel::rgb(0, 255, 0));
let _ = texture.borrow_mut().iter_mut(); //iterate on whole texture
pix_sprite = canvas.create_texture_sprite(Size {w: 20, h: 20}, 2.0);
pix_sprite.set_texture(texture, None);
let _ = pix_sprite.iter_mut(); //only iterate on the part used by the sprite
canvas.draw(&pix_sprite);
// floating text
let mut txt_sprite = canvas.create_text_sprite(Size {w: 10, h: 10}, 5.0);
txt_sprite.set_text("text");
txt_sprite.set_color(Color::BLACK);
// generic operations
txt_sprite.set_position(Position {x: 0, y: 0});
txt_sprite.set_rotation(50.0);
txt_sprite.set_alpha(255);
txt_sprite.set_scale(0.5);
canvas.draw(&txt_sprite);
canvas.update();
Ok(()) Ok(())
} }
@ -115,6 +115,6 @@ fn main() -> Result<(), &'static str> {
setup_logger() setup_logger()
.map_err(|_| "Failed to setup logger")?; .map_err(|_| "Failed to setup logger")?;
canvas::run_vk_canvas("vk_example", Size {w: 1280, h: 720}, ExampleApp {}); canvas::run_canvas("vk_example", Size {w: 1280, h: 720}, ExampleApp {});
} }