M starkingdoms-client/src/ecs.rs => starkingdoms-client/src/ecs.rs +3 -3
@@ 11,9 11,9 @@ pub struct Translation {
impl Translation {
pub fn as_matrix(&self) -> Matrix3<f32> {
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,
])
}
}
M starkingdoms-client/src/lib.rs => starkingdoms-client/src/lib.rs +17 -0
@@ 138,6 138,23 @@ impl UiRenderable for Gui {
ui.end_row();
});
}
+ let mut camera = world.resource_mut::<Camera>();
+ 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();
+ });
});
}
}
M starkingdoms-client/src/rendering/renderer.rs => starkingdoms-client/src/rendering/renderer.rs +12 -4
@@ 102,12 102,16 @@ impl<T: UiRenderable> Renderer<T> {
.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<T: UiRenderable> Renderer<T> {
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<T: UiRenderable> Renderer<T> {
let cam = self.world.resource::<Camera>();
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<T: UiRenderable> Renderer<T> {
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![];
M starkingdoms-client/src/shaders/sprite.wgsl => starkingdoms-client/src/shaders/sprite.wgsl +12 -11
@@ 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<f32>(0.0, 0.0),
- vec2<f32>(1.0, 0.0),
- vec2<f32>(0.0, 1.0),
- vec2<f32>(0.0, 1.0),
- vec2<f32>(1.0, 0.0),
- vec2<f32>(1.0, 1.0)
+ vec2<f32>(-0.5, -0.5),
+ vec2<f32>(0.5, -0.5),
+ vec2<f32>(-0.5, 0.5),
+ vec2<f32>(-0.5, 0.5),
+ vec2<f32>(0.5, -0.5),
+ vec2<f32>(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<f32> {
return textureSample(tex, tex_sampler, fsInput.texcoord);
-}>
\ No newline at end of file
+}