aboutsummaryrefslogtreecommitdiffhomepage
path: root/platform_tools/android/apps/skar_java/src/main/java/com/google/skar/SkARFingerPainting.java
diff options
context:
space:
mode:
Diffstat (limited to 'platform_tools/android/apps/skar_java/src/main/java/com/google/skar/SkARFingerPainting.java')
-rw-r--r--platform_tools/android/apps/skar_java/src/main/java/com/google/skar/SkARFingerPainting.java124
1 files changed, 93 insertions, 31 deletions
diff --git a/platform_tools/android/apps/skar_java/src/main/java/com/google/skar/SkARFingerPainting.java b/platform_tools/android/apps/skar_java/src/main/java/com/google/skar/SkARFingerPainting.java
index c93a900f58..e28037dc33 100644
--- a/platform_tools/android/apps/skar_java/src/main/java/com/google/skar/SkARFingerPainting.java
+++ b/platform_tools/android/apps/skar_java/src/main/java/com/google/skar/SkARFingerPainting.java
@@ -1,16 +1,25 @@
package com.google.skar;
+import android.graphics.Color;
import android.graphics.Path;
import android.graphics.PointF;
+import android.util.Log;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Map;
import java.util.ArrayList;
public class SkARFingerPainting {
// Points obtained by touching the screen. The first point is always brough to (0,0).
// All subsequent points are translated by the same amount.
- public ArrayList<PointF> points = new ArrayList<>();
-
- public Path path = new Path();
+ private ArrayList<PointF> points = new ArrayList<>();
+ private ArrayList<Integer> jumpPoints = new ArrayList<>();
+ private Map<Integer, Integer> indexColors = new HashMap<>();
+ private Map<Path, Integer> pathColors = new HashMap<>();
+ private ArrayList<Path> paths = new ArrayList<>();
+ private int color = Color.RED;
// Previous point added to the path. This points belongs to the path in local space.
public PointF previousPoint;
@@ -34,49 +43,87 @@ public class SkARFingerPainting {
}
// Adds another point to the path in Local space
- public void addPoint(PointF p) {
+ public void addPoint(PointF p, boolean jumpPoint) {
points.add(p);
+ if (jumpPoint) {
+ Log.i("Jumped!", Integer.toString(points.size() - 1));
+ jumpPoints.add(points.size() - 1);
+ indexColors.put(points.size() - 1, color);
+ }
previousPoint = p;
}
// Used to build a path before rendering it
public void buildPath() {
- if (points.size() < 1) {
+ paths = new ArrayList<>();
+ if (points.size() <= 1) {
return;
}
- path = new Path();
+
if (isSmooth) {
- // If less than 3 points, than draw a line between the two points
- if (points.size() <= 2 && points.size() > 0) {
- path.moveTo(points.get(0).x, points.get(0).y);
- path.lineTo(points.get(1).x, points.get(1).y);
- } else if (points.size() >= 3){
- // Else, essentially run deCasteljau
- path.moveTo(points.get(0).x, points.get(0).y);
- PointF mid = new PointF((points.get(0).x + points.get(1).x) / 2,
- (points.get(0).y + points.get(1).y) / 2);
- path.lineTo(mid.x, mid.y);
-
- for (int i = 1; i < points.size() - 1; i++) {
- PointF p1 = points.get(i);
- PointF p2 = points.get(i + 1);
- PointF midP = new PointF((p1.x + p2.x) / 2,(p1.y + p2.y) / 2);
- path.quadTo(p1.x, p1.y, midP.x, midP.y);
- }
-
- path.lineTo(points.get(points.size() - 1).x, points.get(points.size() - 1).y);
+ int start = 0;
+ for (int j = 1; j < jumpPoints.size(); j++) {
+
+ int finish = jumpPoints.get(j);
+ buildSmoothFromTo(start, finish);
+ start = finish;
}
+
+ buildSmoothFromTo(start, points.size());
} else {
- path.moveTo(points.get(0).x, points.get(0).y);
- for (int i = 1; i < points.size(); i++) {
- path.lineTo(points.get(i).x, points.get(i).y);
+
+ int start = 0;
+ for (int j = 1; j < jumpPoints.size(); j++) {
+ int finish = jumpPoints.get(j);
+ buildRoughFromTo(start, finish);
+ start = finish;
}
+
+ buildRoughFromTo(start, points.size());
+ }
+ }
+
+ private void buildRoughFromTo(int start, int finish) {
+ Path p = new Path();
+ int c = indexColors.get(start);
+ p.moveTo(points.get(start).x, points.get(start).y);
+ for (int i = start + 1; i < finish; i++) {
+ p.lineTo(points.get(i).x, points.get(i).y);
}
+ paths.add(p);
+ pathColors.put(p, c);
+ }
+
+ private void buildSmoothFromTo(int start, int finish) {
+ Path p = new Path();
+ int c = indexColors.get(start);
+ int nbPts = finish - start;
+ // If less than 3 points, than draw a line between the two points
+ if (nbPts <= 2 && nbPts > 1) {
+ p.moveTo(points.get(start).x, points.get(start).y);
+ p.lineTo(points.get(start + 1).x, points.get(start + 1).y);
+ } else if (nbPts >= 3){
+ // Else, essentially run deCasteljau
+ p.moveTo(points.get(start).x, points.get(start).y);
+ PointF mid = new PointF((points.get(start).x + points.get(start + 1).x) / 2,
+ (points.get(start).y + points.get(start + 1).y) / 2);
+ p.lineTo(mid.x, mid.y);
+
+ for (int i = start + 1; i < finish - 1; i++) {
+ PointF p1 = points.get(i);
+ PointF p2 = points.get(i + 1);
+ p.quadTo(p1.x, p1.y, (p1.x + p2.x) / 2, (p1.y + p2.y) / 2);
+ }
+
+ p.lineTo(points.get(finish - 1).x, points.get(finish - 1).y);
+ }
+ paths.add(p);
+ pathColors.put(p, c);
}
public boolean isEmpty() {
- return path.isEmpty();
+ return points.isEmpty();
}
public float[] getModelMatrix() {
@@ -87,8 +134,23 @@ public class SkARFingerPainting {
modelMatrix = m;
}
+ public void setColor(int color) {
+ this.color = color;
+ }
+
+ public int getPathColor(Path p) {
+ return pathColors.get(p);
+ }
+
+ public ArrayList<Path> getPaths() {
+ return paths;
+ }
+
public void reset() {
- points = new ArrayList<>();
- path = new Path();
+ points.clear();
+ jumpPoints.clear();
+ paths.clear();
+ pathColors.clear();
+ indexColors.clear();
}
}