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