From f87deae2c7d671260a18de9e8750c9671935511c Mon Sep 17 00:00:00 2001 From: ghostly_zsh Date: Sun, 5 Jan 2025 22:25:00 -0600 Subject: [PATCH] shear --- starkingdoms-client/src/ecs.rs | 18 +++++++++++++ starkingdoms-client/src/lib.rs | 26 +++++++++++++++++-- starkingdoms-client/src/rendering/renderer.rs | 17 ++++++------ 3 files changed, 51 insertions(+), 10 deletions(-) diff --git a/starkingdoms-client/src/ecs.rs b/starkingdoms-client/src/ecs.rs index dc71addf9fe8aaa21802488be08fab7881f49115..7f69d2db9c592f5623d048844269fdaeb0c1a7c6 100644 --- a/starkingdoms-client/src/ecs.rs +++ b/starkingdoms-client/src/ecs.rs @@ -18,6 +18,21 @@ impl Translation { } } +#[derive(Component, Debug, Clone, Copy)] +pub struct Shear { + pub x: f32, + pub y: f32, +} +impl Shear { + pub fn as_matrix(&self) -> Matrix3 { + Matrix3::from_iterator([ + 1.0, self.x, 0.0, + self.y, 1.0, 0.0, + 0.0, 0.0, 1.0, + ]) + } +} + #[derive(Component, Debug, Clone, Copy)] pub struct Scale { pub width: f32, @@ -56,6 +71,7 @@ pub struct SpriteTexture { #[derive(Bundle)] pub struct SpriteBundle { pub position: Translation, + pub shear: Shear, pub scale: Scale, pub texture: SpriteTexture, pub rotation: Rotation @@ -65,5 +81,7 @@ pub struct SpriteBundle { pub struct Camera { pub x: f32, pub y: f32, + pub shear_x: f32, + pub shear_y: f32, pub zoom: f32, } diff --git a/starkingdoms-client/src/lib.rs b/starkingdoms-client/src/lib.rs index 2b114d479515b767d142566766c98f45298549ec..438f3ab87e0cd16169793658441c954c42c8b21f 100644 --- a/starkingdoms-client/src/lib.rs +++ b/starkingdoms-client/src/lib.rs @@ -6,6 +6,7 @@ use bevy_ecs::event::{EventReader, Events}; use bevy_ecs::schedule::Schedule; use bevy_ecs::system::ResMut; use bevy_ecs::world::World; +use ecs::Shear; use egui::{Context, DragValue}; use tracing::info; use winit::event_loop::{ControlFlow, EventLoop}; @@ -40,6 +41,8 @@ pub fn start() { world.insert_resource(Camera { x: 0.0, y: 0.0, + shear_x: 0.0, + shear_y: 0.0, zoom: 1.0, }); @@ -58,6 +61,10 @@ pub fn start() { x: 100.0, y: 100.0 }, + shear: Shear { + x: 0.0, + y: 0.0, + }, scale: Scale { width: 100.0, height: 100.0, @@ -108,8 +115,8 @@ impl UiRenderable for Gui { ui.label("A game about floating through space"); ui.separator(); - let mut sprites = world.query::<(&mut Translation, &mut Scale, &SpriteTexture, &mut Rotation)>(); - for (mut pos, mut scale, tex, mut rot) in sprites.iter_mut(world) { + let mut sprites = world.query::<(&mut Translation, &mut Shear, &mut Scale, &SpriteTexture, &mut Rotation)>(); + for (mut pos, mut shear, mut scale, tex, mut rot) in sprites.iter_mut(world) { ui.heading(&tex.texture); egui::Grid::new("sprite_grid") @@ -125,6 +132,14 @@ impl UiRenderable for Gui { ui.add(DragValue::new(&mut pos.y).speed(0.1)); ui.end_row(); + ui.label("Shear X"); + ui.add(DragValue::new(&mut shear.x).speed(0.1)); + ui.end_row(); + + ui.label("Shear Y"); + ui.add(DragValue::new(&mut shear.y).speed(0.1)); + ui.end_row(); + ui.label("Width"); ui.add(DragValue::new(&mut scale.width).speed(0.1)); ui.end_row(); @@ -151,6 +166,13 @@ impl UiRenderable for Gui { ui.add(DragValue::new(&mut camera.y).speed(0.1)); ui.end_row(); + ui.label("Shear X"); + ui.add(DragValue::new(&mut camera.shear_x).speed(0.1)); + ui.end_row(); + ui.label("Shear Y"); + ui.add(DragValue::new(&mut camera.shear_y).speed(0.1)); + ui.end_row(); + ui.label("Camera Zoom"); ui.add(DragValue::new(&mut camera.zoom).speed(0.1)); ui.end_row(); diff --git a/starkingdoms-client/src/rendering/renderer.rs b/starkingdoms-client/src/rendering/renderer.rs index e4f94595888fdf85daeae0d48338559db11a3f33..150ffd21cea9fa3ebffc9081ba4a7779cc9c8275 100644 --- a/starkingdoms-client/src/rendering/renderer.rs +++ b/starkingdoms-client/src/rendering/renderer.rs @@ -1,4 +1,4 @@ -use crate::ecs::{Camera, Translation, Rotation, Scale, SpriteTexture}; +use crate::ecs::{Camera, Rotation, Scale, Shear, SpriteTexture, Translation}; use crate::rendering::mipmap::MipGenerator; use crate::rendering::renderer::RenderInitRes::{Initialized, NotReadyYet}; use crate::rendering::texture; @@ -243,19 +243,19 @@ impl Renderer { label: Some("command encoder"), }); - let mut sprites_to_render: Vec<(Translation, Scale, SpriteTexture, Rotation)> = vec![]; + let mut sprites_to_render: Vec<(Translation, Shear, Scale, SpriteTexture, Rotation)> = vec![]; - let mut things_to_render = self.world.query::<(&Translation, &Scale, &SpriteTexture, &Rotation)>(); + let mut things_to_render = self.world.query::<(&Translation, &Shear, &Scale, &SpriteTexture, &Rotation)>(); for thing in things_to_render.iter_mut(&mut self.world) { - sprites_to_render.push((*thing.0, *thing.1, thing.2.clone(), *thing.3)); + sprites_to_render.push((*thing.0, *thing.1, *thing.2, thing.3.clone(), *thing.4)); } let cam = self.world.resource::(); let mut frame_uniform = vec![]; let frame_uniform_values = [ - cam.zoom, 0.0, 0.0, 0.0, - 0.0, cam.zoom, 0.0, 0.0, + cam.zoom, cam.shear_y,0.0, 0.0, + cam.shear_x,cam.zoom, 0.0, 0.0, cam.x, cam.y, 1.0, 0.0, self.logical_size.width as f32, self.logical_size.height as f32, 0.0, 0.0]; for i in frame_uniform_values { @@ -265,7 +265,7 @@ impl Renderer { self.queue.write_buffer(&self.frame_uniform, 0, &frame_uniform); - for (pos, scale, tex, rot) in sprites_to_render { + for (pos, shear, scale, tex, rot) in sprites_to_render { let tex = self.textures.entry(tex.texture.clone()).or_insert_with(|| { info!("loading texture {}", &tex.texture); let b: &[u8] = match tex.texture.as_str() { @@ -284,10 +284,11 @@ impl Renderer { }); let xy_matrix = pos.as_matrix(); + let shear_matrix = shear.as_matrix(); let rot_matrix = rot.as_matrix(); let scale_matrix = scale.as_matrix(); - let transform_matrix = scale_matrix * rot_matrix * xy_matrix; + let transform_matrix = scale_matrix * shear_matrix * rot_matrix * xy_matrix; let mut local_buffer = vec![];