SHOW:
|
|
- or go back to the newest paste.
1 | - | package net.randomcompany.android.opengles20.views; |
1 | + | package android.opengles20.views; |
2 | ||
3 | import android.opengl.GLES20; | |
4 | import android.opengl.Matrix; | |
5 | ||
6 | - | import net.randomcompany.android.opengles20.utils.Utils; |
6 | + | import utils.Utils; |
7 | ||
8 | import java.nio.ByteBuffer; | |
9 | import java.nio.ByteOrder; | |
10 | import java.nio.FloatBuffer; | |
11 | import java.nio.ShortBuffer; | |
12 | ||
13 | - | /** |
13 | + | |
14 | - | * Created by Damian Burke |
14 | + | |
15 | - | */ |
15 | + | |
16 | int iProgId; | |
17 | int iPosition; | |
18 | int iColor; | |
19 | int iVPMatrix; | |
20 | ||
21 | public float xAngle = 0; | |
22 | public float yAngle = 0; | |
23 | ||
24 | //to store projection matrix | |
25 | float[] mProjectionMatrix = new float[16]; | |
26 | //to store view matrix | |
27 | float[] mViewMatrix = new float[16]; | |
28 | //to store projection*view matrix | |
29 | float[] mViewProjectionMatrix = new float[16]; | |
30 | //to translate or rotate model | |
31 | float[] mModelMatrix = new float[16]; | |
32 | //final result p*v*m | |
33 | float[] mMVPMatrix = new float[16]; | |
34 | ||
35 | float[] mVertices = { | |
36 | -2, -2, -3, | |
37 | 3, -3, 3 | |
38 | }; | |
39 | ||
40 | float[] mColors = { | |
41 | 1, 1, 1, | |
42 | 0, 1, 1, | |
43 | 0, 1, 1 | |
44 | }; | |
45 | ||
46 | short[] mIndices = { | |
47 | 0, 1, 1, | |
48 | 2, 2, 3 | |
49 | }; | |
50 | ||
51 | FloatBuffer lineBuffer = null; | |
52 | FloatBuffer colorBuffer = null; | |
53 | ShortBuffer indexBuffer = null; | |
54 | ||
55 | ||
56 | public Line() { | |
57 | lineBuffer = ByteBuffer.allocateDirect(mVertices.length * 4).order(ByteOrder.nativeOrder()).asFloatBuffer(); | |
58 | lineBuffer.put(mVertices).position(0); | |
59 | ||
60 | colorBuffer = ByteBuffer.allocateDirect(mColors.length * 4).order(ByteOrder.nativeOrder()).asFloatBuffer(); | |
61 | colorBuffer.put(mColors).position(0); | |
62 | ||
63 | indexBuffer = ByteBuffer.allocateDirect(mIndices.length * 4).order(ByteOrder.nativeOrder()).asShortBuffer(); | |
64 | indexBuffer.put(mIndices).position(0); | |
65 | ||
66 | prepare(); | |
67 | } | |
68 | ||
69 | public Line(float[] points) { | |
70 | mVertices = points; | |
71 | ||
72 | lineBuffer = ByteBuffer.allocateDirect(mVertices.length * 4).order(ByteOrder.nativeOrder()).asFloatBuffer(); | |
73 | lineBuffer.put(mVertices).position(0); | |
74 | ||
75 | colorBuffer = ByteBuffer.allocateDirect(mColors.length * 4).order(ByteOrder.nativeOrder()).asFloatBuffer(); | |
76 | colorBuffer.put(mColors).position(0); | |
77 | ||
78 | indexBuffer = ByteBuffer.allocateDirect(mIndices.length * 4).order(ByteOrder.nativeOrder()).asShortBuffer(); | |
79 | indexBuffer.put(mIndices).position(0); | |
80 | ||
81 | prepare(); | |
82 | } | |
83 | ||
84 | public void prepare() { | |
85 | String strVShader = "attribute vec4 a_position;" + | |
86 | "attribute vec4 a_color;" + | |
87 | "uniform mat4 u_VPMatrix;" + | |
88 | "varying vec4 v_color;" + | |
89 | "void main()" + | |
90 | "{" + | |
91 | "v_color = a_color;" + | |
92 | "gl_Position = u_VPMatrix * a_position;" + | |
93 | "}"; | |
94 | ||
95 | String strFShader = "precision mediump float;" + | |
96 | "varying vec4 v_color;" + | |
97 | "void main()" + | |
98 | "{" + | |
99 | "gl_FragColor = v_color;" + | |
100 | "}"; | |
101 | iProgId = Utils.LoadProgram(strVShader, strFShader); | |
102 | iColor = GLES20.glGetAttribLocation(iProgId, "a_color"); | |
103 | iPosition = GLES20.glGetAttribLocation(iProgId, "a_position"); | |
104 | iVPMatrix = GLES20.glGetUniformLocation(iProgId, "u_VPMatrix"); | |
105 | } | |
106 | ||
107 | ||
108 | private float rotX = 0f; | |
109 | private float rotY = 0f; | |
110 | ||
111 | public void setRotation(float x, float y) { | |
112 | this.rotX = x; | |
113 | this.rotY = y; | |
114 | } | |
115 | ||
116 | private float[] mTranslation = new float[]{0, 0, 0}; | |
117 | ||
118 | public void setTranslation(float[] t) { | |
119 | mTranslation = t; | |
120 | } | |
121 | ||
122 | private float[] mScale = new float[]{1, 1, 1}; | |
123 | ||
124 | public void setScale(float[] s) { | |
125 | this.mScale = s; | |
126 | } | |
127 | ||
128 | public void draw(float[] mViewMatrix, float[] mProjectionMatrix) { | |
129 | Matrix.multiplyMM(mViewProjectionMatrix, 0, mProjectionMatrix, 0, mViewMatrix, 0); | |
130 | GLES20.glUseProgram(iProgId); | |
131 | lineBuffer.position(0); | |
132 | GLES20.glVertexAttribPointer(iPosition, 3, GLES20.GL_FLOAT, false, 0, lineBuffer); | |
133 | GLES20.glEnableVertexAttribArray(iPosition); | |
134 | ||
135 | colorBuffer.position(0); | |
136 | GLES20.glVertexAttribPointer(iColor, 3, GLES20.GL_FLOAT, false, 0, colorBuffer); | |
137 | GLES20.glEnableVertexAttribArray(iColor); | |
138 | ||
139 | // (translate * scale) * rotation -> rot -> scale -> translate | |
140 | ||
141 | ||
142 | // reset transformations in each step. | |
143 | Matrix.setIdentityM(mModelMatrix, 0); | |
144 | ||
145 | // Matrix.scaleM(mModelMatrix, 0, mScale[0], mScale[1], mScale[1]); | |
146 | ||
147 | Matrix.translateM(mModelMatrix, 0, mTranslation[0], mTranslation[1], mTranslation[2]); | |
148 | ||
149 | Matrix.rotateM(mModelMatrix, 0, rotX, 1, 0, 0); | |
150 | Matrix.rotateM(mModelMatrix, 0, -rotY, 0, 1, 0); | |
151 | ||
152 | Matrix.setIdentityM(mViewProjectionMatrix, 0); | |
153 | Matrix.multiplyMM(mViewProjectionMatrix, 0, mViewMatrix, 0, mModelMatrix, 0); | |
154 | //GLES20.glUniformMatrix4fv(iVPMatrix, 1, false, mMVPMatrix, 0); | |
155 | ||
156 | Matrix.multiplyMM(mMVPMatrix, 0, mProjectionMatrix, 0, mViewProjectionMatrix, 0); | |
157 | GLES20.glUniformMatrix4fv(iVPMatrix, 1, false, mMVPMatrix, 0); | |
158 | ||
159 | ||
160 | //GLES20.glDrawElements(GLES20.GL_LINES, mVertices.length/2, GLES20.GL_UNSIGNED_SHORT, indexBuffer); | |
161 | GLES20.glDrawArrays(GLES20.GL_LINES, 0, mVertices.length / 3); | |
162 | } | |
163 | } |