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