diff --git a/include/cinnabar-render/assets.hpp b/include/cinnabar-render/assets.hpp index 3fec6701..eaa19fa1 100644 --- a/include/cinnabar-render/assets.hpp +++ b/include/cinnabar-render/assets.hpp @@ -15,15 +15,12 @@ namespace ce { geom = "", frag = ""; }; - struct TextureFormat { + struct TextureFile { + unsigned char* data = NULL; // TODO: what type should this actually be? this has been a void* in some areas GLsizei width = 0, height = 0; - GLint internalColorSpace = 0; // TODO: is there a better value for this? GL_NONE exists but doesn't seem correct - }; - struct TextureFile { - unsigned char* data = NULL; // TODO: what type should this actually be? this has been a void* in some areas - TextureFormat format; + GLint internalColorSpace = 0; // TODO: is there a better value for this? GL_NONE exists but doesn't seem correct (also make changes in Texture) }; struct MaterialFile { glm::vec4 diff --git a/include/cinnabar-render/texture.hpp b/include/cinnabar-render/texture.hpp index b2f4d56d..dd71572c 100644 --- a/include/cinnabar-render/texture.hpp +++ b/include/cinnabar-render/texture.hpp @@ -7,19 +7,23 @@ namespace ce { class Texture { public: - Texture(std::string filename, GLenum colorSpace = 0, GLenum target = GL_TEXTURE_2D) // TODO: default colorSpace should change based on TextureFile.channelCount (GL_RED, GL_RG, GL_RGB, GL_RGBA) - : Texture(ce::assetManager::getTextureFile(filename), colorSpace, target){}; - Texture(TextureFile textureFile, GLenum colorSpace = 0, GLenum target = GL_TEXTURE_2D); + Texture(std::string filename, GLenum colorSpace = 0, GLenum target = GL_TEXTURE_2D) { + TextureFile textureFile = ce::assetManager::getTextureFile(filename); + init(textureFile, colorSpace, target); + ce::assetManager::freeTextureFile(textureFile); + }; + Texture(TextureFile textureFile, GLenum colorSpace = 0, GLenum target = GL_TEXTURE_2D) { + init(textureFile, colorSpace, target); + }; ~Texture(); void bind(), unbind(), activate(int slot); private: GLuint m_texture; - TextureFormat m_format; - GLenum m_colorSpace; GLenum m_target; + void init(TextureFile textureFile, GLenum colorSpace = 0, GLenum target = GL_TEXTURE_2D); bool loadData(TextureFile textureFile, GLenum colorSpace = 0, GLenum target = GL_TEXTURE_2D); }; } diff --git a/src/cinnabar-render/asset_manager.cpp b/src/cinnabar-render/asset_manager.cpp index be1db3cc..12e44fcc 100644 --- a/src/cinnabar-render/asset_manager.cpp +++ b/src/cinnabar-render/asset_manager.cpp @@ -46,23 +46,23 @@ ce::TextureFile ce::assetManager::getTextureFile(std::string path) { int channelCount; textureFile.data = stbi_load( (defaults::RESOURCE_FOLDER + "/" + defaults::TEXTURE_FOLDER + "/" + path).c_str(), - &textureFile.format.width, - &textureFile.format.height, + &textureFile.width, + &textureFile.height, &channelCount, 0); switch (channelCount) { case 1: - textureFile.format.internalColorSpace = GL_RED; + textureFile.internalColorSpace = GL_RED; break; case 2: - textureFile.format.internalColorSpace = GL_RG; + textureFile.internalColorSpace = GL_RG; break; case 3: - textureFile.format.internalColorSpace = GL_RGB; + textureFile.internalColorSpace = GL_RGB; break; case 4: - textureFile.format.internalColorSpace = GL_RGBA; + textureFile.internalColorSpace = GL_RGBA; break; default: LOG_WARN("Unsupported texture channel count: %i", channelCount); diff --git a/src/cinnabar-render/texture.cpp b/src/cinnabar-render/texture.cpp index 560645ed..83e49d44 100644 --- a/src/cinnabar-render/texture.cpp +++ b/src/cinnabar-render/texture.cpp @@ -4,8 +4,7 @@ #include -ce::Texture::Texture(TextureFile textureFile, GLenum colorSpace, GLenum target) { - +void ce::Texture::init(TextureFile textureFile, GLenum colorSpace, GLenum target) { glGenTextures(1, &m_texture); bind(); glTexParameteri(target, GL_TEXTURE_WRAP_S, GL_REPEAT); // TODO: proper system for setting texture parameters @@ -18,7 +17,6 @@ ce::Texture::Texture(TextureFile textureFile, GLenum colorSpace, GLenum target) } else { LOG_ERROR("Failed to load texture"); } - ce::assetManager::freeTextureFile(textureFile); // TODO: what if the TextureFile is used more than once? this should only be called if a string is passed in for the constructor } ce::Texture::~Texture() { @@ -42,27 +40,24 @@ void ce::Texture::unbind() { } bool ce::Texture::loadData(TextureFile textureFile, GLenum colorSpace, GLenum target) { - m_format = textureFile.format; // TODO: are these variables needed, and are they redundantly set elsewhere? m_target = target; - if (colorSpace) - m_colorSpace = colorSpace; - else - switch (m_format.internalColorSpace) { + if (!colorSpace) + switch (textureFile.internalColorSpace) { case GL_RED: case GL_RG: case GL_RGB: case GL_RGBA: - m_colorSpace = m_format.internalColorSpace; + colorSpace = textureFile.internalColorSpace; break; // TODO: add formats GL_RED_INTEGER, GL_RG_INTEGER, GL_RGB_INTEGER, GL_RGBA_INTEGER, GL_STENCIL_INDEX, GL_DEPTH_COMPONENT, GL_DEPTH_STENCIL default: - LOG_WARN("Unrecognized internal color space: %i", textureFile.format.internalColorSpace); + LOG_WARN("Unrecognized internal color space: %i", textureFile.internalColorSpace); } if (textureFile.data) { bind(); - glTexImage2D(m_target, 0, m_format.internalColorSpace, m_format.width, m_format.height, 0, m_colorSpace, + glTexImage2D(m_target, 0, textureFile.internalColorSpace, textureFile.width, textureFile.height, 0, colorSpace, GL_UNSIGNED_BYTE, textureFile.data); glGenerateMipmap(m_target); unbind();