Move shaders around
This commit is contained in:
parent
3a0c9e57ee
commit
0cf0bcea57
@ -341,50 +341,21 @@ class GLStateTracker {
|
|||||||
|
|
||||||
val shaderVertexTexture: GLTransformableProgram
|
val shaderVertexTexture: GLTransformableProgram
|
||||||
val shaderVertexTextureColor: GLTransformableColorableProgram
|
val shaderVertexTextureColor: GLTransformableColorableProgram
|
||||||
val shaderVertexTextureHSVColor: GLTransformableColorableProgram
|
|
||||||
|
|
||||||
init {
|
init {
|
||||||
val textureF = GLShader.internalFragment("shaders/fragment/texture.glsl")
|
val textureF = GLShader.internalFragment("shaders/fragment/texture.glsl")
|
||||||
val textureColorF = GLShader.internalFragment("shaders/fragment/texture_color.glsl")
|
val textureColorF = GLShader.internalFragment("shaders/fragment/texture_color.glsl")
|
||||||
val textureV = GLShader.internalVertex("shaders/vertex/texture.glsl")
|
val textureV = GLShader.internalVertex("shaders/vertex/texture.glsl")
|
||||||
|
|
||||||
val textureFragmentHSV = GLShader.internalFragment("shaders/fragment/texture_color_per_vertex.glsl")
|
|
||||||
val textureVertexHSV = GLShader.internalVertex("shaders/vertex/texture_hsv.glsl")
|
|
||||||
|
|
||||||
shaderVertexTexture = GLTransformableProgram(this, textureF, textureV)
|
shaderVertexTexture = GLTransformableProgram(this, textureF, textureV)
|
||||||
shaderVertexTextureColor = GLTransformableColorableProgram(this, textureColorF, textureV)
|
shaderVertexTextureColor = GLTransformableColorableProgram(this, textureColorF, textureV)
|
||||||
shaderVertexTextureHSVColor = GLTransformableColorableProgram(this, textureFragmentHSV, textureVertexHSV)
|
|
||||||
|
|
||||||
textureF.unlink()
|
textureF.unlink()
|
||||||
textureColorF.unlink()
|
textureColorF.unlink()
|
||||||
textureV.unlink()
|
textureV.unlink()
|
||||||
textureFragmentHSV.unlink()
|
|
||||||
textureVertexHSV.unlink()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
val fontProgram: GLTransformableColorableProgram
|
val programs = GLPrograms(this)
|
||||||
|
|
||||||
init {
|
|
||||||
val vertex = GLShader.internalVertex("shaders/vertex/font.glsl")
|
|
||||||
val fragment = GLShader.internalFragment("shaders/fragment/font.glsl")
|
|
||||||
|
|
||||||
fontProgram = GLTransformableColorableProgram(this, vertex, fragment)
|
|
||||||
|
|
||||||
vertex.unlink()
|
|
||||||
fragment.unlink()
|
|
||||||
}
|
|
||||||
|
|
||||||
val flatProgram: GLTransformableColorableProgram
|
|
||||||
|
|
||||||
init {
|
|
||||||
val vertex = GLShader.internalVertex("shaders/vertex/flat_vertex_2d.glsl")
|
|
||||||
val fragment = GLShader.internalFragment("shaders/fragment/flat_color.glsl")
|
|
||||||
|
|
||||||
flatProgram = GLTransformableColorableProgram(this, vertex, fragment)
|
|
||||||
|
|
||||||
vertex.unlink()
|
|
||||||
fragment.unlink()
|
|
||||||
}
|
|
||||||
|
|
||||||
val flat2DLines = object : GLStreamBuilderList {
|
val flat2DLines = object : GLStreamBuilderList {
|
||||||
override val small by lazy {
|
override val small by lazy {
|
||||||
@ -434,9 +405,9 @@ class GLStateTracker {
|
|||||||
lambda.invoke(builder)
|
lambda.invoke(builder)
|
||||||
builder.upload()
|
builder.upload()
|
||||||
|
|
||||||
flatProgram.use()
|
programs.flat.use()
|
||||||
flatProgram.color.set(color)
|
programs.flat.color.set(color)
|
||||||
flatProgram.transform.set(matrixStack.last)
|
programs.flat.transform.set(matrixStack.last)
|
||||||
|
|
||||||
builder.draw(GL_LINES)
|
builder.draw(GL_LINES)
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,41 @@
|
|||||||
|
package ru.dbotthepony.kstarbound.client.gl
|
||||||
|
|
||||||
|
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 kotlin.properties.ReadOnlyProperty
|
||||||
|
import kotlin.reflect.KProperty
|
||||||
|
|
||||||
|
private class SimpleProgram<T : GLShaderProgram>(private val name: String, private val factory: (GLStateTracker, Array<out GLShader>) -> T) : ReadOnlyProperty<GLPrograms, T> {
|
||||||
|
private var value: T? = null
|
||||||
|
|
||||||
|
override fun getValue(thisRef: GLPrograms, property: KProperty<*>): T {
|
||||||
|
val value = value
|
||||||
|
|
||||||
|
if (value != null) {
|
||||||
|
return value
|
||||||
|
}
|
||||||
|
|
||||||
|
val vertex = GLShader.internalVertex("shaders/$name.vsh")
|
||||||
|
val fragment = GLShader.internalFragment("shaders/$name.fsh")
|
||||||
|
|
||||||
|
val newValue = factory.invoke(thisRef.state, arrayOf(vertex, fragment))
|
||||||
|
|
||||||
|
this.value = newValue
|
||||||
|
|
||||||
|
vertex.unlink()
|
||||||
|
fragment.unlink()
|
||||||
|
|
||||||
|
if (!newValue.linked) {
|
||||||
|
newValue.link()
|
||||||
|
}
|
||||||
|
|
||||||
|
return newValue
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class GLPrograms(val state: GLStateTracker) {
|
||||||
|
val tile by SimpleProgram("tile", ::GLTransformableColorableProgram)
|
||||||
|
val font by SimpleProgram("font", ::GLTransformableColorableProgram)
|
||||||
|
val flat by SimpleProgram("flat", ::GLTransformableColorableProgram)
|
||||||
|
}
|
@ -61,6 +61,7 @@ open class GLShaderProgram(val state: GLStateTracker, vararg shaders: GLShader)
|
|||||||
|
|
||||||
fun link() {
|
fun link() {
|
||||||
check(!linked) { "Program is already linked!" }
|
check(!linked) { "Program is already linked!" }
|
||||||
|
state.ensureSameThread()
|
||||||
glLinkProgram(pointer)
|
glLinkProgram(pointer)
|
||||||
|
|
||||||
val success = intArrayOf(0)
|
val success = intArrayOf(0)
|
||||||
|
@ -9,4 +9,4 @@ open class GLTransformableColorableProgram(state: GLStateTracker, vararg shaders
|
|||||||
init {
|
init {
|
||||||
color.set(Color.WHITE)
|
color.set(Color.WHITE)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -33,9 +33,9 @@ class Box2DRenderer(val state: GLStateTracker) : IDebugDraw {
|
|||||||
|
|
||||||
builder.upload()
|
builder.upload()
|
||||||
|
|
||||||
state.flatProgram.use()
|
state.programs.flat.use()
|
||||||
state.flatProgram.color.set(color)
|
state.programs.flat.color.set(color)
|
||||||
state.flatProgram.transform.set(state.matrixStack.last)
|
state.programs.flat.transform.set(state.matrixStack.last)
|
||||||
|
|
||||||
builder.draw(GL_LINES)
|
builder.draw(GL_LINES)
|
||||||
}
|
}
|
||||||
@ -59,9 +59,9 @@ class Box2DRenderer(val state: GLStateTracker) : IDebugDraw {
|
|||||||
|
|
||||||
builder.upload()
|
builder.upload()
|
||||||
|
|
||||||
state.flatProgram.use()
|
state.programs.flat.use()
|
||||||
state.flatProgram.color.set(color)
|
state.programs.flat.color.set(color)
|
||||||
state.flatProgram.transform.set(state.matrixStack.last)
|
state.programs.flat.transform.set(state.matrixStack.last)
|
||||||
|
|
||||||
builder.draw(GL_TRIANGLES)
|
builder.draw(GL_TRIANGLES)
|
||||||
}
|
}
|
||||||
|
@ -112,8 +112,8 @@ class Font(
|
|||||||
if (scale != 1f)
|
if (scale != 1f)
|
||||||
stack.scale(x = scale, y = scale)
|
stack.scale(x = scale, y = scale)
|
||||||
|
|
||||||
state.fontProgram.use()
|
state.programs.font.use()
|
||||||
state.fontProgram.color.set(color)
|
state.programs.font.color.set(color)
|
||||||
state.activeTexture = 0
|
state.activeTexture = 0
|
||||||
|
|
||||||
val space = getGlyph(' ')
|
val space = getGlyph(' ')
|
||||||
@ -343,7 +343,7 @@ class Font(
|
|||||||
stack.translateWithMultiplication(bearingX, -bearingY)
|
stack.translateWithMultiplication(bearingX, -bearingY)
|
||||||
|
|
||||||
texture!!.bind()
|
texture!!.bind()
|
||||||
state.fontProgram.transform.set(stack.last)
|
state.programs.font.transform.set(stack.last)
|
||||||
glDrawElements(GL_TRIANGLES, indexCount, elementIndexType, 0L)
|
glDrawElements(GL_TRIANGLES, indexCount, elementIndexType, 0L)
|
||||||
checkForGLError()
|
checkForGLError()
|
||||||
|
|
||||||
|
@ -82,7 +82,7 @@ class TileRenderers(val state: GLStateTracker) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private inner class ForegroundTileProgram(private val texture: GLTexture2D) : ConfiguredShaderProgram(state.shaderVertexTextureHSVColor) {
|
private inner class ForegroundTileProgram(private val texture: GLTexture2D) : ConfiguredShaderProgram(state.programs.tile) {
|
||||||
override fun setup() {
|
override fun setup() {
|
||||||
super.setup()
|
super.setup()
|
||||||
state.activeTexture = 0
|
state.activeTexture = 0
|
||||||
@ -112,7 +112,7 @@ class TileRenderers(val state: GLStateTracker) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private inner class BackgroundTileProgram(private val texture: GLTexture2D) : ConfiguredShaderProgram(state.shaderVertexTextureHSVColor) {
|
private inner class BackgroundTileProgram(private val texture: GLTexture2D) : ConfiguredShaderProgram(state.programs.tile) {
|
||||||
override fun setup() {
|
override fun setup() {
|
||||||
super.setup()
|
super.setup()
|
||||||
state.activeTexture = 0
|
state.activeTexture = 0
|
||||||
|
Loading…
Reference in New Issue
Block a user