18e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk/*
28e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk * Copyright (C) 2011 The Android Open Source Project
38e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk *
48e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk * Licensed under the Apache License, Version 2.0 (the "License");
58e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk * you may not use this file except in compliance with the License.
68e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk * You may obtain a copy of the License at
78e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk *
88e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk *      http://www.apache.org/licenses/LICENSE-2.0
98e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk *
108e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk * Unless required by applicable law or agreed to in writing, software
118e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk * distributed under the License is distributed on an "AS IS" BASIS,
128e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
138e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk * See the License for the specific language governing permissions and
148e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk * limitations under the License.
158e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk */
168e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk
178e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchoukpackage com.android.fbotest;
188e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk
198e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchoukimport android.renderscript.RSSurfaceView;
208e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchoukimport android.renderscript.RenderScriptGL;
218e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk
228e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchoukimport android.content.Context;
238e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchoukimport android.view.MotionEvent;
248e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchoukimport android.view.SurfaceHolder;
258e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchoukimport android.view.ScaleGestureDetector;
268e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchoukimport android.util.Log;
278e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk
288e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchoukpublic class FBOTestView extends RSSurfaceView {
298e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk
308e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk    private RenderScriptGL mRS;
318e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk    private FBOTestRS mRender;
328e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk
338e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk    private ScaleGestureDetector mScaleDetector;
348e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk
358e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk    private static final int INVALID_POINTER_ID = -1;
368e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk    private int mActivePointerId = INVALID_POINTER_ID;
378e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk
388e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk    public FBOTestView(Context context) {
398e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk        super(context);
408e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk        ensureRenderScript();
418e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk        mScaleDetector = new ScaleGestureDetector(context, new ScaleListener());
428e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk    }
438e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk
448e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk    private void ensureRenderScript() {
458e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk        if (mRS == null) {
468e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk            RenderScriptGL.SurfaceConfig sc = new RenderScriptGL.SurfaceConfig();
478e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk            sc.setDepth(16, 24);
488e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk            mRS = createRenderScriptGL(sc);
498e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk            mRender = new FBOTestRS();
508e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk            mRender.init(mRS, getResources());
518e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk        }
528e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk    }
538e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk
548e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk    @Override
558e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk    protected void onAttachedToWindow() {
568e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk        super.onAttachedToWindow();
578e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk        ensureRenderScript();
588e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk    }
598e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk
608e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk    @Override
618e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk    public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
628e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk        super.surfaceChanged(holder, format, w, h);
638e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk        mRender.surfaceChanged();
648e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk    }
658e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk
668e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk    @Override
678e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk    protected void onDetachedFromWindow() {
688e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk        mRender = null;
698e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk        if (mRS != null) {
708e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk            mRS = null;
718e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk            destroyRenderScriptGL();
728e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk        }
738e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk    }
748e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk
758e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk    public void loadA3DFile(String path) {
768e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk        mRender.loadA3DFile(path);
778e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk    }
788e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk
798e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk    @Override
808e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk    public boolean onTouchEvent(MotionEvent ev) {
818e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk        mScaleDetector.onTouchEvent(ev);
828e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk
838e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk        boolean ret = false;
848e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk        float x = ev.getX();
858e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk        float y = ev.getY();
868e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk
878e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk        final int action = ev.getAction();
888e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk
898e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk        switch (action & MotionEvent.ACTION_MASK) {
908e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk        case MotionEvent.ACTION_DOWN: {
918e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk            mRender.onActionDown(x, y);
928e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk            mActivePointerId = ev.getPointerId(0);
938e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk            ret = true;
948e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk            break;
958e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk        }
968e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk        case MotionEvent.ACTION_MOVE: {
978e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk            if (!mScaleDetector.isInProgress()) {
988e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk                mRender.onActionMove(x, y);
998e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk            }
1008e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk            mRender.onActionDown(x, y);
1018e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk            ret = true;
1028e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk            break;
1038e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk        }
1048e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk
1058e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk        case MotionEvent.ACTION_UP: {
1068e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk            mActivePointerId = INVALID_POINTER_ID;
1078e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk            break;
1088e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk        }
1098e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk
1108e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk        case MotionEvent.ACTION_CANCEL: {
1118e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk            mActivePointerId = INVALID_POINTER_ID;
1128e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk            break;
1138e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk        }
1148e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk
1158e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk        case MotionEvent.ACTION_POINTER_UP: {
1168e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk            final int pointerIndex = (ev.getAction() & MotionEvent.ACTION_POINTER_INDEX_MASK)
1178e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk                    >> MotionEvent.ACTION_POINTER_INDEX_SHIFT;
1188e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk            final int pointerId = ev.getPointerId(pointerIndex);
1198e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk            if (pointerId == mActivePointerId) {
1208e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk                // This was our active pointer going up. Choose a new
1218e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk                // active pointer and adjust accordingly.
1228e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk                final int newPointerIndex = pointerIndex == 0 ? 1 : 0;
1238e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk                x = ev.getX(newPointerIndex);
1248e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk                y = ev.getY(newPointerIndex);
1258e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk                mRender.onActionDown(x, y);
1268e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk                mActivePointerId = ev.getPointerId(newPointerIndex);
1278e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk            }
1288e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk            break;
1298e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk        }
1308e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk        }
1318e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk
1328e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk        return ret;
1338e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk    }
1348e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk
1358e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk    private class ScaleListener extends ScaleGestureDetector.SimpleOnScaleGestureListener {
1368e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk        @Override
1378e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk        public boolean onScale(ScaleGestureDetector detector) {
1388e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk            mRender.onActionScale(detector.getScaleFactor());
1398e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk            return true;
1408e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk        }
1418e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk    }
1428e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk}
1438e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk
1448e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk
145