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}