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