aboutsummaryrefslogtreecommitdiffhomepage
path: root/platform_tools/android/apps/skar_java/src/main/java/com/google/ar/core/examples/java/helloskar/HelloSkARActivity.java
diff options
context:
space:
mode:
Diffstat (limited to 'platform_tools/android/apps/skar_java/src/main/java/com/google/ar/core/examples/java/helloskar/HelloSkARActivity.java')
-rw-r--r--platform_tools/android/apps/skar_java/src/main/java/com/google/ar/core/examples/java/helloskar/HelloSkARActivity.java163
1 files changed, 110 insertions, 53 deletions
diff --git a/platform_tools/android/apps/skar_java/src/main/java/com/google/ar/core/examples/java/helloskar/HelloSkARActivity.java b/platform_tools/android/apps/skar_java/src/main/java/com/google/ar/core/examples/java/helloskar/HelloSkARActivity.java
index b62513684e..d8161c7979 100644
--- a/platform_tools/android/apps/skar_java/src/main/java/com/google/ar/core/examples/java/helloskar/HelloSkARActivity.java
+++ b/platform_tools/android/apps/skar_java/src/main/java/com/google/ar/core/examples/java/helloskar/HelloSkARActivity.java
@@ -27,10 +27,15 @@ import android.opengl.GLSurfaceView;
import android.opengl.Matrix;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
+import android.support.v7.widget.Toolbar;
import android.util.Log;
+import android.view.Menu;
+import android.view.MenuInflater;
+import android.view.MenuItem;
import android.view.MotionEvent;
import android.view.SurfaceHolder;
import android.view.View;
+import android.view.WindowManager;
import android.widget.Toast;
import com.google.ar.core.Anchor;
@@ -57,7 +62,6 @@ import com.google.ar.core.exceptions.UnavailableArcoreNotInstalledException;
import com.google.ar.core.exceptions.UnavailableDeviceNotCompatibleException;
import com.google.ar.core.exceptions.UnavailableSdkTooOldException;
import com.google.ar.core.exceptions.UnavailableUserDeclinedInstallationException;
-import com.google.skar.SkARMatrix;
import java.io.IOException;
import java.util.ArrayList;
@@ -72,6 +76,10 @@ import javax.microedition.khronos.opengles.GL10;
*/
public class HelloSkARActivity extends AppCompatActivity implements GLSurfaceView.Renderer {
+ public enum DrawingType {
+ circle, rect, text, animation
+ }
+
private static final String TAG = HelloSkARActivity.class.getSimpleName();
//Simple SurfaceView used to draw 2D objects on top of the GLSurfaceView
@@ -95,14 +103,12 @@ public class HelloSkARActivity extends AppCompatActivity implements GLSurfaceVie
// 2D Renderer
private DrawManager drawManager = new DrawManager();
+ private DrawingType currentDrawabletype = DrawingType.circle;
// Temporary matrix allocated here to reduce number of allocations for each frame.
private final float[] anchorMatrix = new float[16];
- private final float[] back = new float[16];
-
- PointF previousEvent;
- android.graphics.Matrix inverted;
+ PointF previousEvent;;
// Anchors created from taps used for object placing.
private final ArrayList<Anchor> anchors = new ArrayList<>();
@@ -116,6 +122,15 @@ public class HelloSkARActivity extends AppCompatActivity implements GLSurfaceVie
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
+
+ Toolbar myToolbar = (Toolbar) findViewById(R.id.my_toolbar);
+ setSupportActionBar(myToolbar);
+
+
+ //hide notifications bar
+ getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
+ WindowManager.LayoutParams.FLAG_FULLSCREEN);
+
arSurfaceView = findViewById(R.id.arsurfaceview);
glSurfaceView = findViewById(R.id.glsurfaceview);
arSurfaceView.bringToFront();
@@ -313,6 +328,30 @@ public class HelloSkARActivity extends AppCompatActivity implements GLSurfaceVie
}
}
+ // Draw background with OpenGL.
+ // TODO: possibly find a way to extract texture and draw on Canvas
+ backgroundRenderer.draw(frame);
+
+ // If not tracking, don't draw objects
+ if (camera.getTrackingState() == TrackingState.PAUSED) {
+ return;
+ }
+
+ // Get projection matrix.
+ float[] projmtx = new float[16];
+ camera.getProjectionMatrix(projmtx, 0, 0.1f, 100.0f);
+ drawManager.updateProjectionMatrix(projmtx);
+
+ // Get camera matrix and draw.
+ float[] viewmtx = new float[16];
+ camera.getViewMatrix(viewmtx, 0);
+ drawManager.updateViewMatrix(viewmtx);
+
+ final float[] colorCorrectionRgba = new float[4];
+ frame.getLightEstimate().getColorCorrection(colorCorrectionRgba, 0);
+ drawManager.updateLightColorFilter(colorCorrectionRgba);
+
+ // Building finger painting
MotionEvent holdTap = tapHelper.holdPoll();
if (holdTap != null && camera.getTrackingState() == TrackingState.TRACKING) {
for (HitResult hit : frame.hitTest(holdTap)) {
@@ -327,63 +366,39 @@ public class HelloSkARActivity extends AppCompatActivity implements GLSurfaceVie
&& ((Point) trackable).getOrientationMode()
== OrientationMode.ESTIMATED_SURFACE_NORMAL)) {
- float[] pt = {hit.getHitPose().tx(), hit.getHitPose().tz()};
+ // Get hit point transform, apply it to the origin
+ float[] gm = new float[16];
+ hit.getHitPose().toMatrix(gm, 0);
+ float[] point = {0, 0, 0, 1};
+ Matrix.multiplyMV(point, 0, gm, 0, point, 0);
if (drawManager.fingerPainting.isEmpty()) {
- float[] originalPt = {pt[0], pt[1]};
+ drawManager.fingerPainting.addPoint(new PointF(0, 0));
// Get model matrix of first point
float[] m = new float[16];
hit.getHitPose().toMatrix(m, 0);
- drawManager.fingerPainting.setModelMatrix(m); //M0
-
- // Construct the inverse matrix + the translation to the origin
- float[] inv = new float[16];
- hit.getHitPose().toMatrix(inv, 0);
- Matrix.invertM(inv, 0, inv, 0);
- drawManager.fingerPainting.setInverseModelMatrix(inv);
- //inverted = SkARMatrix.createMatrixFrom4x4(inv); //M0 -1
-
- // Map hit location using the raw inverse matrix
- drawManager.fingerPainting.getInverseModelMatrix().mapPoints(originalPt);
-
- // Translate the point back to the origin, and update the inverse matrix
- Matrix.translateM(inv, 0, -originalPt[0], -originalPt[1], 0);
- drawManager.fingerPainting.setInverseModelMatrix(inv);
- //inverted = SkARMatrix.createMatrixFrom4x4(inv);
+ drawManager.fingerPainting.setModelMatrix(m);
+ } else {
+ float localDistanceScale = 1000;
+ PointF distance = new PointF(point[0] - previousEvent.x,
+ point[2] - previousEvent.y);
+
+ // New point is distance + old point
+ PointF p = new PointF(distance.x * localDistanceScale
+ + drawManager.fingerPainting.previousPoint.x,
+ distance.y * localDistanceScale
+ + drawManager.fingerPainting.previousPoint.y);
+
+ drawManager.fingerPainting.addPoint(p);
}
- drawManager.fingerPainting.getInverseModelMatrix().mapPoints(pt);
- PointF newPoint = new PointF(pt[0], pt[1]);
- drawManager.fingerPainting.addPoint(newPoint);
+ previousEvent = new PointF(point[0], point[2]);
break;
}
}
}
- // Draw background with OpenGL.
- // TODO: possibly find a way to extract texture and draw on Canvas
- backgroundRenderer.draw(frame);
-
- // If not tracking, don't draw objects
- if (camera.getTrackingState() == TrackingState.PAUSED) {
- return;
- }
-
- // Get projection matrix.
- float[] projmtx = new float[16];
- camera.getProjectionMatrix(projmtx, 0, 0.1f, 100.0f);
- drawManager.updateProjectionMatrix(projmtx);
-
- // Get camera matrix and draw.
- float[] viewmtx = new float[16];
- camera.getViewMatrix(viewmtx, 0);
- drawManager.updateViewMatrix(viewmtx);
-
- final float[] colorCorrectionRgba = new float[4];
- frame.getLightEstimate().getColorCorrection(colorCorrectionRgba, 0);
- drawManager.updateLightColorFilter(colorCorrectionRgba);
-
// Drawing on Canvas (SurfaceView)
if (arSurfaceView.isRunning()) {
// Lock canvas
@@ -448,14 +463,56 @@ public class HelloSkARActivity extends AppCompatActivity implements GLSurfaceVie
anchor.getPose().toMatrix(anchorMatrix, 0);
drawManager.modelMatrices.add(0, anchorMatrix);
- drawManager.drawRect(canvas);
- drawManager.drawCircle(canvas);
- drawManager.drawAnimatedRoundRect(canvas, radius);
- drawManager.drawText(canvas, "HelloSkAR");
+ switch (currentDrawabletype) {
+ case circle:
+ drawManager.drawCircle(canvas);
+ return;
+ case rect:
+ drawManager.drawRect(canvas);
+ return;
+ case animation:
+ drawManager.drawAnimatedRoundRect(canvas, radius);
+ return;
+ case text:
+ drawManager.drawText(canvas, "Android");
+ return;
+ default:
+ drawManager.drawCircle(canvas);
+ return;
+ }
}
}
private void drawFingerPainting(Canvas canvas) {
drawManager.drawFingerPainting(canvas);
}
+
+ // Menu functions
+ public boolean onCreateOptionsMenu(Menu menu) {
+ MenuInflater inflater = getMenuInflater();
+ inflater.inflate(R.menu.main_menu, menu);
+ return true;
+ }
+
+ public boolean onOptionsItemSelected(MenuItem item) {
+ switch (item.getItemId()) {
+ case R.id.reset_paint:
+ drawManager.fingerPainting.reset();
+ return true;
+ case R.id.draw_circle:
+ currentDrawabletype = DrawingType.circle;
+ return true;
+ case R.id.draw_rect:
+ currentDrawabletype = DrawingType.rect;
+ return true;
+ case R.id.draw_animation:
+ currentDrawabletype = DrawingType.animation;
+ return true;
+ case R.id.draw_text:
+ currentDrawabletype = DrawingType.text;
+ return true;
+ default:
+ return super.onOptionsItemSelected(item);
+ }
+ }
}