Texture::Texture(Asset file, GLenum textureTarget, GLfloat filter) { std::map<std::string, TextureData *>::const_iterator it = m_textureCache.find(file.getIOStream()->getFileName().c_str()); if(it != m_textureCache.end()) { m_textureData = it->second; m_textureData->incrementReference(); } else { int x, y, bytesPerPixel; unsigned char* data = stbi_load_from_memory(reinterpret_cast<const unsigned char *>(file.read()), file.getIOStream()->fileSize(), &x, &y, &bytesPerPixel, 4); if(data == NULL) { log_err("Unable to load texture: %s", file.getIOStream()->getFileName().c_str()); } else { m_textureData = m_textureCache[file.getIOStream()->getFileName().c_str()] = new TextureData(x, y, data, textureTarget, filter); stbi_image_free(data); m_textureData->incrementReference(); } } }