~starkingdoms/starkingdoms

0958067ee6628f0d20bb3efe520a7b0c30cc71ef — ghostly_zsh 11 months ago 1aa4b3b
rotation fixed, camera transform works, camera gui added
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
}