Skip to content

Commit 2fce8f7

Browse files
committed
add generate_frame and generate everything based on config
1 parent 3b8401d commit 2fce8f7

File tree

1 file changed

+54
-19
lines changed

1 file changed

+54
-19
lines changed

src/main.rs

Lines changed: 54 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -20,24 +20,25 @@ use unchecked_array::UncheckedSyncArray;
2020
const ITER_MAX: u16 = 600;
2121

2222
#[inline]
23-
fn index_to_complex(i: usize, scale: f64, dim: WindowDimensions) -> Complex {
24-
const OFFSET: Complex = Complex {
25-
r: -1.781_050_04,
26-
i: 0.0,
27-
};
28-
23+
fn index_to_complex(i: usize, scale: f64, dim: WindowDimensions, offset: Complex) -> Complex {
2924
let [r, i] = usizex2::from_array([i % dim.width, i / dim.height])
3025
.cast::<isize>()
3126
.sub(isizex2::splat(isize::try_from(dim.height / 2).unwrap()))
3227
.cast::<f64>()
3328
.mul(f64x2::splat(scale))
3429
.to_array();
3530

36-
Complex { r, i } + OFFSET
31+
Complex { r, i } + offset
3732
}
3833

3934
#[inline]
40-
fn generate_buffer(threads: usize, scale: f64, buffer: &mut [u32], dim: WindowDimensions) {
35+
fn generate_buffer(
36+
threads: usize,
37+
scale: f64,
38+
buffer: &mut [u32],
39+
dim: WindowDimensions,
40+
offset: Complex,
41+
) {
4142
let max_pixel = dim.width * dim.height - 1;
4243

4344
let buf = UncheckedSyncArray::from_slice(buffer);
@@ -50,7 +51,7 @@ fn generate_buffer(threads: usize, scale: f64, buffer: &mut [u32], dim: WindowDi
5051

5152
while pixel <= max_pixel {
5253
let mut z = Complex::default();
53-
let c = index_to_complex(pixel, scale, dim);
54+
let c = index_to_complex(pixel, scale, dim, offset);
5455

5556
let mut iter: u16 = 0;
5657

@@ -78,6 +79,18 @@ fn generate_buffer(threads: usize, scale: f64, buffer: &mut [u32], dim: WindowDi
7879
});
7980
}
8081

82+
#[allow(dead_code)] // not currently called
83+
fn generate_frame(config: &Config, frame: u64, buffer: &mut [u32]) {
84+
let mut scale = config.starting_scale;
85+
86+
#[allow(clippy::cast_precision_loss)] // this is fine, we hit fp error way before frames cap out
87+
{
88+
scale *= config.scaling_factor.powf(frame as f64);
89+
}
90+
91+
generate_buffer(config.threads, scale, buffer, config.dims, config.offset);
92+
}
93+
8194
fn insert_frame_counter(frame: u64, buf: &mut [u32], dim: WindowDimensions) {
8295
let digits = pixel::Digit::from_u64(frame);
8396

@@ -93,36 +106,58 @@ fn insert_frame_counter(frame: u64, buf: &mut [u32], dim: WindowDimensions) {
93106
}
94107

95108
fn main() -> Result<(), Box<dyn Error>> {
96-
let threads: usize = thread::available_parallelism()?.into();
97-
let mut scale: f64 = 4.0 / 450.0;
98-
let dimensions = WindowDimensions::default();
109+
let conf = Config::generate()?;
99110

100-
let mut buffer: Vec<u32> = vec![0; dimensions.flat_length()];
111+
let mut buffer: Vec<u32> = vec![0; conf.dims.flat_length()];
101112

102113
let mut window = Window::new(
103114
"Mandelbrot",
104-
dimensions.width,
105-
dimensions.height,
115+
conf.dims.width,
116+
conf.dims.height,
106117
WindowOptions::default(),
107118
)?;
108119

109120
window.limit_update_rate(Some(std::time::Duration::from_millis(33)));
110121

111122
let mut frame = 0;
123+
let mut scale = conf.starting_scale;
112124

113125
while window.is_open() && !window.is_key_down(Key::Escape) {
114-
generate_buffer(threads, scale, &mut buffer, dimensions);
115-
insert_frame_counter(frame, &mut buffer, dimensions);
126+
generate_buffer(conf.threads, scale, &mut buffer, conf.dims, conf.offset);
127+
insert_frame_counter(frame, &mut buffer, conf.dims);
116128

117-
scale *= 0.95;
129+
scale *= conf.scaling_factor;
118130
frame += 1;
119131

120-
window.update_with_buffer(&buffer, dimensions.width, dimensions.height)?;
132+
window.update_with_buffer(&buffer, conf.dims.width, conf.dims.height)?;
121133
}
122134

123135
Ok(())
124136
}
125137

138+
struct Config {
139+
dims: WindowDimensions,
140+
starting_scale: f64,
141+
scaling_factor: f64,
142+
offset: Complex,
143+
threads: usize,
144+
}
145+
146+
impl Config {
147+
fn generate() -> Result<Self, Box<dyn Error>> {
148+
Ok(Self {
149+
threads: thread::available_parallelism()?.into(),
150+
dims: WindowDimensions::default(),
151+
starting_scale: 4.0 / 450.0,
152+
scaling_factor: 0.95,
153+
offset: Complex {
154+
r: -1.781_050_04,
155+
i: 0.0,
156+
},
157+
})
158+
}
159+
}
160+
126161
#[derive(Copy, Clone)]
127162
pub struct WindowDimensions {
128163
width: usize,

0 commit comments

Comments
 (0)