Files
fractal/src/client/render/compute/data.rs
2025-03-31 22:51:48 -04:00

72 lines
1.8 KiB
Rust

use nalgebra::Vector2;
use crate::util::FixedDec;
use super::Camera;
const VIEW_ALIGN: usize = 4 * 2;
pub struct ComputeView {
pub bytes: Vec<u8>,
}
impl ComputeView {
pub fn bytes(&self) -> &[u8] {
&self.bytes
}
}
impl Default for ComputeView {
fn default() -> Self {
let val = FixedDec::from_parts(false, 0, vec![0, 0, 0]);
Self::new(true, Vector2::zeros(), Vector2::zeros(), 0, &val, &val, &val)
}
}
impl ComputeView {
fn new(
reset: bool,
dims: Vector2<u32>,
stretch: Vector2<f32>,
level: i32,
scale: &FixedDec,
x: &FixedDec,
y: &FixedDec,
) -> Self {
let mut bytes = Vec::new();
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);
let rem = bytes.len() % VIEW_ALIGN;
if rem != 0 {
bytes.extend((0..(VIEW_ALIGN - rem)).map(|_| 0));
}
Self { bytes }
}
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);
let mut y = camera.pos.y.clone();
y.set_whole_len(1);
y.set_dec_len(len as i32 - 1);
let stretch = camera.stretch();
let mut scale = camera.zoom.mult().clone();
scale.set_precision(len);
Self::new(reset, camera.size, stretch, camera.zoom.level(), &scale, &x, &y)
}
}
impl PartialEq for ComputeView {
fn eq(&self, other: &Self) -> bool {
self.bytes[1..] == other.bytes[1..]
}
}