From 0958067ee6628f0d20bb3efe520a7b0c30cc71ef Mon Sep 17 00:00:00 2001 From: ghostly_zsh Date: Sun, 5 Jan 2025 22:04:58 -0600 Subject: [PATCH] rotation fixed, camera transform works, camera gui added --- starkingdoms-client/src/ecs.rs | 6 ++--- starkingdoms-client/src/lib.rs | 17 ++++++++++++++ starkingdoms-client/src/rendering/renderer.rs | 16 +++++++++---- starkingdoms-client/src/shaders/sprite.wgsl | 23 ++++++++++--------- 4 files changed, 44 insertions(+), 18 deletions(-) diff --git a/starkingdoms-client/src/ecs.rs b/starkingdoms-client/src/ecs.rs index aa506efa0a0643b98981eda46271228b469386ea..dc71addf9fe8aaa21802488be08fab7881f49115 100644 --- a/starkingdoms-client/src/ecs.rs +++ b/starkingdoms-client/src/ecs.rs @@ -11,9 +11,9 @@ pub struct Translation { impl Translation { pub fn as_matrix(&self) -> Matrix3 { Matrix3::from_iterator([ - 1.0, 0.0, 0.0, - 0.0, 1.0, 0.0, - self.x, self.y, 1.0, + 1.0, 0.0, self.x, + 0.0, 1.0, self.y, + 0.0, 0.0, 1.0, ]) } } diff --git a/starkingdoms-client/src/lib.rs b/starkingdoms-client/src/lib.rs index cc338c0aa29eade752443a8e901071b13dd44332..2b114d479515b767d142566766c98f45298549ec 100644 --- a/starkingdoms-client/src/lib.rs +++ b/starkingdoms-client/src/lib.rs @@ -138,6 +138,23 @@ impl UiRenderable for Gui { ui.end_row(); }); } + let mut camera = world.resource_mut::(); + egui::Grid::new("camera_grid") + .num_columns(2) + .spacing([40.0, 4.0]) + .show(ui, |ui| { + ui.label("Camera X"); + ui.add(DragValue::new(&mut camera.x).speed(0.1)); + ui.end_row(); + + ui.label("Camera Y"); + ui.add(DragValue::new(&mut camera.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 0c80b3c94b75c0935bebf0cc98bf7f0ca54d1020..e4f94595888fdf85daeae0d48338559db11a3f33 100644 --- a/starkingdoms-client/src/rendering/renderer.rs +++ b/starkingdoms-client/src/rendering/renderer.rs @@ -102,12 +102,16 @@ impl Renderer { .await .unwrap(); + let mut limits = Limits::downlevel_webgl2_defaults(); + limits.max_texture_dimension_1d = 8192; + limits.max_texture_dimension_2d = 8192; + limits.max_texture_dimension_3d = 2048; let (device, queue) = adapter .request_device( &DeviceDescriptor { label: Some("Basic render device"), required_features: Features::default(), - required_limits: Limits::downlevel_webgl2_defaults(), + required_limits: limits, memory_hints: Default::default(), }, None, @@ -162,7 +166,7 @@ impl Renderer { let frame_uniform = device.create_buffer(&BufferDescriptor { label: Some("frame uniforms"), - size: 16, // vec2f, vec2f + size: 48 + 16, // mat3x3f, vec2f usage: BufferUsages::UNIFORM | BufferUsages::COPY_DST, mapped_at_creation: false, }); @@ -249,7 +253,11 @@ impl Renderer { let cam = self.world.resource::(); let mut frame_uniform = vec![]; - let frame_uniform_values = [cam.x, cam.y, self.logical_size.width as f32, self.logical_size.height as f32]; + let frame_uniform_values = [ + cam.zoom, 0.0, 0.0, 0.0, + 0.0, 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 { let mut bytes = i.to_ne_bytes().to_vec(); frame_uniform.append(&mut bytes); @@ -279,7 +287,7 @@ impl Renderer { let rot_matrix = rot.as_matrix(); let scale_matrix = scale.as_matrix(); - let transform_matrix = xy_matrix * rot_matrix * scale_matrix; + let transform_matrix = scale_matrix * rot_matrix * xy_matrix; let mut local_buffer = vec![]; diff --git a/starkingdoms-client/src/shaders/sprite.wgsl b/starkingdoms-client/src/shaders/sprite.wgsl index 198889206039d04f07c058f38c9f06d3cf8fefde..2674eb5f4959b31aee4df2051bfbaec434b02ac8 100644 --- a/starkingdoms-client/src/shaders/sprite.wgsl +++ b/starkingdoms-client/src/shaders/sprite.wgsl @@ -4,8 +4,8 @@ struct VertexShaderOut { } struct FrameUniforms { - camera_position: vec2f, - viewport_size: vec2f + camera_transform: mat3x3f, + viewport_size: vec2f, } struct LocalUniforms { transform: mat3x3f, @@ -17,17 +17,18 @@ struct LocalUniforms { @builtin(vertex_index) vertexIndex : u32 ) -> VertexShaderOut { let pos = array( - vec2(0.0, 0.0), - vec2(1.0, 0.0), - vec2(0.0, 1.0), - vec2(0.0, 1.0), - vec2(1.0, 0.0), - vec2(1.0, 1.0) + vec2(-0.5, -0.5), + vec2(0.5, -0.5), + vec2(-0.5, 0.5), + vec2(-0.5, 0.5), + vec2(0.5, -0.5), + vec2(0.5, 0.5) ); var vsOutput: VertexShaderOut; - let position = (local_uni.transform * vec3f(pos[vertexIndex], 1)).xy; + let homogeneous_position = frame_uni.camera_transform * local_uni.transform * vec3f(pos[vertexIndex], 1); + let position = homogeneous_position.xy / homogeneous_position.z; // convert from pixels to 0.0 to 1.0 let zeroToOne = position / frame_uni.viewport_size; // convert from 0 - 1 to 0 - 2 @@ -38,7 +39,7 @@ struct LocalUniforms { let clipSpace = flippedClipSpace * vec2f(1, -1); vsOutput.position = vec4f(clipSpace, 0.0, 1.0); - vsOutput.texcoord = pos[vertexIndex]; + vsOutput.texcoord = pos[vertexIndex] + vec2f(0.5, 0.5); return vsOutput; } @@ -48,4 +49,4 @@ struct LocalUniforms { @fragment fn fs(fsInput: VertexShaderOut) -> @location(0) vec4 { return textureSample(tex, tex_sampler, fsInput.texcoord); -} \ No newline at end of file +}