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.
46 lines
1.2 KiB
Kotlin
46 lines
1.2 KiB
Kotlin
package me.eater.threedom.gl.vertex
|
|
|
|
import me.eater.threedom.gl.GL.stack
|
|
import org.lwjgl.opengl.GL30.*
|
|
import org.lwjgl.system.MemoryUtil
|
|
import java.nio.ByteBuffer
|
|
|
|
open class VertexBuffer<T : VertexData>(
|
|
items: List<T> = listOf(),
|
|
val interleaved: Boolean = false,
|
|
val usage: Int = GL_STATIC_DRAW
|
|
) {
|
|
val id: Int = run {
|
|
val pId = stack.mallocInt(1)
|
|
glGenBuffers(pId)
|
|
pId.get(0)
|
|
}
|
|
|
|
@Suppress("CanBePrimaryConstructorProperty")
|
|
open val items: List<T> = items
|
|
var stride: Int
|
|
private set
|
|
|
|
init {
|
|
val size = items.size * (items.firstOrNull()?.length ?: 0).also { stride = it }
|
|
val byteBuffer = MemoryUtil.memAlloc(size)
|
|
|
|
var offset = 0
|
|
for (i in items.indices) {
|
|
val item = items[i]
|
|
|
|
if (interleaved) {
|
|
item.write(offset, byteBuffer)
|
|
offset += item.length
|
|
} else {
|
|
item.writeNonInterleaved(i, items.size, byteBuffer)
|
|
}
|
|
}
|
|
|
|
glBindBuffer(GL_ARRAY_BUFFER, id)
|
|
glBufferData(GL_ARRAY_BUFFER, byteBuffer, usage)
|
|
glBindBuffer(GL_ARRAY_BUFFER, 0)
|
|
MemoryUtil.memFree(byteBuffer)
|
|
}
|
|
}
|