@@ -20,24 +20,25 @@ use unchecked_array::UncheckedSyncArray;
2020const 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+
8194fn 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
95108fn 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 ) ]
127162pub struct WindowDimensions {
128163 width : usize ,
0 commit comments