#pragma once #include #include #include #include #include #include #include class ShaderProgram { /* TODO there's gotta be a better way of doing this! */ std::string mVertexPath, mGeometryPath, mFragmentPath; SDL_TimerID mShaderWatchTimer; /* most recent modification times for the three in order */ time_t mMtime[3]; bool mUniformLocationsNeedRefresh; std::map UniformLocationCache; static GLint my_checkCompileSuccess (const GLuint, const GLenum); static Uint32 my_WatchShaderHelper (Uint32 interval, void* param); GLint getCachedLoc (const std::string&); public: /* * Set-able */ GLuint ID; ShaderProgram (const std::string&, const std::string&, const std::string&); ~ShaderProgram (void); /* * gl* stuff. These modify the current `ID`. */ void RefreshUniformLocations (void); void Use (void); void Bool (const std::string&, const bool&); void Float (const std::string&, const float&); void Int (const std::string&, const int&); void Vec2 (const std::string&, const glm::vec2&); void Vec3 (const std::string&, const glm::vec3&); void Vec4 (const std::string&, const glm::vec4&); void Mat2 (const std::string&, const glm::mat2&); void Mat3 (const std::string&, const glm::mat3&); void Mat4 (const std::string&, const glm::mat4&); /* * Program/util stuff */ GLuint CompileShaderBuffer (const std::string&, const GLenum); GLuint Compile3ShaderBuffers (const std::string&, const std::string&, const std::string&); GLuint CompileShaderPath (const std::string&, const GLenum); GLint LinkProgram (void); /* * Monitor the modification time of the loaded shaders */ void StartWatchingShader (void); void StopWatchingShader (void); bool NeedsReloading (bool); const std::string& getVertexPath (void) const { return mVertexPath; } const std::string& getGeometryPath (void) const { return mGeometryPath; } const std::string& getFragmentPath (void) const { return mFragmentPath; } };