| 34 |
34 |
|
| 35 |
35 |
class AroundTheWorldRendererPicker implements GLSurfaceView.Renderer
|
| 36 |
36 |
{
|
|
37 |
private static final int BYTES_PER_FLOAT = 4;
|
|
38 |
private static final int STRIDE_BYTES = 7 * BYTES_PER_FLOAT;
|
|
39 |
private static final int POSITION_OFFSET = 0;
|
|
40 |
private static final int POSITION_DATA_SIZE = 3;
|
|
41 |
private static final int COLOR_OFFSET = 3;
|
|
42 |
private static final int COLOR_DATA_SIZE = 4;
|
|
43 |
|
|
44 |
private float[] mModelMatrix = new float[16];
|
| 37 |
45 |
private float[] mViewMatrix = new float[16];
|
| 38 |
46 |
private float[] mProjectionMatrix = new float[16];
|
| 39 |
|
private float[] mMVPMatrix = new float[16];
|
|
47 |
private float[] mMVPTriangleMatrix= new float[16];
|
|
48 |
private float[] mMVPSquareMatrix = new float[16];
|
| 40 |
49 |
|
| 41 |
|
private final FloatBuffer mTriangleVertices;
|
|
50 |
private final FloatBuffer mTriangleVert, mSquareVert;
|
| 42 |
51 |
|
| 43 |
52 |
private int mMVPMatrixH;
|
| 44 |
53 |
private int mPositionH;
|
| 45 |
54 |
private int mColorH;
|
| 46 |
55 |
|
| 47 |
|
private final int mBytesPerFloat = 4;
|
| 48 |
|
private final int mStrideBytes = 7 * mBytesPerFloat;
|
| 49 |
|
private final int mPositionOffset = 0;
|
| 50 |
|
private final int mPositionDataSize = 3;
|
| 51 |
|
private final int mColorOffset = 3;
|
| 52 |
|
private final int mColorDataSize = 4;
|
|
56 |
private int mHeight, mWidth;
|
| 53 |
57 |
|
| 54 |
58 |
///////////////////////////////////////////////////////////////////////////////////////////////////
|
| 55 |
59 |
|
| 56 |
60 |
AroundTheWorldRendererPicker()
|
| 57 |
61 |
{
|
| 58 |
|
final float[] triangle1VerticesData = {
|
| 59 |
|
-0.865f, 1.5f, 0.0f, // x,y,z
|
| 60 |
|
1.0f, 1.0f, 1.0f, 1.0f, // r,g,b
|
|
62 |
Matrix.setIdentityM(mModelMatrix, 0);
|
| 61 |
63 |
|
| 62 |
|
-0.865f,-1.5f, 0.0f,
|
| 63 |
|
0.0f, 0.0f, 0.0f, 1.0f,
|
|
64 |
final float[] triangleVertData = {
|
|
65 |
-0.865f, 1.5f, 0.0f, 1.0f, 1.0f, 1.0f, 1.0f, // x,y,z, r,g,b,a
|
|
66 |
-0.865f,-1.5f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f,
|
|
67 |
1.730f, 0.0f, 0.0f, 0.5f, 0.5f, 0.0f, 1.0f };
|
| 64 |
68 |
|
| 65 |
|
1.73f, 0.0f, 0.0f,
|
| 66 |
|
0.5f, 0.5f, 0.0f, 1.0f };
|
|
69 |
mTriangleVert = ByteBuffer.allocateDirect(triangleVertData.length * BYTES_PER_FLOAT).order(ByteOrder.nativeOrder()).asFloatBuffer();
|
|
70 |
mTriangleVert.put(triangleVertData).position(0);
|
| 67 |
71 |
|
| 68 |
|
mTriangleVertices = ByteBuffer.allocateDirect(triangle1VerticesData.length * mBytesPerFloat).order(ByteOrder.nativeOrder()).asFloatBuffer();
|
| 69 |
|
mTriangleVertices.put(triangle1VerticesData).position(0);
|
|
72 |
final float[] squareVertData = {
|
|
73 |
-0.15f, 0.15f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f,
|
|
74 |
-0.15f,-0.15f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f,
|
|
75 |
0.15f, 0.15f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f,
|
|
76 |
0.15f,-0.15f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f };
|
|
77 |
|
|
78 |
mSquareVert = ByteBuffer.allocateDirect(squareVertData.length * BYTES_PER_FLOAT).order(ByteOrder.nativeOrder()).asFloatBuffer();
|
|
79 |
mSquareVert.put(squareVertData).position(0);
|
| 70 |
80 |
}
|
| 71 |
81 |
|
|
82 |
///////////////////////////////////////////////////////////////////////////////////////////////////
|
|
83 |
|
|
84 |
public void move(float x, float y)
|
|
85 |
{
|
|
86 |
mModelMatrix[12] = x;
|
|
87 |
mModelMatrix[13] = y;
|
|
88 |
}
|
|
89 |
|
|
90 |
///////////////////////////////////////////////////////////////////////////////////////////////////
|
|
91 |
|
|
92 |
public int getHeight()
|
|
93 |
{
|
|
94 |
return mHeight;
|
|
95 |
}
|
|
96 |
|
|
97 |
///////////////////////////////////////////////////////////////////////////////////////////////////
|
|
98 |
|
|
99 |
public int getWidth()
|
|
100 |
{
|
|
101 |
return mWidth;
|
|
102 |
}
|
|
103 |
|
| 72 |
104 |
///////////////////////////////////////////////////////////////////////////////////////////////////
|
| 73 |
105 |
|
| 74 |
106 |
@Override public void onSurfaceCreated(GL10 glUnused, EGLConfig config)
|
| ... | ... | |
| 190 |
222 |
|
| 191 |
223 |
@Override public void onSurfaceChanged(GL10 glUnused, int width, int height)
|
| 192 |
224 |
{
|
|
225 |
mHeight = height;
|
|
226 |
mWidth = width;
|
|
227 |
|
| 193 |
228 |
GLES20.glViewport(0, 0, width, height);
|
| 194 |
229 |
|
| 195 |
230 |
final float ratio = (float) width / height;
|
| ... | ... | |
| 201 |
236 |
final float far = 2.0f;
|
| 202 |
237 |
|
| 203 |
238 |
Matrix.frustumM(mProjectionMatrix, 0, left, right, bottom, top, near, far);
|
| 204 |
|
Matrix.multiplyMM(mMVPMatrix, 0, mProjectionMatrix, 0, mViewMatrix, 0);
|
|
239 |
Matrix.multiplyMM(mMVPTriangleMatrix, 0, mProjectionMatrix, 0, mViewMatrix, 0);
|
| 205 |
240 |
}
|
| 206 |
241 |
|
| 207 |
242 |
///////////////////////////////////////////////////////////////////////////////////////////////////
|
| ... | ... | |
| 209 |
244 |
@Override public void onDrawFrame(GL10 glUnused)
|
| 210 |
245 |
{
|
| 211 |
246 |
GLES20.glClear(GLES20.GL_DEPTH_BUFFER_BIT | GLES20.GL_COLOR_BUFFER_BIT);
|
|
247 |
GLES20.glUniformMatrix4fv(mMVPMatrixH, 1, false, mMVPTriangleMatrix, 0);
|
| 212 |
248 |
|
| 213 |
|
mTriangleVertices.position(mPositionOffset);
|
| 214 |
|
GLES20.glVertexAttribPointer(mPositionH, mPositionDataSize, GLES20.GL_FLOAT, false, mStrideBytes, mTriangleVertices);
|
|
249 |
///////// 'white-black-yellow' triangle //////
|
|
250 |
mTriangleVert.position(POSITION_OFFSET);
|
|
251 |
GLES20.glVertexAttribPointer(mPositionH, POSITION_DATA_SIZE, GLES20.GL_FLOAT, false, STRIDE_BYTES, mTriangleVert);
|
| 215 |
252 |
GLES20.glEnableVertexAttribArray(mPositionH);
|
|
253 |
mTriangleVert.position(COLOR_OFFSET);
|
|
254 |
GLES20.glVertexAttribPointer(mColorH, COLOR_DATA_SIZE, GLES20.GL_FLOAT, false, STRIDE_BYTES, mTriangleVert);
|
|
255 |
GLES20.glEnableVertexAttribArray(mColorH);
|
| 216 |
256 |
|
| 217 |
|
mTriangleVertices.position(mColorOffset);
|
| 218 |
|
GLES20.glVertexAttribPointer(mColorH, mColorDataSize, GLES20.GL_FLOAT, false, mStrideBytes, mTriangleVertices);
|
|
257 |
GLES20.glUniformMatrix4fv(mMVPMatrixH, 1, false, mMVPTriangleMatrix, 0);
|
|
258 |
GLES20.glDrawArrays(GLES20.GL_TRIANGLES, 0, 3);
|
|
259 |
|
|
260 |
//////// 'current position' square ///////////
|
|
261 |
mSquareVert.position(POSITION_OFFSET);
|
|
262 |
GLES20.glVertexAttribPointer(mPositionH, POSITION_DATA_SIZE, GLES20.GL_FLOAT, false, STRIDE_BYTES, mSquareVert);
|
|
263 |
GLES20.glEnableVertexAttribArray(mPositionH);
|
|
264 |
mSquareVert.position(COLOR_OFFSET);
|
|
265 |
GLES20.glVertexAttribPointer(mColorH, COLOR_DATA_SIZE, GLES20.GL_FLOAT, false, STRIDE_BYTES, mSquareVert);
|
| 219 |
266 |
GLES20.glEnableVertexAttribArray(mColorH);
|
| 220 |
267 |
|
| 221 |
|
GLES20.glUniformMatrix4fv(mMVPMatrixH, 1, false, mMVPMatrix, 0);
|
| 222 |
|
GLES20.glDrawArrays(GLES20.GL_TRIANGLES, 0, 3);
|
|
268 |
Matrix.multiplyMM(mMVPSquareMatrix, 0, mViewMatrix, 0, mModelMatrix, 0);
|
|
269 |
Matrix.multiplyMM(mMVPSquareMatrix, 0, mProjectionMatrix, 0, mMVPSquareMatrix, 0);
|
|
270 |
|
|
271 |
GLES20.glUniformMatrix4fv(mMVPMatrixH, 1, false, mMVPSquareMatrix, 0);
|
|
272 |
GLES20.glDrawArrays(GLES20.GL_TRIANGLE_STRIP, 0,4);
|
| 223 |
273 |
}
|
| 224 |
274 |
}
|
Around the World: moving the selection rectangle