1572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams/*
2572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams * Copyright (C) 2008 The Android Open Source Project
3572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams *
4572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams * Licensed under the Apache License, Version 2.0 (the "License");
5572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams * you may not use this file except in compliance with the License.
6572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams * You may obtain a copy of the License at
7572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams *
8572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams *      http://www.apache.org/licenses/LICENSE-2.0
9572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams *
10572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams * Unless required by applicable law or agreed to in writing, software
11572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams * distributed under the License is distributed on an "AS IS" BASIS,
12572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams * See the License for the specific language governing permissions and
14572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams * limitations under the License.
15572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams */
16572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
17572a5031a5d8602db0bec0b253428a034bd4dd59Jason Samspackage com.example.android.rs.balls;
18572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
19572a5031a5d8602db0bec0b253428a034bd4dd59Jason Samsimport java.io.Writer;
20572a5031a5d8602db0bec0b253428a034bd4dd59Jason Samsimport java.util.ArrayList;
21572a5031a5d8602db0bec0b253428a034bd4dd59Jason Samsimport java.util.concurrent.Semaphore;
22572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
23572a5031a5d8602db0bec0b253428a034bd4dd59Jason Samsimport android.renderscript.RSSurfaceView;
24572a5031a5d8602db0bec0b253428a034bd4dd59Jason Samsimport android.renderscript.RenderScript;
25572a5031a5d8602db0bec0b253428a034bd4dd59Jason Samsimport android.renderscript.RenderScriptGL;
26572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
27572a5031a5d8602db0bec0b253428a034bd4dd59Jason Samsimport android.content.Context;
28572a5031a5d8602db0bec0b253428a034bd4dd59Jason Samsimport android.content.res.Resources;
29572a5031a5d8602db0bec0b253428a034bd4dd59Jason Samsimport android.graphics.Bitmap;
30572a5031a5d8602db0bec0b253428a034bd4dd59Jason Samsimport android.graphics.drawable.BitmapDrawable;
31572a5031a5d8602db0bec0b253428a034bd4dd59Jason Samsimport android.graphics.drawable.Drawable;
32572a5031a5d8602db0bec0b253428a034bd4dd59Jason Samsimport android.os.Handler;
33572a5031a5d8602db0bec0b253428a034bd4dd59Jason Samsimport android.os.Message;
34572a5031a5d8602db0bec0b253428a034bd4dd59Jason Samsimport android.util.AttributeSet;
35572a5031a5d8602db0bec0b253428a034bd4dd59Jason Samsimport android.util.Log;
36572a5031a5d8602db0bec0b253428a034bd4dd59Jason Samsimport android.view.Surface;
37572a5031a5d8602db0bec0b253428a034bd4dd59Jason Samsimport android.view.SurfaceHolder;
38572a5031a5d8602db0bec0b253428a034bd4dd59Jason Samsimport android.view.SurfaceView;
39572a5031a5d8602db0bec0b253428a034bd4dd59Jason Samsimport android.view.KeyEvent;
40572a5031a5d8602db0bec0b253428a034bd4dd59Jason Samsimport android.view.MotionEvent;
41572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
42572a5031a5d8602db0bec0b253428a034bd4dd59Jason Samspublic class BallsView extends RSSurfaceView {
43572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
44572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    public BallsView(Context context) {
45572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        super(context);
46572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        //setFocusable(true);
47572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    }
48572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
49572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    private RenderScriptGL mRS;
50572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    private BallsRS mRender;
51572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
52572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
53572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        super.surfaceChanged(holder, format, w, h);
54572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        if (mRS == null) {
55572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            RenderScriptGL.SurfaceConfig sc = new RenderScriptGL.SurfaceConfig();
56572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            mRS = createRenderScriptGL(sc);
57572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            mRS.setSurface(holder, w, h);
58572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            mRender = new BallsRS();
59572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            mRender.init(mRS, getResources(), w, h);
60572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        }
61572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mRender.updateProjectionMatrices();
62572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    }
63572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
64572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    @Override
65572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    protected void onDetachedFromWindow() {
66572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        if(mRS != null) {
67572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            mRS = null;
68572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            destroyRenderScriptGL();
69572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        }
70572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    }
71572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
72572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
73572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    @Override
74572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    public boolean onTouchEvent(MotionEvent ev)
75572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    {
76572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        int act = ev.getActionMasked();
77572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        if (act == ev.ACTION_UP) {
78572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            mRender.newTouchPosition(0, 0, 0, ev.getPointerId(0));
79572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            return false;
80572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        } else if (act == MotionEvent.ACTION_POINTER_UP) {
81572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            // only one pointer going up, we can get the index like this
82572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            int pointerIndex = ev.getActionIndex();
83572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            int pointerId = ev.getPointerId(pointerIndex);
84572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            mRender.newTouchPosition(0, 0, 0, pointerId);
85572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            return false;
86572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        }
87572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        int count = ev.getHistorySize();
88572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        int pcount = ev.getPointerCount();
89572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
90572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        for (int p=0; p < pcount; p++) {
91572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            int id = ev.getPointerId(p);
92572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            mRender.newTouchPosition(ev.getX(p),
93572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams                                     ev.getY(p),
94572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams                                     ev.getPressure(p),
95572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams                                     id);
96572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
97572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            for (int i=0; i < count; i++) {
98572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams                mRender.newTouchPosition(ev.getHistoricalX(p, i),
99572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams                                         ev.getHistoricalY(p, i),
100572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams                                         ev.getHistoricalPressure(p, i),
101572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams                                         id);
102572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            }
103572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        }
104572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        return true;
105572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    }
106572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
107572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    void setAccel(float x, float y, float z) {
108572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        if ((mRender == null) || (mRS == null)) {
109572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            return;
110572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        }
111572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mRender.setAccel(x, -y);
112572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    }
113572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
114572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams}
115572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
116572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
117