move stuff around

This commit is contained in:
DBotThePony 2022-09-11 10:40:48 +07:00
parent 86742b537e
commit 09ec0f676d
Signed by: DBot
GPG Key ID: DCC23B5715498507
17 changed files with 144 additions and 132 deletions

View File

@ -5,6 +5,11 @@ import org.lwjgl.opengl.GL
import org.lwjgl.opengl.GL46.*
import ru.dbotthepony.kstarbound.Starbound
import ru.dbotthepony.kstarbound.client.freetype.FreeType
import ru.dbotthepony.kstarbound.client.gl.shader.GLShader
import ru.dbotthepony.kstarbound.client.gl.shader.GLShaderProgram
import ru.dbotthepony.kstarbound.client.gl.shader.GLTransformableColorableProgram
import ru.dbotthepony.kstarbound.client.gl.shader.GLTransformableProgram
import ru.dbotthepony.kstarbound.client.gl.vertex.GLAttributeList
import ru.dbotthepony.kstarbound.client.gl.vertex.StreamVertexBuilder
import ru.dbotthepony.kstarbound.client.gl.vertex.VertexType
import ru.dbotthepony.kstarbound.client.render.Box2DRenderer
@ -12,7 +17,6 @@ import ru.dbotthepony.kstarbound.client.render.Font
import ru.dbotthepony.kstarbound.client.render.TileRenderers
import ru.dbotthepony.kvector.api.IStruct4f
import ru.dbotthepony.kvector.matrix.Matrix4fStack
import ru.dbotthepony.kvector.matrix.nfloat.Matrix4f
import ru.dbotthepony.kvector.util2d.AABB
import ru.dbotthepony.kvector.vector.Color
import java.io.FileNotFoundException
@ -59,31 +63,11 @@ private class GLStateGenericTracker<T>(private var value: T, private val lambda:
}
}
open class GLTransformableProgram(state: GLStateTracker, vararg shaders: GLShader) : GLShaderProgram(state, *shaders) {
init {
link()
}
val transform = this["_transform"]!!
init {
transform.set(Matrix4f.IDENTITY)
}
}
open class GLTransformableColorableProgram(state: GLStateTracker, vararg shaders: GLShader) : GLTransformableProgram(state, *shaders) {
val color = this["_color"]!!
init {
color.set(Color.WHITE)
}
}
interface GLCleanable : Cleaner.Cleanable {
/**
* Выставляет флаг на то, что объект был удалён вручную и вызывает clean()
*/
fun cleanManual(): Unit
fun cleanManual()
}
interface GLStreamBuilderList {
@ -144,7 +128,7 @@ class GLStateTracker {
var blend by GLStateSwitchTracker(GL_BLEND)
var depthTest by GLStateSwitchTracker(GL_DEPTH_TEST)
var VBO: GLVertexBufferObject? = null
var VBO: VertexBufferObject? = null
set(value) {
ensureSameThread()
if (field === value) return
@ -161,7 +145,7 @@ class GLStateTracker {
checkForGLError()
}
var EBO: GLVertexBufferObject? = null
var EBO: VertexBufferObject? = null
set(value) {
ensureSameThread()
if (field === value) return
@ -178,7 +162,7 @@ class GLStateTracker {
checkForGLError()
}
var VAO: GLVertexArrayObject? = null
var VAO: VertexArrayObject? = null
set(value) {
ensureSameThread()
if (field === value) return
@ -243,12 +227,12 @@ class GLStateTracker {
return GLShaderProgram(this, *shaders)
}
fun newVBO(type: VBOType = VBOType.ARRAY): GLVertexBufferObject {
return GLVertexBufferObject(this, type)
fun newVBO(type: VBOType = VBOType.ARRAY): VertexBufferObject {
return VertexBufferObject(this, type)
}
fun newEBO() = newVBO(VBOType.ELEMENT_ARRAY)
fun newVAO() = GLVertexArrayObject(this)
fun newVAO() = VertexArrayObject(this)
fun newTexture(name: String = "<unknown>") = GLTexture2D(this, name)
private val named2DTextures = HashMap<String, GLTexture2D>()
@ -308,7 +292,7 @@ class GLStateTracker {
}
}
fun bind(obj: GLVertexBufferObject): GLVertexBufferObject {
fun bind(obj: VertexBufferObject): VertexBufferObject {
if (obj.type == VBOType.ARRAY)
VBO = obj
else
@ -317,7 +301,7 @@ class GLStateTracker {
return obj
}
fun unbind(obj: GLVertexBufferObject): GLVertexBufferObject {
fun unbind(obj: VertexBufferObject): VertexBufferObject {
if (obj.type == VBOType.ARRAY)
if (obj == VBO)
VBO = null
@ -328,12 +312,12 @@ class GLStateTracker {
return obj
}
fun bind(obj: GLVertexArrayObject): GLVertexArrayObject {
fun bind(obj: VertexArrayObject): VertexArrayObject {
VAO = obj
return obj
}
fun unbind(obj: GLVertexArrayObject): GLVertexArrayObject {
fun unbind(obj: VertexArrayObject): VertexArrayObject {
if (obj == VAO)
VAO = null

View File

@ -3,7 +3,7 @@ package ru.dbotthepony.kstarbound.client.gl
import org.lwjgl.opengl.GL46.*
import java.io.Closeable
class GLVertexArrayObject(val state: GLStateTracker) : Closeable {
class VertexArrayObject(val state: GLStateTracker) : Closeable {
val pointer = glGenVertexArrays()
init {
@ -12,17 +12,17 @@ class GLVertexArrayObject(val state: GLStateTracker) : Closeable {
private val cleanable = state.registerCleanable(this, ::glDeleteVertexArrays, "Vertex Array Object", pointer)
fun bind(): GLVertexArrayObject {
fun bind(): VertexArrayObject {
check(isValid) { "Tried to use NULL GLVertexArrayObject" }
return state.bind(this)
}
fun unbind(): GLVertexArrayObject {
fun unbind(): VertexArrayObject {
check(isValid) { "Tried to use NULL GLVertexArrayObject" }
return state.unbind(this)
}
fun attribute(position: Int, size: Int, type: Int, normalize: Boolean, stride: Int, offset: Long = 0L): GLVertexArrayObject {
fun attribute(position: Int, size: Int, type: Int, normalize: Boolean, stride: Int, offset: Long = 0L): VertexArrayObject {
check(isValid) { "Tried to use NULL GLVertexArrayObject" }
state.ensureSameThread()
glVertexAttribPointer(position, size, type, normalize, stride, offset)
@ -30,7 +30,7 @@ class GLVertexArrayObject(val state: GLStateTracker) : Closeable {
return this
}
fun enableAttribute(position: Int): GLVertexArrayObject {
fun enableAttribute(position: Int): VertexArrayObject {
check(isValid) { "Tried to use NULL GLVertexArrayObject" }
state.ensureSameThread()
glEnableVertexArrayAttrib(pointer, position)

View File

@ -5,12 +5,12 @@ import org.lwjgl.system.MemoryUtil
import java.io.Closeable
import java.nio.ByteBuffer
enum class VBOType(val value: Int) {
enum class VBOType(val glType: Int) {
ARRAY(GL_ARRAY_BUFFER),
ELEMENT_ARRAY(GL_ELEMENT_ARRAY_BUFFER),
}
class GLVertexBufferObject(val state: GLStateTracker, val type: VBOType = VBOType.ARRAY) : Closeable {
class VertexBufferObject(val state: GLStateTracker, val type: VBOType = VBOType.ARRAY) : Closeable {
val pointer = glGenBuffers()
init {
@ -22,19 +22,19 @@ class GLVertexBufferObject(val state: GLStateTracker, val type: VBOType = VBOTyp
val isArray get() = type == VBOType.ARRAY
val isElementArray get() = type == VBOType.ELEMENT_ARRAY
fun bind(): GLVertexBufferObject {
fun bind(): VertexBufferObject {
check(isValid) { "Tried to use NULL GLVertexBufferObject" }
state.bind(this)
return this
}
fun unbind(): GLVertexBufferObject {
fun unbind(): VertexBufferObject {
check(isValid) { "Tried to use NULL GLVertexBufferObject" }
state.unbind(this)
return this
}
fun bufferData(data: ByteBuffer, usage: Int): GLVertexBufferObject {
fun bufferData(data: ByteBuffer, usage: Int): VertexBufferObject {
check(isValid) { "Tried to use NULL GLVertexBufferObject" }
state.ensureSameThread()
glNamedBufferData(pointer, data, usage)
@ -42,7 +42,7 @@ class GLVertexBufferObject(val state: GLStateTracker, val type: VBOType = VBOTyp
return this
}
fun bufferData(data: ByteBuffer, usage: Int, length: Long): GLVertexBufferObject {
fun bufferData(data: ByteBuffer, usage: Int, length: Long): VertexBufferObject {
check(isValid) { "Tried to use NULL GLVertexBufferObject" }
state.ensureSameThread()
@ -56,7 +56,7 @@ class GLVertexBufferObject(val state: GLStateTracker, val type: VBOType = VBOTyp
return this
}
fun bufferData(data: IntArray, usage: Int): GLVertexBufferObject {
fun bufferData(data: IntArray, usage: Int): VertexBufferObject {
check(isValid) { "Tried to use NULL GLVertexBufferObject" }
state.ensureSameThread()
glNamedBufferData(pointer, data, usage)
@ -64,7 +64,7 @@ class GLVertexBufferObject(val state: GLStateTracker, val type: VBOType = VBOTyp
return this
}
fun bufferData(data: FloatArray, usage: Int): GLVertexBufferObject {
fun bufferData(data: FloatArray, usage: Int): VertexBufferObject {
check(isValid) { "Tried to use NULL GLVertexBufferObject" }
state.ensureSameThread()
glNamedBufferData(pointer, data, usage)
@ -72,7 +72,7 @@ class GLVertexBufferObject(val state: GLStateTracker, val type: VBOType = VBOTyp
return this
}
fun bufferData(data: DoubleArray, usage: Int): GLVertexBufferObject {
fun bufferData(data: DoubleArray, usage: Int): VertexBufferObject {
check(isValid) { "Tried to use NULL GLVertexBufferObject" }
state.ensureSameThread()
glNamedBufferData(pointer, data, usage)
@ -80,7 +80,7 @@ class GLVertexBufferObject(val state: GLStateTracker, val type: VBOType = VBOTyp
return this
}
fun bufferData(data: LongArray, usage: Int): GLVertexBufferObject {
fun bufferData(data: LongArray, usage: Int): VertexBufferObject {
check(isValid) { "Tried to use NULL GLVertexBufferObject" }
state.ensureSameThread()
glNamedBufferData(pointer, data, usage)

View File

@ -0,0 +1,4 @@
package ru.dbotthepony.kstarbound.client.gl.shader
class ShaderCompilationException(reason: String) : RuntimeException(reason)
class ShaderLinkException(reason: String) : RuntimeException(reason)

View File

@ -1,11 +1,8 @@
package ru.dbotthepony.kstarbound.client.gl
package ru.dbotthepony.kstarbound.client.gl.shader
import org.lwjgl.opengl.GL20
import org.lwjgl.opengl.GL46.*
import ru.dbotthepony.kstarbound.client.gl.checkForGLError
import java.io.File
import kotlin.RuntimeException
class ShaderCompilationException(reason: String) : RuntimeException(reason)
class GLShader(
body: String,

View File

@ -1,70 +1,15 @@
package ru.dbotthepony.kstarbound.client.gl
package ru.dbotthepony.kstarbound.client.gl.shader
import it.unimi.dsi.fastutil.objects.Object2ObjectArrayMap
import it.unimi.dsi.fastutil.objects.Object2ObjectFunction
import org.lwjgl.opengl.GL46.*
import ru.dbotthepony.kstarbound.client.gl.GLStateTracker
import ru.dbotthepony.kvector.api.IFloatMatrix
import ru.dbotthepony.kvector.api.IStruct3f
import ru.dbotthepony.kvector.api.IStruct4f
import java.nio.ByteBuffer
import java.nio.ByteOrder
import java.util.*
import kotlin.collections.HashSet
class ShaderLinkException(reason: String) : RuntimeException(reason)
data class Uniform4f(val x: Float, val y: Float, val z: Float, val w: Float) : IStruct4f
data class Uniform3f(val x: Float, val y: Float, val z: Float) : IStruct3f
class GLUniformLocation(val program: GLShaderProgram, val name: String, val pointer: Int) {
fun set(value: IStruct4f): GLUniformLocation {
program.state.ensureSameThread()
val (v0, v1, v2, v3) = value
glProgramUniform4f(program.pointer, pointer, v0, v1, v2, v3)
return this
}
fun set(value: IStruct3f): GLUniformLocation {
program.state.ensureSameThread()
val (v0, v1, v2) = value
glProgramUniform3f(program.pointer, pointer, v0, v1, v2)
return this
}
fun set(value: Int): GLUniformLocation {
program.state.ensureSameThread()
glProgramUniform1i(program.pointer, pointer, value)
return this
}
private val buff3x3 by lazy { ByteBuffer.allocateDirect(4 * 3 * 3).also { it.order(ByteOrder.nativeOrder()) }.asFloatBuffer() }
private val buff4x4 by lazy { ByteBuffer.allocateDirect(4 * 4 * 4).also { it.order(ByteOrder.nativeOrder()) }.asFloatBuffer() }
fun set(value: IFloatMatrix<*>): GLUniformLocation {
program.state.ensureSameThread()
if (value.rows == 3 && value.columns == 3) {
// Матрица 3x3
buff3x3.position(0)
value.write(buff3x3)
buff3x3.position(0)
glProgramUniformMatrix3fv(program.pointer, pointer, false, buff3x3)
checkForGLError()
} else if (value.rows == 4 && value.columns == 4) {
// Матрица 4x4
buff4x4.position(0)
value.write(buff4x4)
buff4x4.position(0)
glProgramUniformMatrix4fv(program.pointer, pointer, false, buff4x4)
checkForGLError()
} else {
throw IllegalArgumentException("Can not use matrix with these dimensions: ${value.columns}x${value.rows}")
}
return this
}
}
open class GLShaderProgram(val state: GLStateTracker, vararg shaders: GLShader) {
val pointer = glCreateProgram()
var linked = false

View File

@ -0,0 +1,12 @@
package ru.dbotthepony.kstarbound.client.gl.shader
import ru.dbotthepony.kstarbound.client.gl.GLStateTracker
import ru.dbotthepony.kvector.vector.Color
open class GLTransformableColorableProgram(state: GLStateTracker, vararg shaders: GLShader) : GLTransformableProgram(state, *shaders) {
val color = this["_color"]!!
init {
color.set(Color.WHITE)
}
}

View File

@ -0,0 +1,16 @@
package ru.dbotthepony.kstarbound.client.gl.shader
import ru.dbotthepony.kstarbound.client.gl.GLStateTracker
import ru.dbotthepony.kvector.matrix.nfloat.Matrix4f
open class GLTransformableProgram(state: GLStateTracker, vararg shaders: GLShader) : GLShaderProgram(state, *shaders) {
init {
link()
}
val transform = this["_transform"]!!
init {
transform.set(Matrix4f.IDENTITY)
}
}

View File

@ -0,0 +1,57 @@
package ru.dbotthepony.kstarbound.client.gl.shader
import ru.dbotthepony.kstarbound.client.gl.checkForGLError
import ru.dbotthepony.kvector.api.IFloatMatrix
import ru.dbotthepony.kvector.api.IStruct3f
import ru.dbotthepony.kvector.api.IStruct4f
import java.nio.ByteBuffer
import java.nio.ByteOrder
class GLUniformLocation(val program: GLShaderProgram, val name: String, val pointer: Int) {
fun set(value: IStruct4f): GLUniformLocation {
program.state.ensureSameThread()
val (v0, v1, v2, v3) = value
glProgramUniform4f(program.pointer, pointer, v0, v1, v2, v3)
return this
}
fun set(value: IStruct3f): GLUniformLocation {
program.state.ensureSameThread()
val (v0, v1, v2) = value
glProgramUniform3f(program.pointer, pointer, v0, v1, v2)
return this
}
fun set(value: Int): GLUniformLocation {
program.state.ensureSameThread()
glProgramUniform1i(program.pointer, pointer, value)
return this
}
private val buff3x3 by lazy { ByteBuffer.allocateDirect(4 * 3 * 3).also { it.order(ByteOrder.nativeOrder()) }.asFloatBuffer() }
private val buff4x4 by lazy { ByteBuffer.allocateDirect(4 * 4 * 4).also { it.order(ByteOrder.nativeOrder()) }.asFloatBuffer() }
fun set(value: IFloatMatrix<*>): GLUniformLocation {
program.state.ensureSameThread()
if (value.rows == 3 && value.columns == 3) {
// Матрица 3x3
buff3x3.position(0)
value.write(buff3x3)
buff3x3.position(0)
glProgramUniformMatrix3fv(program.pointer, pointer, false, buff3x3)
checkForGLError()
} else if (value.rows == 4 && value.columns == 4) {
// Матрица 4x4
buff4x4.position(0)
value.write(buff4x4)
buff4x4.position(0)
glProgramUniformMatrix4fv(program.pointer, pointer, false, buff4x4)
checkForGLError()
} else {
throw IllegalArgumentException("Can not use matrix with these dimensions: ${value.columns}x${value.rows}")
}
return this
}
}

View File

@ -4,9 +4,8 @@ import org.lwjgl.opengl.GL46
import org.lwjgl.opengl.GL46.GL_UNSIGNED_INT
import org.lwjgl.opengl.GL46.GL_UNSIGNED_SHORT
import org.lwjgl.opengl.GL46.GL_UNSIGNED_BYTE
import ru.dbotthepony.kstarbound.client.gl.GLAttributeList
import ru.dbotthepony.kstarbound.client.gl.GLType
import ru.dbotthepony.kstarbound.client.gl.GLVertexBufferObject
import ru.dbotthepony.kstarbound.client.gl.VertexBufferObject
import ru.dbotthepony.kstarbound.util.writeLEFloat
import ru.dbotthepony.kstarbound.util.writeLEInt
import ru.dbotthepony.kstarbound.util.writeLEShort
@ -91,9 +90,9 @@ abstract class AbstractVertexBuilder<T : AbstractVertexBuilder<T>>(
}
}
protected abstract fun doUpload(vbo: GLVertexBufferObject, ebo: GLVertexBufferObject, drawType: Int)
protected abstract fun doUpload(vbo: VertexBufferObject, ebo: VertexBufferObject, drawType: Int)
fun upload(vbo: GLVertexBufferObject, ebo: GLVertexBufferObject, drawType: Int = GL46.GL_DYNAMIC_DRAW) {
fun upload(vbo: VertexBufferObject, ebo: VertexBufferObject, drawType: Int = GL46.GL_DYNAMIC_DRAW) {
require(vbo.isArray) { "$vbo is not an array" }
require(ebo.isElementArray) { "$vbo is not an element array" }

View File

@ -1,8 +1,7 @@
package ru.dbotthepony.kstarbound.client.gl.vertex
import org.lwjgl.opengl.GL46
import ru.dbotthepony.kstarbound.client.gl.GLAttributeList
import ru.dbotthepony.kstarbound.client.gl.GLVertexBufferObject
import ru.dbotthepony.kstarbound.client.gl.VertexBufferObject
import ru.dbotthepony.kstarbound.util.ByteBufferOutputStream
open class DirectVertexBuilder<T : DirectVertexBuilder<T>>(
@ -34,7 +33,7 @@ open class DirectVertexBuilder<T : DirectVertexBuilder<T>>(
elementMemory.position = 0
}
override fun doUpload(vbo: GLVertexBufferObject, ebo: GLVertexBufferObject, drawType: Int) {
override fun doUpload(vbo: VertexBufferObject, ebo: VertexBufferObject, drawType: Int) {
val vertexPos = vertexMemory.position
val elementPos = elementMemory.position

View File

@ -1,6 +1,8 @@
package ru.dbotthepony.kstarbound.client.gl
package ru.dbotthepony.kstarbound.client.gl.vertex
import com.google.common.collect.ImmutableList
import ru.dbotthepony.kstarbound.client.gl.GLType
import ru.dbotthepony.kstarbound.client.gl.VertexArrayObject
/**
@ -45,9 +47,9 @@ class GLAttributeList(builder: Builder) {
}
/**
* Применяет список атрибутов к заданному [GLVertexArrayObject] (попутно включая или отключая их через [enable])
* Применяет список атрибутов к заданному [VertexArrayObject] (попутно включая или отключая их через [enable])
*/
fun apply(target: GLVertexArrayObject, enable: Boolean) {
fun apply(target: VertexArrayObject, enable: Boolean) {
for (i in attributes.indices) {
val value = attributes[i]
target.attribute(i, value.glType.logicalSize, value.glType.typeIndentity, false, value.stride, value.offset)

View File

@ -4,12 +4,10 @@ import it.unimi.dsi.fastutil.io.FastByteArrayInputStream
import it.unimi.dsi.fastutil.io.FastByteArrayOutputStream
import org.lwjgl.opengl.GL11.GL_UNSIGNED_INT
import org.lwjgl.opengl.GL11.GL_UNSIGNED_SHORT
import ru.dbotthepony.kstarbound.client.gl.GLAttributeList
import ru.dbotthepony.kstarbound.client.gl.GLVertexBufferObject
import ru.dbotthepony.kstarbound.client.gl.VertexBufferObject
import ru.dbotthepony.kstarbound.util.readLEShort
import ru.dbotthepony.kstarbound.util.writeLEInt
import java.nio.ByteBuffer
import java.nio.ByteOrder
/**
* Vertex Builder который хранит все данные на куче, при [upload] создаётся [ByteBuffer] вне кучи,
@ -47,7 +45,7 @@ class HeapVertexBuilder(
elementMemory.reset()
}
override fun doUpload(vbo: GLVertexBufferObject, ebo: GLVertexBufferObject, drawType: Int) {
override fun doUpload(vbo: VertexBufferObject, ebo: VertexBufferObject, drawType: Int) {
val vboMemory = ByteBuffer.allocateDirect(vertexMemory.length)
vboMemory.put(vertexMemory.array, 0, vertexMemory.length)

View File

@ -1,7 +1,6 @@
package ru.dbotthepony.kstarbound.client.gl.vertex
import org.lwjgl.opengl.GL46
import ru.dbotthepony.kstarbound.client.gl.GLAttributeList
import ru.dbotthepony.kstarbound.client.gl.GLStateTracker
import ru.dbotthepony.kstarbound.client.gl.checkForGLError
import java.io.Closeable

View File

@ -1,8 +1,8 @@
package ru.dbotthepony.kstarbound.client.render
import org.lwjgl.opengl.GL46.*
import ru.dbotthepony.kstarbound.client.gl.GLShaderProgram
import ru.dbotthepony.kstarbound.client.gl.GLVertexArrayObject
import ru.dbotthepony.kstarbound.client.gl.shader.GLShaderProgram
import ru.dbotthepony.kstarbound.client.gl.VertexArrayObject
import ru.dbotthepony.kstarbound.client.gl.checkForGLError
import ru.dbotthepony.kstarbound.client.gl.vertex.AbstractVertexBuilder
import ru.dbotthepony.kvector.api.IFloatMatrix
@ -42,7 +42,7 @@ open class ConfiguredShaderProgram(
class ConfiguredStaticMesh(
val programState: ConfiguredShaderProgram,
val indexCount: Int,
val vao: GLVertexArrayObject,
val vao: VertexArrayObject,
val elementIndexType: Int,
) : AutoCloseable {
private var onClose = {}

View File

@ -6,7 +6,7 @@ import org.lwjgl.opengl.GL46.*
import ru.dbotthepony.kstarbound.client.freetype.LoadFlag
import ru.dbotthepony.kstarbound.client.gl.*
import ru.dbotthepony.kstarbound.client.freetype.struct.FT_Pixel_Mode
import ru.dbotthepony.kstarbound.client.gl.GLAttributeList
import ru.dbotthepony.kstarbound.client.gl.vertex.GLAttributeList
import ru.dbotthepony.kstarbound.client.gl.vertex.HeapVertexBuilder
import ru.dbotthepony.kstarbound.client.gl.vertex.QuadTransformers
import ru.dbotthepony.kstarbound.client.gl.vertex.VertexType
@ -257,9 +257,9 @@ class Font(
val advanceX: Float
val advanceY: Float
private val vbo: GLVertexBufferObject? // все три указателя должны хранится во избежание утечки
private val ebo: GLVertexBufferObject? // все три указателя должны хранится во избежание утечки
private val vao: GLVertexArrayObject? // все три указателя должны хранится во избежание утечки
private val vbo: VertexBufferObject? // все три указателя должны хранится во избежание утечки
private val ebo: VertexBufferObject? // все три указателя должны хранится во избежание утечки
private val vao: VertexArrayObject? // все три указателя должны хранится во избежание утечки
private val indexCount: Int

View File

@ -7,7 +7,7 @@ import org.lwjgl.opengl.GL46.*
import ru.dbotthepony.kstarbound.PIXELS_IN_STARBOUND_UNITf
import ru.dbotthepony.kstarbound.Starbound
import ru.dbotthepony.kstarbound.client.gl.*
import ru.dbotthepony.kstarbound.client.gl.GLAttributeList
import ru.dbotthepony.kstarbound.client.gl.vertex.GLAttributeList
import ru.dbotthepony.kstarbound.client.gl.vertex.*
import ru.dbotthepony.kstarbound.defs.tile.*
import ru.dbotthepony.kstarbound.world.TileState