Skip to content

Commit 71447f9

Browse files
committed
Cart doesn't like loops
1 parent c51116f commit 71447f9

File tree

1 file changed

+86
-81
lines changed
  • crates/bevy_render/src/render_resource

1 file changed

+86
-81
lines changed

crates/bevy_render/src/render_resource/shader.rs

+86-81
Original file line numberDiff line numberDiff line change
@@ -360,61 +360,61 @@ impl ShaderProcessor {
360360
}
361361
};
362362

363-
let shader_defs = HashSet::<String>::from_iter(shader_defs.iter().cloned());
363+
let shader_defs_unique = HashSet::<String>::from_iter(shader_defs.iter().cloned());
364364
let mut scopes = vec![true];
365-
let mut processing = shader_str.to_string();
366-
let final_string = loop {
367-
let mut processed = String::new();
368-
let mut changed = false;
369-
for line in processing.split('\n') {
370-
if let Some(cap) = self.ifdef_regex.captures(line) {
371-
let def = cap.get(1).unwrap();
372-
scopes.push(*scopes.last().unwrap() && shader_defs.contains(def.as_str()));
373-
changed = true;
374-
} else if let Some(cap) = self.ifndef_regex.captures(line) {
375-
let def = cap.get(1).unwrap();
376-
scopes.push(*scopes.last().unwrap() && !shader_defs.contains(def.as_str()));
377-
changed = true;
378-
} else if self.else_regex.is_match(line) {
379-
let mut is_parent_scope_truthy = true;
380-
if scopes.len() > 1 {
381-
is_parent_scope_truthy = scopes[scopes.len() - 2];
382-
}
383-
if let Some(last) = scopes.last_mut() {
384-
*last = is_parent_scope_truthy && !*last;
385-
}
386-
changed = true;
387-
} else if self.endif_regex.is_match(line) {
388-
scopes.pop();
389-
if scopes.is_empty() {
390-
return Err(ProcessShaderError::TooManyEndIfs);
391-
}
392-
changed = true;
393-
} else if let Some(cap) = SHADER_IMPORT_PROCESSOR
394-
.import_asset_path_regex
395-
.captures(line)
396-
{
397-
let import = ShaderImport::AssetPath(cap.get(1).unwrap().as_str().to_string());
398-
apply_import(import_handles, shaders, &import, shader, &mut processed)?;
399-
changed = true;
400-
} else if let Some(cap) = SHADER_IMPORT_PROCESSOR
401-
.import_custom_path_regex
402-
.captures(line)
403-
{
404-
let import = ShaderImport::Custom(cap.get(1).unwrap().as_str().to_string());
405-
apply_import(import_handles, shaders, &import, shader, &mut processed)?;
406-
changed = true;
407-
} else if *scopes.last().unwrap() {
408-
processed.push_str(line);
409-
processed.push('\n');
365+
let mut final_string = String::new();
366+
for line in shader_str.split('\n') {
367+
if let Some(cap) = self.ifdef_regex.captures(line) {
368+
let def = cap.get(1).unwrap();
369+
scopes.push(*scopes.last().unwrap() && shader_defs_unique.contains(def.as_str()));
370+
} else if let Some(cap) = self.ifndef_regex.captures(line) {
371+
let def = cap.get(1).unwrap();
372+
scopes.push(*scopes.last().unwrap() && !shader_defs_unique.contains(def.as_str()));
373+
} else if self.else_regex.is_match(line) {
374+
let mut is_parent_scope_truthy = true;
375+
if scopes.len() > 1 {
376+
is_parent_scope_truthy = scopes[scopes.len() - 2];
410377
}
378+
if let Some(last) = scopes.last_mut() {
379+
*last = is_parent_scope_truthy && !*last;
380+
}
381+
} else if self.endif_regex.is_match(line) {
382+
scopes.pop();
383+
if scopes.is_empty() {
384+
return Err(ProcessShaderError::TooManyEndIfs);
385+
}
386+
} else if let Some(cap) = SHADER_IMPORT_PROCESSOR
387+
.import_asset_path_regex
388+
.captures(line)
389+
{
390+
let import = ShaderImport::AssetPath(cap.get(1).unwrap().as_str().to_string());
391+
self.apply_import(
392+
import_handles,
393+
shaders,
394+
&import,
395+
shader,
396+
shader_defs,
397+
&mut final_string,
398+
)?;
399+
} else if let Some(cap) = SHADER_IMPORT_PROCESSOR
400+
.import_custom_path_regex
401+
.captures(line)
402+
{
403+
let import = ShaderImport::Custom(cap.get(1).unwrap().as_str().to_string());
404+
self.apply_import(
405+
import_handles,
406+
shaders,
407+
&import,
408+
shader,
409+
shader_defs,
410+
&mut final_string,
411+
)?;
412+
} else if *scopes.last().unwrap() {
413+
final_string.push_str(line);
414+
final_string.push('\n');
411415
}
412-
processed.pop();
413-
if !changed {
414-
break processed;
415-
}
416-
processing = processed;
417-
};
416+
}
417+
final_string.pop();
418418

419419
if scopes.len() != 1 {
420420
return Err(ProcessShaderError::NotEnoughEndIfs);
@@ -430,40 +430,45 @@ impl ShaderProcessor {
430430
}
431431
}
432432
}
433-
}
434433

435-
fn apply_import(
436-
import_handles: &HashMap<ShaderImport, Handle<Shader>>,
437-
shaders: &HashMap<Handle<Shader>, Shader>,
438-
import: &ShaderImport,
439-
shader: &Shader,
440-
final_string: &mut String,
441-
) -> Result<(), ProcessShaderError> {
442-
let imported_shader = import_handles
443-
.get(import)
444-
.and_then(|handle| shaders.get(handle))
445-
.ok_or_else(|| ProcessShaderError::UnresolvedImport(import.clone()))?;
446-
match &shader.source {
447-
Source::Wgsl(_) => {
448-
if let Source::Wgsl(import_source) = &imported_shader.source {
449-
final_string.push_str(import_source);
450-
} else {
451-
return Err(ProcessShaderError::MismatchedImportFormat(import.clone()));
434+
fn apply_import(
435+
&self,
436+
import_handles: &HashMap<ShaderImport, Handle<Shader>>,
437+
shaders: &HashMap<Handle<Shader>, Shader>,
438+
import: &ShaderImport,
439+
shader: &Shader,
440+
shader_defs: &[String],
441+
final_string: &mut String,
442+
) -> Result<(), ProcessShaderError> {
443+
let imported_shader = import_handles
444+
.get(import)
445+
.and_then(|handle| shaders.get(handle))
446+
.ok_or_else(|| ProcessShaderError::UnresolvedImport(import.clone()))?;
447+
let imported_processed =
448+
self.process(imported_shader, shader_defs, shaders, import_handles)?;
449+
450+
match &shader.source {
451+
Source::Wgsl(_) => {
452+
if let ProcessedShader::Wgsl(import_source) = &imported_processed {
453+
final_string.push_str(import_source);
454+
} else {
455+
return Err(ProcessShaderError::MismatchedImportFormat(import.clone()));
456+
}
452457
}
453-
}
454-
Source::Glsl(_, _) => {
455-
if let Source::Glsl(import_source, _) = &imported_shader.source {
456-
final_string.push_str(import_source);
457-
} else {
458-
return Err(ProcessShaderError::MismatchedImportFormat(import.clone()));
458+
Source::Glsl(_, _) => {
459+
if let ProcessedShader::Glsl(import_source, _) = &imported_processed {
460+
final_string.push_str(import_source);
461+
} else {
462+
return Err(ProcessShaderError::MismatchedImportFormat(import.clone()));
463+
}
464+
}
465+
Source::SpirV(_) => {
466+
return Err(ProcessShaderError::ShaderFormatDoesNotSupportImports);
459467
}
460468
}
461-
Source::SpirV(_) => {
462-
return Err(ProcessShaderError::ShaderFormatDoesNotSupportImports);
463-
}
464-
}
465469

466-
Ok(())
470+
Ok(())
471+
}
467472
}
468473

469474
#[cfg(test)]

0 commit comments

Comments
 (0)