commonMain.ru.casperix.opengl.renderer.texture.GLTexture2D.kt Maven / Gradle / Ivy
package ru.casperix.opengl.renderer.texture
import ru.casperix.opengl.core.*
import ru.casperix.opengl.renderer.texture.GLTexture.Companion.asGLMagFilter
import ru.casperix.opengl.renderer.texture.GLTexture.Companion.asGLMinFilter
import ru.casperix.opengl.renderer.texture.GLTexture.Companion.asGLWrap
import ru.casperix.renderer.material.Texture2D
class GLTexture2D(val texture: Texture2D) : GLTexture {
val handle = glGenTexture()
init {
glBindTexture(GL_TEXTURE_2D, handle)
texture.config.apply {
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, asGLWrap(uWrap))
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, asGLWrap(vWrap))
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, asGLMinFilter(minFilter, useMipMap))
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, asGLMagFilter(magFilter, useMipMap))
}
upload()
if (texture.config.useMipMap) {
glGenerateMipmap(GL_TEXTURE_2D)
}
glBindTexture(GL_TEXTURE_2D, 0)
}
override fun dispose() {
glDeleteTexture(handle)
}
private fun upload() {
val image = texture.map
val data = image.bytes.data
val bytesPerPixel = image.pixelCodec.bytesPerPixel
val openGlFormat = when (bytesPerPixel) {
3 -> GL_RGB8
4 -> GL_RGBA8
else -> throw Exception("Unsupported bytesPerPixel: $bytesPerPixel")
}
val dataFormat = when (bytesPerPixel) {
3 -> GL_RGB
4 -> GL_RGBA
else -> throw Exception("Unsupported bytesPerPixel: $bytesPerPixel")
}
glTexImage2D(
GL_TEXTURE_2D,
0,
openGlFormat,
image.width,
image.height,
0,
dataFormat,
GL_UNSIGNED_BYTE,
data.asByteArray()
)
}
override fun bind(channel: Int) {
glActiveTexture(GL_TEXTURE0 + channel)
glBindTexture(GL_TEXTURE_2D, handle)
}
}