1e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams/* 2e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams * Copyright (C) 2008 The Android Open Source Project 3e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams * 4e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams * Licensed under the Apache License, Version 2.0 (the "License"); 5e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams * you may not use this file except in compliance with the License. 6e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams * You may obtain a copy of the License at 7e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams * 8e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams * http://www.apache.org/licenses/LICENSE-2.0 9e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams * 10e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams * Unless required by applicable law or agreed to in writing, software 11e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams * distributed under the License is distributed on an "AS IS" BASIS, 12e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams * See the License for the specific language governing permissions and 14e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams * limitations under the License. 15e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams */ 16e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams 17e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Samspackage com.example.android.rs.balls; 18e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams 19e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Samsimport java.io.Writer; 20e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Samsimport java.util.ArrayList; 21e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Samsimport java.util.concurrent.Semaphore; 22e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams 23e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Samsimport android.renderscript.RSSurfaceView; 24e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Samsimport android.renderscript.RenderScript; 25e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Samsimport android.renderscript.RenderScriptGL; 26e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams 27e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Samsimport android.content.Context; 28e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Samsimport android.content.res.Resources; 29e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Samsimport android.graphics.Bitmap; 30e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Samsimport android.graphics.drawable.BitmapDrawable; 31e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Samsimport android.graphics.drawable.Drawable; 32e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Samsimport android.os.Handler; 33e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Samsimport android.os.Message; 34e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Samsimport android.util.AttributeSet; 35e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Samsimport android.util.Log; 36e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Samsimport android.view.Surface; 37e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Samsimport android.view.SurfaceHolder; 38e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Samsimport android.view.SurfaceView; 39e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Samsimport android.view.KeyEvent; 40e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Samsimport android.view.MotionEvent; 41e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams 42e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Samspublic class BallsView extends RSSurfaceView { 43e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams 44e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams public BallsView(Context context) { 45e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams super(context); 46e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams //setFocusable(true); 47e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams } 48e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams 49e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams private RenderScriptGL mRS; 50e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams private BallsRS mRender; 51e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams 52e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) { 53e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams super.surfaceChanged(holder, format, w, h); 54e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams if (mRS == null) { 55e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams RenderScriptGL.SurfaceConfig sc = new RenderScriptGL.SurfaceConfig(); 56e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams mRS = createRenderScriptGL(sc); 57e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams mRS.setSurface(holder, w, h); 58e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams mRender = new BallsRS(); 59e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams mRender.init(mRS, getResources(), w, h); 60e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams } 61e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams mRender.updateProjectionMatrices(); 62e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams } 63e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams 64e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams @Override 65e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams protected void onDetachedFromWindow() { 66e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams if(mRS != null) { 67e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams mRS = null; 68e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams destroyRenderScriptGL(); 69e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams } 70e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams } 71e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams 72e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams 73e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams @Override 74e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams public boolean onTouchEvent(MotionEvent ev) 75e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams { 76e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams int act = ev.getActionMasked(); 77e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams if (act == ev.ACTION_UP) { 78e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams mRender.newTouchPosition(0, 0, 0, ev.getPointerId(0)); 79e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams return false; 80e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams } else if (act == MotionEvent.ACTION_POINTER_UP) { 81e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams // only one pointer going up, we can get the index like this 82e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams int pointerIndex = ev.getActionIndex(); 83e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams int pointerId = ev.getPointerId(pointerIndex); 84e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams mRender.newTouchPosition(0, 0, 0, pointerId); 85e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams return false; 86e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams } 87e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams int count = ev.getHistorySize(); 88e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams int pcount = ev.getPointerCount(); 89e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams 90e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams for (int p=0; p < pcount; p++) { 91e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams int id = ev.getPointerId(p); 92e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams mRender.newTouchPosition(ev.getX(p), 93e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams ev.getY(p), 94e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams ev.getPressure(p), 95e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams id); 96e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams 97e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams for (int i=0; i < count; i++) { 98e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams mRender.newTouchPosition(ev.getHistoricalX(p, i), 99e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams ev.getHistoricalY(p, i), 100e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams ev.getHistoricalPressure(p, i), 101e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams id); 102e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams } 103e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams } 104e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams return true; 105e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams } 106e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams 107e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams void setAccel(float x, float y, float z) { 108da1c93ae4d27b73ea983370520a7a739226f1695Yong Chen if ((mRender == null) || (mRS == null)) { 109e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams return; 110e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams } 111e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams mRender.setAccel(x, -y); 112e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams } 113e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams 114e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams} 115e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams 116e5f2f66f8c802d64ecf869081036ae13d4e9e19cJason Sams 117