commit 951c4af9fb776e03a72c0c23827da0b8f79fe484
Author: Leszek Koltunski <leszek@distorted.org>
Date:   Sat Nov 12 23:25:58 2016 +0000

    Around the World: moving the selection rectangle

diff --git a/src/main/java/org/distorted/examples/aroundtheworld/AroundTheWorldRendererPicker.java b/src/main/java/org/distorted/examples/aroundtheworld/AroundTheWorldRendererPicker.java
index b48b9a8..0bb2d5c 100644
--- a/src/main/java/org/distorted/examples/aroundtheworld/AroundTheWorldRendererPicker.java
+++ b/src/main/java/org/distorted/examples/aroundtheworld/AroundTheWorldRendererPicker.java
@@ -34,41 +34,73 @@ import android.opengl.Matrix;
 
 class AroundTheWorldRendererPicker implements GLSurfaceView.Renderer
   {
+	private static final int BYTES_PER_FLOAT    = 4;
+	private static final int STRIDE_BYTES       = 7 * BYTES_PER_FLOAT;
+	private static final int POSITION_OFFSET    = 0;
+	private static final int POSITION_DATA_SIZE = 3;
+	private static final int COLOR_OFFSET       = 3;
+	private static final int COLOR_DATA_SIZE    = 4;
+
+  private float[] mModelMatrix      = new float[16];
 	private float[] mViewMatrix       = new float[16];
 	private float[] mProjectionMatrix = new float[16];
-	private float[] mMVPMatrix        = new float[16];
+	private float[] mMVPTriangleMatrix= new float[16];
+  private float[] mMVPSquareMatrix  = new float[16];
 
-	private final FloatBuffer mTriangleVertices;
+	private final FloatBuffer mTriangleVert, mSquareVert;
 
   private int mMVPMatrixH;
   private int mPositionH;
 	private int mColorH;
 
-	private final int mBytesPerFloat    = 4;
-	private final int mStrideBytes      = 7 * mBytesPerFloat;
-	private final int mPositionOffset   = 0;
-	private final int mPositionDataSize = 3;
-	private final int mColorOffset      = 3;
-	private final int mColorDataSize    = 4;
+  private int mHeight, mWidth;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
 	AroundTheWorldRendererPicker()
 	  {
-		final float[] triangle1VerticesData = {
-				      -0.865f, 1.5f, 0.0f,      // x,y,z
-	            1.0f, 1.0f, 1.0f, 1.0f,   // r,g,b
+	  Matrix.setIdentityM(mModelMatrix, 0);
 
-	            -0.865f,-1.5f, 0.0f,
-	            0.0f, 0.0f, 0.0f, 1.0f,
+		final float[] triangleVertData = {
+				      -0.865f, 1.5f, 0.0f,    1.0f, 1.0f, 1.0f, 1.0f,   // x,y,z,  r,g,b,a
+	            -0.865f,-1.5f, 0.0f,    0.0f, 0.0f, 0.0f, 1.0f,
+	             1.730f, 0.0f, 0.0f,    0.5f, 0.5f, 0.0f, 1.0f };
 
-	            1.73f, 0.0f, 0.0f,
-	            0.5f, 0.5f, 0.0f, 1.0f };
+		mTriangleVert = ByteBuffer.allocateDirect(triangleVertData.length * BYTES_PER_FLOAT).order(ByteOrder.nativeOrder()).asFloatBuffer();
+    mTriangleVert.put(triangleVertData).position(0);
 
-		mTriangleVertices = ByteBuffer.allocateDirect(triangle1VerticesData.length * mBytesPerFloat).order(ByteOrder.nativeOrder()).asFloatBuffer();
-    mTriangleVertices.put(triangle1VerticesData).position(0);
+    final float[] squareVertData = {
+				      -0.15f, 0.15f, 0.0f,    1.0f, 0.0f, 0.0f, 1.0f,
+	            -0.15f,-0.15f, 0.0f,    1.0f, 0.0f, 0.0f, 1.0f,
+	             0.15f, 0.15f, 0.0f,    1.0f, 0.0f, 0.0f, 1.0f,
+	             0.15f,-0.15f, 0.0f,    1.0f, 0.0f, 0.0f, 1.0f };
+
+		mSquareVert = ByteBuffer.allocateDirect(squareVertData.length * BYTES_PER_FLOAT).order(ByteOrder.nativeOrder()).asFloatBuffer();
+    mSquareVert.put(squareVertData).position(0);
 	  }
 
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  public void move(float x, float y)
+		{
+		mModelMatrix[12] = x;
+		mModelMatrix[13] = y;
+		}
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  public int getHeight()
+		{
+		return mHeight;
+		}
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  public int getWidth()
+		{
+		return mWidth;
+		}
+
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
 	@Override public void onSurfaceCreated(GL10 glUnused, EGLConfig config)
@@ -190,6 +222,9 @@ class AroundTheWorldRendererPicker implements GLSurfaceView.Renderer
 
 	@Override public void onSurfaceChanged(GL10 glUnused, int width, int height)
 	  {
+	  mHeight = height;
+	  mWidth  = width;
+
 		GLES20.glViewport(0, 0, width, height);
 
 		final float ratio  = (float) width / height;
@@ -201,7 +236,7 @@ class AroundTheWorldRendererPicker implements GLSurfaceView.Renderer
 		final float far    = 2.0f;
 
 		Matrix.frustumM(mProjectionMatrix, 0, left, right, bottom, top, near, far);
-		Matrix.multiplyMM(mMVPMatrix, 0, mProjectionMatrix, 0, mViewMatrix, 0);
+		Matrix.multiplyMM(mMVPTriangleMatrix, 0, mProjectionMatrix, 0, mViewMatrix, 0);
 	  }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -209,16 +244,31 @@ class AroundTheWorldRendererPicker implements GLSurfaceView.Renderer
 	@Override public void onDrawFrame(GL10 glUnused)
 	  {
 		GLES20.glClear(GLES20.GL_DEPTH_BUFFER_BIT | GLES20.GL_COLOR_BUFFER_BIT);
+    GLES20.glUniformMatrix4fv(mMVPMatrixH, 1, false, mMVPTriangleMatrix, 0);
 
-    mTriangleVertices.position(mPositionOffset);
-    GLES20.glVertexAttribPointer(mPositionH, mPositionDataSize, GLES20.GL_FLOAT, false, mStrideBytes, mTriangleVertices);
+    ///////// 'white-black-yellow' triangle //////
+    mTriangleVert.position(POSITION_OFFSET);
+    GLES20.glVertexAttribPointer(mPositionH, POSITION_DATA_SIZE, GLES20.GL_FLOAT, false, STRIDE_BYTES, mTriangleVert);
     GLES20.glEnableVertexAttribArray(mPositionH);
+    mTriangleVert.position(COLOR_OFFSET);
+    GLES20.glVertexAttribPointer(mColorH, COLOR_DATA_SIZE, GLES20.GL_FLOAT, false, STRIDE_BYTES, mTriangleVert);
+    GLES20.glEnableVertexAttribArray(mColorH);
 
-    mTriangleVertices.position(mColorOffset);
-    GLES20.glVertexAttribPointer(mColorH, mColorDataSize, GLES20.GL_FLOAT, false, mStrideBytes, mTriangleVertices);
+		GLES20.glUniformMatrix4fv(mMVPMatrixH, 1, false, mMVPTriangleMatrix, 0);
+		GLES20.glDrawArrays(GLES20.GL_TRIANGLES, 0, 3);
+
+    //////// 'current position' square ///////////
+    mSquareVert.position(POSITION_OFFSET);
+    GLES20.glVertexAttribPointer(mPositionH, POSITION_DATA_SIZE, GLES20.GL_FLOAT, false, STRIDE_BYTES, mSquareVert);
+    GLES20.glEnableVertexAttribArray(mPositionH);
+    mSquareVert.position(COLOR_OFFSET);
+    GLES20.glVertexAttribPointer(mColorH, COLOR_DATA_SIZE, GLES20.GL_FLOAT, false, STRIDE_BYTES, mSquareVert);
     GLES20.glEnableVertexAttribArray(mColorH);
 
-		GLES20.glUniformMatrix4fv(mMVPMatrixH, 1, false, mMVPMatrix, 0);
-    GLES20.glDrawArrays(GLES20.GL_TRIANGLES, 0, 3);
+    Matrix.multiplyMM(mMVPSquareMatrix, 0, mViewMatrix, 0, mModelMatrix, 0);
+    Matrix.multiplyMM(mMVPSquareMatrix, 0, mProjectionMatrix, 0, mMVPSquareMatrix, 0);
+
+    GLES20.glUniformMatrix4fv(mMVPMatrixH, 1, false, mMVPSquareMatrix, 0);
+		GLES20.glDrawArrays(GLES20.GL_TRIANGLE_STRIP, 0,4);
 	  }
   }
diff --git a/src/main/java/org/distorted/examples/aroundtheworld/AroundTheWorldSurfaceViewPicker.java b/src/main/java/org/distorted/examples/aroundtheworld/AroundTheWorldSurfaceViewPicker.java
index cd37209..213a558 100644
--- a/src/main/java/org/distorted/examples/aroundtheworld/AroundTheWorldSurfaceViewPicker.java
+++ b/src/main/java/org/distorted/examples/aroundtheworld/AroundTheWorldSurfaceViewPicker.java
@@ -64,7 +64,34 @@ class AroundTheWorldSurfaceViewPicker extends GLSurfaceView
       int x = (int)event.getX();
       int y = (int)event.getY();
 
-      android.util.Log.e("Picker", "touched at x="+x+" y="+y);
+      int h = mRenderer.getHeight();
+      int w = mRenderer.getWidth();
+
+      float xf = (x-w/2)*3.0f/h;
+      float yf =-(y-h/2)*3.0f/h;
+
+      if( yf>-1.5f && yf<1.5f )
+        {
+        if( yf>=0 && yf> 1-0.577f*xf )
+          {
+          float d = 0.577f*xf + yf;
+          yf /= d;
+          xf /= d;
+          }
+        else if( yf<=0 && yf< 0.577f*xf-1 )
+          {
+          float d = 0.577f*xf - yf;
+          yf /= d;
+          xf /= d;
+          }
+        else if( xf< -0.865f )
+          {
+          yf *= (-0.865f/xf);
+          xf  =  -0.865f;
+          }
+
+        mRenderer.move(xf,yf);
+        }
 
       return true;
       }
