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