11use crate :: util:: { data_export:: * , ComplexFixed , ComplexArbitrary , PixelData , complex_extended:: ComplexExtended , float_extended:: FloatExtended , string_to_extended, extended_to_string} ;
2- use crate :: math:: { SeriesApproximation , Perturbation } ;
2+ use crate :: math:: { SeriesApproximation , Perturbation , Reference } ;
33
44use std:: time:: Instant ;
55use std:: cmp:: { min, max} ;
@@ -18,18 +18,27 @@ pub struct FractalRenderer {
1818 approximation_order : usize ,
1919 glitch_tolerance : f64 ,
2020 data_export : DataExport ,
21+ start_render_time : Instant ,
22+ remaining_frames : usize ,
23+ zoom_scale_factor : f64 ,
24+ center_reference : Reference ,
2125}
2226
2327impl FractalRenderer {
2428 pub fn new ( settings : Config ) -> Self {
25- let image_width = settings. get_int ( "image_width" ) . unwrap ( ) as usize ;
26- let image_height = settings. get_int ( "image_height" ) . unwrap ( ) as usize ;
27- let maximum_iteration = settings. get_int ( "iterations" ) . unwrap ( ) as usize ;
28- let initial_zoom = settings. get_str ( "zoom" ) . unwrap ( ) ;
29- let center_real = settings. get_str ( "real" ) . unwrap ( ) ;
30- let center_imag = settings. get_str ( "imag" ) . unwrap ( ) ;
31- let approximation_order = 8 ;
32- let glitch_tolerance = 0.01 ;
29+ // Print out the status information
30+ println ! ( "{:<6}| {:<14}| {:<14}| {:<14}| {:<14}| {:<14}| {:<14}| {:<14}| {:<14}| {:<14}| {:<14}" , "Frame" , "Zoom" , "Approx [ms]" , "Skipped [it]" , "Reference [ms]" , "Packing [ms]" , "Iteration [ms]" , "Colouring [ms]" , "Correct [ms]" , "Saving [ms]" , "TOTAL [ms]" ) ;
31+
32+ let image_width = settings. get_int ( "image_width" ) . unwrap_or ( 1000 ) as usize ;
33+ let image_height = settings. get_int ( "image_height" ) . unwrap_or ( 1000 ) as usize ;
34+ let maximum_iteration = settings. get_int ( "iterations" ) . unwrap_or ( 1000 ) as usize ;
35+ let initial_zoom = settings. get_str ( "zoom" ) . unwrap_or ( "1E0" . to_string ( ) ) ;
36+ let center_real = settings. get_str ( "real" ) . unwrap_or ( "-0.75" . to_string ( ) ) ;
37+ let center_imag = settings. get_str ( "imag" ) . unwrap_or ( "0.0" . to_string ( ) ) ;
38+ let approximation_order = settings. get_int ( "approximation_order" ) . unwrap_or ( 0 ) as usize ;
39+ let glitch_tolerance = settings. get_float ( "glitch_tolerance" ) . unwrap_or ( 0.01 ) ;
40+ let remaining_frames = settings. get_int ( "frames" ) . unwrap_or ( 1 ) as usize ;
41+ let zoom_scale_factor = settings. get_float ( "zoom_scale" ) . unwrap_or ( 2.0 ) ;
3342 let display_glitches = false ;
3443
3544 let aspect = image_width as f64 / image_height as f64 ;
@@ -56,23 +65,42 @@ impl FractalRenderer {
5665 image_height,
5766 aspect,
5867 zoom,
59- center_location,
68+ center_location : center_location . clone ( ) ,
6069 maximum_iteration,
6170 approximation_order : auto_approximation,
6271 glitch_tolerance,
63- data_export : DataExport :: new ( image_width, image_height, display_glitches, DataType :: BOTH )
72+ data_export : DataExport :: new ( image_width, image_height, display_glitches, DataType :: BOTH ) ,
73+ start_render_time : Instant :: now ( ) ,
74+ remaining_frames,
75+ zoom_scale_factor,
76+ center_reference : Reference :: new ( center_location. clone ( ) , center_location, 1 , maximum_iteration)
6477 }
6578 }
6679
67- pub fn render ( & mut self , filename : String ) {
80+ pub fn render_frame ( & mut self , index : usize , filename : String ) {
81+ print ! ( "{:<6}" , index) ;
82+ let frame_time = Instant :: now ( ) ;
83+
84+ // If we are on the first frame
85+ // if index == 0 {
86+ // self.center_reference.run();
87+ // println!("{}", self.center_reference.current_iteration);
88+ // }
89+
90+
91+
92+
93+
94+
95+
6896 let delta_pixel = ( -2.0 * ( 4.0 / self . image_height as f64 - 2.0 ) / self . zoom . mantissa ) / self . image_height as f64 ;
6997
7098 // this should be the delta relative to the image, without the big zoom factor applied.
7199 let delta_top_left = ComplexFixed :: new ( ( 4.0 / self . image_width as f64 - 2.0 ) / self . zoom . mantissa * self . aspect as f64 , ( 4.0 / self . image_height as f64 - 2.0 ) / self . zoom . mantissa ) ;
72100
73101 let time = Instant :: now ( ) ;
74102
75- println ! ( "{:<7}{:>16}" , "Zoom ", extended_to_string( self . zoom) ) ;
103+ print ! ( "| {:<14} " , extended_to_string( self . zoom) ) ;
76104
77105 let delta_pixel_extended = FloatExtended :: new ( delta_pixel, -self . zoom . exponent ) ;
78106
@@ -88,15 +116,15 @@ impl FractalRenderer {
88116
89117 series_approximation. run ( ) ;
90118
91- println ! ( "{:<14}{:>6} ms" , "Approximation ", time. elapsed( ) . as_millis( ) ) ;
92- println ! ( "{:<10}{:>13} (order {}) " , "Skipped" , series_approximation. current_iteration, series_approximation . order ) ;
119+ print ! ( "| {:<14}" , time. elapsed( ) . as_millis( ) ) ;
120+ print ! ( "| {:<14} " , series_approximation. current_iteration) ;
93121
94122 let time = Instant :: now ( ) ;
95123
96124 let mut reference = series_approximation. get_reference ( ComplexExtended :: new2 ( 0.0 , 0.0 , 0 ) ) ;
97125 reference. run ( ) ;
98126
99- println ! ( "{:<14}{:>6} ms (precision {}, iterations {}) " , "Reference" , time. elapsed( ) . as_millis( ) , self . center_location . prec ( ) . 0 , reference . current_iteration ) ;
127+ print ! ( "| {:<14}" , time. elapsed( ) . as_millis( ) ) ;
100128
101129 let time = Instant :: now ( ) ;
102130
@@ -122,15 +150,15 @@ impl FractalRenderer {
122150 }
123151 } ) . collect :: < Vec < PixelData > > ( ) ;
124152
125- println ! ( "{:<14}{:>6} ms" , "Packing ", time. elapsed( ) . as_millis( ) ) ;
153+ print ! ( "| {:<14}" , time. elapsed( ) . as_millis( ) ) ;
126154
127155 let time = Instant :: now ( ) ;
128156 Perturbation :: iterate ( & mut pixel_data, & reference, reference. current_iteration ) ;
129- println ! ( "{:<14}{:>6} ms" , "Iteration ", time. elapsed( ) . as_millis( ) ) ;
157+ print ! ( "| {:<14}" , time. elapsed( ) . as_millis( ) ) ;
130158
131159 let time = Instant :: now ( ) ;
132160 self . data_export . export_pixels ( & pixel_data, self . maximum_iteration , & reference) ;
133- println ! ( "{:<14}{:>6} ms" , "Coloring ", time. elapsed( ) . as_millis( ) ) ;
161+ print ! ( "| {:<14}" , time. elapsed( ) . as_millis( ) ) ;
134162
135163 let time = Instant :: now ( ) ;
136164
@@ -173,20 +201,21 @@ impl FractalRenderer {
173201 } ) ;
174202 }
175203
176- println ! ( "{:<14}{:>6} ms (remaining {}) " , "Fixing" , time. elapsed( ) . as_millis( ) , pixel_data . len ( ) ) ;
204+ print ! ( "| {:<14}" , time. elapsed( ) . as_millis( ) ) ;
177205
178206 let time = Instant :: now ( ) ;
179207 self . data_export . save ( & filename) ;
180- println ! ( "{:<14}{:>6} ms" , "Saving ", time. elapsed( ) . as_millis( ) ) ;
181- return ;
208+ print ! ( "| {:<14}" , time. elapsed( ) . as_millis( ) ) ;
209+ println ! ( "| {:<8} {:<8}" , frame_time . elapsed ( ) . as_millis ( ) , self . start_render_time . elapsed ( ) . as_millis ( ) ) ;
182210 }
183211
184- pub fn render_sequence ( & mut self , scale_factor : f64 ) {
212+ pub fn render ( & mut self ) {
185213 let mut count = 0 ;
186- while self . zoom . to_float ( ) > 0.5 {
187- self . render ( format ! ( "output/keyframe_{:08}" , count) ) ;
188- self . zoom . mantissa /= scale_factor ;
214+ while self . remaining_frames > 0 && self . zoom . to_float ( ) > 0.5 {
215+ self . render_frame ( count , format ! ( "output/keyframe_{:08}" , count) ) ;
216+ self . zoom . mantissa /= self . zoom_scale_factor ;
189217 self . zoom . reduce ( ) ;
218+ self . remaining_frames -= 1 ;
190219 count += 1 ;
191220 }
192221 }
0 commit comments