15b539461dcc159bd89297443780d635ccc5e3564John Hoford/*
25b539461dcc159bd89297443780d635ccc5e3564John Hoford * Copyright (C) 2015 The Android Open Source Project
35b539461dcc159bd89297443780d635ccc5e3564John Hoford *
45b539461dcc159bd89297443780d635ccc5e3564John Hoford * Licensed under the Apache License, Version 2.0 (the "License");
55b539461dcc159bd89297443780d635ccc5e3564John Hoford * you may not use this file except in compliance with the License.
65b539461dcc159bd89297443780d635ccc5e3564John Hoford * You may obtain a copy of the License at
75b539461dcc159bd89297443780d635ccc5e3564John Hoford *
85b539461dcc159bd89297443780d635ccc5e3564John Hoford *      http://www.apache.org/licenses/LICENSE-2.0
95b539461dcc159bd89297443780d635ccc5e3564John Hoford *
105b539461dcc159bd89297443780d635ccc5e3564John Hoford * Unless required by applicable law or agreed to in writing, software
115b539461dcc159bd89297443780d635ccc5e3564John Hoford * distributed under the License is distributed on an "AS IS" BASIS,
125b539461dcc159bd89297443780d635ccc5e3564John Hoford * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
135b539461dcc159bd89297443780d635ccc5e3564John Hoford * See the License for the specific language governing permissions and
145b539461dcc159bd89297443780d635ccc5e3564John Hoford * limitations under the License.
155b539461dcc159bd89297443780d635ccc5e3564John Hoford */
165b539461dcc159bd89297443780d635ccc5e3564John Hoford
175b539461dcc159bd89297443780d635ccc5e3564John Hofordpackage com.example.android.rs.vr.engine;
185b539461dcc159bd89297443780d635ccc5e3564John Hoford
195b539461dcc159bd89297443780d635ccc5e3564John Hofordimport android.util.Log;
205b539461dcc159bd89297443780d635ccc5e3564John Hoford
215b539461dcc159bd89297443780d635ccc5e3564John Hofordimport java.text.DecimalFormat;
225b539461dcc159bd89297443780d635ccc5e3564John Hoford
235b539461dcc159bd89297443780d635ccc5e3564John Hoford/**
245b539461dcc159bd89297443780d635ccc5e3564John Hoford * code to manage transformations between world screen and volume space.
255b539461dcc159bd89297443780d635ccc5e3564John Hoford */
265b539461dcc159bd89297443780d635ccc5e3564John Hofordpublic class Transform {
275b539461dcc159bd89297443780d635ccc5e3564John Hoford    public final static char WORLD_SPACE = 0;
285b539461dcc159bd89297443780d635ccc5e3564John Hoford    public final static char SCREEN_SPACE = 1;
295b539461dcc159bd89297443780d635ccc5e3564John Hoford    public final static char VOLUME_SPACE = 2;
305b539461dcc159bd89297443780d635ccc5e3564John Hoford    private static final String LOGTAG = "Transform";
315b539461dcc159bd89297443780d635ccc5e3564John Hoford
325b539461dcc159bd89297443780d635ccc5e3564John Hoford    Matrix[][] mAllMat = new Matrix[3][3];
335b539461dcc159bd89297443780d635ccc5e3564John Hoford    public ViewMatrix mViewMatrix = new ViewMatrix();
345b539461dcc159bd89297443780d635ccc5e3564John Hoford    float[] mVoxelDim = new float[3];
355b539461dcc159bd89297443780d635ccc5e3564John Hoford
365b539461dcc159bd89297443780d635ccc5e3564John Hoford    public void clone(Transform src) {
375b539461dcc159bd89297443780d635ccc5e3564John Hoford        System.arraycopy(src.mVoxelDim, 0, mVoxelDim, 0, mVoxelDim.length);
385b539461dcc159bd89297443780d635ccc5e3564John Hoford        mViewMatrix.clone(src.mViewMatrix);
395b539461dcc159bd89297443780d635ccc5e3564John Hoford        updateAllMatrix();
405b539461dcc159bd89297443780d635ccc5e3564John Hoford    }
415b539461dcc159bd89297443780d635ccc5e3564John Hoford
425b539461dcc159bd89297443780d635ccc5e3564John Hoford    public void updateAllMatrix() {
435b539461dcc159bd89297443780d635ccc5e3564John Hoford        mViewMatrix.calcMatrix();
445b539461dcc159bd89297443780d635ccc5e3564John Hoford        Matrix m = new Matrix();
455b539461dcc159bd89297443780d635ccc5e3564John Hoford        m.setToUnit();
465b539461dcc159bd89297443780d635ccc5e3564John Hoford        mAllMat[0][0] = m;
475b539461dcc159bd89297443780d635ccc5e3564John Hoford        mAllMat[1][1] = m;
485b539461dcc159bd89297443780d635ccc5e3564John Hoford        mAllMat[2][2] = m;
495b539461dcc159bd89297443780d635ccc5e3564John Hoford        mAllMat[SCREEN_SPACE][WORLD_SPACE] = new Matrix(mViewMatrix);
505b539461dcc159bd89297443780d635ccc5e3564John Hoford        mAllMat[WORLD_SPACE][SCREEN_SPACE] = mViewMatrix.invers();
515b539461dcc159bd89297443780d635ccc5e3564John Hoford        m = new Matrix();
525b539461dcc159bd89297443780d635ccc5e3564John Hoford        m.setToUnit();
535b539461dcc159bd89297443780d635ccc5e3564John Hoford        if (mVoxelDim[0] > 0) {
545b539461dcc159bd89297443780d635ccc5e3564John Hoford            int min = 0;
555b539461dcc159bd89297443780d635ccc5e3564John Hoford
565b539461dcc159bd89297443780d635ccc5e3564John Hoford            m.m[0] = 1 / mVoxelDim[0];
575b539461dcc159bd89297443780d635ccc5e3564John Hoford            m.m[5] = 1 / mVoxelDim[1];
585b539461dcc159bd89297443780d635ccc5e3564John Hoford            m.m[10] = 1 / mVoxelDim[2];
595b539461dcc159bd89297443780d635ccc5e3564John Hoford        }
605b539461dcc159bd89297443780d635ccc5e3564John Hoford        mAllMat[WORLD_SPACE][VOLUME_SPACE] = m;
615b539461dcc159bd89297443780d635ccc5e3564John Hoford        mAllMat[VOLUME_SPACE][WORLD_SPACE] = m.invers();
625b539461dcc159bd89297443780d635ccc5e3564John Hoford        mAllMat[SCREEN_SPACE][VOLUME_SPACE] = m = m.premult(mViewMatrix);
635b539461dcc159bd89297443780d635ccc5e3564John Hoford        mAllMat[VOLUME_SPACE][SCREEN_SPACE] = m.invers();
645b539461dcc159bd89297443780d635ccc5e3564John Hoford
655b539461dcc159bd89297443780d635ccc5e3564John Hoford    }
665b539461dcc159bd89297443780d635ccc5e3564John Hoford
675b539461dcc159bd89297443780d635ccc5e3564John Hoford    public void setVoxelDim(float[] volDim) {
685b539461dcc159bd89297443780d635ccc5e3564John Hoford        mVoxelDim[0] = volDim[0];
695b539461dcc159bd89297443780d635ccc5e3564John Hoford        mVoxelDim[1] = volDim[1];
705b539461dcc159bd89297443780d635ccc5e3564John Hoford        mVoxelDim[2] = volDim[2];
715b539461dcc159bd89297443780d635ccc5e3564John Hoford    }
725b539461dcc159bd89297443780d635ccc5e3564John Hoford
735b539461dcc159bd89297443780d635ccc5e3564John Hoford    public Matrix getMatrix(char from, char to) {
745b539461dcc159bd89297443780d635ccc5e3564John Hoford        return mAllMat[from][to];
755b539461dcc159bd89297443780d635ccc5e3564John Hoford    }
765b539461dcc159bd89297443780d635ccc5e3564John Hoford
775b539461dcc159bd89297443780d635ccc5e3564John Hoford    public void setScreenDim(int x, int y) {
785b539461dcc159bd89297443780d635ccc5e3564John Hoford        mViewMatrix.setScreenDim(x, y);
795b539461dcc159bd89297443780d635ccc5e3564John Hoford        updateAllMatrix();
805b539461dcc159bd89297443780d635ccc5e3564John Hoford    }
815b539461dcc159bd89297443780d635ccc5e3564John Hoford
825b539461dcc159bd89297443780d635ccc5e3564John Hoford    public double[] getLookPoint() {
835b539461dcc159bd89297443780d635ccc5e3564John Hoford        return mViewMatrix.getLookPoint();
845b539461dcc159bd89297443780d635ccc5e3564John Hoford    }
855b539461dcc159bd89297443780d635ccc5e3564John Hoford
865b539461dcc159bd89297443780d635ccc5e3564John Hoford    public void setLookPoint(double[] mLookPoint) {
875b539461dcc159bd89297443780d635ccc5e3564John Hoford        mViewMatrix.setLookPoint(mLookPoint);
885b539461dcc159bd89297443780d635ccc5e3564John Hoford        updateAllMatrix();
895b539461dcc159bd89297443780d635ccc5e3564John Hoford    }
905b539461dcc159bd89297443780d635ccc5e3564John Hoford
915b539461dcc159bd89297443780d635ccc5e3564John Hoford    public double[] getEyePoint() {
925b539461dcc159bd89297443780d635ccc5e3564John Hoford        return mViewMatrix.getEyePoint();
935b539461dcc159bd89297443780d635ccc5e3564John Hoford    }
945b539461dcc159bd89297443780d635ccc5e3564John Hoford
955b539461dcc159bd89297443780d635ccc5e3564John Hoford    public void setEyePoint(double[] mEyePoint) {
965b539461dcc159bd89297443780d635ccc5e3564John Hoford        mViewMatrix.setEyePoint(mEyePoint);
975b539461dcc159bd89297443780d635ccc5e3564John Hoford        updateAllMatrix();
985b539461dcc159bd89297443780d635ccc5e3564John Hoford    }
995b539461dcc159bd89297443780d635ccc5e3564John Hoford
1005b539461dcc159bd89297443780d635ccc5e3564John Hoford    public double[] getUpVector() {
1015b539461dcc159bd89297443780d635ccc5e3564John Hoford        return mViewMatrix.getUpVector();
1025b539461dcc159bd89297443780d635ccc5e3564John Hoford    }
1035b539461dcc159bd89297443780d635ccc5e3564John Hoford
1045b539461dcc159bd89297443780d635ccc5e3564John Hoford    public void setUpVector(double[] mUpVector) {
1055b539461dcc159bd89297443780d635ccc5e3564John Hoford        mViewMatrix.setUpVector(mUpVector);
1065b539461dcc159bd89297443780d635ccc5e3564John Hoford        updateAllMatrix();
1075b539461dcc159bd89297443780d635ccc5e3564John Hoford    }
1085b539461dcc159bd89297443780d635ccc5e3564John Hoford
1095b539461dcc159bd89297443780d635ccc5e3564John Hoford    public double getScreenWidth() {
1105b539461dcc159bd89297443780d635ccc5e3564John Hoford        return mViewMatrix.getScreenWidth();
1115b539461dcc159bd89297443780d635ccc5e3564John Hoford    }
1125b539461dcc159bd89297443780d635ccc5e3564John Hoford
1135b539461dcc159bd89297443780d635ccc5e3564John Hoford    public void setScreenWidth(double screenWidth) {
1145b539461dcc159bd89297443780d635ccc5e3564John Hoford        mViewMatrix.setScreenWidth(screenWidth);
1155b539461dcc159bd89297443780d635ccc5e3564John Hoford        updateAllMatrix();
1165b539461dcc159bd89297443780d635ccc5e3564John Hoford    }
1175b539461dcc159bd89297443780d635ccc5e3564John Hoford
1185b539461dcc159bd89297443780d635ccc5e3564John Hoford    public void lookAt(TriData tri, int w, int h) {
1195b539461dcc159bd89297443780d635ccc5e3564John Hoford        mViewMatrix.lookAt(tri, mVoxelDim, w, h);
1205b539461dcc159bd89297443780d635ccc5e3564John Hoford        updateAllMatrix();
1215b539461dcc159bd89297443780d635ccc5e3564John Hoford    }
1225b539461dcc159bd89297443780d635ccc5e3564John Hoford
1235b539461dcc159bd89297443780d635ccc5e3564John Hoford    public void look(char dir, TriData tri, int w, int h) {
1245b539461dcc159bd89297443780d635ccc5e3564John Hoford        mViewMatrix.look(dir, tri, mVoxelDim, w, h);
1255b539461dcc159bd89297443780d635ccc5e3564John Hoford        updateAllMatrix();
1265b539461dcc159bd89297443780d635ccc5e3564John Hoford    }
1275b539461dcc159bd89297443780d635ccc5e3564John Hoford
1285b539461dcc159bd89297443780d635ccc5e3564John Hoford    public void trackBallUp(float x, float y) {
1295b539461dcc159bd89297443780d635ccc5e3564John Hoford        mViewMatrix.trackBallUP(x, y);
1305b539461dcc159bd89297443780d635ccc5e3564John Hoford        updateAllMatrix();
1315b539461dcc159bd89297443780d635ccc5e3564John Hoford    }
1325b539461dcc159bd89297443780d635ccc5e3564John Hoford
1335b539461dcc159bd89297443780d635ccc5e3564John Hoford    public void trackBallDown(float x, float y) {
1345b539461dcc159bd89297443780d635ccc5e3564John Hoford        mViewMatrix.trackBallDown(x, y);
1355b539461dcc159bd89297443780d635ccc5e3564John Hoford    }
1365b539461dcc159bd89297443780d635ccc5e3564John Hoford
1375b539461dcc159bd89297443780d635ccc5e3564John Hoford    public void trackBallMove(float x, float y) {
1385b539461dcc159bd89297443780d635ccc5e3564John Hoford        mViewMatrix.trackBallMove(x, y);
1395b539461dcc159bd89297443780d635ccc5e3564John Hoford        updateAllMatrix();
1405b539461dcc159bd89297443780d635ccc5e3564John Hoford    }
1415b539461dcc159bd89297443780d635ccc5e3564John Hoford
1425b539461dcc159bd89297443780d635ccc5e3564John Hoford    static DecimalFormat df = new DecimalFormat("      ##0.000");
1435b539461dcc159bd89297443780d635ccc5e3564John Hoford
1445b539461dcc159bd89297443780d635ccc5e3564John Hoford    private static String trim(double d) {
1455b539461dcc159bd89297443780d635ccc5e3564John Hoford        String s = df.format(d);
1465b539461dcc159bd89297443780d635ccc5e3564John Hoford        return s.substring(s.length() - 6);
1475b539461dcc159bd89297443780d635ccc5e3564John Hoford    }
1485b539461dcc159bd89297443780d635ccc5e3564John Hoford
1495b539461dcc159bd89297443780d635ccc5e3564John Hoford    public static void print(float[] d) {
1505b539461dcc159bd89297443780d635ccc5e3564John Hoford        String s = "";
1515b539461dcc159bd89297443780d635ccc5e3564John Hoford        for (int i = 0; i < d.length; i++) {
1525b539461dcc159bd89297443780d635ccc5e3564John Hoford            s += (((i == 0) ? "[ " : " , ") + trim(d[i]));
1535b539461dcc159bd89297443780d635ccc5e3564John Hoford        }
1545b539461dcc159bd89297443780d635ccc5e3564John Hoford        Log.v(LOGTAG, s + "]");
1555b539461dcc159bd89297443780d635ccc5e3564John Hoford    }
1565b539461dcc159bd89297443780d635ccc5e3564John Hoford
1575b539461dcc159bd89297443780d635ccc5e3564John Hoford    public static void main(String[] args) {
1585b539461dcc159bd89297443780d635ccc5e3564John Hoford        int[] voldim = {50, 50, 100};
1595b539461dcc159bd89297443780d635ccc5e3564John Hoford        double[] mEyePoint = {voldim[0] / 2., -voldim[1] / 2., voldim[2] / 2.};
1605b539461dcc159bd89297443780d635ccc5e3564John Hoford        double[] mLookPoint = {voldim[0] / 2., voldim[1] / 2., voldim[2] / 2.};
1615b539461dcc159bd89297443780d635ccc5e3564John Hoford        double[] mUpVector = {0., 0., 1.};
1625b539461dcc159bd89297443780d635ccc5e3564John Hoford
1635b539461dcc159bd89297443780d635ccc5e3564John Hoford        Transform t = new Transform();
1645b539461dcc159bd89297443780d635ccc5e3564John Hoford        t.mVoxelDim[0] = 1;
1655b539461dcc159bd89297443780d635ccc5e3564John Hoford        t.setEyePoint(mEyePoint);
1665b539461dcc159bd89297443780d635ccc5e3564John Hoford        t.setLookPoint(mLookPoint);
1675b539461dcc159bd89297443780d635ccc5e3564John Hoford        t.setUpVector(mUpVector);
1685b539461dcc159bd89297443780d635ccc5e3564John Hoford        t.setScreenDim(256, 256);
1695b539461dcc159bd89297443780d635ccc5e3564John Hoford        t.setScreenWidth(128);
1705b539461dcc159bd89297443780d635ccc5e3564John Hoford        t.updateAllMatrix();
1715b539461dcc159bd89297443780d635ccc5e3564John Hoford
1725b539461dcc159bd89297443780d635ccc5e3564John Hoford        Matrix m = t.getMatrix(SCREEN_SPACE, VOLUME_SPACE);
1735b539461dcc159bd89297443780d635ccc5e3564John Hoford        float[] orig = {.5f, .5f, 0};
1745b539461dcc159bd89297443780d635ccc5e3564John Hoford        float[] ret = new float[3];
1755b539461dcc159bd89297443780d635ccc5e3564John Hoford
1765b539461dcc159bd89297443780d635ccc5e3564John Hoford        m.mult3(orig, ret);
1775b539461dcc159bd89297443780d635ccc5e3564John Hoford        print(ret);
1785b539461dcc159bd89297443780d635ccc5e3564John Hoford        float[] look = {0, 0, 1};
1795b539461dcc159bd89297443780d635ccc5e3564John Hoford        m.mult3v(look, ret);
1805b539461dcc159bd89297443780d635ccc5e3564John Hoford        print(ret);
1815b539461dcc159bd89297443780d635ccc5e3564John Hoford        float[] up = {1, 0, 0};
1825b539461dcc159bd89297443780d635ccc5e3564John Hoford        m.mult3v(up, ret);
1835b539461dcc159bd89297443780d635ccc5e3564John Hoford        print(ret);
1845b539461dcc159bd89297443780d635ccc5e3564John Hoford        float[] right = {0, 1, 0};
1855b539461dcc159bd89297443780d635ccc5e3564John Hoford        m.mult3v(right, ret);
1865b539461dcc159bd89297443780d635ccc5e3564John Hoford        print(ret);
1875b539461dcc159bd89297443780d635ccc5e3564John Hoford
1885b539461dcc159bd89297443780d635ccc5e3564John Hoford    }
1895b539461dcc159bd89297443780d635ccc5e3564John Hoford
1905b539461dcc159bd89297443780d635ccc5e3564John Hoford    public void print() {
1915b539461dcc159bd89297443780d635ccc5e3564John Hoford        Log.v(LOGTAG, "==== =========== VIEW ========== ======");
1925b539461dcc159bd89297443780d635ccc5e3564John Hoford
1935b539461dcc159bd89297443780d635ccc5e3564John Hoford        mViewMatrix.print();
1945b539461dcc159bd89297443780d635ccc5e3564John Hoford        Log.v(LOGTAG, "==== SCREEN_SPACE to WORLD_SPACE ======");
1955b539461dcc159bd89297443780d635ccc5e3564John Hoford        mAllMat[SCREEN_SPACE][WORLD_SPACE].print();
1965b539461dcc159bd89297443780d635ccc5e3564John Hoford        Log.v(LOGTAG, "==== SCREEN_SPACE to VOLUME_SPACE ======");
1975b539461dcc159bd89297443780d635ccc5e3564John Hoford        mAllMat[SCREEN_SPACE][VOLUME_SPACE].print();
1985b539461dcc159bd89297443780d635ccc5e3564John Hoford        Log.v(LOGTAG, "==== WORLD_SPACE to VOLUME_SPACE ======");
1995b539461dcc159bd89297443780d635ccc5e3564John Hoford        mAllMat[WORLD_SPACE][VOLUME_SPACE].print();
2005b539461dcc159bd89297443780d635ccc5e3564John Hoford        Log.v(LOGTAG, "==== WORLD_SPACE to SCREEN_SPACE ======");
2015b539461dcc159bd89297443780d635ccc5e3564John Hoford        mAllMat[WORLD_SPACE][SCREEN_SPACE].print();
2025b539461dcc159bd89297443780d635ccc5e3564John Hoford        Log.v(LOGTAG, "==== VOLUME_SPACE to SCREEN_SPACE ======");
2035b539461dcc159bd89297443780d635ccc5e3564John Hoford        mAllMat[VOLUME_SPACE][SCREEN_SPACE].print();
2045b539461dcc159bd89297443780d635ccc5e3564John Hoford        Log.v(LOGTAG, "==== VOLUME_SPACE to WORLD_SPACE ======");
2055b539461dcc159bd89297443780d635ccc5e3564John Hoford        mAllMat[VOLUME_SPACE][WORLD_SPACE].print();
2065b539461dcc159bd89297443780d635ccc5e3564John Hoford        Log.v(LOGTAG, "=======================================");
2075b539461dcc159bd89297443780d635ccc5e3564John Hoford    }
2085b539461dcc159bd89297443780d635ccc5e3564John Hoford}