mouse controls

This commit is contained in:
2025-03-31 22:51:48 -04:00
parent 34292dbe82
commit f1a91b1404
14 changed files with 121 additions and 142 deletions

View File

@@ -19,7 +19,7 @@ impl ComputeView {
impl Default for ComputeView {
fn default() -> Self {
let val = FixedDec::from_parts(false, 0, vec![0, 0, 0]);
Self::new(true, Vector2::zeros(), 0, &val, &val, &val)
Self::new(true, Vector2::zeros(), Vector2::zeros(), 0, &val, &val, &val)
}
}
@@ -27,6 +27,7 @@ impl ComputeView {
fn new(
reset: bool,
dims: Vector2<u32>,
stretch: Vector2<f32>,
level: i32,
scale: &FixedDec,
x: &FixedDec,
@@ -36,6 +37,7 @@ impl ComputeView {
bytes.extend((reset as u32).to_le_bytes());
bytes.extend(level.to_le_bytes());
bytes.extend(bytemuck::cast_slice(&[dims.x, dims.y]));
bytes.extend(bytemuck::cast_slice(&[stretch.x, stretch.y]));
scale.to_bytes(&mut bytes);
x.to_bytes(&mut bytes);
y.to_bytes(&mut bytes);
@@ -46,7 +48,7 @@ impl ComputeView {
Self { bytes }
}
pub fn from_camera_size(camera: &Camera, size: &Vector2<u32>, reset: bool, len: usize) -> Self {
pub fn from_camera(camera: &Camera, reset: bool, len: usize) -> Self {
let mut x = camera.pos.x.clone();
x.set_whole_len(1);
x.set_dec_len(len as i32 - 1);
@@ -54,17 +56,11 @@ impl ComputeView {
y.set_whole_len(1);
y.set_dec_len(len as i32 - 1);
let fsize: Vector2<f32> = size.cast();
let stretch = if size.x < size.y {
Vector2::new(fsize.x / fsize.y, 1.0)
} else {
Vector2::new(1.0, fsize.y / fsize.x)
};
let stretch = camera.stretch();
let mut scale = camera.zoom.mult().clone();
scale.set_precision(len);
Self::new(reset, *size, camera.zoom.level(), &scale, &x, &y)
Self::new(reset, camera.size, stretch, camera.zoom.level(), &scale, &x, &y)
}
}

View File

@@ -36,10 +36,9 @@ impl ComputePipeline {
encoder: &mut wgpu::CommandEncoder,
belt: &mut wgpu::util::StagingBelt,
camera: &Camera,
size: &Vector2<u32>,
len: usize,
) {
let mut view = ComputeView::from_camera_size(camera, size, false, len);
let mut view = ComputeView::from_camera(camera, false, len);
if view != self.old_view {
for (i, b) in 1u32.to_le_bytes().iter().enumerate() {
view.bytes[i] = *b;
@@ -49,7 +48,7 @@ impl ComputePipeline {
println!("new len: {}", len);
self.old_len = len;
self.pipeline = self.pipeline(device, &Self::shader(device, len));
self.work.set(work_vec(size.x, size.y, len));
self.work.set(work_vec(camera.size.x, camera.size.y, len));
}
let updated = self.work.update(device, encoder, belt)
| self.view.update(device, encoder, belt, view.bytes());
@@ -66,14 +65,7 @@ impl ComputePipeline {
pass.dispatch_workgroups(240, 135, 1);
}
pub fn resize(
&mut self,
device: &wgpu::Device,
encoder: &mut wgpu::CommandEncoder,
belt: &mut wgpu::util::StagingBelt,
size: Vector2<u32>,
len: usize,
) {
pub fn resize(&mut self, device: &wgpu::Device, size: Vector2<u32>, len: usize) {
self.work.set(work_vec(size.x, size.y, len));
self.old_len = len;
self.output.resize(

View File

@@ -9,6 +9,7 @@ struct View {
reset: u32,
level: i32,
dims: vec2<u32>,
stretch: vec2<f32>,
scale: FixedDec,
corner_x: FixedDec,
corner_y: FixedDec,
@@ -28,30 +29,14 @@ fn main(
if id.x > view.dims.x - 1 || id.y > view.dims.y - 1 {
return;
}
// TODO: actually use width
let varwidth = LEN + 2;
let workwidth = varwidth * 2 + 1;
let worki = (id.x * view.dims.y + id.y) * workwidth;
let xidx = worki + 1;
let yidx = xidx + varwidth;
// let dec = view.corner_x.dec;
// var rel_x = FixedDec(POS, dec, array<u32, LEN>());
// rel_x.parts[0] = id.x;
// rel_x = shr(rel_x, view.level);
// var rel_y = FixedDec(POS, dec, array<u32, LEN>());
// rel_y.parts[0] = id.y;
// rel_y = shr(rel_y, view.level);
// let cx = add(view.corner_x, rel_x);
// let cy = add(view.corner_y, rel_y);
let fdims = vec2<f32>(view.dims);
var stretch: vec2<f32>;
if fdims.x < fdims.y {
stretch = vec2(fdims.x / fdims.y, 1.0);
} else {
stretch = vec2(1.0, fdims.y / fdims.x);
}
let fpos = (vec2<f32>(id.xy) / fdims - 0.5) * stretch;
let fpos = (vec2<f32>(id.xy) / fdims - 0.5) * view.stretch;
let cx = add(mul(from_f32(fpos.x), view.scale), view.corner_x);
let cy = add(mul(from_f32(fpos.y), view.scale), view.corner_y);
var x: FixedDec;