マイペースなプログラミング日記

x86エミュレータやFPGA、WebGLにお熱なd-kamiがマイペースに書くブログ

ScalaでJOGLを使ってみた

[tech] Scala で JOGL (OpenGL) | Sun, Oct 6. 2013 - 氾濫原 [HANRANGEN]ScalaOpenGLを使うための記事が書かれていたが、ソースコードというかパッケージの構成が微妙に変わってしまったようなのでソースコードを修正した物を載せてみる

import com.jogamp.opengl.GL
import com.jogamp.opengl.GLProfile
import com.jogamp.opengl.GLAutoDrawable
import com.jogamp.opengl.GLCapabilities
import com.jogamp.opengl.GLEventListener
import com.jogamp.opengl.util.FPSAnimator

import com.jogamp.newt.opengl.GLWindow
import com.jogamp.newt.event.WindowAdapter
import com.jogamp.newt.event.WindowEvent

object Sketch {
    def main (args: Array[String]) {
        val glp = GLProfile.getDefault();
        val caps = new GLCapabilities(glp)

        val window = GLWindow.create(caps)
        window.setSize(300, 300)
        window.setVisible(true)
        window.setTitle("TEST")

        window.addWindowListener(new WindowAdapter(){
            override def windowDestroyNotify (e : WindowEvent) {
                System.exit(0)
            }
        })

        window.addGLEventListener(new GLEventListener(){
            var theta : Double = 0
            var s : Double = 0
            var c : Double = 0

            override def display(drawable : GLAutoDrawable){
                println("display")
                update
                render(drawable)
            }

            override def dispose(drawable : GLAutoDrawable){
                println("dispose")
            }

            override def init(drawable : GLAutoDrawable){
                println("init")
            }

            override def reshape(drawable : GLAutoDrawable, x : Int, y : Int, w : Int, h : Int){
                println("reshape")
            }

            def update(){
                theta = theta + 0.01
                s = Math.sin(theta)
                c = Math.sin(theta)
            }

            def render(drawable : GLAutoDrawable){
                println("render")
                val gl = drawable.getGL().getGL2();

                gl.glClear(GL.GL_COLOR_BUFFER_BIT);

                gl.glBegin(GL.GL_TRIANGLES);
                gl.glColor3f(1, 0, 0);
                gl.glVertex2d(-c, -c);
                gl.glColor3f(0, 1, 0);
                gl.glVertex2d(0, c);
                gl.glColor3f(0, 0, 1);
                gl.glVertex2d(s, -s);
                gl.glEnd();
            }
        })

        val animator = new FPSAnimator(window, 60);
        animator.start();
    }
}