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; 185b539461dcc159bd89297443780d635ccc5e3564John Hoford 195b539461dcc159bd89297443780d635ccc5e3564John Hofordimport android.content.Context; 205b539461dcc159bd89297443780d635ccc5e3564John Hofordimport android.graphics.Color; 215b539461dcc159bd89297443780d635ccc5e3564John Hofordimport android.graphics.Paint; 225b539461dcc159bd89297443780d635ccc5e3564John Hofordimport android.graphics.SurfaceTexture; 235b539461dcc159bd89297443780d635ccc5e3564John Hofordimport android.os.AsyncTask; 245b539461dcc159bd89297443780d635ccc5e3564John Hofordimport android.renderscript.RenderScript; 255b539461dcc159bd89297443780d635ccc5e3564John Hofordimport android.util.AttributeSet; 265b539461dcc159bd89297443780d635ccc5e3564John Hofordimport android.util.Log; 275b539461dcc159bd89297443780d635ccc5e3564John Hofordimport android.view.MotionEvent; 285b539461dcc159bd89297443780d635ccc5e3564John Hofordimport android.view.ScaleGestureDetector; 295b539461dcc159bd89297443780d635ccc5e3564John Hofordimport android.view.Surface; 305b539461dcc159bd89297443780d635ccc5e3564John Hofordimport android.view.TextureView; 315b539461dcc159bd89297443780d635ccc5e3564John Hoford 325b539461dcc159bd89297443780d635ccc5e3564John Hofordimport com.example.android.rs.vr.engine.Cube; 335b539461dcc159bd89297443780d635ccc5e3564John Hofordimport com.example.android.rs.vr.engine.Pipeline; 345b539461dcc159bd89297443780d635ccc5e3564John Hofordimport com.example.android.rs.vr.engine.RsBrickedBitMask; 355b539461dcc159bd89297443780d635ccc5e3564John Hofordimport com.example.android.rs.vr.engine.TriData; 365b539461dcc159bd89297443780d635ccc5e3564John Hofordimport com.example.android.rs.vr.engine.VectorUtil; 375b539461dcc159bd89297443780d635ccc5e3564John Hofordimport com.example.android.rs.vr.engine.ViewMatrix; 385b539461dcc159bd89297443780d635ccc5e3564John Hofordimport com.example.android.rs.vr.engine.Volume; 395b539461dcc159bd89297443780d635ccc5e3564John Hofordimport com.example.android.rs.vr.engine.VrPipline1; 405b539461dcc159bd89297443780d635ccc5e3564John Hofordimport com.example.android.rs.vr.engine.VrState; 415b539461dcc159bd89297443780d635ccc5e3564John Hoford 425b539461dcc159bd89297443780d635ccc5e3564John Hofordimport java.util.Arrays; 435b539461dcc159bd89297443780d635ccc5e3564John Hoford 445b539461dcc159bd89297443780d635ccc5e3564John Hoford/** 455b539461dcc159bd89297443780d635ccc5e3564John Hoford * VrView runs a volume rendering on the screen 465b539461dcc159bd89297443780d635ccc5e3564John Hoford */ 475b539461dcc159bd89297443780d635ccc5e3564John Hofordpublic class VrView extends TextureView { 485b539461dcc159bd89297443780d635ccc5e3564John Hoford private static final String LOGTAG = "rsexample.google.com.vrdemo"; 495b539461dcc159bd89297443780d635ccc5e3564John Hoford private Pipeline mPipline = new VrPipline1();//BasicPipline(); 505b539461dcc159bd89297443780d635ccc5e3564John Hoford // private VrState mState4 = new VrState(); // for down sampled 515b539461dcc159bd89297443780d635ccc5e3564John Hoford private VrState mState1 = new VrState(); // for full res version 525b539461dcc159bd89297443780d635ccc5e3564John Hoford private VrState mStateLow = new VrState(); // for full res version 535b539461dcc159bd89297443780d635ccc5e3564John Hoford private VrState mLastDrawn = new VrState(); // for full res version 545b539461dcc159bd89297443780d635ccc5e3564John Hoford private Paint paint = new Paint(); 555b539461dcc159bd89297443780d635ccc5e3564John Hoford private SurfaceTexture mSurfaceTexture; 565b539461dcc159bd89297443780d635ccc5e3564John Hoford private Surface mSurface; 575b539461dcc159bd89297443780d635ccc5e3564John Hoford ///private Size mImageViewSize; 585b539461dcc159bd89297443780d635ccc5e3564John Hoford private int refresh = 0; // 0 is no refresh else refresh = downsample 595b539461dcc159bd89297443780d635ccc5e3564John Hoford int mPreviousMode = -1; 605b539461dcc159bd89297443780d635ccc5e3564John Hoford int last_look = 0; 615b539461dcc159bd89297443780d635ccc5e3564John Hoford 625b539461dcc159bd89297443780d635ccc5e3564John Hoford // int mDownSample = 4; 635b539461dcc159bd89297443780d635ccc5e3564John Hoford private final char[] looks = { 645b539461dcc159bd89297443780d635ccc5e3564John Hoford ViewMatrix.UP_AT, 655b539461dcc159bd89297443780d635ccc5e3564John Hoford ViewMatrix.DOWN_AT, 665b539461dcc159bd89297443780d635ccc5e3564John Hoford ViewMatrix.RIGHT_AT, 675b539461dcc159bd89297443780d635ccc5e3564John Hoford ViewMatrix.LEFT_AT, 685b539461dcc159bd89297443780d635ccc5e3564John Hoford ViewMatrix.FORWARD_AT, 695b539461dcc159bd89297443780d635ccc5e3564John Hoford ViewMatrix.BEHIND_AT}; 705b539461dcc159bd89297443780d635ccc5e3564John Hoford private byte mMode = ROTATE_MODE; 715b539461dcc159bd89297443780d635ccc5e3564John Hoford private ScaleGestureDetector mScaleDetector; 725b539461dcc159bd89297443780d635ccc5e3564John Hoford private boolean mInScale; 735b539461dcc159bd89297443780d635ccc5e3564John Hoford 745b539461dcc159bd89297443780d635ccc5e3564John Hoford public static final byte ROTATE_MODE = 1; 755b539461dcc159bd89297443780d635ccc5e3564John Hoford public static final byte CUT_X_MODE = 2; 765b539461dcc159bd89297443780d635ccc5e3564John Hoford public static final byte CUT_Y_MODE = 3; 775b539461dcc159bd89297443780d635ccc5e3564John Hoford public static final byte CUT_Z_MODE = 4; 785b539461dcc159bd89297443780d635ccc5e3564John Hoford 795b539461dcc159bd89297443780d635ccc5e3564John Hoford public void setMode(byte mode) { 805b539461dcc159bd89297443780d635ccc5e3564John Hoford mMode = mode; 815b539461dcc159bd89297443780d635ccc5e3564John Hoford } 825b539461dcc159bd89297443780d635ccc5e3564John Hoford 835b539461dcc159bd89297443780d635ccc5e3564John Hoford private float mDownPointX; 845b539461dcc159bd89297443780d635ccc5e3564John Hoford private float mDownPointY; 855b539461dcc159bd89297443780d635ccc5e3564John Hoford private double mDownScreenWidth; 865b539461dcc159bd89297443780d635ccc5e3564John Hoford private double[] mDownLookPoint = new double[3]; 875b539461dcc159bd89297443780d635ccc5e3564John Hoford private double[] mDownEyePoint = new double[3]; 885b539461dcc159bd89297443780d635ccc5e3564John Hoford private double[] mDownUpVector = new double[3]; 895b539461dcc159bd89297443780d635ccc5e3564John Hoford private double[] mDownRightVector = new double[3]; 905b539461dcc159bd89297443780d635ccc5e3564John Hoford private float[] mCurrentTrim = new float[6]; 915b539461dcc159bd89297443780d635ccc5e3564John Hoford VrRenderTesk mRenderTesk; 925b539461dcc159bd89297443780d635ccc5e3564John Hoford VrBinGridTask mBinGridTask; 935b539461dcc159bd89297443780d635ccc5e3564John Hoford 945b539461dcc159bd89297443780d635ccc5e3564John Hoford public VrView(Context context) { 955b539461dcc159bd89297443780d635ccc5e3564John Hoford super(context); 965b539461dcc159bd89297443780d635ccc5e3564John Hoford setup(context); 975b539461dcc159bd89297443780d635ccc5e3564John Hoford paint.setFilterBitmap(true); 985b539461dcc159bd89297443780d635ccc5e3564John Hoford } 995b539461dcc159bd89297443780d635ccc5e3564John Hoford 1005b539461dcc159bd89297443780d635ccc5e3564John Hoford public VrView(Context context, AttributeSet attrs) { 1015b539461dcc159bd89297443780d635ccc5e3564John Hoford super(context, attrs); 1025b539461dcc159bd89297443780d635ccc5e3564John Hoford setup(context); 1035b539461dcc159bd89297443780d635ccc5e3564John Hoford } 1045b539461dcc159bd89297443780d635ccc5e3564John Hoford 1055b539461dcc159bd89297443780d635ccc5e3564John Hoford 1065b539461dcc159bd89297443780d635ccc5e3564John Hoford public VrView(Context context, AttributeSet attrs, int defStyleAttr) { 1075b539461dcc159bd89297443780d635ccc5e3564John Hoford super(context, attrs, defStyleAttr); 1085b539461dcc159bd89297443780d635ccc5e3564John Hoford setup(context); 1095b539461dcc159bd89297443780d635ccc5e3564John Hoford } 1105b539461dcc159bd89297443780d635ccc5e3564John Hoford 1115b539461dcc159bd89297443780d635ccc5e3564John Hoford 1125b539461dcc159bd89297443780d635ccc5e3564John Hoford public VrView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { 1135b539461dcc159bd89297443780d635ccc5e3564John Hoford super(context, attrs, defStyleAttr, defStyleRes); 1145b539461dcc159bd89297443780d635ccc5e3564John Hoford setup(context); 1155b539461dcc159bd89297443780d635ccc5e3564John Hoford } 1165b539461dcc159bd89297443780d635ccc5e3564John Hoford 1175b539461dcc159bd89297443780d635ccc5e3564John Hoford private void setup(Context context) { 1185b539461dcc159bd89297443780d635ccc5e3564John Hoford if (isInEditMode()) { 1195b539461dcc159bd89297443780d635ccc5e3564John Hoford return; 1205b539461dcc159bd89297443780d635ccc5e3564John Hoford } 1215b539461dcc159bd89297443780d635ccc5e3564John Hoford setSurfaceTextureListener(new TextureView.SurfaceTextureListener() { 1225b539461dcc159bd89297443780d635ccc5e3564John Hoford 1235b539461dcc159bd89297443780d635ccc5e3564John Hoford @Override 1245b539461dcc159bd89297443780d635ccc5e3564John Hoford public void onSurfaceTextureAvailable(SurfaceTexture surface, int width, int height) { 1255b539461dcc159bd89297443780d635ccc5e3564John Hoford mSurfaceTexture = surface; 1265b539461dcc159bd89297443780d635ccc5e3564John Hoford } 1275b539461dcc159bd89297443780d635ccc5e3564John Hoford 1285b539461dcc159bd89297443780d635ccc5e3564John Hoford @Override 1295b539461dcc159bd89297443780d635ccc5e3564John Hoford public void onSurfaceTextureSizeChanged(SurfaceTexture surface, int width, int height) { 1305b539461dcc159bd89297443780d635ccc5e3564John Hoford mSurfaceTexture = surface; 1315b539461dcc159bd89297443780d635ccc5e3564John Hoford } 1325b539461dcc159bd89297443780d635ccc5e3564John Hoford 1335b539461dcc159bd89297443780d635ccc5e3564John Hoford @Override 1345b539461dcc159bd89297443780d635ccc5e3564John Hoford public boolean onSurfaceTextureDestroyed(SurfaceTexture surface) { 1355b539461dcc159bd89297443780d635ccc5e3564John Hoford return false; 1365b539461dcc159bd89297443780d635ccc5e3564John Hoford } 1375b539461dcc159bd89297443780d635ccc5e3564John Hoford 1385b539461dcc159bd89297443780d635ccc5e3564John Hoford @Override 1395b539461dcc159bd89297443780d635ccc5e3564John Hoford public void onSurfaceTextureUpdated(SurfaceTexture surface) { 1405b539461dcc159bd89297443780d635ccc5e3564John Hoford } 1415b539461dcc159bd89297443780d635ccc5e3564John Hoford }); 1425b539461dcc159bd89297443780d635ccc5e3564John Hoford 1435b539461dcc159bd89297443780d635ccc5e3564John Hoford mScaleDetector = new ScaleGestureDetector(context, 1445b539461dcc159bd89297443780d635ccc5e3564John Hoford new ScaleGestureDetector.OnScaleGestureListener() { 1455b539461dcc159bd89297443780d635ccc5e3564John Hoford @Override 1465b539461dcc159bd89297443780d635ccc5e3564John Hoford public boolean onScale(ScaleGestureDetector detector) { 1475b539461dcc159bd89297443780d635ccc5e3564John Hoford double width = mState1.mTransform.getScreenWidth() / detector.getScaleFactor(); 1485b539461dcc159bd89297443780d635ccc5e3564John Hoford mState1.mTransform.setScreenWidth(width); 1495b539461dcc159bd89297443780d635ccc5e3564John Hoford panMove(detector.getFocusX(), detector.getFocusY()); 1505b539461dcc159bd89297443780d635ccc5e3564John Hoford render(4); 1515b539461dcc159bd89297443780d635ccc5e3564John Hoford return true; 1525b539461dcc159bd89297443780d635ccc5e3564John Hoford } 1535b539461dcc159bd89297443780d635ccc5e3564John Hoford 1545b539461dcc159bd89297443780d635ccc5e3564John Hoford @Override 1555b539461dcc159bd89297443780d635ccc5e3564John Hoford public boolean onScaleBegin(ScaleGestureDetector detector) { 1565b539461dcc159bd89297443780d635ccc5e3564John Hoford panDown(detector.getFocusX(), detector.getFocusY()); 1575b539461dcc159bd89297443780d635ccc5e3564John Hoford mInScale = true; 1585b539461dcc159bd89297443780d635ccc5e3564John Hoford return true; 1595b539461dcc159bd89297443780d635ccc5e3564John Hoford } 1605b539461dcc159bd89297443780d635ccc5e3564John Hoford 1615b539461dcc159bd89297443780d635ccc5e3564John Hoford @Override 1625b539461dcc159bd89297443780d635ccc5e3564John Hoford public void onScaleEnd(ScaleGestureDetector detector) { 1635b539461dcc159bd89297443780d635ccc5e3564John Hoford mInScale = false; 1645b539461dcc159bd89297443780d635ccc5e3564John Hoford } 1655b539461dcc159bd89297443780d635ccc5e3564John Hoford }); 1665b539461dcc159bd89297443780d635ccc5e3564John Hoford } 1675b539461dcc159bd89297443780d635ccc5e3564John Hoford 1685b539461dcc159bd89297443780d635ccc5e3564John Hoford private void updateOutputDimensions(int width, int height) { 1695b539461dcc159bd89297443780d635ccc5e3564John Hoford } 1705b539461dcc159bd89297443780d635ccc5e3564John Hoford 1715b539461dcc159bd89297443780d635ccc5e3564John Hoford @Override 1725b539461dcc159bd89297443780d635ccc5e3564John Hoford public boolean onTouchEvent(MotionEvent e) { 1735b539461dcc159bd89297443780d635ccc5e3564John Hoford if (mPreviousMode == 1) { 1745b539461dcc159bd89297443780d635ccc5e3564John Hoford mPipline.cancel(); 1755b539461dcc159bd89297443780d635ccc5e3564John Hoford } 1765b539461dcc159bd89297443780d635ccc5e3564John Hoford boolean handled = mScaleDetector.onTouchEvent(e); 1775b539461dcc159bd89297443780d635ccc5e3564John Hoford if (e.getPointerCount() > 1) { 1785b539461dcc159bd89297443780d635ccc5e3564John Hoford return true; 1795b539461dcc159bd89297443780d635ccc5e3564John Hoford } 1805b539461dcc159bd89297443780d635ccc5e3564John Hoford if (mInScale) { 1815b539461dcc159bd89297443780d635ccc5e3564John Hoford return true; 1825b539461dcc159bd89297443780d635ccc5e3564John Hoford } 1835b539461dcc159bd89297443780d635ccc5e3564John Hoford int action = e.getAction(); 1845b539461dcc159bd89297443780d635ccc5e3564John Hoford if (action == MotionEvent.ACTION_DOWN) { 1855b539461dcc159bd89297443780d635ccc5e3564John Hoford actionDown(e); 1865b539461dcc159bd89297443780d635ccc5e3564John Hoford } else if (action == MotionEvent.ACTION_MOVE) { 1875b539461dcc159bd89297443780d635ccc5e3564John Hoford actionMove(e); 1885b539461dcc159bd89297443780d635ccc5e3564John Hoford render(4); 1895b539461dcc159bd89297443780d635ccc5e3564John Hoford } else if (action == MotionEvent.ACTION_UP) { 1905b539461dcc159bd89297443780d635ccc5e3564John Hoford actionUp(e); 1915b539461dcc159bd89297443780d635ccc5e3564John Hoford refresh = 1; 1925b539461dcc159bd89297443780d635ccc5e3564John Hoford render(1); 1935b539461dcc159bd89297443780d635ccc5e3564John Hoford } 1945b539461dcc159bd89297443780d635ccc5e3564John Hoford return true; 1955b539461dcc159bd89297443780d635ccc5e3564John Hoford } 1965b539461dcc159bd89297443780d635ccc5e3564John Hoford 1975b539461dcc159bd89297443780d635ccc5e3564John Hoford private void panMove(float x, float y) { 1985b539461dcc159bd89297443780d635ccc5e3564John Hoford double dist_x = (mDownPointX - x) * mDownScreenWidth / getWidth(); 1995b539461dcc159bd89297443780d635ccc5e3564John Hoford double dist_y = (y - mDownPointY) * mDownScreenWidth / getWidth(); 2005b539461dcc159bd89297443780d635ccc5e3564John Hoford double[] p; 2015b539461dcc159bd89297443780d635ccc5e3564John Hoford p = mState1.mTransform.getEyePoint(); 2025b539461dcc159bd89297443780d635ccc5e3564John Hoford p[0] = mDownEyePoint[0] + dist_x * mDownRightVector[0] + dist_y * mDownUpVector[0]; 2035b539461dcc159bd89297443780d635ccc5e3564John Hoford p[1] = mDownEyePoint[1] + dist_x * mDownRightVector[1] + dist_y * mDownUpVector[1]; 2045b539461dcc159bd89297443780d635ccc5e3564John Hoford p[2] = mDownEyePoint[2] + dist_x * mDownRightVector[2] + dist_y * mDownUpVector[2]; 2055b539461dcc159bd89297443780d635ccc5e3564John Hoford mState1.mTransform.setEyePoint(p); 2065b539461dcc159bd89297443780d635ccc5e3564John Hoford p = mState1.mTransform.getLookPoint(); 2075b539461dcc159bd89297443780d635ccc5e3564John Hoford p[0] = mDownLookPoint[0] + dist_x * mDownRightVector[0] + dist_y * mDownUpVector[0]; 2085b539461dcc159bd89297443780d635ccc5e3564John Hoford p[1] = mDownLookPoint[1] + dist_x * mDownRightVector[1] + dist_y * mDownUpVector[1]; 2095b539461dcc159bd89297443780d635ccc5e3564John Hoford p[2] = mDownLookPoint[2] + dist_x * mDownRightVector[2] + dist_y * mDownUpVector[2]; 2105b539461dcc159bd89297443780d635ccc5e3564John Hoford mState1.mTransform.setLookPoint(p); 2115b539461dcc159bd89297443780d635ccc5e3564John Hoford } 2125b539461dcc159bd89297443780d635ccc5e3564John Hoford 2135b539461dcc159bd89297443780d635ccc5e3564John Hoford private void panDown(float x, float y) { 2145b539461dcc159bd89297443780d635ccc5e3564John Hoford mDownPointX = x; 2155b539461dcc159bd89297443780d635ccc5e3564John Hoford mDownPointY = y; 2165b539461dcc159bd89297443780d635ccc5e3564John Hoford mDownScreenWidth = mState1.mTransform.getScreenWidth(); 2175b539461dcc159bd89297443780d635ccc5e3564John Hoford double[] p; 2185b539461dcc159bd89297443780d635ccc5e3564John Hoford p = mState1.mTransform.getLookPoint(); 2195b539461dcc159bd89297443780d635ccc5e3564John Hoford System.arraycopy(p, 0, mDownLookPoint, 0, 3); 2205b539461dcc159bd89297443780d635ccc5e3564John Hoford p = mState1.mTransform.getEyePoint(); 2215b539461dcc159bd89297443780d635ccc5e3564John Hoford System.arraycopy(p, 0, mDownEyePoint, 0, 3); 2225b539461dcc159bd89297443780d635ccc5e3564John Hoford p = mState1.mTransform.getUpVector(); 2235b539461dcc159bd89297443780d635ccc5e3564John Hoford System.arraycopy(p, 0, mDownUpVector, 0, 3); 2245b539461dcc159bd89297443780d635ccc5e3564John Hoford mDownRightVector[0] = mDownLookPoint[0] - mDownEyePoint[0]; 2255b539461dcc159bd89297443780d635ccc5e3564John Hoford mDownRightVector[1] = mDownLookPoint[1] - mDownEyePoint[1]; 2265b539461dcc159bd89297443780d635ccc5e3564John Hoford mDownRightVector[2] = mDownLookPoint[2] - mDownEyePoint[2]; 2275b539461dcc159bd89297443780d635ccc5e3564John Hoford VectorUtil.normalize(mDownRightVector); 2285b539461dcc159bd89297443780d635ccc5e3564John Hoford VectorUtil.cross(mDownRightVector, mDownUpVector, mDownRightVector); 2295b539461dcc159bd89297443780d635ccc5e3564John Hoford } 2305b539461dcc159bd89297443780d635ccc5e3564John Hoford 2315b539461dcc159bd89297443780d635ccc5e3564John Hoford private void actionDown(MotionEvent e) { 2325b539461dcc159bd89297443780d635ccc5e3564John Hoford panDown(e.getX(), e.getY()); 2335b539461dcc159bd89297443780d635ccc5e3564John Hoford 2345b539461dcc159bd89297443780d635ccc5e3564John Hoford switch (mMode) { 2355b539461dcc159bd89297443780d635ccc5e3564John Hoford case ROTATE_MODE: 2365b539461dcc159bd89297443780d635ccc5e3564John Hoford mState1.mTransform.trackBallDown(e.getX(), e.getY()); 2375b539461dcc159bd89297443780d635ccc5e3564John Hoford break; 2385b539461dcc159bd89297443780d635ccc5e3564John Hoford 2395b539461dcc159bd89297443780d635ccc5e3564John Hoford case CUT_X_MODE: 2405b539461dcc159bd89297443780d635ccc5e3564John Hoford case CUT_Y_MODE: 2415b539461dcc159bd89297443780d635ccc5e3564John Hoford case CUT_Z_MODE: 2425b539461dcc159bd89297443780d635ccc5e3564John Hoford float[] trim = mState1.mCubeVolume.getTrim(); 2435b539461dcc159bd89297443780d635ccc5e3564John Hoford System.arraycopy(trim, 0, mCurrentTrim, 0, 6); 2445b539461dcc159bd89297443780d635ccc5e3564John Hoford break; 2455b539461dcc159bd89297443780d635ccc5e3564John Hoford } 2465b539461dcc159bd89297443780d635ccc5e3564John Hoford } 2475b539461dcc159bd89297443780d635ccc5e3564John Hoford 2485b539461dcc159bd89297443780d635ccc5e3564John Hoford private void actionMove(MotionEvent e) { 2495b539461dcc159bd89297443780d635ccc5e3564John Hoford float deltax, deltay; 2505b539461dcc159bd89297443780d635ccc5e3564John Hoford 2515b539461dcc159bd89297443780d635ccc5e3564John Hoford switch (mMode) { 2525b539461dcc159bd89297443780d635ccc5e3564John Hoford case ROTATE_MODE: 2535b539461dcc159bd89297443780d635ccc5e3564John Hoford 2545b539461dcc159bd89297443780d635ccc5e3564John Hoford mState1.mTransform.trackBallMove(e.getX(), e.getY()); 2555b539461dcc159bd89297443780d635ccc5e3564John Hoford 2565b539461dcc159bd89297443780d635ccc5e3564John Hoford break; 2575b539461dcc159bd89297443780d635ccc5e3564John Hoford 2585b539461dcc159bd89297443780d635ccc5e3564John Hoford case CUT_X_MODE: 2595b539461dcc159bd89297443780d635ccc5e3564John Hoford deltax = (float) ((mDownPointX - e.getX()) / getWidth()); 2605b539461dcc159bd89297443780d635ccc5e3564John Hoford deltay = (float) -((mDownPointY - e.getY()) / getWidth()); 2615b539461dcc159bd89297443780d635ccc5e3564John Hoford cut(0, deltax, deltay); 2625b539461dcc159bd89297443780d635ccc5e3564John Hoford break; 2635b539461dcc159bd89297443780d635ccc5e3564John Hoford case CUT_Y_MODE: 2645b539461dcc159bd89297443780d635ccc5e3564John Hoford deltax = (float) ((mDownPointX - e.getX()) / getWidth()); 2655b539461dcc159bd89297443780d635ccc5e3564John Hoford deltay = (float) -((mDownPointY - e.getY()) / getWidth()); 2665b539461dcc159bd89297443780d635ccc5e3564John Hoford cut(1, deltax, deltay); 2675b539461dcc159bd89297443780d635ccc5e3564John Hoford break; 2685b539461dcc159bd89297443780d635ccc5e3564John Hoford case CUT_Z_MODE: 2695b539461dcc159bd89297443780d635ccc5e3564John Hoford deltax = (float) ((mDownPointX - e.getX()) / getWidth()); 2705b539461dcc159bd89297443780d635ccc5e3564John Hoford deltay = (float) -((mDownPointY - e.getY()) / getWidth()); 2715b539461dcc159bd89297443780d635ccc5e3564John Hoford cut(2, deltax, deltay); 2725b539461dcc159bd89297443780d635ccc5e3564John Hoford break; 2735b539461dcc159bd89297443780d635ccc5e3564John Hoford 2745b539461dcc159bd89297443780d635ccc5e3564John Hoford } 2755b539461dcc159bd89297443780d635ccc5e3564John Hoford } 2765b539461dcc159bd89297443780d635ccc5e3564John Hoford 2775b539461dcc159bd89297443780d635ccc5e3564John Hoford private void actionUp(MotionEvent e) { 2785b539461dcc159bd89297443780d635ccc5e3564John Hoford } 2795b539461dcc159bd89297443780d635ccc5e3564John Hoford 2805b539461dcc159bd89297443780d635ccc5e3564John Hoford public void cut(int side, float fractionx, float fractiony) { 2815b539461dcc159bd89297443780d635ccc5e3564John Hoford float[] f = Arrays.copyOf(mCurrentTrim, mCurrentTrim.length); 2825b539461dcc159bd89297443780d635ccc5e3564John Hoford f[side] += fractionx; 2835b539461dcc159bd89297443780d635ccc5e3564John Hoford if (f[side] < 0) f[side] = 0; 2845b539461dcc159bd89297443780d635ccc5e3564John Hoford if (f[side] > .8) f[side] = .8f; 2855b539461dcc159bd89297443780d635ccc5e3564John Hoford f[side + 3] += fractiony; 2865b539461dcc159bd89297443780d635ccc5e3564John Hoford if (f[side + 3] < 0) f[side + 3] = 0; 2875b539461dcc159bd89297443780d635ccc5e3564John Hoford if (f[side + 3] > .8) f[side + 3] = .8f; 2885b539461dcc159bd89297443780d635ccc5e3564John Hoford mState1.mCubeVolume = new Cube(mState1.mVolume, 5f, f); 2895b539461dcc159bd89297443780d635ccc5e3564John Hoford mState1.mCubeScreen = new TriData(mState1.mCubeVolume); 2905b539461dcc159bd89297443780d635ccc5e3564John Hoford mState1.mCubeScreen.scale(mState1.mVolume.mVoxelDim); 2915b539461dcc159bd89297443780d635ccc5e3564John Hoford } 2925b539461dcc159bd89297443780d635ccc5e3564John Hoford 2935b539461dcc159bd89297443780d635ccc5e3564John Hoford public void resetCut() { 2945b539461dcc159bd89297443780d635ccc5e3564John Hoford Arrays.fill(mCurrentTrim, 0); 2955b539461dcc159bd89297443780d635ccc5e3564John Hoford mState1.mCubeVolume = new Cube(mState1.mVolume, 5f, mCurrentTrim); 2965b539461dcc159bd89297443780d635ccc5e3564John Hoford mState1.mCubeScreen = new TriData(mState1.mCubeVolume); 2975b539461dcc159bd89297443780d635ccc5e3564John Hoford mState1.mCubeScreen.scale(mState1.mVolume.mVoxelDim); 2985b539461dcc159bd89297443780d635ccc5e3564John Hoford mState1.mTransform.look(looks[last_look], mState1.mCubeScreen, getWidth(), getHeight()); 2995b539461dcc159bd89297443780d635ccc5e3564John Hoford mState1.mTransform.setScreenWidth(.6f * mState1.mTransform.getScreenWidth()); 3005b539461dcc159bd89297443780d635ccc5e3564John Hoford last_look = (last_look + 1) % looks.length; 3015b539461dcc159bd89297443780d635ccc5e3564John Hoford render(4); 3025b539461dcc159bd89297443780d635ccc5e3564John Hoford } 3035b539461dcc159bd89297443780d635ccc5e3564John Hoford 3045b539461dcc159bd89297443780d635ccc5e3564John Hoford public void setVolume(RenderScript rs, Volume v) { 3055b539461dcc159bd89297443780d635ccc5e3564John Hoford mState1.mRs = rs; 3065b539461dcc159bd89297443780d635ccc5e3564John Hoford mState1.mVolume = v; 3075b539461dcc159bd89297443780d635ccc5e3564John Hoford mState1.mCubeVolume = new Cube(mState1.mVolume, 5f); 3085b539461dcc159bd89297443780d635ccc5e3564John Hoford mState1.mCubeScreen = new TriData(mState1.mCubeVolume); 3095b539461dcc159bd89297443780d635ccc5e3564John Hoford mState1.mCubeScreen.scale(v.mVoxelDim); 3105b539461dcc159bd89297443780d635ccc5e3564John Hoford mState1.mTransform.setVoxelDim(v.mVoxelDim); 3115b539461dcc159bd89297443780d635ccc5e3564John Hoford mState1.mTransform.look(ViewMatrix.DOWN_AT, mState1.mCubeScreen, getWidth(), getHeight()); 3125b539461dcc159bd89297443780d635ccc5e3564John Hoford setLook(mState1.mVolume.getLookNames()[0]); 3135b539461dcc159bd89297443780d635ccc5e3564John Hoford } 3145b539461dcc159bd89297443780d635ccc5e3564John Hoford 3155b539461dcc159bd89297443780d635ccc5e3564John Hoford protected void look(int k) { 3165b539461dcc159bd89297443780d635ccc5e3564John Hoford mState1.mTransform.look(looks[k], mState1.mCubeVolume, getWidth(), getHeight()); 3175b539461dcc159bd89297443780d635ccc5e3564John Hoford render(4); 3185b539461dcc159bd89297443780d635ccc5e3564John Hoford render(1); 3195b539461dcc159bd89297443780d635ccc5e3564John Hoford } 3205b539461dcc159bd89297443780d635ccc5e3564John Hoford 3215b539461dcc159bd89297443780d635ccc5e3564John Hoford void render(int downSample) { 3225b539461dcc159bd89297443780d635ccc5e3564John Hoford 3235b539461dcc159bd89297443780d635ccc5e3564John Hoford if (mRenderTesk == null) { 3245b539461dcc159bd89297443780d635ccc5e3564John Hoford mRenderTesk = new VrRenderTesk(); 3255b539461dcc159bd89297443780d635ccc5e3564John Hoford refresh = 0; 3265b539461dcc159bd89297443780d635ccc5e3564John Hoford mRenderTesk.execute(downSample); 3275b539461dcc159bd89297443780d635ccc5e3564John Hoford } else { 3285b539461dcc159bd89297443780d635ccc5e3564John Hoford refresh = downSample; 3295b539461dcc159bd89297443780d635ccc5e3564John Hoford } 3305b539461dcc159bd89297443780d635ccc5e3564John Hoford } 3315b539461dcc159bd89297443780d635ccc5e3564John Hoford 3325b539461dcc159bd89297443780d635ccc5e3564John Hoford public String[] getLooks() { 3335b539461dcc159bd89297443780d635ccc5e3564John Hoford return mState1.mVolume.getLookNames(); 3345b539461dcc159bd89297443780d635ccc5e3564John Hoford } 3355b539461dcc159bd89297443780d635ccc5e3564John Hoford 3365b539461dcc159bd89297443780d635ccc5e3564John Hoford public void setLook(String look) { 3375b539461dcc159bd89297443780d635ccc5e3564John Hoford int[][] color = mState1.mVolume.getLookColor(look); 3385b539461dcc159bd89297443780d635ccc5e3564John Hoford int[][] opacity = mState1.mVolume.getLookOpactiy(look); 3395b539461dcc159bd89297443780d635ccc5e3564John Hoford mState1.mMaterial.setup(opacity, color); 3405b539461dcc159bd89297443780d635ccc5e3564John Hoford if (mBinGridTask == null) { 3415b539461dcc159bd89297443780d635ccc5e3564John Hoford mBinGridTask = new VrBinGridTask(); 3425b539461dcc159bd89297443780d635ccc5e3564John Hoford mBinGridTask.execute(mState1.mVolume); 3435b539461dcc159bd89297443780d635ccc5e3564John Hoford } 3445b539461dcc159bd89297443780d635ccc5e3564John Hoford } 3455b539461dcc159bd89297443780d635ccc5e3564John Hoford 3465b539461dcc159bd89297443780d635ccc5e3564John Hoford class VrRenderTesk extends AsyncTask<Integer, String, Long> { 3475b539461dcc159bd89297443780d635ccc5e3564John Hoford 3485b539461dcc159bd89297443780d635ccc5e3564John Hoford long m_last_time; 3495b539461dcc159bd89297443780d635ccc5e3564John Hoford 3505b539461dcc159bd89297443780d635ccc5e3564John Hoford @Override 3515b539461dcc159bd89297443780d635ccc5e3564John Hoford protected void onPreExecute() { 3525b539461dcc159bd89297443780d635ccc5e3564John Hoford mStateLow.copyData(mState1); 3535b539461dcc159bd89297443780d635ccc5e3564John Hoford } 3545b539461dcc159bd89297443780d635ccc5e3564John Hoford 3555b539461dcc159bd89297443780d635ccc5e3564John Hoford @Override 3565b539461dcc159bd89297443780d635ccc5e3564John Hoford protected void onCancelled() { 3575b539461dcc159bd89297443780d635ccc5e3564John Hoford mPipline.cancel(); 3585b539461dcc159bd89297443780d635ccc5e3564John Hoford } 3595b539461dcc159bd89297443780d635ccc5e3564John Hoford 3605b539461dcc159bd89297443780d635ccc5e3564John Hoford @Override 3615b539461dcc159bd89297443780d635ccc5e3564John Hoford protected Long doInBackground(Integer... down) { 3625b539461dcc159bd89297443780d635ccc5e3564John Hoford if (mState1.mRs == null) return 0L; 3635b539461dcc159bd89297443780d635ccc5e3564John Hoford if (mSurfaceTexture == null) return 0L; 3645b539461dcc159bd89297443780d635ccc5e3564John Hoford int sample = 4; 3655b539461dcc159bd89297443780d635ccc5e3564John Hoford VrState state = mStateLow; 3665b539461dcc159bd89297443780d635ccc5e3564John Hoford if (down[0] == 1) { 3675b539461dcc159bd89297443780d635ccc5e3564John Hoford if (mPreviousMode == 4) { 3685b539461dcc159bd89297443780d635ccc5e3564John Hoford mState1.copyData(mLastDrawn); 3695b539461dcc159bd89297443780d635ccc5e3564John Hoford } else { 3705b539461dcc159bd89297443780d635ccc5e3564John Hoford mState1.copyData(mStateLow); 3715b539461dcc159bd89297443780d635ccc5e3564John Hoford } 3725b539461dcc159bd89297443780d635ccc5e3564John Hoford // mStateLow.mScrAllocation.setSurface(null); 3735b539461dcc159bd89297443780d635ccc5e3564John Hoford state = mState1; 3745b539461dcc159bd89297443780d635ccc5e3564John Hoford sample = 1; 3755b539461dcc159bd89297443780d635ccc5e3564John Hoford if (mStateLow.mScrAllocation != null) { 3765b539461dcc159bd89297443780d635ccc5e3564John Hoford mStateLow.mScrAllocation.setSurface(null); 3775b539461dcc159bd89297443780d635ccc5e3564John Hoford } 3785b539461dcc159bd89297443780d635ccc5e3564John Hoford } else { 3795b539461dcc159bd89297443780d635ccc5e3564John Hoford if (mState1.mScrAllocation != null) { 3805b539461dcc159bd89297443780d635ccc5e3564John Hoford mState1.mScrAllocation.setSurface(null); 3815b539461dcc159bd89297443780d635ccc5e3564John Hoford } 3825b539461dcc159bd89297443780d635ccc5e3564John Hoford } 3835b539461dcc159bd89297443780d635ccc5e3564John Hoford 3845b539461dcc159bd89297443780d635ccc5e3564John Hoford if (mPreviousMode != sample) { 3855b539461dcc159bd89297443780d635ccc5e3564John Hoford if (mSurface != null) { 3865b539461dcc159bd89297443780d635ccc5e3564John Hoford mSurface.release(); 3875b539461dcc159bd89297443780d635ccc5e3564John Hoford } 3885b539461dcc159bd89297443780d635ccc5e3564John Hoford mSurface = new Surface(mSurfaceTexture); 3895b539461dcc159bd89297443780d635ccc5e3564John Hoford } 3905b539461dcc159bd89297443780d635ccc5e3564John Hoford mPreviousMode = sample; 3915b539461dcc159bd89297443780d635ccc5e3564John Hoford 3925b539461dcc159bd89297443780d635ccc5e3564John Hoford int img_width = getWidth() / sample; 3935b539461dcc159bd89297443780d635ccc5e3564John Hoford int img_height = getHeight() / sample; 3945b539461dcc159bd89297443780d635ccc5e3564John Hoford state.createOutputAllocation(mSurface, img_width, img_height); 3955b539461dcc159bd89297443780d635ccc5e3564John Hoford 3965b539461dcc159bd89297443780d635ccc5e3564John Hoford mPipline.initBuffers(state); 3975b539461dcc159bd89297443780d635ccc5e3564John Hoford 3985b539461dcc159bd89297443780d635ccc5e3564John Hoford if (mPipline.isCancel()) { 3995b539461dcc159bd89297443780d635ccc5e3564John Hoford return 0L; 4005b539461dcc159bd89297443780d635ccc5e3564John Hoford } 4015b539461dcc159bd89297443780d635ccc5e3564John Hoford long start = System.nanoTime(); 4025b539461dcc159bd89297443780d635ccc5e3564John Hoford addTimeLine(null); 4035b539461dcc159bd89297443780d635ccc5e3564John Hoford mPipline.setupTriangles(state); 4045b539461dcc159bd89297443780d635ccc5e3564John Hoford 4055b539461dcc159bd89297443780d635ccc5e3564John Hoford if (mPipline.isCancel()) { 4065b539461dcc159bd89297443780d635ccc5e3564John Hoford return 0L; 4075b539461dcc159bd89297443780d635ccc5e3564John Hoford } 4085b539461dcc159bd89297443780d635ccc5e3564John Hoford mPipline.rasterizeTriangles(state); 4095b539461dcc159bd89297443780d635ccc5e3564John Hoford 4105b539461dcc159bd89297443780d635ccc5e3564John Hoford if (mPipline.isCancel()) { 4115b539461dcc159bd89297443780d635ccc5e3564John Hoford return 0L; 4125b539461dcc159bd89297443780d635ccc5e3564John Hoford } 4135b539461dcc159bd89297443780d635ccc5e3564John Hoford mPipline.raycast(state); 4145b539461dcc159bd89297443780d635ccc5e3564John Hoford 4155b539461dcc159bd89297443780d635ccc5e3564John Hoford if (mPipline.isCancel()) { 4165b539461dcc159bd89297443780d635ccc5e3564John Hoford return 0L; 4175b539461dcc159bd89297443780d635ccc5e3564John Hoford } 4185b539461dcc159bd89297443780d635ccc5e3564John Hoford mLastDrawn.copyData(state); 4195b539461dcc159bd89297443780d635ccc5e3564John Hoford state.mRs.finish(); 4205b539461dcc159bd89297443780d635ccc5e3564John Hoford state.mScrAllocation.ioSend(); 4215b539461dcc159bd89297443780d635ccc5e3564John Hoford 4225b539461dcc159bd89297443780d635ccc5e3564John Hoford long time = System.nanoTime(); 4235b539461dcc159bd89297443780d635ccc5e3564John Hoford addLine("vr(" + img_width + "," + img_height + "): " + (time - start) / 1E6f + " ms"); 4245b539461dcc159bd89297443780d635ccc5e3564John Hoford return 0L; 4255b539461dcc159bd89297443780d635ccc5e3564John Hoford } 4265b539461dcc159bd89297443780d635ccc5e3564John Hoford 4275b539461dcc159bd89297443780d635ccc5e3564John Hoford private void addTimeLine(String line) { 4285b539461dcc159bd89297443780d635ccc5e3564John Hoford if (line == null) { 4295b539461dcc159bd89297443780d635ccc5e3564John Hoford m_last_time = System.nanoTime(); 4305b539461dcc159bd89297443780d635ccc5e3564John Hoford return; 4315b539461dcc159bd89297443780d635ccc5e3564John Hoford } 4325b539461dcc159bd89297443780d635ccc5e3564John Hoford long time = System.nanoTime(); 4335b539461dcc159bd89297443780d635ccc5e3564John Hoford float ftime = (time - m_last_time) / 1E6f; 4345b539461dcc159bd89297443780d635ccc5e3564John Hoford if (ftime > 100) 4355b539461dcc159bd89297443780d635ccc5e3564John Hoford addLine(line + ": " + (ftime / 1E3f) + " sec"); 4365b539461dcc159bd89297443780d635ccc5e3564John Hoford else 4375b539461dcc159bd89297443780d635ccc5e3564John Hoford addLine(line + ": " + (ftime) + " ms"); 4385b539461dcc159bd89297443780d635ccc5e3564John Hoford m_last_time = System.nanoTime(); 4395b539461dcc159bd89297443780d635ccc5e3564John Hoford } 4405b539461dcc159bd89297443780d635ccc5e3564John Hoford 4415b539461dcc159bd89297443780d635ccc5e3564John Hoford private void addLine(String line) { 4425b539461dcc159bd89297443780d635ccc5e3564John Hoford publishProgress(line); 4435b539461dcc159bd89297443780d635ccc5e3564John Hoford } 4445b539461dcc159bd89297443780d635ccc5e3564John Hoford 4455b539461dcc159bd89297443780d635ccc5e3564John Hoford protected void onProgressUpdate(String... progress) { 4465b539461dcc159bd89297443780d635ccc5e3564John Hoford Log.v(LOGTAG, progress[0]); 4475b539461dcc159bd89297443780d635ccc5e3564John Hoford } 4485b539461dcc159bd89297443780d635ccc5e3564John Hoford 4495b539461dcc159bd89297443780d635ccc5e3564John Hoford protected void onPostExecute(Long result) { 4505b539461dcc159bd89297443780d635ccc5e3564John Hoford invalidate(); 4515b539461dcc159bd89297443780d635ccc5e3564John Hoford mRenderTesk = null; 4525b539461dcc159bd89297443780d635ccc5e3564John Hoford if (refresh != 0) { 4535b539461dcc159bd89297443780d635ccc5e3564John Hoford render(refresh); 4545b539461dcc159bd89297443780d635ccc5e3564John Hoford } 4555b539461dcc159bd89297443780d635ccc5e3564John Hoford } 4565b539461dcc159bd89297443780d635ccc5e3564John Hoford } 4575b539461dcc159bd89297443780d635ccc5e3564John Hoford 4585b539461dcc159bd89297443780d635ccc5e3564John Hoford class VrBinGridTask extends AsyncTask<Volume, String, Long> { 4595b539461dcc159bd89297443780d635ccc5e3564John Hoford 4605b539461dcc159bd89297443780d635ccc5e3564John Hoford @Override 4615b539461dcc159bd89297443780d635ccc5e3564John Hoford protected Long doInBackground(Volume... v) { 4625b539461dcc159bd89297443780d635ccc5e3564John Hoford mState1.mRsMask = new RsBrickedBitMask(mState1); 4635b539461dcc159bd89297443780d635ccc5e3564John Hoford mState1.mRs.finish(); 4645b539461dcc159bd89297443780d635ccc5e3564John Hoford return 0L; 4655b539461dcc159bd89297443780d635ccc5e3564John Hoford } 4665b539461dcc159bd89297443780d635ccc5e3564John Hoford 4675b539461dcc159bd89297443780d635ccc5e3564John Hoford protected void onProgressUpdate(String... progress) { 4685b539461dcc159bd89297443780d635ccc5e3564John Hoford Log.v(LOGTAG, progress[0]); 4695b539461dcc159bd89297443780d635ccc5e3564John Hoford } 4705b539461dcc159bd89297443780d635ccc5e3564John Hoford 4715b539461dcc159bd89297443780d635ccc5e3564John Hoford protected void onPostExecute(Long result) { 4725b539461dcc159bd89297443780d635ccc5e3564John Hoford mBinGridTask = null; 4735b539461dcc159bd89297443780d635ccc5e3564John Hoford render(4); 4745b539461dcc159bd89297443780d635ccc5e3564John Hoford render(1); 4755b539461dcc159bd89297443780d635ccc5e3564John Hoford } 4765b539461dcc159bd89297443780d635ccc5e3564John Hoford } 4775b539461dcc159bd89297443780d635ccc5e3564John Hoford} 478