1- use crate :: util:: { data_export:: * , ComplexFixed , ComplexArbitrary , PixelData , complex_extended:: ComplexExtended , float_extended:: FloatExtended , string_to_extended, extended_to_string_short, extended_to_string_long, get_approximation_terms, get_delta_top_left, generate_default_palette} ;
1+ use crate :: util:: { data_export:: * , ComplexFixed , ComplexArbitrary , PixelData , complex_extended:: ComplexExtended , float_extended:: FloatExtended , string_to_extended, extended_to_string_short, extended_to_string_long, get_approximation_terms, get_delta_top_left, generate_default_palette, ProgressCounters } ;
22use crate :: math:: { SeriesApproximation , Perturbation , Reference } ;
33
44use std:: time:: { Duration , Instant } ;
@@ -15,7 +15,7 @@ use std::thread;
1515use std:: sync:: Arc ;
1616use std:: sync:: mpsc;
1717
18- use atomic_counter:: { AtomicCounter , RelaxedCounter } ;
18+ use atomic_counter:: AtomicCounter ;
1919
2020
2121pub struct FractalRenderer {
@@ -39,6 +39,7 @@ pub struct FractalRenderer {
3939 jitter : bool ,
4040 experimental : bool ,
4141 show_output : bool ,
42+ pub progress : ProgressCounters ,
4243 pub render_time : u128 ,
4344}
4445
@@ -154,6 +155,7 @@ impl FractalRenderer {
154155 jitter,
155156 experimental,
156157 show_output,
158+ progress : ProgressCounters :: new ( maximum_iteration) ,
157159 render_time : 0
158160 }
159161 }
@@ -203,43 +205,13 @@ impl FractalRenderer {
203205 let frame_time = Instant :: now ( ) ;
204206 let approximation_time = Instant :: now ( ) ;
205207
206- let reference_complete = Arc :: new ( RelaxedCounter :: new ( 0 ) ) ;
207- let series_approximation_complete = Arc :: new ( RelaxedCounter :: new ( 0 ) ) ;
208- let series_validaton_complete = Arc :: new ( RelaxedCounter :: new ( 0 ) ) ;
209-
210- let reference_counter = if self . show_output {
211- Some ( & reference_complete)
212- } else {
213- None
214- } ;
215-
216- let series_approximation_counter = if self . show_output {
217- Some ( & series_approximation_complete)
218- } else {
219- None
220- } ;
221-
222- let series_validation_counter = if self . show_output {
223- Some ( & series_validaton_complete)
224- } else {
225- None
226- } ;
227-
228208 let ( tx, rx) = mpsc:: channel ( ) ;
229209
230- let reference_maximum_iteration = Arc :: new ( RelaxedCounter :: new ( self . maximum_iteration ) ) ;
231-
232- let reference_maximum_iteration_counter = if self . show_output {
233- Some ( & reference_maximum_iteration)
234- } else {
235- None
236- } ;
237-
238210 if self . show_output {
239- let thread_counter_1 = Arc :: clone ( & reference_complete ) ;
240- let thread_counter_2 = Arc :: clone ( & series_approximation_complete ) ;
241- let thread_counter_3 = Arc :: clone ( & reference_maximum_iteration ) ;
242- let thread_counter_4 = Arc :: clone ( & series_validaton_complete ) ;
211+ let thread_counter_1 = self . progress . reference . clone ( ) ;
212+ let thread_counter_2 = self . progress . series_approximation . clone ( ) ;
213+ let thread_counter_3 = self . progress . reference_maximum . clone ( ) ;
214+ let thread_counter_4 = self . progress . series_validation . clone ( ) ;
243215 print ! ( "| " ) ;
244216
245217 thread:: spawn ( move || {
@@ -269,9 +241,9 @@ impl FractalRenderer {
269241 } ;
270242
271243 if frame_index == 0 {
272- self . center_reference . run ( reference_counter , reference_maximum_iteration_counter ) ;
244+ self . center_reference . run ( & self . progress . reference , & self . progress . reference_maximum ) ;
273245 self . series_approximation . maximum_iteration = self . center_reference . current_iteration ;
274- self . series_approximation . generate_approximation ( & self . center_reference , series_approximation_counter ) ;
246+ self . series_approximation . generate_approximation ( & self . center_reference , & self . progress . series_approximation ) ;
275247 } else {
276248 // If the image width/height changes intraframe (GUI) we need to regenerate some things
277249 if self . data_export . image_width != self . image_width || self . data_export . image_height != self . image_height {
@@ -286,7 +258,7 @@ impl FractalRenderer {
286258 // Check to see if the series approximation order has changed intraframe
287259 if self . series_approximation . order != ( self . series_approximation . coefficients [ 0 ] . len ( ) - 1 ) {
288260 // println!("order was: {}, is now: {}", (self.series_approximation.coefficients[0].len() - 1), self.series_approximation.order);
289- self . series_approximation . generate_approximation ( & self . center_reference , series_approximation_counter ) ;
261+ self . series_approximation . generate_approximation ( & self . center_reference , & self . progress . series_approximation ) ;
290262 }
291263 }
292264
@@ -316,7 +288,7 @@ impl FractalRenderer {
316288 self . image_width ,
317289 self . image_height ,
318290 & self . center_reference ,
319- series_validation_counter ) ;
291+ & self . progress . series_validation ) ;
320292
321293 self . data_export . maximum_iteration = self . maximum_iteration ;
322294
@@ -415,20 +387,12 @@ impl FractalRenderer {
415387
416388 let iteration_time = Instant :: now ( ) ;
417389
418- let pixels_complete = Arc :: new ( RelaxedCounter :: new ( 0 ) ) ;
419-
420- let counter = if self . show_output {
421- Some ( & pixels_complete)
422- } else {
423- None
424- } ;
425-
426390 let total_pixels = self . render_indices . len ( ) as f64 ;
427391
428392 let ( tx, rx) = mpsc:: channel ( ) ;
429393
430394 if self . show_output {
431- let thread_counter = Arc :: clone ( & pixels_complete ) ;
395+ let thread_counter = Arc :: clone ( & self . progress . iteration ) ;
432396 print ! ( "| " ) ;
433397
434398 thread:: spawn ( move || {
@@ -449,9 +413,9 @@ impl FractalRenderer {
449413
450414 // This one has no offset because it is not a glitch resolving reference
451415 if self . analytic_derivative {
452- Perturbation :: iterate_normal_plus_derivative ( & mut pixel_data, & self . center_reference , counter ) ;
416+ Perturbation :: iterate_normal_plus_derivative ( & mut pixel_data, & self . center_reference , & self . progress . iteration ) ;
453417 } else {
454- Perturbation :: iterate_normal ( & mut pixel_data, & self . center_reference , counter ) ;
418+ Perturbation :: iterate_normal ( & mut pixel_data, & self . center_reference , & self . progress . iteration ) ;
455419 } ;
456420
457421 tx. send ( ( ) ) . unwrap ( ) ;
@@ -477,7 +441,7 @@ impl FractalRenderer {
477441 let ( tx, rx) = mpsc:: channel ( ) ;
478442
479443 if self . show_output {
480- let thread_counter = Arc :: clone ( & pixels_complete ) ;
444+ let thread_counter = Arc :: clone ( & self . progress . iteration ) ;
481445 print ! ( "| " ) ;
482446
483447 thread:: spawn ( move || {
@@ -504,7 +468,7 @@ impl FractalRenderer {
504468 let mut glitch_reference = self . series_approximation . get_reference ( glitch_reference_pixel. delta_centre , & self . center_reference ) ;
505469
506470 correction_references += 1 ;
507- glitch_reference. run ( None , None ) ;
471+ glitch_reference. run ( & self . progress . reference , & self . progress . reference_maximum ) ;
508472
509473 let delta_current_reference = self . series_approximation . evaluate ( glitch_reference_pixel. delta_centre , glitch_reference. start_iteration ) ;
510474
@@ -528,9 +492,9 @@ impl FractalRenderer {
528492 }
529493
530494 if self . analytic_derivative {
531- Perturbation :: iterate_normal_plus_derivative ( & mut pixel_data, & glitch_reference, counter ) ;
495+ Perturbation :: iterate_normal_plus_derivative ( & mut pixel_data, & glitch_reference, & self . progress . iteration ) ;
532496 } else {
533- Perturbation :: iterate_normal ( & mut pixel_data, & glitch_reference, counter ) ;
497+ Perturbation :: iterate_normal ( & mut pixel_data, & glitch_reference, & self . progress . iteration ) ;
534498 } ;
535499
536500 self . data_export . export_pixels ( & pixel_data, & glitch_reference, delta_pixel_extended) ;
@@ -557,6 +521,8 @@ impl FractalRenderer {
557521
558522 self . render_time = frame_time. elapsed ( ) . as_millis ( ) ;
559523
524+ self . progress . reset ( self . maximum_iteration ) ;
525+
560526 if self . show_output {
561527 print ! ( "| {:<15}" , saving_time. elapsed( ) . as_millis( ) ) ;
562528 println ! ( "| {:<15}| {:<15}" , frame_time. elapsed( ) . as_millis( ) , self . start_render_time. elapsed( ) . as_millis( ) ) ;
@@ -590,7 +556,7 @@ impl FractalRenderer {
590556 // Overwrite the series approximation order
591557 self . series_approximation . order = 8 ;
592558 self . series_approximation . maximum_iteration = self . center_reference . current_iteration ;
593- self . series_approximation . generate_approximation ( & self . center_reference , None ) ;
559+ self . series_approximation . generate_approximation ( & self . center_reference , & self . progress . series_approximation ) ;
594560 }
595561
596562 // Logic in here to automatically adjust the maximum number of iterations
@@ -608,10 +574,10 @@ impl FractalRenderer {
608574 } else {
609575 if self . series_approximation . min_valid_iteration < 1000 && self . series_approximation . order > 16 {
610576 self . series_approximation . order = 16 ;
611- self . series_approximation . generate_approximation ( & self . center_reference , None ) ;
577+ self . series_approximation . generate_approximation ( & self . center_reference , & self . progress . series_approximation ) ;
612578 } else if self . series_approximation . min_valid_iteration < 10000 && self . series_approximation . order > 32 {
613579 self . series_approximation . order = 32 ;
614- self . series_approximation . generate_approximation ( & self . center_reference , None ) ;
580+ self . series_approximation . generate_approximation ( & self . center_reference , & self . progress . series_approximation ) ;
615581 }
616582 }
617583
0 commit comments