1094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk/*
2094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk * Copyright (C) 2008 The Android Open Source Project
3094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk *
4094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk * Licensed under the Apache License, Version 2.0 (the "License");
5094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk * you may not use this file except in compliance with the License.
6094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk * You may obtain a copy of the License at
7094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk *
8094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk *      http://www.apache.org/licenses/LICENSE-2.0
9094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk *
10094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk * Unless required by applicable law or agreed to in writing, software
11094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk * distributed under the License is distributed on an "AS IS" BASIS,
12094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk * See the License for the specific language governing permissions and
14094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk * limitations under the License.
15094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk */
16094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk
1727f50523a45100f3b4861762b6263e0b9ba6e22eAlex Sakhartchoukpackage com.android.modelviewer;
18094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk
19094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchoukimport java.io.Writer;
20094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchoukimport java.util.ArrayList;
21094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchoukimport java.util.concurrent.Semaphore;
22094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk
23094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchoukimport android.renderscript.RSSurfaceView;
24094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchoukimport android.renderscript.RenderScript;
25094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchoukimport android.renderscript.RenderScriptGL;
26094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk
27094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchoukimport android.content.Context;
28094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchoukimport android.content.res.Resources;
29094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchoukimport android.graphics.Bitmap;
30094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchoukimport android.graphics.drawable.BitmapDrawable;
31094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchoukimport android.graphics.drawable.Drawable;
32094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchoukimport android.os.Handler;
33094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchoukimport android.os.Message;
34094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchoukimport android.util.AttributeSet;
35094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchoukimport android.util.Log;
36094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchoukimport android.view.Surface;
37094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchoukimport android.view.SurfaceHolder;
38094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchoukimport android.view.SurfaceView;
39094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchoukimport android.view.KeyEvent;
40094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchoukimport android.view.MotionEvent;
41094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk
42094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchoukpublic class SceneGraphView extends RSSurfaceView {
43094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk
44094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk    public SceneGraphView(Context context) {
45094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk        super(context);
46094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk        //setFocusable(true);
47094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk    }
48094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk
49094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk    private RenderScriptGL mRS;
50094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk    private SceneGraphRS mRender;
51094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk
52094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk
53094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk    public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
54094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk        super.surfaceChanged(holder, format, w, h);
55094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk        if (mRS == null) {
562222aa90031604e9752ebc2909303a84139b8b18Jason Sams            RenderScriptGL.SurfaceConfig sc = new RenderScriptGL.SurfaceConfig();
572222aa90031604e9752ebc2909303a84139b8b18Jason Sams            sc.setDepth(16, 24);
58bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams            mRS = createRenderScriptGL(sc);
59bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams            mRS.setSurface(holder, w, h);
60094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk            mRender = new SceneGraphRS();
61094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk            mRender.init(mRS, getResources(), w, h);
62094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk        }
63094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk    }
64094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk
65094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk    @Override
66094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk    protected void onDetachedFromWindow() {
67ed9f210568082dd6d1d8a0c92c693d574d87d545Alex Sakhartchouk        if (mRS != null) {
68094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk            mRS = null;
69bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams            destroyRenderScriptGL();
70094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk        }
71094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk    }
72094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk
73094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk    @Override
74094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk    public boolean onKeyDown(int keyCode, KeyEvent event)
75094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk    {
76094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk        // break point at here
77094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk        // this method doesn't work when 'extends View' include 'extends ScrollView'.
78094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk        return super.onKeyDown(keyCode, event);
79094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk    }
80094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk
81094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk
82094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk    @Override
83094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk    public boolean onTouchEvent(MotionEvent ev)
84094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk    {
85094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk        boolean ret = true;
86094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk        int act = ev.getAction();
87094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk        if (act == ev.ACTION_UP) {
88094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk            ret = false;
89094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk        }
90094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk
91094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk        mRender.touchEvent((int)ev.getX(), (int)ev.getY());
92094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk        return ret;
93094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk    }
94094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk}
95094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk
96094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk
97