@@ -34,8 +34,20 @@ pub fn generate_merge_list<'a>(nodes: &'a [FilialTuple], sources: &'a HashMap<Pa
3434 // invariant: nodes_iter always has _at least_ one element. Can't save a not-file :B
3535 let first = nodes_iter. next ( ) . unwrap ( ) . 0 ;
3636 let first_path = graph. get_node ( first) ;
37+ let first_source = sources. get ( & first_path) . unwrap ( ) ;
38+
39+ let version_line_offset = find_version_offset ( first_source) ;
40+ let version_char_offsets = char_offset_for_line ( version_line_offset, first_source) ;
41+ add_preamble (
42+ version_line_offset,
43+ version_char_offsets. 1 ,
44+ first_path. to_str ( ) . unwrap ( ) ,
45+ first_source,
46+ & mut merge_list,
47+ & mut extra_lines,
48+ ) ;
3749
38- last_offset_set. insert ( ( first, None ) , 0 ) ;
50+ last_offset_set. insert ( ( first, None ) , version_char_offsets . 1 ) ;
3951
4052 // stack to keep track of the depth first traversal
4153 let mut stack = VecDeque :: < NodeIndex > :: new ( ) ;
@@ -53,8 +65,8 @@ pub fn generate_merge_list<'a>(nodes: &'a [FilialTuple], sources: &'a HashMap<Pa
5365 // now we add a view of the remainder of the root file
5466 let offset = * last_offset_set. get ( & ( first, None ) ) . unwrap ( ) ;
5567
56- let len = sources . get ( & first_path ) . unwrap ( ) . len ( ) ;
57- merge_list. push_back ( & sources . get ( & first_path ) . unwrap ( ) [ min ( offset, len) ..] ) ;
68+ let len = first_source . len ( ) ;
69+ merge_list. push_back ( & first_source [ min ( offset, len) ..] ) ;
5870
5971 let total_len = merge_list. iter ( ) . fold ( 0 , |a, b| a + b. len ( ) ) ;
6072
@@ -171,6 +183,30 @@ fn char_offset_for_line(line_num: usize, source: &str) -> (usize, usize) {
171183 ( char_for_line, char_following_line)
172184}
173185
186+ fn find_version_offset ( source : & str ) -> usize {
187+ source
188+ . lines ( )
189+ . enumerate ( )
190+ . find ( |( _, line) | line. starts_with ( "#version " ) )
191+ . map_or ( 0 , |( i, _) | i)
192+ }
193+
194+ fn add_preamble < ' a > (
195+ version_line_offset : usize , version_char_offset : usize , path : & str , source : & ' a str , merge_list : & mut LinkedList < & ' a str > ,
196+ extra_lines : & mut Vec < String > ,
197+ ) {
198+ // TODO: Optifine #define preabmle
199+ merge_list. push_back ( & source[ ..version_char_offset] ) ;
200+ let google_line_directive = format ! (
201+ "#extension GL_GOOGLE_cpp_style_line_directive : enable\n #line {} \" {}\" \n " ,
202+ // +2 because 0 indexed but #line is 1 indexed and references the *following* line
203+ version_line_offset + 2 ,
204+ path,
205+ ) ;
206+ extra_lines. push ( google_line_directive) ;
207+ unsafe_get_and_insert ( merge_list, extra_lines) ;
208+ }
209+
174210fn add_opening_line_directive ( path : & Path , merge_list : & mut LinkedList < & str > , extra_lines : & mut Vec < String > ) {
175211 let line_directive = format ! ( "#line 1 \" {}\" \n " , path. to_str( ) . unwrap( ) . replace( '\\' , "\\ \\ " ) ) ;
176212 extra_lines. push ( line_directive) ;
@@ -242,6 +278,11 @@ mod merge_view_test {
242278 let merge_file = tmp_path. join ( "shaders" ) . join ( "final.fsh.merge" ) ;
243279
244280 let mut truth = fs:: read_to_string ( merge_file) . unwrap ( ) ;
281+ truth = truth. replacen (
282+ "!!" ,
283+ & tmp_path. join ( "shaders" ) . join ( "final.fsh" ) . to_str ( ) . unwrap ( ) . replace ( '\\' , "\\ \\ " ) ,
284+ 1 ,
285+ ) ;
245286 truth = truth. replacen (
246287 "!!" ,
247288 & tmp_path. join ( "shaders" ) . join ( "common.glsl" ) . to_str ( ) . unwrap ( ) . replace ( '\\' , "\\ \\ " ) ,
@@ -306,6 +347,12 @@ mod merge_view_test {
306347
307348 let mut truth = fs:: read_to_string ( merge_file) . unwrap ( ) ;
308349
350+ truth = truth. replacen (
351+ "!!" ,
352+ & tmp_path. join ( "shaders" ) . join ( "final.fsh" ) . to_str ( ) . unwrap ( ) . replace ( '\\' , "\\ \\ " ) ,
353+ 1 ,
354+ ) ;
355+
309356 for file in & [ "sample.glsl" , "burger.glsl" , "sample.glsl" , "test.glsl" , "sample.glsl" ] {
310357 let path = tmp_path. clone ( ) ;
311358 truth = truth. replacen (
@@ -380,6 +427,12 @@ mod merge_view_test {
380427
381428 let mut truth = fs:: read_to_string ( merge_file) . unwrap ( ) ;
382429
430+ truth = truth. replacen (
431+ "!!" ,
432+ & tmp_path. join ( "shaders" ) . join ( "final.fsh" ) . to_str ( ) . unwrap ( ) . replace ( '\\' , "\\ \\ " ) ,
433+ 1 ,
434+ ) ;
435+
383436 for file in & [ "sample.glsl" , "burger.glsl" , "sample.glsl" , "test.glsl" , "sample.glsl" ] {
384437 let path = tmp_path. clone ( ) ;
385438 truth = truth. replacen (
@@ -464,6 +517,7 @@ mod merge_view_test {
464517 let mut truth = fs:: read_to_string ( merge_file) . unwrap ( ) ;
465518
466519 for file in & [
520+ PathBuf :: new ( ) . join ( "final.fsh" ) . to_str ( ) . unwrap ( ) ,
467521 PathBuf :: new ( ) . join ( "utils" ) . join ( "utilities.glsl" ) . to_str ( ) . unwrap ( ) ,
468522 PathBuf :: new ( ) . join ( "utils" ) . join ( "stuff1.glsl" ) . to_str ( ) . unwrap ( ) ,
469523 PathBuf :: new ( ) . join ( "utils" ) . join ( "utilities.glsl" ) . to_str ( ) . unwrap ( ) ,
0 commit comments