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.

74 lines
2.4 KiB
Kotlin

package me.eater.threedom.gl.vertex
import org.joml.*
import org.lwjgl.opengl.GL30.*
import java.nio.ByteBuffer
import kotlin.reflect.KProperty
abstract class VertexDataPoint<T>(val type: Int, var value: T, val length: Int, val slots: Int = 1) {
abstract fun write(position: Int, buffer: ByteBuffer)
operator fun getValue(thisRef: Any?, property: KProperty<*>): T {
return value
}
operator fun setValue(thisRef: Any?, property: KProperty<*>, value: T) {
this.value = value
}
class SingleInt(value: Int) : VertexDataPoint<Int>(GL_INT, value, 4) {
override fun write(position: Int, buffer: ByteBuffer) {
buffer.putInt(position, value)
}
}
class SingleFloat(value: Float) : VertexDataPoint<Float>(GL_FLOAT, value, 4) {
override fun write(position: Int, buffer: ByteBuffer) {
buffer.putFloat(position, value)
}
}
class SingleDouble(value: Double) : VertexDataPoint<Double>(GL_DOUBLE, value, 8) {
override fun write(position: Int, buffer: ByteBuffer) {
buffer.putDouble(position, value)
}
}
class SingleBoolean(value: Boolean) : VertexDataPoint<Boolean>(GL_BOOL, value, 1) {
override fun write(position: Int, buffer: ByteBuffer) {
buffer.put(position, if (value) 1 else 2)
}
}
class Vec2(value: Vector2fc) : VertexDataPoint<Vector2fc>(GL_FLOAT, value, 8, 2) {
override fun write(position: Int, buffer: ByteBuffer) {
value.get(position, buffer)
}
}
class Vec3(value: Vector3fc) : VertexDataPoint<Vector3fc>(GL_FLOAT, value, 12, 3) {
override fun write(position: Int, buffer: ByteBuffer) {
value.get(position, buffer)
}
}
class Vec4(value: Vector4fc) : VertexDataPoint<Vector4fc>(GL_FLOAT, value, 16, 4) {
override fun write(position: Int, buffer: ByteBuffer) {
value.get(position, buffer)
}
}
class Mat3(value: Matrix3fc) : VertexDataPoint<Matrix3fc>(GL_FLOAT, value, 3 * 3 * 4, 9) {
override fun write(position: Int, buffer: ByteBuffer) {
value.get(position, buffer)
}
}
class Mat4(value: Matrix4fc) : VertexDataPoint<Matrix4fc>(GL_FLOAT, value, 4 * 4 * 4, 16) {
override fun write(position: Int, buffer: ByteBuffer) {
value.get(position, buffer)
}
}
}