class Renderer2 : 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 vertexBuffer = Buffers.newDirectFloatBuffer(vertices)
val vbo = IntBuffer.allocate(1)

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(1, 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, 0)

val vertSource = readShaderSource("simple.vert")
val fragSource = readShaderSource("simple.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!!)

gl.glBindBuffer(GL2.GL_ARRAY_BUFFER, vbo[0])
gl.glEnableClientState(GL2.GL_VERTEX_ARRAY)
gl.glVertexPointer(3, GL2.GL_FLOAT, 0, 0)
gl.glDrawArrays(GL2.GL_QUADS, 0, vertices.size)
gl.glDisableClientState(GL2.GL_VERTEX_ARRAY)
gl.glBindBuffer(GL2.GL_ARRAY_BUFFER, 0)
}
}
override fun dispose(drawable: GLAutoDrawable?) {}
}