#include "resourceManager.h" #include #include #include // Instantiate static variables std::map ResourceManager::Textures; std::map ResourceManager::Shaders; Shader ResourceManager::LoadShader(const GLchar* vShaderFile, const GLchar* fShaderFile, const GLchar* gShaderFile, std::string name) { Shaders[name] = loadShaderFromFile(vShaderFile, fShaderFile, gShaderFile); return Shaders[name]; } Shader ResourceManager::GetShader(std::string name) { return Shaders[name]; } Texture ResourceManager::LoadTexture(const GLchar* file, std::string name) { Textures[name] = loadTextureFromFile(file); return Textures[name]; } Texture ResourceManager::GetTexture(std::string name) { return Textures[name]; } void ResourceManager::Clear() { // (Properly) delete all shaders for (auto iter : Shaders) glDeleteProgram(iter.second.ID); // (Properly) delete all Textures for (auto iter : Textures) glDeleteTextures(1, &iter.second.ID); } Shader ResourceManager::loadShaderFromFile(const GLchar* vShaderFile, const GLchar* fShaderFile, const GLchar* gShaderFile) { // 1. Retrieve the vertex/fragment source code from filePath std::string vertexCode; std::string fragmentCode; std::string geometryCode; try { // Open files std::ifstream vertexShaderFile(vShaderFile); std::ifstream fragmentShaderFile(fShaderFile); std::stringstream vShaderStream, fShaderStream; // Read file's buffer contents into streams vShaderStream << vertexShaderFile.rdbuf(); fShaderStream << fragmentShaderFile.rdbuf(); // close file handlers vertexShaderFile.close(); fragmentShaderFile.close(); // Convert stream into string vertexCode = vShaderStream.str(); fragmentCode = fShaderStream.str(); // If geometry shader path is present, also load a geometry shader if (gShaderFile != nullptr) { std::ifstream geometryShaderFile(gShaderFile); std::stringstream gShaderStream; gShaderStream << geometryShaderFile.rdbuf(); geometryShaderFile.close(); geometryCode = gShaderStream.str(); } } catch (std::exception e) { std::cout << "ERROR::SHADER: Failed to read shader files" << std::endl; } const GLchar* vShaderCode = vertexCode.c_str(); const GLchar* fShaderCode = fragmentCode.c_str(); const GLchar* gShaderCode = geometryCode.c_str(); // 2. Now create shader object from source code Shader shader; shader.Compile(vShaderCode, fShaderCode, gShaderFile != nullptr ? gShaderCode : nullptr); return shader; } Texture ResourceManager::loadTextureFromFile(const GLchar* file) { // Create Texture object Texture Texture; // Load image int width, height, nrChannels; unsigned char* image = stbi_load(file, &width, &height, &nrChannels , 4); // Now generate Texture Texture.generate(width, height, image); // And finally free image data stbi_image_free(image); return Texture; }