FBOSyncView.java revision 8650c32907b74b945dd6cc9a5bf41c12fde005df
18650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk/*
28650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk * Copyright (C) 2011 The Android Open Source Project
38650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk *
48650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk * Licensed under the Apache License, Version 2.0 (the "License");
58650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk * you may not use this file except in compliance with the License.
68650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk * You may obtain a copy of the License at
78650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk *
88650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk *      http://www.apache.org/licenses/LICENSE-2.0
98650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk *
108650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk * Unless required by applicable law or agreed to in writing, software
118650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk * distributed under the License is distributed on an "AS IS" BASIS,
128650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
138650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk * See the License for the specific language governing permissions and
148650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk * limitations under the License.
158650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk */
168650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk
178650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchoukpackage com.android.fbotest;
188650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk
198650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchoukimport android.renderscript.RSSurfaceView;
208650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchoukimport android.renderscript.RenderScriptGL;
218650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk
228650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchoukimport android.content.Context;
238650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchoukimport android.view.MotionEvent;
248650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchoukimport android.view.SurfaceHolder;
258650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchoukimport android.view.ScaleGestureDetector;
268650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchoukimport android.util.Log;
278650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk
288650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchoukpublic class FBOSyncView extends RSSurfaceView {
298650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk
308650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk    private RenderScriptGL mRS;
318650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk    private FBOSyncRS mRender;
328650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk
338650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk    private ScaleGestureDetector mScaleDetector;
348650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk
358650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk    private static final int INVALID_POINTER_ID = -1;
368650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk    private int mActivePointerId = INVALID_POINTER_ID;
378650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk
388650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk    public FBOSyncView(Context context) {
398650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk        super(context);
408650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk        ensureRenderScript();
418650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk        mScaleDetector = new ScaleGestureDetector(context, new ScaleListener());
428650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk    }
438650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk
448650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk    private void ensureRenderScript() {
458650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk        if (mRS == null) {
468650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk            RenderScriptGL.SurfaceConfig sc = new RenderScriptGL.SurfaceConfig();
478650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk            sc.setDepth(16, 24);
488650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk            mRS = createRenderScriptGL(sc);
498650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk            mRender = new FBOSyncRS();
508650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk            mRender.init(mRS, getResources());
518650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk        }
528650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk    }
538650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk
548650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk    @Override
558650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk    protected void onAttachedToWindow() {
568650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk        super.onAttachedToWindow();
578650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk        ensureRenderScript();
588650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk    }
598650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk
608650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk    @Override
618650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk    public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
628650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk        super.surfaceChanged(holder, format, w, h);
638650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk        mRender.surfaceChanged();
648650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk    }
658650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk
668650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk    @Override
678650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk    protected void onDetachedFromWindow() {
688650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk        mRender = null;
698650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk        if (mRS != null) {
708650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk            mRS = null;
718650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk            destroyRenderScriptGL();
728650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk        }
738650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk    }
748650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk
758650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk    public void loadA3DFile(String path) {
768650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk        mRender.loadA3DFile(path);
778650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk    }
788650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk
798650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk    @Override
808650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk    public boolean onTouchEvent(MotionEvent ev) {
818650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk        mScaleDetector.onTouchEvent(ev);
828650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk
838650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk        boolean ret = false;
848650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk        float x = ev.getX();
858650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk        float y = ev.getY();
868650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk
878650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk        final int action = ev.getAction();
888650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk
898650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk        switch (action & MotionEvent.ACTION_MASK) {
908650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk        case MotionEvent.ACTION_DOWN: {
918650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk            mRender.onActionDown(x, y);
928650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk            mActivePointerId = ev.getPointerId(0);
938650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk            ret = true;
948650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk            break;
958650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk        }
968650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk        case MotionEvent.ACTION_MOVE: {
978650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk            if (!mScaleDetector.isInProgress()) {
988650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk                mRender.onActionMove(x, y);
998650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk            }
1008650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk            mRender.onActionDown(x, y);
1018650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk            ret = true;
1028650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk            break;
1038650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk        }
1048650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk
1058650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk        case MotionEvent.ACTION_UP: {
1068650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk            mActivePointerId = INVALID_POINTER_ID;
1078650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk            break;
1088650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk        }
1098650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk
1108650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk        case MotionEvent.ACTION_CANCEL: {
1118650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk            mActivePointerId = INVALID_POINTER_ID;
1128650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk            break;
1138650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk        }
1148650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk
1158650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk        case MotionEvent.ACTION_POINTER_UP: {
1168650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk            final int pointerIndex = (ev.getAction() & MotionEvent.ACTION_POINTER_INDEX_MASK)
1178650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk                    >> MotionEvent.ACTION_POINTER_INDEX_SHIFT;
1188650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk            final int pointerId = ev.getPointerId(pointerIndex);
1198650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk            if (pointerId == mActivePointerId) {
1208650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk                // This was our active pointer going up. Choose a new
1218650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk                // active pointer and adjust accordingly.
1228650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk                final int newPointerIndex = pointerIndex == 0 ? 1 : 0;
1238650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk                x = ev.getX(newPointerIndex);
1248650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk                y = ev.getY(newPointerIndex);
1258650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk                mRender.onActionDown(x, y);
1268650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk                mActivePointerId = ev.getPointerId(newPointerIndex);
1278650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk            }
1288650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk            break;
1298650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk        }
1308650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk        }
1318650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk
1328650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk        return ret;
1338650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk    }
1348650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk
1358650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk    private class ScaleListener extends ScaleGestureDetector.SimpleOnScaleGestureListener {
1368650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk        @Override
1378650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk        public boolean onScale(ScaleGestureDetector detector) {
1388650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk            mRender.onActionScale(detector.getScaleFactor());
1398650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk            return true;
1408650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk        }
1418650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk    }
1428650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk}
1438650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk
1448650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk
145