aboutsummaryrefslogtreecommitdiffhomepage
path: root/platform_tools/android/apps/skar_java/src/main/java/com/google/ar/core/examples/java/helloskar/DrawManager.java
blob: bf85a767c2ba3545d22de0e596c55c5574ac593a (plain)
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;
    }
}