blob: 5dc5fc3d1989feae7d1bac405b182819d70ce792 [file] [log] [blame]
/*
* Copyright (C) 2015 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.example.android.rs.vr.engine;
import android.util.Log;
import java.text.DecimalFormat;
/**
* code to manage transformations between world screen and volume space.
*/
public class Transform {
public final static char WORLD_SPACE = 0;
public final static char SCREEN_SPACE = 1;
public final static char VOLUME_SPACE = 2;
private static final String LOGTAG = "Transform";
Matrix[][] mAllMat = new Matrix[3][3];
public ViewMatrix mViewMatrix = new ViewMatrix();
float[] mVoxelDim = new float[3];
public void clone(Transform src) {
System.arraycopy(src.mVoxelDim, 0, mVoxelDim, 0, mVoxelDim.length);
mViewMatrix.clone(src.mViewMatrix);
updateAllMatrix();
}
public void updateAllMatrix() {
mViewMatrix.calcMatrix();
Matrix m = new Matrix();
m.setToUnit();
mAllMat[0][0] = m;
mAllMat[1][1] = m;
mAllMat[2][2] = m;
mAllMat[SCREEN_SPACE][WORLD_SPACE] = new Matrix(mViewMatrix);
mAllMat[WORLD_SPACE][SCREEN_SPACE] = mViewMatrix.invers();
m = new Matrix();
m.setToUnit();
if (mVoxelDim[0] > 0) {
int min = 0;
m.m[0] = 1 / mVoxelDim[0];
m.m[5] = 1 / mVoxelDim[1];
m.m[10] = 1 / mVoxelDim[2];
}
mAllMat[WORLD_SPACE][VOLUME_SPACE] = m;
mAllMat[VOLUME_SPACE][WORLD_SPACE] = m.invers();
mAllMat[SCREEN_SPACE][VOLUME_SPACE] = m = m.premult(mViewMatrix);
mAllMat[VOLUME_SPACE][SCREEN_SPACE] = m.invers();
}
public void setVoxelDim(float[] volDim) {
mVoxelDim[0] = volDim[0];
mVoxelDim[1] = volDim[1];
mVoxelDim[2] = volDim[2];
}
public Matrix getMatrix(char from, char to) {
return mAllMat[from][to];
}
public void setScreenDim(int x, int y) {
mViewMatrix.setScreenDim(x, y);
updateAllMatrix();
}
public double[] getLookPoint() {
return mViewMatrix.getLookPoint();
}
public void setLookPoint(double[] mLookPoint) {
mViewMatrix.setLookPoint(mLookPoint);
updateAllMatrix();
}
public double[] getEyePoint() {
return mViewMatrix.getEyePoint();
}
public void setEyePoint(double[] mEyePoint) {
mViewMatrix.setEyePoint(mEyePoint);
updateAllMatrix();
}
public double[] getUpVector() {
return mViewMatrix.getUpVector();
}
public void setUpVector(double[] mUpVector) {
mViewMatrix.setUpVector(mUpVector);
updateAllMatrix();
}
public double getScreenWidth() {
return mViewMatrix.getScreenWidth();
}
public void setScreenWidth(double screenWidth) {
mViewMatrix.setScreenWidth(screenWidth);
updateAllMatrix();
}
public void lookAt(TriData tri, int w, int h) {
mViewMatrix.lookAt(tri, mVoxelDim, w, h);
updateAllMatrix();
}
public void look(char dir, TriData tri, int w, int h) {
mViewMatrix.look(dir, tri, mVoxelDim, w, h);
updateAllMatrix();
}
public void trackBallUp(float x, float y) {
mViewMatrix.trackBallUP(x, y);
updateAllMatrix();
}
public void trackBallDown(float x, float y) {
mViewMatrix.trackBallDown(x, y);
}
public void trackBallMove(float x, float y) {
mViewMatrix.trackBallMove(x, y);
updateAllMatrix();
}
static DecimalFormat df = new DecimalFormat(" ##0.000");
private static String trim(double d) {
String s = df.format(d);
return s.substring(s.length() - 6);
}
public static void print(float[] d) {
String s = "";
for (int i = 0; i < d.length; i++) {
s += (((i == 0) ? "[ " : " , ") + trim(d[i]));
}
Log.v(LOGTAG, s + "]");
}
public static void main(String[] args) {
int[] voldim = {50, 50, 100};
double[] mEyePoint = {voldim[0] / 2., -voldim[1] / 2., voldim[2] / 2.};
double[] mLookPoint = {voldim[0] / 2., voldim[1] / 2., voldim[2] / 2.};
double[] mUpVector = {0., 0., 1.};
Transform t = new Transform();
t.mVoxelDim[0] = 1;
t.setEyePoint(mEyePoint);
t.setLookPoint(mLookPoint);
t.setUpVector(mUpVector);
t.setScreenDim(256, 256);
t.setScreenWidth(128);
t.updateAllMatrix();
Matrix m = t.getMatrix(SCREEN_SPACE, VOLUME_SPACE);
float[] orig = {.5f, .5f, 0};
float[] ret = new float[3];
m.mult3(orig, ret);
print(ret);
float[] look = {0, 0, 1};
m.mult3v(look, ret);
print(ret);
float[] up = {1, 0, 0};
m.mult3v(up, ret);
print(ret);
float[] right = {0, 1, 0};
m.mult3v(right, ret);
print(ret);
}
public void print() {
Log.v(LOGTAG, "==== =========== VIEW ========== ======");
mViewMatrix.print();
Log.v(LOGTAG, "==== SCREEN_SPACE to WORLD_SPACE ======");
mAllMat[SCREEN_SPACE][WORLD_SPACE].print();
Log.v(LOGTAG, "==== SCREEN_SPACE to VOLUME_SPACE ======");
mAllMat[SCREEN_SPACE][VOLUME_SPACE].print();
Log.v(LOGTAG, "==== WORLD_SPACE to VOLUME_SPACE ======");
mAllMat[WORLD_SPACE][VOLUME_SPACE].print();
Log.v(LOGTAG, "==== WORLD_SPACE to SCREEN_SPACE ======");
mAllMat[WORLD_SPACE][SCREEN_SPACE].print();
Log.v(LOGTAG, "==== VOLUME_SPACE to SCREEN_SPACE ======");
mAllMat[VOLUME_SPACE][SCREEN_SPACE].print();
Log.v(LOGTAG, "==== VOLUME_SPACE to WORLD_SPACE ======");
mAllMat[VOLUME_SPACE][WORLD_SPACE].print();
Log.v(LOGTAG, "=======================================");
}
}