diff --git a/source/examples/bindless-textures/main.cpp b/source/examples/bindless-textures/main.cpp index 08b46f81..d67f0bd5 100644 --- a/source/examples/bindless-textures/main.cpp +++ b/source/examples/bindless-textures/main.cpp @@ -94,8 +94,8 @@ class EventHandler : public ExampleWindowEventHandler, glowutils::AbstractCoordi m_program = new glow::Program; m_program->attach( - glowutils::createShaderFromFile(gl::GL_VERTEX_SHADER, "data/bindless-textures/shader.vert"), - glowutils::createShaderFromFile(gl::GL_FRAGMENT_SHADER, "data/bindless-textures/shader.frag") + glow::Shader::fromFile(gl::GL_VERTEX_SHADER, "data/bindless-textures/shader.vert"), + glow::Shader::fromFile(gl::GL_FRAGMENT_SHADER, "data/bindless-textures/shader.frag") ); std::array::value> handles; diff --git a/source/examples/computeshader/main.cpp b/source/examples/computeshader/main.cpp index a4bfa470..1722a13f 100644 --- a/source/examples/computeshader/main.cpp +++ b/source/examples/computeshader/main.cpp @@ -168,7 +168,7 @@ void EventHandler::createAndSetupTexture() void EventHandler::createAndSetupShaders() { m_computeProgram = new glow::Program(); - m_computeProgram->attach(glowutils::createShaderFromFile(gl::GL_COMPUTE_SHADER, "data/computeshader/cstest.comp")); + m_computeProgram->attach(glow::Shader::fromFile(gl::GL_COMPUTE_SHADER, "data/computeshader/cstest.comp")); m_computeProgram->setUniform("destTex", 0); } diff --git a/source/examples/gpu-particles/ComputeShaderParticles.cpp b/source/examples/gpu-particles/ComputeShaderParticles.cpp index b32dca25..36b54211 100644 --- a/source/examples/gpu-particles/ComputeShaderParticles.cpp +++ b/source/examples/gpu-particles/ComputeShaderParticles.cpp @@ -71,9 +71,9 @@ void ComputeShaderParticles::initialize() m_drawProgram = new Program(); m_drawProgram->attach( - glowutils::createShaderFromFile(gl::GL_VERTEX_SHADER, "data/gpu-particles/points.vert") - , glowutils::createShaderFromFile(gl::GL_GEOMETRY_SHADER, "data/gpu-particles/points.geom") - , glowutils::createShaderFromFile(gl::GL_FRAGMENT_SHADER, "data/gpu-particles/points.frag")); + glow::Shader::fromFile(gl::GL_VERTEX_SHADER, "data/gpu-particles/points.vert") + , glow::Shader::fromFile(gl::GL_GEOMETRY_SHADER, "data/gpu-particles/points.geom") + , glow::Shader::fromFile(gl::GL_FRAGMENT_SHADER, "data/gpu-particles/points.frag")); m_positionsSSBO = new Buffer(); m_velocitiesSSBO = new Buffer(); @@ -114,7 +114,7 @@ void ComputeShaderParticles::initialize() m_quad = new glowutils::ScreenAlignedQuad(m_color); m_clear = new glowutils::ScreenAlignedQuad( - glowutils::createShaderFromFile(gl::GL_FRAGMENT_SHADER, "data/gpu-particles/clear.frag")); + glow::Shader::fromFile(gl::GL_FRAGMENT_SHADER, "data/gpu-particles/clear.frag")); } void ComputeShaderParticles::reset() diff --git a/source/examples/gpu-particles/FragmentShaderParticles.cpp b/source/examples/gpu-particles/FragmentShaderParticles.cpp index 39c0e99b..938a7c6a 100644 --- a/source/examples/gpu-particles/FragmentShaderParticles.cpp +++ b/source/examples/gpu-particles/FragmentShaderParticles.cpp @@ -66,7 +66,7 @@ void FragmentShaderParticles::initialize() // Create screen aligned quad for particle update m_quadUpdate = new ScreenAlignedQuad( - createShaderFromFile(gl::GL_FRAGMENT_SHADER, "data/gpu-particles/particle.frag"), + Shader::fromFile(gl::GL_FRAGMENT_SHADER, "data/gpu-particles/particle.frag"), m_texPositions ); m_quadUpdate->program()->setUniform("vertices", 0); m_quadUpdate->program()->setUniform("velocities", 1); @@ -88,15 +88,15 @@ void FragmentShaderParticles::initialize() // Create screen aligned quads for clear and rendering m_clear = new ScreenAlignedQuad( - createShaderFromFile(gl::GL_FRAGMENT_SHADER, "data/gpu-particles/clear.frag") ); + Shader::fromFile(gl::GL_FRAGMENT_SHADER, "data/gpu-particles/clear.frag") ); m_quad = new ScreenAlignedQuad(m_colorBuffer); // Create draw program m_drawProgram = new Program(); m_drawProgram->attach( - createShaderFromFile(gl::GL_VERTEX_SHADER, "data/gpu-particles/points_fragment.vert") - , createShaderFromFile(gl::GL_GEOMETRY_SHADER, "data/gpu-particles/points.geom") - , createShaderFromFile(gl::GL_FRAGMENT_SHADER, "data/gpu-particles/points.frag")); + Shader::fromFile(gl::GL_VERTEX_SHADER, "data/gpu-particles/points_fragment.vert") + , Shader::fromFile(gl::GL_GEOMETRY_SHADER, "data/gpu-particles/points.geom") + , Shader::fromFile(gl::GL_FRAGMENT_SHADER, "data/gpu-particles/points.frag")); } void FragmentShaderParticles::reset() diff --git a/source/examples/gpu-particles/TransformFeedbackParticles.cpp b/source/examples/gpu-particles/TransformFeedbackParticles.cpp index b1ea3b3e..c94ec053 100644 --- a/source/examples/gpu-particles/TransformFeedbackParticles.cpp +++ b/source/examples/gpu-particles/TransformFeedbackParticles.cpp @@ -44,7 +44,7 @@ void TransformFeedbackParticles::initialize() reset(); m_transformFeedbackProgram = new glow::Program(); - m_transformFeedbackProgram->attach(glowutils::createShaderFromFile(gl::GL_VERTEX_SHADER, "data/gpu-particles/transformfeedback.vert")); + m_transformFeedbackProgram->attach(glow::Shader::fromFile(gl::GL_VERTEX_SHADER, "data/gpu-particles/transformfeedback.vert")); m_transformFeedbackProgram->link(); @@ -53,9 +53,9 @@ void TransformFeedbackParticles::initialize() m_drawProgram = new Program(); m_drawProgram->attach( - glowutils::createShaderFromFile(gl::GL_VERTEX_SHADER, "data/gpu-particles/points.vert") - , glowutils::createShaderFromFile(gl::GL_GEOMETRY_SHADER, "data/gpu-particles/points.geom") - , glowutils::createShaderFromFile(gl::GL_FRAGMENT_SHADER, "data/gpu-particles/points.frag")); + glow::Shader::fromFile(gl::GL_VERTEX_SHADER, "data/gpu-particles/points.vert") + , glow::Shader::fromFile(gl::GL_GEOMETRY_SHADER, "data/gpu-particles/points.geom") + , glow::Shader::fromFile(gl::GL_FRAGMENT_SHADER, "data/gpu-particles/points.frag")); m_vao = new VertexArrayObject(); m_vao->bind(); @@ -90,7 +90,7 @@ void TransformFeedbackParticles::initialize() m_quad = new glowutils::ScreenAlignedQuad(m_color); m_clear = new glowutils::ScreenAlignedQuad( - glowutils::createShaderFromFile(gl::GL_FRAGMENT_SHADER, "data/gpu-particles/clear.frag")); + glow::Shader::fromFile(gl::GL_FRAGMENT_SHADER, "data/gpu-particles/clear.frag")); } void TransformFeedbackParticles::reset() diff --git a/source/examples/simple-transformfeedback/main.cpp b/source/examples/simple-transformfeedback/main.cpp index e9f610e6..b1f4f65b 100644 --- a/source/examples/simple-transformfeedback/main.cpp +++ b/source/examples/simple-transformfeedback/main.cpp @@ -181,12 +181,12 @@ void EventHandler::createAndSetupShaders() { m_shaderProgram = new glow::Program(); m_shaderProgram->attach( - glowutils::createShaderFromFile(gl::GL_VERTEX_SHADER, "data/transformfeedback/simple.vert") - , glowutils::createShaderFromFile(gl::GL_FRAGMENT_SHADER, "data/transformfeedback/simple.frag")); + glow::Shader::fromFile(gl::GL_VERTEX_SHADER, "data/transformfeedback/simple.vert") + , glow::Shader::fromFile(gl::GL_FRAGMENT_SHADER, "data/transformfeedback/simple.frag")); m_transformFeedbackProgram = new glow::Program(); m_transformFeedbackProgram->attach( - glowutils::createShaderFromFile(gl::GL_VERTEX_SHADER, "data/transformfeedback/transformfeedback.vert")); + glow::Shader::fromFile(gl::GL_VERTEX_SHADER, "data/transformfeedback/transformfeedback.vert")); m_transformFeedbackProgram->setUniform("deltaT", 0.0f); } diff --git a/source/examples/ssbo/main.cpp b/source/examples/ssbo/main.cpp index b22f9e62..3fe34f70 100644 --- a/source/examples/ssbo/main.cpp +++ b/source/examples/ssbo/main.cpp @@ -40,7 +40,7 @@ class EventHandler : public ExampleWindowEventHandler gl::glClearColor(0.2f, 0.3f, 0.4f, 1.f); - m_quad = new glowutils::ScreenAlignedQuad(glowutils::createShaderFromFile(gl::GL_FRAGMENT_SHADER, "data/ssbo/ssbo.frag")); + m_quad = new glowutils::ScreenAlignedQuad(glow::Shader::fromFile(gl::GL_FRAGMENT_SHADER, "data/ssbo/ssbo.frag")); m_quad->program()->setUniform("maximum", 10); m_quad->program()->setUniform("rowCount", 10); diff --git a/source/examples/tessellation/main.cpp b/source/examples/tessellation/main.cpp index ebb4c1de..8ad32fb1 100644 --- a/source/examples/tessellation/main.cpp +++ b/source/examples/tessellation/main.cpp @@ -59,12 +59,12 @@ class EventHandler : public ExampleWindowEventHandler m_sphere = new glow::Program(); m_sphere->attach( - glowutils::createShaderFromFile(gl::GL_VERTEX_SHADER, "data/tessellation/sphere.vert") - , glowutils::createShaderFromFile(gl::GL_TESS_CONTROL_SHADER, "data/tessellation/sphere.tcs") - , glowutils::createShaderFromFile(gl::GL_TESS_EVALUATION_SHADER, "data/tessellation/sphere.tes") - , glowutils::createShaderFromFile(gl::GL_GEOMETRY_SHADER, "data/tessellation/sphere.geom") - , glowutils::createShaderFromFile(gl::GL_FRAGMENT_SHADER, "data/tessellation/sphere.frag") - , glowutils::createShaderFromFile(gl::GL_FRAGMENT_SHADER, "data/common/phong.frag")); + glow::Shader::fromFile(gl::GL_VERTEX_SHADER, "data/tessellation/sphere.vert") + , glow::Shader::fromFile(gl::GL_TESS_CONTROL_SHADER, "data/tessellation/sphere.tcs") + , glow::Shader::fromFile(gl::GL_TESS_EVALUATION_SHADER, "data/tessellation/sphere.tes") + , glow::Shader::fromFile(gl::GL_GEOMETRY_SHADER, "data/tessellation/sphere.geom") + , glow::Shader::fromFile(gl::GL_FRAGMENT_SHADER, "data/tessellation/sphere.frag") + , glow::Shader::fromFile(gl::GL_FRAGMENT_SHADER, "data/common/phong.frag")); m_icosahedron = new glowutils::Icosahedron(); m_agrid = new glowutils::AdaptiveGrid(16U); diff --git a/source/examples/transparency/ABufferAlgorithm.cpp b/source/examples/transparency/ABufferAlgorithm.cpp index 02f9f4f7..199286b0 100644 --- a/source/examples/transparency/ABufferAlgorithm.cpp +++ b/source/examples/transparency/ABufferAlgorithm.cpp @@ -42,7 +42,7 @@ void ABufferAlgorithm::initialize(const std::string & transparencyShaderFilePath glow::NamedString::create("/transparency/abuffer.glsl", new glow::File(transparencyShaderFilePath + "abuffer.glsl")); m_program = new glow::Program(); - m_program->attach(glowutils::createShaderFromFile(gl::GL_FRAGMENT_SHADER, transparencyShaderFilePath + "abuffer.frag")); + m_program->attach(glow::Shader::fromFile(gl::GL_FRAGMENT_SHADER, transparencyShaderFilePath + "abuffer.frag")); m_program->attach(vertexShader); if (geometryShader != nullptr) m_program->attach(geometryShader); @@ -63,7 +63,7 @@ void ABufferAlgorithm::initialize(const std::string & transparencyShaderFilePath m_counter = new glow::Buffer(); m_counter->setName("A Buffer Counter"); - m_quad = new glowutils::ScreenAlignedQuad(glowutils::createShaderFromFile(gl::GL_FRAGMENT_SHADER, transparencyShaderFilePath + "abuffer_post.frag")); + m_quad = new glowutils::ScreenAlignedQuad(glow::Shader::fromFile(gl::GL_FRAGMENT_SHADER, transparencyShaderFilePath + "abuffer_post.frag")); m_colorBuffer = createColorTex(); m_postFbo = new glow::FrameBufferObject; diff --git a/source/examples/transparency/GlBlendAlgorithm.cpp b/source/examples/transparency/GlBlendAlgorithm.cpp index 44a2549e..51df4e56 100644 --- a/source/examples/transparency/GlBlendAlgorithm.cpp +++ b/source/examples/transparency/GlBlendAlgorithm.cpp @@ -15,7 +15,7 @@ void GlBlendAlgorithm::initialize(const std::string & transparencyShaderFilePath assert(vertexShader != nullptr); m_program = new glow::Program(); - m_program->attach(glowutils::createShaderFromFile(gl::GL_FRAGMENT_SHADER, transparencyShaderFilePath + "glblend.frag")); + m_program->attach(glow::Shader::fromFile(gl::GL_FRAGMENT_SHADER, transparencyShaderFilePath + "glblend.frag")); m_program->attach(vertexShader); if (geometryShader != nullptr) m_program->attach(geometryShader); diff --git a/source/examples/transparency/HybridAlgorithm.cpp b/source/examples/transparency/HybridAlgorithm.cpp index 20dab065..aca51023 100644 --- a/source/examples/transparency/HybridAlgorithm.cpp +++ b/source/examples/transparency/HybridAlgorithm.cpp @@ -27,20 +27,20 @@ void HybridAlgorithm::initialize(const std::string & transparencyShaderFilePath, m_opaqueProgram = new glow::Program; m_opaqueProgram->attach(vertexShader); - m_opaqueProgram->attach(glowutils::createShaderFromFile(gl::GL_FRAGMENT_SHADER, transparencyShaderFilePath + "hybrid_opaque.frag")); + m_opaqueProgram->attach(glow::Shader::fromFile(gl::GL_FRAGMENT_SHADER, transparencyShaderFilePath + "hybrid_opaque.frag")); if (geometryShader != nullptr) m_opaqueProgram->attach(geometryShader); m_depthKTabProgram = new glow::Program; m_depthKTabProgram->attach(vertexShader); - m_depthKTabProgram->attach(glowutils::createShaderFromFile(gl::GL_FRAGMENT_SHADER, transparencyShaderFilePath + "hybrid_depthktab.frag")); + m_depthKTabProgram->attach(glow::Shader::fromFile(gl::GL_FRAGMENT_SHADER, transparencyShaderFilePath + "hybrid_depthktab.frag")); if (geometryShader != nullptr) m_depthKTabProgram->attach(geometryShader); m_visibilityKTabProgram = new glow::Program; - m_visibilityKTabProgram->attach(glowutils::createShaderFromFile(gl::GL_COMPUTE_SHADER, transparencyShaderFilePath + "hybrid_visibilityktab.comp")); + m_visibilityKTabProgram->attach(glow::Shader::fromFile(gl::GL_COMPUTE_SHADER, transparencyShaderFilePath + "hybrid_visibilityktab.comp")); m_colorProgram = new glow::Program; m_colorProgram->attach(vertexShader); - m_colorProgram->attach(glowutils::createShaderFromFile(gl::GL_FRAGMENT_SHADER, transparencyShaderFilePath + "hybrid_color.frag")); + m_colorProgram->attach(glow::Shader::fromFile(gl::GL_FRAGMENT_SHADER, transparencyShaderFilePath + "hybrid_color.frag")); if (geometryShader != nullptr) m_colorProgram->attach(geometryShader); m_depthBuffer = new glow::RenderBufferObject; @@ -62,7 +62,7 @@ void HybridAlgorithm::initialize(const std::string & transparencyShaderFilePath, m_colorFbo->attachRenderBuffer(gl::GL_DEPTH_ATTACHMENT, m_depthBuffer.get()); m_colorFbo->setDrawBuffers({ gl::GL_COLOR_ATTACHMENT0, gl::GL_COLOR_ATTACHMENT1 }); - m_compositionQuad = new glowutils::ScreenAlignedQuad(glowutils::createShaderFromFile(gl::GL_FRAGMENT_SHADER, transparencyShaderFilePath + "hybrid_post.frag")); + m_compositionQuad = new glowutils::ScreenAlignedQuad(glow::Shader::fromFile(gl::GL_FRAGMENT_SHADER, transparencyShaderFilePath + "hybrid_post.frag")); m_compositionFbo = new glow::FrameBufferObject; m_compositionFbo->attachTexture2D(gl::GL_COLOR_ATTACHMENT0, m_colorBuffer.get()); m_compositionFbo->setDrawBuffer(gl::GL_COLOR_ATTACHMENT0); diff --git a/source/examples/transparency/WeightedAverageAlgorithm.cpp b/source/examples/transparency/WeightedAverageAlgorithm.cpp index 45ff55bc..ed59e9a8 100644 --- a/source/examples/transparency/WeightedAverageAlgorithm.cpp +++ b/source/examples/transparency/WeightedAverageAlgorithm.cpp @@ -14,12 +14,12 @@ void WeightedAverageAlgorithm::initialize(const std::string & transparencyShaderFilePath, glow::Shader *vertexShader, glow::Shader *geometryShader) { m_opaqueProgram = new glow::Program; - m_opaqueProgram->attach(glowutils::createShaderFromFile(gl::GL_FRAGMENT_SHADER, transparencyShaderFilePath + "wavg_opaque.frag")); + m_opaqueProgram->attach(glow::Shader::fromFile(gl::GL_FRAGMENT_SHADER, transparencyShaderFilePath + "wavg_opaque.frag")); m_opaqueProgram->attach(vertexShader); if (geometryShader != nullptr) m_opaqueProgram->attach(geometryShader); m_accumulationProgram = new glow::Program; - m_accumulationProgram->attach(glowutils::createShaderFromFile(gl::GL_FRAGMENT_SHADER, transparencyShaderFilePath + "wavg_translucent.frag")); + m_accumulationProgram->attach(glow::Shader::fromFile(gl::GL_FRAGMENT_SHADER, transparencyShaderFilePath + "wavg_translucent.frag")); m_accumulationProgram->attach(vertexShader); if (geometryShader != nullptr) m_accumulationProgram->attach(geometryShader); @@ -35,7 +35,7 @@ void WeightedAverageAlgorithm::initialize(const std::string & transparencyShader m_renderFbo->attachRenderBuffer(gl::GL_DEPTH_ATTACHMENT, m_depthBuffer); m_renderFbo->setDrawBuffers({ gl::GL_COLOR_ATTACHMENT0, gl::GL_COLOR_ATTACHMENT1 }); - m_quad = new glowutils::ScreenAlignedQuad(glowutils::createShaderFromFile(gl::GL_FRAGMENT_SHADER, transparencyShaderFilePath + "wavg_post.frag")); + m_quad = new glowutils::ScreenAlignedQuad(glow::Shader::fromFile(gl::GL_FRAGMENT_SHADER, transparencyShaderFilePath + "wavg_post.frag")); m_colorBuffer = createColorTex(); m_postFbo = new glow::FrameBufferObject; diff --git a/source/examples/transparency/main.cpp b/source/examples/transparency/main.cpp index 70b9afa0..24b7954e 100644 --- a/source/examples/transparency/main.cpp +++ b/source/examples/transparency/main.cpp @@ -60,7 +60,7 @@ class EventHandler : public ExampleWindowEventHandler, glowutils::AbstractCoordi gl::glClearColor(1.0f, 1.0f, 1.0f, 1.0f); - glow::Shader* vertexShader = glowutils::createShaderFromFile(gl::GL_VERTEX_SHADER, "data/transparency/transparency.vert"); + glow::Shader* vertexShader = glow::Shader::fromFile(gl::GL_VERTEX_SHADER, "data/transparency/transparency.vert"); m_algos.push_back(new GlBlendAlgorithm); m_algos.push_back(new ABufferAlgorithm); @@ -76,8 +76,8 @@ class EventHandler : public ExampleWindowEventHandler, glowutils::AbstractCoordi // Setup the screen aligned quad stuff glow::Program* quadProgram = new glow::Program(); - quadProgram->attach(glowutils::createShaderFromFile(gl::GL_FRAGMENT_SHADER, "data/transparency/quad.frag")); - quadProgram->attach(glowutils::createShaderFromFile(gl::GL_VERTEX_SHADER, "data/transparency/quad.vert")); + quadProgram->attach(glow::Shader::fromFile(gl::GL_FRAGMENT_SHADER, "data/transparency/quad.frag")); + quadProgram->attach(glow::Shader::fromFile(gl::GL_VERTEX_SHADER, "data/transparency/quad.vert")); m_quad = new glowutils::ScreenAlignedQuad(quadProgram); m_aabb.extend(glm::vec3(-1.f, -0.5f, -10.5f)); diff --git a/source/glow/include/glow/Shader.h b/source/glow/include/glow/Shader.h index 07d44644..ba48621d 100644 --- a/source/glow/include/glow/Shader.h +++ b/source/glow/include/glow/Shader.h @@ -40,6 +40,7 @@ class GLOW_API Shader : public Object, protected ChangeListener, public Changeab public: static Shader * fromString(const gl::GLenum type, const std::string & sourceString); + static Shader * fromFile(const gl::GLenum type, const std::string & filename); public: Shader(const gl::GLenum type); diff --git a/source/glow/source/Shader.cpp b/source/glow/source/Shader.cpp index a828c396..ff1e9201 100644 --- a/source/glow/source/Shader.cpp +++ b/source/glow/source/Shader.cpp @@ -10,6 +10,7 @@ #include #include #include +#include #include #include @@ -68,6 +69,11 @@ Shader * Shader::fromString(const gl::GLenum type, const std::string & sourceStr return new Shader(type, new StaticStringSource(sourceString)); } +Shader * Shader::fromFile(const gl::GLenum type, const std::string & filename) +{ + return new Shader(type, new File(filename)); +} + Shader::~Shader() { if (m_source) diff --git a/source/glowutils/include/glowutils/glowutils.h b/source/glowutils/include/glowutils/glowutils.h index 7cc7d19c..ec8b9d72 100644 --- a/source/glowutils/include/glowutils/glowutils.h +++ b/source/glowutils/include/glowutils/glowutils.h @@ -1,25 +1,12 @@ #pragma once #include -#include - -#include #include -namespace glow -{ - -class Shader; - -} - namespace glowutils { -GLOWUTILS_API glow::Shader * createShaderFromFile(gl::GLenum type, const std::string & fileName); -GLOWUTILS_API glow::Shader * createShaderFromFile(gl::GLenum type, const std::string & fileName, const std::vector & includePaths); - GLOWUTILS_API void scanDirectory(const std::string & directory, const std::string & fileExtension); } // namespace glowutils diff --git a/source/glowutils/source/glowutils.cpp b/source/glowutils/source/glowutils.cpp index b566dd90..0f82cb81 100644 --- a/source/glowutils/source/glowutils.cpp +++ b/source/glowutils/source/glowutils.cpp @@ -1,10 +1,9 @@ #include +#include + #include #include -#include - -#include #ifdef _MSC_VER #include "windows.h" @@ -59,16 +58,6 @@ using namespace glow; namespace glowutils { -Shader * createShaderFromFile(const gl::GLenum type, const std::string& fileName) -{ - return new Shader(type, new File(fileName)); -} - -Shader * createShaderFromFile(gl::GLenum type, const std::string & fileName, const std::vector & includePaths) -{ - return new Shader(type, new File(fileName), includePaths); -} - void scanDirectory(const std::string & directory, const std::string & fileExtension) { for (const std::string & file: getFiles(directory))