1 /* 2 * Copyright (C) 2011 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package com.android.fbotest; 18 19 import android.renderscript.RSSurfaceView; 20 import android.renderscript.RenderScriptGL; 21 22 import android.content.Context; 23 import android.view.MotionEvent; 24 import android.view.SurfaceHolder; 25 import android.view.ScaleGestureDetector; 26 import android.util.Log; 27 28 public class FBOSyncView extends RSSurfaceView { 29 30 private RenderScriptGL mRS; 31 private FBOSyncRS mRender; 32 33 private ScaleGestureDetector mScaleDetector; 34 35 private static final int INVALID_POINTER_ID = -1; 36 private int mActivePointerId = INVALID_POINTER_ID; 37 FBOSyncView(Context context)38 public FBOSyncView(Context context) { 39 super(context); 40 ensureRenderScript(); 41 mScaleDetector = new ScaleGestureDetector(context, new ScaleListener()); 42 } 43 ensureRenderScript()44 private void ensureRenderScript() { 45 if (mRS == null) { 46 RenderScriptGL.SurfaceConfig sc = new RenderScriptGL.SurfaceConfig(); 47 sc.setDepth(16, 24); 48 mRS = createRenderScriptGL(sc); 49 mRender = new FBOSyncRS(); 50 mRender.init(mRS, getResources()); 51 } 52 } 53 54 @Override onAttachedToWindow()55 protected void onAttachedToWindow() { 56 super.onAttachedToWindow(); 57 ensureRenderScript(); 58 } 59 60 @Override surfaceChanged(SurfaceHolder holder, int format, int w, int h)61 public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) { 62 super.surfaceChanged(holder, format, w, h); 63 mRender.surfaceChanged(); 64 } 65 66 @Override onDetachedFromWindow()67 protected void onDetachedFromWindow() { 68 mRender = null; 69 if (mRS != null) { 70 mRS = null; 71 destroyRenderScriptGL(); 72 } 73 } 74 loadA3DFile(String path)75 public void loadA3DFile(String path) { 76 mRender.loadA3DFile(path); 77 } 78 79 @Override onTouchEvent(MotionEvent ev)80 public boolean onTouchEvent(MotionEvent ev) { 81 mScaleDetector.onTouchEvent(ev); 82 83 boolean ret = false; 84 float x = ev.getX(); 85 float y = ev.getY(); 86 87 final int action = ev.getAction(); 88 89 switch (action & MotionEvent.ACTION_MASK) { 90 case MotionEvent.ACTION_DOWN: { 91 mRender.onActionDown(x, y); 92 mActivePointerId = ev.getPointerId(0); 93 ret = true; 94 break; 95 } 96 case MotionEvent.ACTION_MOVE: { 97 if (!mScaleDetector.isInProgress()) { 98 mRender.onActionMove(x, y); 99 } 100 mRender.onActionDown(x, y); 101 ret = true; 102 break; 103 } 104 105 case MotionEvent.ACTION_UP: { 106 mActivePointerId = INVALID_POINTER_ID; 107 break; 108 } 109 110 case MotionEvent.ACTION_CANCEL: { 111 mActivePointerId = INVALID_POINTER_ID; 112 break; 113 } 114 115 case MotionEvent.ACTION_POINTER_UP: { 116 final int pointerIndex = (ev.getAction() & MotionEvent.ACTION_POINTER_INDEX_MASK) 117 >> MotionEvent.ACTION_POINTER_INDEX_SHIFT; 118 final int pointerId = ev.getPointerId(pointerIndex); 119 if (pointerId == mActivePointerId) { 120 // This was our active pointer going up. Choose a new 121 // active pointer and adjust accordingly. 122 final int newPointerIndex = pointerIndex == 0 ? 1 : 0; 123 x = ev.getX(newPointerIndex); 124 y = ev.getY(newPointerIndex); 125 mRender.onActionDown(x, y); 126 mActivePointerId = ev.getPointerId(newPointerIndex); 127 } 128 break; 129 } 130 } 131 132 return ret; 133 } 134 135 private class ScaleListener extends ScaleGestureDetector.SimpleOnScaleGestureListener { 136 @Override onScale(ScaleGestureDetector detector)137 public boolean onScale(ScaleGestureDetector detector) { 138 mRender.onActionScale(detector.getScaleFactor()); 139 return true; 140 } 141 } 142 } 143 144 145