diff --git a/panda/src/gobj/shader.cxx b/panda/src/gobj/shader.cxx index a586a4e928..fc458ccaef 100644 --- a/panda/src/gobj/shader.cxx +++ b/panda/src/gobj/shader.cxx @@ -2876,7 +2876,7 @@ r_preprocess_source(ostream &out, istream &in, const Filename &fn, source_dir = full_fn.get_dirname(); incfn = incfile; - } else if (sscanf(line.c_str(), " # pragma%*[ \t]include <%2047[^\"]> %zn", incfile, &nread) == 1 + } else if (sscanf(line.c_str(), " # pragma%*[ \t]include <%2047[^\>]> %zn", incfile, &nread) == 1 && nread == line.size()) { // Angled includes are also OK, but we don't search in the directory // of the source file. diff --git a/tests/display/glsl_include_angle.vert b/tests/display/glsl_include_angle.vert new file mode 100644 index 0000000000..ac3e9dfdc1 --- /dev/null +++ b/tests/display/glsl_include_angle.vert @@ -0,0 +1,10 @@ +#version 150 + +#pragma include + +// Vertex inputs +in vec4 p3d_Vertex; + +void main() { + gl_Position = p3d_ModelViewProjectionMatrix * p3d_Vertex; +} diff --git a/tests/display/glsl_include_angle_legacy.vert b/tests/display/glsl_include_angle_legacy.vert new file mode 100644 index 0000000000..08ffe6298f --- /dev/null +++ b/tests/display/glsl_include_angle_legacy.vert @@ -0,0 +1,10 @@ +#version 120 + +#pragma include + +// Vertex inputs +attribute vec4 p3d_Vertex; + +void main() { + gl_Position = p3d_ModelViewProjectionMatrix * p3d_Vertex; +} diff --git a/tests/display/test_glsl_shader.py b/tests/display/test_glsl_shader.py index 4a4314ba9d..8a59d0f665 100644 --- a/tests/display/test_glsl_shader.py +++ b/tests/display/test_glsl_shader.py @@ -497,3 +497,31 @@ def test_glsl_includes(gsg): vert_path = core.Filename(SHADERS_DIR, 'glsl_include' + suffix + '.vert') frag_path = core.Filename(SHADERS_DIR, 'glsl_simple' + suffix + '.frag') run_glsl_compile_check(gsg, vert_path, frag_path) + + +def test_glsl_includes_angle_nodir(gsg): + """Test preprocessing includes with angle includes without model-path""" + suffix = '' + if (gsg.driver_shader_version_major, gsg.driver_shader_version_minor) < (1, 50): + suffix = '_legacy' + vert_path = core.Filename(SHADERS_DIR, 'glsl_include_angle' + suffix + '.vert') + frag_path = core.Filename(SHADERS_DIR, 'glsl_simple' + suffix + '.frag') + assert core.Shader.load(core.Shader.SL_GLSL, vert_path, frag_path) is None + + +@pytest.fixture +def with_current_dir_on_model_path(): + model_path = core.get_model_path() + model_path.prepend_directory(core.Filename.from_os_specific(os.path.dirname(__file__))) + yield + model_path.clear_local_value() + + +def test_glsl_includes_angle_withdir(gsg, with_current_dir_on_model_path): + """Test preprocessing includes with angle includes with model-path""" + suffix = '' + if (gsg.driver_shader_version_major, gsg.driver_shader_version_minor) < (1, 50): + suffix = '_legacy' + vert_path = core.Filename(SHADERS_DIR, 'glsl_include_angle' + suffix + '.vert') + frag_path = core.Filename(SHADERS_DIR, 'glsl_simple' + suffix + '.frag') + run_glsl_compile_check(gsg, vert_path, frag_path)