TextureGL::TextureGL(const TextureDescriptor &descriptor) : Texture(descriptor), m_target(GL_TEXTURE_2D) // XXX don't force target { glGenTextures(1, &m_texture); glBindTexture(m_target, m_texture); glEnable(m_target); switch (m_target) { case GL_TEXTURE_2D: if (descriptor.generateMipmaps) glTexParameteri(m_target, GL_GENERATE_MIPMAP, GL_TRUE); glTexImage2D( m_target, 0, GLTextureFormat(descriptor.format), descriptor.dataSize.x, descriptor.dataSize.y, 0, GLImageFormatForTextureFormat(descriptor.format), GLImageTypeForTextureFormat(descriptor.format), 0); break; default: assert(0); } GLenum magFilter, minFilter, wrapS, wrapT; switch (descriptor.sampleMode) { case LINEAR_CLAMP: magFilter = GL_LINEAR; minFilter = descriptor.generateMipmaps ? GL_LINEAR_MIPMAP_LINEAR : GL_LINEAR; wrapS = wrapT = GL_CLAMP_TO_EDGE; break; case NEAREST_CLAMP: magFilter = GL_NEAREST; minFilter = descriptor.generateMipmaps ? GL_NEAREST_MIPMAP_NEAREST : GL_NEAREST; wrapS = wrapT = GL_CLAMP_TO_EDGE; break; case LINEAR_REPEAT: magFilter = GL_LINEAR; minFilter = descriptor.generateMipmaps ? GL_LINEAR_MIPMAP_LINEAR : GL_LINEAR; wrapS = wrapT = GL_REPEAT; break; case NEAREST_REPEAT: magFilter = GL_NEAREST; minFilter = descriptor.generateMipmaps ? GL_NEAREST_MIPMAP_NEAREST : GL_NEAREST; wrapS = wrapT = GL_REPEAT; break; default: assert(0); } glTexParameteri(m_target, GL_TEXTURE_WRAP_S, wrapS); glTexParameteri(m_target, GL_TEXTURE_WRAP_T, wrapS); glTexParameteri(m_target, GL_TEXTURE_MAG_FILTER, magFilter); glTexParameteri(m_target, GL_TEXTURE_MIN_FILTER, minFilter); glDisable(m_target); }
TextureGL::TextureGL(const TextureDescriptor &descriptor, const bool useCompressed) : Texture(descriptor), m_target(GL_TEXTURE_2D) // XXX don't force target { glGenTextures(1, &m_texture); glBindTexture(m_target, m_texture); glEnable(m_target); // useCompressed is the global scope flag whereas descriptor.allowCompression is the local texture mode flag // either both or neither might be true however only compress the texture when both are true. const bool compressTexture = useCompressed && descriptor.allowCompression; switch (m_target) { case GL_TEXTURE_2D: if (descriptor.generateMipmaps) glTexParameteri(m_target, GL_GENERATE_MIPMAP, GL_TRUE); glTexImage2D( m_target, 0, compressTexture ? GLCompressedTextureFormat(descriptor.format) : GLTextureFormat(descriptor.format), descriptor.dataSize.x, descriptor.dataSize.y, 0, GLImageFormatForTextureFormat(descriptor.format), GLImageTypeForTextureFormat(descriptor.format), 0); break; default: assert(0); } GLenum magFilter, minFilter, wrapS, wrapT; switch (descriptor.sampleMode) { case LINEAR_CLAMP: magFilter = GL_LINEAR; minFilter = descriptor.generateMipmaps ? GL_LINEAR_MIPMAP_LINEAR : GL_LINEAR; wrapS = wrapT = GL_CLAMP_TO_EDGE; break; case NEAREST_CLAMP: magFilter = GL_NEAREST; minFilter = descriptor.generateMipmaps ? GL_NEAREST_MIPMAP_NEAREST : GL_NEAREST; wrapS = wrapT = GL_CLAMP_TO_EDGE; break; case LINEAR_REPEAT: magFilter = GL_LINEAR; minFilter = descriptor.generateMipmaps ? GL_LINEAR_MIPMAP_LINEAR : GL_LINEAR; wrapS = wrapT = GL_REPEAT; break; case NEAREST_REPEAT: magFilter = GL_NEAREST; minFilter = descriptor.generateMipmaps ? GL_NEAREST_MIPMAP_NEAREST : GL_NEAREST; wrapS = wrapT = GL_REPEAT; break; default: assert(0); } glTexParameteri(m_target, GL_TEXTURE_WRAP_S, wrapS); glTexParameteri(m_target, GL_TEXTURE_WRAP_T, wrapS); glTexParameteri(m_target, GL_TEXTURE_MAG_FILTER, magFilter); glTexParameteri(m_target, GL_TEXTURE_MIN_FILTER, minFilter); glDisable(m_target); }