]> Pileus Git - ~andy/spades/blob - src/org/pileus/spades/Cards.java
Add initial OpenGL example
[~andy/spades] / src / org / pileus / spades / Cards.java
1 package org.pileus.spades;
2
3 import java.nio.ByteBuffer;
4 import java.nio.ByteOrder;
5 import java.nio.FloatBuffer;
6
7 import javax.microedition.khronos.egl.EGLConfig;
8 import javax.microedition.khronos.opengles.GL10;
9
10 import android.opengl.GLES20;
11 import android.opengl.GLSurfaceView;
12
13 import android.content.Context;
14
15 public class Cards extends GLSurfaceView implements GLSurfaceView.Renderer
16 {
17         /* Shader data */
18         private final String vertSource =
19                 "attribute vec4 vPosition;"  +
20                 "void main() {"              +
21                 "  gl_Position = vPosition;" +
22                 "}";
23
24         private final String fragSource =
25                 "precision mediump float;" +
26                 "uniform vec4 vColor;"     +
27                 "void main() {"            +
28                 "  gl_FragColor = vColor;" +
29                 "}";
30
31         /* Drawing data */
32         private final float coords[] = {
33                 0.0f,  0.5f, 0.0f,
34                 -0.5f, -0.5f, 0.0f,
35                 0.5f, -0.5f, 0.0f,
36         };
37
38         private final float color[] = { 1, 0, 0, 1 };
39
40         /* Private data */
41         private int         program;
42         private FloatBuffer vertBuf;
43
44         /* Private methods */
45         private int loadShader(int type, String code)
46         {
47                 int shader = GLES20.glCreateShader(type);
48                 GLES20.glShaderSource(shader, code);
49                 GLES20.glCompileShader(shader);
50                 return shader;
51         }
52
53         /* GLSurfaceView Methods */
54         public Cards(Context context)
55         {
56                 super(context);
57                 Os.debug("Cards create");
58
59                 this.setEGLContextClientVersion(2);
60                 this.setRenderer(this);
61                 this.setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY);
62         }
63
64         /* Renderer methods */
65         @Override
66         public void onSurfaceCreated(GL10 unused, EGLConfig config)
67         {
68                 /* Initialize shaders */
69                 int vertShader = this.loadShader(GLES20.GL_VERTEX_SHADER,   vertSource);
70                 int fragShader = this.loadShader(GLES20.GL_FRAGMENT_SHADER, fragSource);
71
72                 /* Link shaders into an OpenGL program */
73                 this.program = GLES20.glCreateProgram();
74                 GLES20.glAttachShader(program, vertShader);
75                 GLES20.glAttachShader(program, fragShader);
76                 GLES20.glLinkProgram(program);
77
78                 /* Create Vertex Array  */
79                 ByteBuffer byteBuf = ByteBuffer.allocateDirect(coords.length * 4);
80                 byteBuf.order(ByteOrder.nativeOrder());
81
82                 this.vertBuf = byteBuf.asFloatBuffer();
83                 this.vertBuf.put(coords);
84                 this.vertBuf.position(0);
85         }
86
87         @Override
88         public void onDrawFrame(GL10 unused)
89         {
90                 /* Turn on the program */
91                 GLES20.glUseProgram(program);
92                 int posHandle = GLES20.glGetAttribLocation(program, "vPosition");
93                 int clrHandle = GLES20.glGetUniformLocation(program, "vColor");
94
95                 /* Draw */
96                 GLES20.glClearColor(0, 0, 0, 1);
97                 GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT);
98                 GLES20.glEnableVertexAttribArray(posHandle);
99                 GLES20.glVertexAttribPointer(posHandle, 3, GLES20.GL_FLOAT, false, 3*4, vertBuf);
100                 GLES20.glUniform4fv(clrHandle, 1, color, 0);
101                 GLES20.glDrawArrays(GLES20.GL_TRIANGLES, 0, 3);
102                 GLES20.glDisableVertexAttribArray(posHandle);
103         }
104
105         @Override
106         public void onSurfaceChanged(GL10 unused, int width, int height)
107         {
108                 GLES20.glViewport(0, 0, width, height);
109         }
110 }