import com.jogamp.common.nio.Buffers
import com.jogamp.opengl.GL2
import com.jogamp.opengl.GLAutoDrawable
import com.jogamp.opengl.GLEventListener
import java.io.BufferedReader
import java.io.FileReader
import java.nio.IntBuffer
class ColorShader : GLEventListener {
private var frame_width = 0
private var frame_height = 0
val vertices = floatArrayOf(
-0.9f, -0.9f, 0.0f,
0.9f, -0.9f, 0.0f,
0.9f, 0.9f, 0.0f,
-0.9f, 0.9f, 0.0f
)
val colors = floatArrayOf(
1.0f, 0.0f, 0.0f,
0.0f, 1.0f, 0.0f,
0.0f, 0.0f, 1.0f,
1.0f, 1.0f, 0.0f
)
val vertexBuffer = Buffers.newDirectFloatBuffer(vertices)
val colorBuffer = Buffers.newDirectFloatBuffer(colors)
val vbo = IntBuffer.allocate(2)
private var programId : Int? = null
fun readShaderSource(filename : String) : String {
val br = BufferedReader(FileReader(filename))
var result = ""
var str = br.readLine()
while (str != null) {
result += str + "\n"
str = br.readLine()
}
return result
}
override fun init(drawable: GLAutoDrawable?) {
drawable?.let {
val gl = it.gl.gL2
gl.glClearColor(0.0f, 0.0f, 1.0f, 1.0f)
gl.glGenBuffers(2, vbo)
gl.glBindBuffer(GL2.GL_ARRAY_BUFFER, vbo[0])
gl.glBufferData(GL2.GL_ARRAY_BUFFER, vertices.size.toLong() * 4, vertexBuffer, GL2.GL_STATIC_DRAW)
gl.glBindBuffer(GL2.GL_ARRAY_BUFFER, vbo[1])
gl.glBufferData(GL2.GL_ARRAY_BUFFER, colors.size.toLong() * 4, colorBuffer, GL2.GL_STATIC_DRAW)
gl.glBindBuffer(GL2.GL_ARRAY_BUFFER, 0)
val vertSource = readShaderSource("simple3.vert")
val fragSource = readShaderSource("simple3.frag")
programId = gl.glCreateProgram()
val vertexShader = gl.glCreateShader(GL2.GL_VERTEX_SHADER)
gl.glShaderSource(vertexShader, 1, arrayOf(vertSource), null)
gl.glCompileShader(vertexShader)
gl.glAttachShader(programId!!, vertexShader)
val fragmentShader = gl.glCreateShader(GL2.GL_FRAGMENT_SHADER)
gl.glShaderSource(fragmentShader, 1, arrayOf(fragSource), null)
gl.glCompileShader(fragmentShader)
gl.glAttachShader(programId!!, fragmentShader)
gl.glLinkProgram(programId!!)
}
}
override fun reshape(drawable: GLAutoDrawable?, x: Int, y: Int, width: Int, height: Int) {
frame_width = width
frame_height = height
}
override fun display(drawable: GLAutoDrawable?) {
drawable?.let {
val gl = it.gl.gL2
gl.glViewport(0, 0, frame_width, frame_height)
gl.glClear(GL2.GL_COLOR_BUFFER_BIT or GL2.GL_DEPTH_BUFFER_BIT)
gl.glUseProgram(programId!!)
val vertexPositionId = gl.glGetAttribLocation(programId!!, "VertexPosition")
val vertexColorId = gl.glGetAttribLocation(programId!!, "VertexColor")
gl.glEnableVertexAttribArray(vertexPositionId)
gl.glEnableVertexAttribArray(vertexColorId)
gl.glBindBuffer(GL2.GL_ARRAY_BUFFER, vbo[0])
gl.glVertexAttribPointer(vertexPositionId, 3, GL2.GL_FLOAT, false, 0, 0)
gl.glBindBuffer(GL2.GL_ARRAY_BUFFER, vbo[1])
gl.glVertexAttribPointer(vertexColorId, 3, GL2.GL_FLOAT, false, 0, 0)
gl.glDrawArrays(GL2.GL_QUADS, 0, vertices.size)
gl.glBindBuffer(GL2.GL_ARRAY_BUFFER, 0)
}
}
override fun dispose(drawable: GLAutoDrawable?) {}
}
#version 400
in vec4 VertexPosition;
in vec4 VertexColor;
out vec4 color;
void main(void)
{
gl_Position = VertexPosition;
color = VertexColor;
}
#version 400
in vec4 color;
void main (void)
{
gl_FragColor = color;
}