1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
|
package com.google.ar.core.examples.java.helloskar;
import android.graphics.Canvas;
import android.graphics.ColorFilter;
import android.graphics.Paint;
import android.graphics.RectF;
import com.google.skar.SkARMatrix;
import com.google.skar.SkARUtil;
import java.util.ArrayList;
public class DrawManager {
private float[] projectionMatrix = new float[16];
private float[] viewMatrix = new float[16];
private float[] viewportMatrix = new float[16];
private ColorFilter lightFilter;
public ArrayList<float[]> modelMatrices = new ArrayList<>();
public void updateViewportMatrix(float width, float height) {
viewportMatrix = SkARMatrix.createViewportMatrix(width, height);
}
public void updateProjectionMatrix(float[] projectionMatrix) {
this.projectionMatrix = projectionMatrix;
}
public void updateViewMatrix(float[] viewMatrix) {
this.viewMatrix = viewMatrix;
}
public void updateLightColorFilter(float[] colorCorr) {
lightFilter = SkARUtil.createLightCorrectionColorFilter(colorCorr);
}
public void drawCircle(Canvas canvas) {
if (modelMatrices.isEmpty()) {
return;
}
Paint p = new Paint();
p.setColorFilter(lightFilter);
p.setARGB(180, 100, 0, 0);
canvas.save();
canvas.setMatrix(SkARMatrix.createPerspectiveMatrix(modelMatrices.get(0),
viewMatrix, projectionMatrix, viewportMatrix));
canvas.drawCircle(0, 0, 0.1f, p);
canvas.restore();
}
public void drawRect(Canvas canvas) {
if (modelMatrices.isEmpty()) {
return;
}
Paint p = new Paint();
p.setColorFilter(lightFilter);
p.setARGB(180, 0, 0, 255);
canvas.save();
canvas.setMatrix(SkARMatrix.createPerspectiveMatrix(modelMatrices.get(0),
viewMatrix, projectionMatrix, viewportMatrix));
RectF rect = new RectF(0, 0, 0.2f, 0.2f);
canvas.drawRect(rect, p);
canvas.restore();
}
public void drawText(Canvas canvas, String text) {
if (modelMatrices.isEmpty()) {
return;
}
Paint p = new Paint();
float textSize = 100;
p.setColorFilter(lightFilter);
p.setARGB(255, 0, 255, 0);
p.setTextSize(textSize);
float[] scaleMatrix = getTextScaleMatrix(textSize);
float[] rotateMatrix = createXYtoXZRotationMatrix();
float[] actualModel = new float[16];
android.opengl.Matrix.setIdentityM(actualModel, 0);
android.opengl.Matrix.multiplyMM(actualModel, 0, scaleMatrix, 0, rotateMatrix, 0);
android.opengl.Matrix.multiplyMM(actualModel, 0, modelMatrices.get(0), 0, actualModel, 0);
canvas.save();
canvas.setMatrix(SkARMatrix.createPerspectiveMatrix(actualModel,
viewMatrix, projectionMatrix, viewportMatrix, false));
canvas.drawText(text, 0, 0, p);
canvas.restore();
}
private float[] getTextScaleMatrix(float size) {
float scaleFactor = 1 / (size * 10);
float[] initScale = new float[16];
android.opengl.Matrix.setIdentityM(initScale, 0);
android.opengl.Matrix.scaleM(initScale, 0, scaleFactor, scaleFactor, scaleFactor);
return initScale;
}
private float[] createXYtoXZRotationMatrix() {
float[] skiaRotation = new float[16];
android.opengl.Matrix.setIdentityM(skiaRotation, 0);
android.opengl.Matrix.rotateM(skiaRotation, 0, 90, 1, 0, 0);
return skiaRotation;
}
}
|