Skip to content

Commit 8288ee9

Browse files
committed
refactor again the counters to get ready for UI
1 parent 3852cec commit 8288ee9

File tree

6 files changed

+69
-111
lines changed

6 files changed

+69
-111
lines changed

src/math/perturbation.rs

Lines changed: 4 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ use std::sync::Arc;
1212
pub struct Perturbation {}
1313

1414
impl Perturbation {
15-
pub fn iterate_normal(pixel_data: &mut [PixelData], reference: &Reference, pixels_complete: Option<&Arc<RelaxedCounter>>) {
15+
pub fn iterate_normal(pixel_data: &mut [PixelData], reference: &Reference, pixels_complete: &Arc<RelaxedCounter>) {
1616
pixel_data.par_chunks_mut(4)
1717
.for_each(|pixel_data| {
1818
let mut new_pixels_complete = 0;
@@ -92,16 +92,11 @@ impl Perturbation {
9292
}
9393
}
9494

95-
match &pixels_complete {
96-
Some(complete) => {
97-
complete.add(new_pixels_complete);
98-
},
99-
_ => {}
100-
}
95+
pixels_complete.add(new_pixels_complete);
10196
});
10297
}
10398

104-
pub fn iterate_normal_plus_derivative(pixel_data: &mut [PixelData], reference: &Reference, pixels_complete: Option<&Arc<RelaxedCounter>>) {
99+
pub fn iterate_normal_plus_derivative(pixel_data: &mut [PixelData], reference: &Reference, pixels_complete: &Arc<RelaxedCounter>) {
105100
pixel_data.par_chunks_mut(4)
106101
.for_each(|pixel_data| {
107102
let mut new_pixels_complete = 0;
@@ -194,12 +189,7 @@ impl Perturbation {
194189
}
195190
}
196191

197-
match &pixels_complete {
198-
Some(complete) => {
199-
complete.add(new_pixels_complete);
200-
},
201-
_ => {}
202-
}
192+
pixels_complete.add(new_pixels_complete);
203193
});
204194
}
205195
}

src/math/reference.rs

Lines changed: 3 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ impl Reference {
7373
}
7474

7575

76-
pub fn run(&mut self, reference_counter: Option<&Arc<RelaxedCounter>>, reference_maximum_iteration_counter: Option<&Arc<RelaxedCounter>>) {
76+
pub fn run(&mut self, reference_counter: &Arc<RelaxedCounter>, reference_maximum_iteration_counter: &Arc<RelaxedCounter>) {
7777
let z_fixed = to_fixed(&self.z);
7878
let z_tolerance = self.glitch_tolerance * z_fixed.norm_sqr();
7979

@@ -100,26 +100,10 @@ impl Reference {
100100
}
101101
}
102102

103-
match &reference_counter {
104-
Some(complete) => {
105-
complete.inc();
106-
},
107-
_ => {}
108-
}
103+
reference_counter.inc();
109104

110105
if !self.step() {
111-
match &reference_counter {
112-
Some(complete) => {
113-
// Set the maximum value
114-
match &reference_maximum_iteration_counter {
115-
Some(maximum_iteration_counter) => {
116-
maximum_iteration_counter.add(usize::max_value() - self.maximum_iteration + complete.get() + 1);
117-
},
118-
_ => {}
119-
}
120-
},
121-
_ => {}
122-
}
106+
reference_maximum_iteration_counter.add(usize::max_value() - self.maximum_iteration + reference_counter.get() + 1);
123107

124108
break;
125109
};

src/math/series_approximation.rs

Lines changed: 5 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ impl SeriesApproximation {
5959
}
6060
}
6161

62-
pub fn generate_approximation(&mut self, center_reference: &Reference, series_approximation_counter: Option<&Arc<RelaxedCounter>>) {
62+
pub fn generate_approximation(&mut self, center_reference: &Reference, series_approximation_counter: &Arc<RelaxedCounter>) {
6363
// Reset the coefficients
6464
self.coefficients = vec![vec![ComplexExtended::new2(0.0, 0.0, 0); self.order as usize + 1]; 1];
6565

@@ -101,12 +101,7 @@ impl SeriesApproximation {
101101

102102
previous_coefficients = next_coefficients.clone();
103103

104-
match &series_approximation_counter {
105-
Some(complete) => {
106-
complete.inc();
107-
},
108-
_ => {}
109-
}
104+
series_approximation_counter.inc();
110105

111106
// only every 100th iteration (101, 201 etc)
112107
// This is 0, 100, 200 -> 1, 101, 201
@@ -127,7 +122,7 @@ impl SeriesApproximation {
127122
image_width: usize,
128123
image_height: usize,
129124
center_reference: &Reference,
130-
series_validation_counter: Option<&Arc<RelaxedCounter>>) {
125+
series_validation_counter: &Arc<RelaxedCounter>) {
131126
// Delete the previous probes and calculate new ones
132127
self.probe_start = Vec::new();
133128
self.approximation_probes = Vec::new();
@@ -213,12 +208,7 @@ impl SeriesApproximation {
213208
first_valid_iterations += 1;
214209
}
215210

216-
match &series_validation_counter {
217-
Some(complete) => {
218-
complete.inc();
219-
},
220-
_ => {}
221-
}
211+
series_validation_counter.inc();
222212

223213
self.min_valid_iteration = first_valid_iterations;
224214

@@ -339,12 +329,7 @@ impl SeriesApproximation {
339329
}
340330
}
341331

342-
match &series_validation_counter {
343-
Some(complete) => {
344-
complete.inc();
345-
},
346-
_ => {}
347-
}
332+
series_validation_counter.inc();
348333

349334
self.valid_iterations = valid_iterations;
350335

src/renderer.rs

Lines changed: 24 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
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};
22
use crate::math::{SeriesApproximation, Perturbation, Reference};
33

44
use std::time::{Duration, Instant};
@@ -15,7 +15,7 @@ use std::thread;
1515
use std::sync::Arc;
1616
use std::sync::mpsc;
1717

18-
use atomic_counter::{AtomicCounter, RelaxedCounter};
18+
use atomic_counter::AtomicCounter;
1919

2020

2121
pub 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

src/util/mod.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,12 @@ pub mod data_export;
55
pub mod float_extended;
66
pub mod complex_extended;
77
pub mod recolour_exr;
8+
pub mod progress;
89

910
pub use complex_extended::ComplexExtended;
1011
pub use float_extended::FloatExtended;
1112
pub use recolour_exr::RecolourEXR;
13+
pub use progress::ProgressCounters;
1214

1315
pub type ComplexFixed<T> = num_complex::Complex<T>;
1416
pub type ComplexArbitrary = rug::Complex;

src/util/progress.rs

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
use atomic_counter::RelaxedCounter;
2+
3+
use std::sync::Arc;
4+
5+
pub struct ProgressCounters {
6+
pub reference: Arc<RelaxedCounter>,
7+
pub reference_maximum: Arc<RelaxedCounter>,
8+
pub series_approximation: Arc<RelaxedCounter>,
9+
pub series_validation: Arc<RelaxedCounter>,
10+
pub iteration: Arc<RelaxedCounter>
11+
}
12+
13+
impl ProgressCounters {
14+
pub fn new(maximum_iteration: usize) -> ProgressCounters {
15+
ProgressCounters {
16+
reference: Arc::new(RelaxedCounter::new(0)),
17+
reference_maximum: Arc::new(RelaxedCounter::new(maximum_iteration)),
18+
series_approximation: Arc::new(RelaxedCounter::new(0)),
19+
series_validation: Arc::new(RelaxedCounter::new(0)),
20+
iteration: Arc::new(RelaxedCounter::new(0)),
21+
}
22+
}
23+
24+
pub fn reset(&mut self, maximum_iteration: usize) {
25+
self.reference = Arc::new(RelaxedCounter::new(0));
26+
self.reference_maximum = Arc::new(RelaxedCounter::new(maximum_iteration));
27+
self.series_approximation = Arc::new(RelaxedCounter::new(0));
28+
self.series_validation = Arc::new(RelaxedCounter::new(0));
29+
self.iteration = Arc::new(RelaxedCounter::new(0));
30+
}
31+
}

0 commit comments

Comments
 (0)