You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
56 lines
1.6 KiB
Kotlin
56 lines
1.6 KiB
Kotlin
package me.eater.threedom.gl.texture
|
|
|
|
import me.eater.threedom.gl.GL.stack
|
|
import org.lwjgl.opengl.GL30.*
|
|
import org.lwjgl.stb.STBImage.stbi_load_from_memory
|
|
import org.lwjgl.stb.STBImage.stbi_set_flip_vertically_on_load
|
|
import org.lwjgl.system.MemoryUtil
|
|
import java.lang.ref.WeakReference
|
|
import java.nio.ByteBuffer
|
|
|
|
class Texture {
|
|
var id: Int = run {
|
|
val pTexture = stack.mallocInt(1)
|
|
glGenTextures(pTexture)
|
|
pTexture.get(0).also {
|
|
textures[it] = WeakReference(this)
|
|
}
|
|
}
|
|
|
|
fun load(image: ByteArray, flipped: Boolean = true, mipmapLevel: Int = 0) {
|
|
val mem = MemoryUtil.memAlloc(image.size)
|
|
mem.put(image)
|
|
mem.rewind()
|
|
load(mem, flipped, mipmapLevel)
|
|
MemoryUtil.memFree(mem)
|
|
}
|
|
|
|
fun load(image: ByteBuffer, flipped: Boolean = true, mipmapLevel: Int = 0) {
|
|
stbi_set_flip_vertically_on_load(flipped)
|
|
val pWidth = stack.mallocInt(1)
|
|
val pHeight = stack.mallocInt(1)
|
|
val pChannels = stack.mallocInt(1)
|
|
val imagePixelData = stbi_load_from_memory(image, pWidth, pHeight, pChannels, 4)
|
|
glBindTexture(GL_TEXTURE_2D, id)
|
|
glTexImage2D(
|
|
GL_TEXTURE_2D,
|
|
mipmapLevel,
|
|
GL_RGBA8,
|
|
pWidth.get(0),
|
|
pHeight.get(0),
|
|
0,
|
|
GL_RGBA,
|
|
GL_UNSIGNED_BYTE,
|
|
imagePixelData
|
|
)
|
|
glGenerateMipmap(GL_TEXTURE_2D)
|
|
glBindTexture(GL_TEXTURE_2D, 0)
|
|
}
|
|
|
|
companion object {
|
|
private val textures = mutableMapOf<Int, WeakReference<Texture>>()
|
|
|
|
fun getTexture(id: Int): Texture? = textures[id]?.get()
|
|
}
|
|
}
|