cleanup
This commit is contained in:
102
src/Assets.cpp
Executable file
102
src/Assets.cpp
Executable file
@@ -0,0 +1,102 @@
|
||||
#include "Assets.h"
|
||||
|
||||
#include <iostream>
|
||||
#include <sstream>
|
||||
#include <fstream>
|
||||
|
||||
#include <SDL_image.h>
|
||||
|
||||
#include "Utility.h"
|
||||
|
||||
|
||||
Shader Assets::loadShader(const GLchar *vShaderFile, const GLchar *fShaderFile, const GLchar *gShaderFile, std::string name) {
|
||||
shaders[name] = loadShaderFromFile(vShaderFile, fShaderFile, gShaderFile);
|
||||
return shaders[name];
|
||||
}
|
||||
Shader Assets::getShader(std::string name) {
|
||||
return shaders[name];
|
||||
}
|
||||
Texture2D Assets::loadTexture(const GLchar *file, GLboolean alpha, std::string name) {
|
||||
textures[name] = loadTextureFromFile(file,alpha);
|
||||
return textures[name];
|
||||
}
|
||||
Texture2D Assets::getTexture(std::string name) {
|
||||
return textures[name];
|
||||
}
|
||||
|
||||
Texture2D Assets::loadTextureFromFile(const GLchar *file, GLboolean alpha) {
|
||||
Texture2D texture;
|
||||
if(alpha) {
|
||||
texture.Internal_Format = GL_RGBA;
|
||||
texture.Image_Format = GL_RGBA;
|
||||
}
|
||||
|
||||
SDL_Surface *loadedSurface;
|
||||
loadedSurface = IMG_Load( file );
|
||||
|
||||
if(loadedSurface == NULL) {
|
||||
std::cout << "Unable to load Image " << file << " SDL_Image Error: " << IMG_GetError() << std::endl;
|
||||
SDL_FreeSurface(loadedSurface);
|
||||
return texture;
|
||||
}
|
||||
texture.Generate(loadedSurface->w, loadedSurface->h, (unsigned char *) loadedSurface->pixels);
|
||||
|
||||
Utility::checkOpenGLError();
|
||||
|
||||
SDL_FreeSurface(loadedSurface);
|
||||
return texture;
|
||||
}
|
||||
|
||||
Shader Assets::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;
|
||||
}
|
||||
|
||||
Assets::~Assets() {
|
||||
std::cout << "Deleting Assets" << std::endl;
|
||||
for(auto iter : shaders) {
|
||||
glDeleteProgram(iter.second.ID);
|
||||
}
|
||||
for(auto iter : textures) {
|
||||
glDeleteTextures(1, &iter.second.ID);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user