Skip to content

Instantly share code, notes, and snippets.

@jimschubert
Created November 2, 2013 03:15
Show Gist options
  • Save jimschubert/7275087 to your computer and use it in GitHub Desktop.
Save jimschubert/7275087 to your computer and use it in GitHub Desktop.
An example of drawing a triangle in Android using Scala. Converted from an example in Pro Android 3 http://www.apress.com/9781430232223
package com.example.AndroidPlaytime
import javax.microedition.khronos.opengles.GL10
import javax.microedition.khronos.egl.EGLConfig
import android.opengl.{GLSurfaceView, GLU}
import android.content.Context
import java.nio.{ByteOrder, ByteBuffer}
import android.app.Activity
import android.os.Bundle
import android.view.Window
class MyActivity extends Activity {
var view: GLSurfaceView = null
override def onPause() = {
super.onPause()
view.onPause()
}
override def onResume() = {
super.onResume()
view.onResume()
}
override def onCreate(savedInstanceState: Bundle) = {
super.onCreate(savedInstanceState)
requestWindowFeature(Window.FEATURE_NO_TITLE)
view = new GLSurfaceView(this)
view.setEGLConfigChooser(8 , 8, 8, 8, 16, 0)
view.setRenderer(new SimpleTriangleRender(this))
// view.setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY)
view.setRenderMode(GLSurfaceView.RENDERMODE_CONTINUOUSLY)
this.setContentView(view)
}
}
abstract class AbstractRenderer extends android.opengl.GLSurfaceView.Renderer {
def draw(gl:GL10)
def onDrawFrame(gl: GL10) = {
gl.glDisable(GL10.GL_DITHER)
gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT)
gl.glMatrixMode(GL10.GL_MODELVIEW)
gl.glLoadIdentity()
GLU.gluLookAt(gl, 0f, 0f, -5f, 0f, 0f, 0f, 0f, 1.0f, 0f)
gl.glEnableClientState(GL10.GL_VERTEX_ARRAY)
draw(gl)
}
def onSurfaceChanged(gl: GL10, width: Int, height: Int) = {
gl.glViewport(0,0,width,height)
val ratio:Float = width/height
gl.glMatrixMode(GL10.GL_PROJECTION)
gl.glLoadIdentity()
gl.glFrustumf(-ratio, ratio, -1, 1,3,7)
}
def onSurfaceCreated(gl: GL10, config: EGLConfig) = {
gl.glDisable(GL10.GL_DITHER)
gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_FASTEST)
gl.glClearColor(0.5f, 0.5f, 0.5f, 1)
gl.glShadeModel(GL10.GL_SMOOTH)
gl.glEnable(GL10.GL_DEPTH_TEST)
}
}
class SimpleTriangleRender(context:Context) extends AbstractRenderer
{
private[this] val verts = 3
private[this] val vbb = ByteBuffer.allocateDirect(verts * 3 * 4)
vbb.order(ByteOrder.nativeOrder())
private[this] val ibb = ByteBuffer.allocateDirect(verts * 2)
ibb.order(ByteOrder.nativeOrder())
private[this] val vertBuffer = vbb.asFloatBuffer()
private[this] val indexBuffer = ibb.asShortBuffer()
private[this] val coords: Array[Float] = List(
-0.5f, -0.5f, 0.0f,
0.5f, -0.5f, 0.0f,
0.0f, 0.5f, 0.0f
).toArray
(0 until verts).foreach(i =>
(0 until 3).foreach(j => {
vertBuffer.put(coords(i*3+j))
})
)
private[this] val indexes = Array[Short](0, 1, 2)
(0 until 3).foreach(j => {
indexBuffer.put(indexes(j))
})
vertBuffer.position(0)
indexBuffer.position(0)
def draw(gl: GL10): Unit = {
gl.glColor4f(1.0f, 0f, 0f, 0.5f)
gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vertBuffer)
gl.glDrawElements(GL10.GL_TRIANGLES, verts, GL10.GL_UNSIGNED_SHORT, indexBuffer)
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment