From b32976504da5aa503582d7dc07dee0e0e4c9ba1b Mon Sep 17 00:00:00 2001 From: Carter Anderson Date: Sat, 11 Nov 2023 15:01:08 -0800 Subject: [PATCH] Fix shader import hot reloading on windows (#10502) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit # Objective Hot reloading shader imports on windows is currently broken due to inconsistent `/` and `\` usage ('/` is used in the user facing APIs and `\` is produced by notify-rs (and likely other OS apis). Fixes #10500 ## Solution Standardize import paths when loading a `Shader`. The correct long term fix is to standardize AssetPath on `/`-only, but this is the right scope of fix for a patch release. --------- Co-authored-by: François --- .../bevy_render/src/render_resource/shader.rs | 34 ++++++++----------- 1 file changed, 14 insertions(+), 20 deletions(-) diff --git a/crates/bevy_render/src/render_resource/shader.rs b/crates/bevy_render/src/render_resource/shader.rs index 465fbb193d..7b10677784 100644 --- a/crates/bevy_render/src/render_resource/shader.rs +++ b/crates/bevy_render/src/render_resource/shader.rs @@ -259,30 +259,24 @@ impl AssetLoader for ShaderLoader { ) -> BoxedFuture<'a, Result> { Box::pin(async move { let ext = load_context.path().extension().unwrap().to_str().unwrap(); - + let path = load_context.asset_path().to_string(); + // On windows, the path will inconsistently use \ or /. + // TODO: remove this once AssetPath forces cross-platform "slash" consistency. See #10511 + let path = path.replace(std::path::MAIN_SEPARATOR, "/"); let mut bytes = Vec::new(); reader.read_to_end(&mut bytes).await?; let mut shader = match ext { "spv" => Shader::from_spirv(bytes, load_context.path().to_string_lossy()), - "wgsl" => Shader::from_wgsl( - String::from_utf8(bytes)?, - load_context.path().to_string_lossy(), - ), - "vert" => Shader::from_glsl( - String::from_utf8(bytes)?, - naga::ShaderStage::Vertex, - load_context.path().to_string_lossy(), - ), - "frag" => Shader::from_glsl( - String::from_utf8(bytes)?, - naga::ShaderStage::Fragment, - load_context.path().to_string_lossy(), - ), - "comp" => Shader::from_glsl( - String::from_utf8(bytes)?, - naga::ShaderStage::Compute, - load_context.path().to_string_lossy(), - ), + "wgsl" => Shader::from_wgsl(String::from_utf8(bytes)?, path), + "vert" => { + Shader::from_glsl(String::from_utf8(bytes)?, naga::ShaderStage::Vertex, path) + } + "frag" => { + Shader::from_glsl(String::from_utf8(bytes)?, naga::ShaderStage::Fragment, path) + } + "comp" => { + Shader::from_glsl(String::from_utf8(bytes)?, naga::ShaderStage::Compute, path) + } _ => panic!("unhandled extension: {ext}"), };