SceneManager.java revision 61440e8a8bc5d0d3c7edc66eccb609e5f07fea6e
189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project/* 289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * Copyright (C) 2011 The Android Open Source Project 389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * 489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * you may not use this file except in compliance with the License. 689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * You may obtain a copy of the License at 789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * 889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * 1089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 1189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 1289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * See the License for the specific language governing permissions and 1489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * limitations under the License. 1589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project */ 1689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 1789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectpackage com.android.scenegraph; 1889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 1989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectimport java.io.BufferedInputStream; 2089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectimport java.io.File; 2189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectimport java.io.FileInputStream; 2289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectimport java.io.IOException; 237562408b2261d38415453378b6188f74fda99d88Mathias Agopianimport java.io.InputStream; 2489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectimport java.io.Writer; 2589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectimport java.lang.Math; 26c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurentimport java.util.ArrayList; 2789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectimport java.util.HashMap; 2889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectimport java.util.regex.Matcher; 2989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectimport java.util.regex.Pattern; 3089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 31c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurentimport com.android.scenegraph.Scene; 3289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 3389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectimport android.content.res.Resources; 3489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectimport android.graphics.Bitmap; 3589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectimport android.graphics.BitmapFactory; 3689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectimport android.os.AsyncTask; 3789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectimport android.renderscript.*; 3889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectimport android.renderscript.Allocation.MipmapControl; 3989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectimport android.renderscript.Mesh; 4089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectimport android.renderscript.RenderScriptGL; 4189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectimport android.util.Log; 4272ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kastenimport android.view.SurfaceHolder; 4389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 4489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project/** 4589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * @hide 46c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent */ 4772ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kastenpublic class SceneManager extends SceneGraphBase { 48c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 49c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent ScriptC_render mRenderLoop; 503856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ScriptC_camera mCameraScript; 51c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent ScriptC_light mLightScript; 52c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent ScriptC_params mParamsScript; 53c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent ScriptC_transform mTransformScript; 54c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 55c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent RenderScriptGL mRS; 56c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent Resources mRes; 57c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent Mesh mQuad; 58c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent int mWidth; 59c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent int mHeight; 60c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent 6189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Scene mActiveScene; 6289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project private static SceneManager sSceneManager; 6389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 6489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project public static boolean isSDCardPath(String path) { 6589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project int sdCardIndex = path.indexOf("sdcard/"); 6689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project // We are looking for /sdcard/ or sdcard/ 6789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (sdCardIndex == 0 || sdCardIndex == 1) { 6889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return true; 6989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 7089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project sdCardIndex = path.indexOf("mnt/sdcard/"); 7189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (sdCardIndex == 0 || sdCardIndex == 1) { 72c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return true; 7389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 74c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return false; 7572ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten } 76a0d68338a88c2ddb4502f95017b546d603ef1ec7Glenn Kasten 77c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent static Bitmap loadBitmap(String name, Resources res) { 78c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent InputStream is = null; 79c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent boolean loadFromSD = isSDCardPath(name); 80c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent try { 81c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent if (!loadFromSD) { 823856b090cd04ba5dd4a59a12430ed724d5995909Steve Block is = res.getAssets().open(name); 83c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } else { 84c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent File f = new File(name); 85c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent is = new BufferedInputStream(new FileInputStream(f)); 86c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 87c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } catch (IOException e) { 88c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent Log.e("ImageLoaderTask", " Message: " + e.getMessage()); 89c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent return null; 90c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 91fa2877b9ea48baed934b866d2ab3658b69c4c869Eric Laurent 9289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Bitmap b = BitmapFactory.decodeStream(is); 9389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project try { 9489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project is.close(); 9589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } catch (IOException e) { 9689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Log.e("ImageLoaderTask", " Message: " + e.getMessage()); 9789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 9889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return b; 9989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 10089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 10189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project public static Allocation loadCubemap(String name, RenderScriptGL rs, Resources res) { 102 Bitmap b = loadBitmap(name, res); 103 return Allocation.createCubemapFromBitmap(rs, b, 104 MipmapControl.MIPMAP_ON_SYNC_TO_TEXTURE, 105 Allocation.USAGE_GRAPHICS_TEXTURE); 106 } 107 108 public static Allocation loadTexture2D(String name, RenderScriptGL rs, Resources res) { 109 Bitmap b = loadBitmap(name, res); 110 return Allocation.createFromBitmap(rs, b, 111 Allocation.MipmapControl.MIPMAP_ON_SYNC_TO_TEXTURE, 112 Allocation.USAGE_GRAPHICS_TEXTURE); 113 } 114 115 static Allocation getStringAsAllocation(RenderScript rs, String str) { 116 if (str == null) { 117 return null; 118 } 119 if (str.length() == 0) { 120 return null; 121 } 122 byte[] allocArray = null; 123 byte[] nullChar = new byte[1]; 124 nullChar[0] = 0; 125 try { 126 allocArray = str.getBytes("UTF-8"); 127 Allocation alloc = Allocation.createSized(rs, Element.U8(rs), 128 allocArray.length + 1, 129 Allocation.USAGE_SCRIPT); 130 alloc.copy1DRangeFrom(0, allocArray.length, allocArray); 131 alloc.copy1DRangeFrom(allocArray.length, 1, nullChar); 132 return alloc; 133 } 134 catch (Exception e) { 135 throw new RSRuntimeException("Could not convert string to utf-8."); 136 } 137 } 138 139 public static class SceneLoadedCallback implements Runnable { 140 Scene mLoadedScene; 141 String mName; 142 public void run() { 143 } 144 } 145 146 public Scene getActiveScene() { 147 return mActiveScene; 148 } 149 150 public void setActiveScene(Scene s) { 151 mActiveScene = s; 152 } 153 154 public static SceneManager getInstance() { 155 if (sSceneManager == null) { 156 sSceneManager = new SceneManager(); 157 } 158 return sSceneManager; 159 } 160 161 protected SceneManager() { 162 } 163 164 public void loadModel(String name, SceneLoadedCallback cb) { 165 ColladaScene scene = new ColladaScene(name, cb); 166 scene.init(mRS, mRes); 167 } 168 169 public Mesh getScreenAlignedQuad() { 170 if (mQuad != null) { 171 return mQuad; 172 } 173 174 Mesh.TriangleMeshBuilder tmb = new Mesh.TriangleMeshBuilder(mRS, 175 3, Mesh.TriangleMeshBuilder.TEXTURE_0); 176 177 tmb.setTexture(0.0f, 1.0f); 178 tmb.addVertex(-1.0f, 1.0f, 1.0f); 179 180 tmb.setTexture(0.0f, 0.0f); 181 tmb.addVertex(-1.0f, -1.0f, 1.0f); 182 183 tmb.setTexture(1.0f, 0.0f); 184 tmb.addVertex(1.0f, -1.0f, 1.0f); 185 186 tmb.setTexture(1.0f, 1.0f); 187 tmb.addVertex(1.0f, 1.0f, 1.0f); 188 189 tmb.addTriangle(0, 1, 2); 190 tmb.addTriangle(2, 3, 0); 191 192 mQuad = tmb.create(true); 193 return mQuad; 194 } 195 196 public Renderable getRenderableQuad(String name, RenderState state) { 197 Renderable quad = new Renderable(); 198 quad.setTransform(new MatrixTransform()); 199 quad.setMesh(getScreenAlignedQuad()); 200 quad.setName(name); 201 quad.setRenderState(state); 202 quad.setCullType(1); 203 return quad; 204 } 205 206 public void initRS(RenderScriptGL rs, Resources res, int w, int h) { 207 mRS = rs; 208 mRes = res; 209 mTransformScript = new ScriptC_transform(rs, res, R.raw.transform); 210 mTransformScript.set_gTransformScript(mTransformScript); 211 212 mCameraScript = new ScriptC_camera(rs, res, R.raw.camera); 213 mLightScript = new ScriptC_light(rs, res, R.raw.light); 214 mParamsScript = new ScriptC_params(rs, res, R.raw.params); 215 216 mRenderLoop = new ScriptC_render(rs, res, R.raw.render); 217 mRenderLoop.set_gTransformScript(mTransformScript); 218 mRenderLoop.set_gCameraScript(mCameraScript); 219 mRenderLoop.set_gLightScript(mLightScript); 220 mRenderLoop.set_gParamsScript(mParamsScript); 221 222 Allocation checker = Allocation.createFromBitmapResource(mRS, mRes, R.drawable.checker, 223 MipmapControl.MIPMAP_ON_SYNC_TO_TEXTURE, 224 Allocation.USAGE_GRAPHICS_TEXTURE); 225 mRenderLoop.set_gTGrid(checker); 226 mRenderLoop.set_gPFSBackground(ProgramStore.BLEND_NONE_DEPTH_TEST(mRS)); 227 } 228 229 public ScriptC_render getRenderLoop() { 230 return mRenderLoop; 231 } 232} 233 234 235 236 237