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