Scala から JOGL (Java で OpenGL を使うやつ)

JOGL はどれをダウンロードしていいのかサッパリわからないが、jogamp-all-platforms.7z というのが全部入りっぽいのでこれをダウンロードする。このファイルのありかがそもそも見つけられないと思うけど、http://jogamp.org/deployment/jogamp-current/archive/ にある。ほんとどれをダウンロードしたらいいかサッパリわからないし、どこからこのページに辿りついたのかよくわからないけど、とにかくこのページから jogamp-all-platforms.7z をダウンロードすれば良い。jogamp って何?って感じだけどとにかくこれでいい。

ぐ〜ぐるで調べると、情報が古いのがたくさんでてくるのでつらい。これが公式?っぽいので、ここを見るのが良さそう。これまたこのページに辿りつくが難しい。

クラスパスには2つファイルを指定するだけでいい。これ以外はむしろ指定すると scala がぬるぽ出したりしてよくわからないことになる。横着して *.jar とかしてはいけない。

-classpath /path/to/jogamp-all-platforms/jar/gluegen-rt.jar:/path/to/jogamp-all-platforms/jar/jogl-all.jar

JOGL のチュートリアル にあるサンプルを移植すると以下のような感じになるっぽい。なんとなく awt ではなく newt を使うようにも変えてる。

チュートリアルだと animator.add() が余計でエラって動かない。あとなんかいろいろハマったけど忘れてしまった。とにかくこれで動く。

//#!scala -classpath /path/to/jogamp-all-platforms/jar/gluegen-rt.jar:/path/to/jogamp-all-platforms/jar/jogl-all.jar

import javax.media.opengl._
import com.jogamp.newt.event.WindowAdapter
import com.jogamp.newt.event.WindowEvent
import com.jogamp.newt.opengl.GLWindow
import com.jogamp.opengl.util.FPSAnimator

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) {
				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();

	}

}
  1. トップ
  2. tech
  3. Scala で JOGL (OpenGL)