Scene.java revision 4fd35d8f49dbed174828da60b70c37e7a77a0d13
1a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk/*
2a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk * Copyright (C) 2011 The Android Open Source Project
3a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk *
4a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk * Licensed under the Apache License, Version 2.0 (the "License");
5a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk * you may not use this file except in compliance with the License.
6a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk * You may obtain a copy of the License at
7a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk *
8a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk *      http://www.apache.org/licenses/LICENSE-2.0
9a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk *
10a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk * Unless required by applicable law or agreed to in writing, software
11a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk * distributed under the License is distributed on an "AS IS" BASIS,
12a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk * See the License for the specific language governing permissions and
14a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk * limitations under the License.
15a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk */
16a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
17a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchoukpackage com.android.scenegraph;
18a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
19a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchoukimport java.lang.Math;
20a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchoukimport java.util.ArrayList;
21a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchoukimport java.util.HashMap;
22a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchoukimport java.util.regex.Matcher;
23a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchoukimport java.util.regex.Pattern;
24a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
25a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchoukimport android.renderscript.RenderScriptGL;
26a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchoukimport android.renderscript.Mesh;
27a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchoukimport android.renderscript.*;
28a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchoukimport android.content.res.Resources;
29a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchoukimport android.util.Log;
30a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchoukimport android.os.AsyncTask;
31a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
32a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk/**
33a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk * @hide
34a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk */
35a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchoukpublic class Scene extends SceneGraphBase {
36a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    private static String TIMER_TAG = "TIMER";
37a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
38516054bf53b0a8844267185ddaf1d505c9e81da7Alex Sakhartchouk    private class ImageLoaderTask extends AsyncTask<ArrayList<RenderableBase>, Void, Boolean> {
39516054bf53b0a8844267185ddaf1d505c9e81da7Alex Sakhartchouk        protected Boolean doInBackground(ArrayList<RenderableBase>... objects) {
40a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk            long start = System.currentTimeMillis();
41516054bf53b0a8844267185ddaf1d505c9e81da7Alex Sakhartchouk            for (int i = 0; i < objects[0].size(); i ++) {
42516054bf53b0a8844267185ddaf1d505c9e81da7Alex Sakhartchouk                Renderable dI = (Renderable)objects[0].get(i);
43a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk                dI.updateTextures(mRS, mRes);
44a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk            }
45a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk            long end = System.currentTimeMillis();
46a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk            Log.v(TIMER_TAG, "Texture init time: " + (end - start));
47a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk            return new Boolean(true);
48a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        }
49a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
50a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        protected void onPostExecute(Boolean result) {
51a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        }
52a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    }
53a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
54a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    CompoundTransform mRootTransforms;
55a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    HashMap<String, Transform> mTransformMap;
56a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    ArrayList<RenderPass> mRenderPasses;
57a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    ArrayList<LightBase> mLights;
58a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    ArrayList<Camera> mCameras;
594fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk    ArrayList<FragmentShader> mFragmentShaders;
604fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk    ArrayList<VertexShader> mVertexShaders;
61684267525b349eb12f4e31d88061c51115678decAlex Sakhartchouk    ArrayList<RenderableBase> mRenderables;
62684267525b349eb12f4e31d88061c51115678decAlex Sakhartchouk    HashMap<String, RenderableBase> mRenderableMap;
63a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    ArrayList<Texture2D> mTextures;
64a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
65684267525b349eb12f4e31d88061c51115678decAlex Sakhartchouk    HashMap<String, ArrayList<Renderable> > mRenderableMeshMap;
66a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
67a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    // RS Specific stuff
68a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    ScriptField_SgTransform mTransformRSData;
69a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
70a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    RenderScriptGL mRS;
71a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    Resources mRes;
72a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
73a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    ScriptField_RenderPass_s mRenderPassAlloc;
74a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
75a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    public Scene() {
76a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mRenderPasses = new ArrayList<RenderPass>();
77a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mLights = new ArrayList<LightBase>();
78a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mCameras = new ArrayList<Camera>();
794fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk        mFragmentShaders = new ArrayList<FragmentShader>();
804fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk        mVertexShaders = new ArrayList<VertexShader>();
81684267525b349eb12f4e31d88061c51115678decAlex Sakhartchouk        mRenderables = new ArrayList<RenderableBase>();
82684267525b349eb12f4e31d88061c51115678decAlex Sakhartchouk        mRenderableMap = new HashMap<String, RenderableBase>();
83684267525b349eb12f4e31d88061c51115678decAlex Sakhartchouk        mRenderableMeshMap = new HashMap<String, ArrayList<Renderable> >();
84a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mTextures = new ArrayList<Texture2D>();
85a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mRootTransforms = new CompoundTransform();
86a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mRootTransforms.setName("_scene_root_");
87a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mTransformMap = new HashMap<String, Transform>();
88a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    }
89a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
90a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    public void appendTransform(Transform t) {
91a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mRootTransforms.appendChild(t);
92a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    }
93a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
94a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    // temporary
95a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    public void addToTransformMap(Transform t) {
96a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mTransformMap.put(t.getName(), t);
97a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    }
98a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
99a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    public Transform getTransformByName(String name) {
100a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        return mTransformMap.get(name);
101a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    }
102a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
103a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    public void appendRenderPass(RenderPass p) {
104a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mRenderPasses.add(p);
105a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    }
106a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
107a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    public void clearRenderPasses() {
108a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mRenderPasses.clear();
109a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    }
110a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
111a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    public void appendLight(LightBase l) {
112a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mLights.add(l);
113a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    }
114a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
115a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    public void appendCamera(Camera c) {
116a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mCameras.add(c);
117a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    }
118a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
1194fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk    public void appendShader(FragmentShader f) {
1204fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk        mFragmentShaders.add(f);
1214fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk    }
1224fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk
1234fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk    public void appendShader(VertexShader v) {
1244fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk        mVertexShaders.add(v);
1254fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk    }
1264fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk
127a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    public ArrayList<Camera> getCameras() {
128a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        return mCameras;
129a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    }
130a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
13161440e8a8bc5d0d3c7edc66eccb609e5f07fea6eAlex Sakhartchouk    public ArrayList<LightBase> getLights() {
13261440e8a8bc5d0d3c7edc66eccb609e5f07fea6eAlex Sakhartchouk        return mLights;
13361440e8a8bc5d0d3c7edc66eccb609e5f07fea6eAlex Sakhartchouk    }
13461440e8a8bc5d0d3c7edc66eccb609e5f07fea6eAlex Sakhartchouk
135684267525b349eb12f4e31d88061c51115678decAlex Sakhartchouk    public void appendRenderable(RenderableBase d) {
136684267525b349eb12f4e31d88061c51115678decAlex Sakhartchouk        mRenderables.add(d);
137684267525b349eb12f4e31d88061c51115678decAlex Sakhartchouk        mRenderableMap.put(d.getName(), d);
138a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    }
139a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
140684267525b349eb12f4e31d88061c51115678decAlex Sakhartchouk    public ArrayList<RenderableBase> getRenderables() {
141684267525b349eb12f4e31d88061c51115678decAlex Sakhartchouk        return mRenderables;
142a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    }
143a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
144684267525b349eb12f4e31d88061c51115678decAlex Sakhartchouk    public RenderableBase getRenderableByName(String name) {
145684267525b349eb12f4e31d88061c51115678decAlex Sakhartchouk        return mRenderableMap.get(name);
146a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    }
147a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
148a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    public void appendTextures(Texture2D tex) {
149a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mTextures.add(tex);
150a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    }
151a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
152a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    public void assignRenderStateToMaterial(RenderState renderState, String regex) {
153a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        Pattern pattern = Pattern.compile(regex);
154684267525b349eb12f4e31d88061c51115678decAlex Sakhartchouk        int numRenderables = mRenderables.size();
155684267525b349eb12f4e31d88061c51115678decAlex Sakhartchouk        for (int i = 0; i < numRenderables; i ++) {
156684267525b349eb12f4e31d88061c51115678decAlex Sakhartchouk            Renderable shape = (Renderable)mRenderables.get(i);
157a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk            Matcher m = pattern.matcher(shape.mMaterialName);
158a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk            if (m.find()) {
159a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk                shape.setRenderState(renderState);
160a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk            }
161a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        }
162a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    }
163a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
164a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    public void assignRenderState(RenderState renderState) {
165684267525b349eb12f4e31d88061c51115678decAlex Sakhartchouk        int numRenderables = mRenderables.size();
166684267525b349eb12f4e31d88061c51115678decAlex Sakhartchouk        for (int i = 0; i < numRenderables; i ++) {
167684267525b349eb12f4e31d88061c51115678decAlex Sakhartchouk            Renderable shape = (Renderable)mRenderables.get(i);
168a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk            shape.setRenderState(renderState);
169a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        }
170a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    }
171a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
172a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    public void meshLoaded(Mesh m) {
173684267525b349eb12f4e31d88061c51115678decAlex Sakhartchouk        ArrayList<Renderable> entries = mRenderableMeshMap.get(m.getName());
174a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        int numEntries = entries.size();
175a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        for (int i = 0; i < numEntries; i++) {
176684267525b349eb12f4e31d88061c51115678decAlex Sakhartchouk            Renderable d = entries.get(i);
177a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk            d.resolveMeshData(m);
178684267525b349eb12f4e31d88061c51115678decAlex Sakhartchouk            //mRenderablesField.set(d.getRsField(mRS, mRes), d.sceneIndex, true);
179a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        }
180a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    }
181a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
182684267525b349eb12f4e31d88061c51115678decAlex Sakhartchouk    void addToMeshMap(Renderable d) {
183684267525b349eb12f4e31d88061c51115678decAlex Sakhartchouk        ArrayList<Renderable> entries = mRenderableMeshMap.get(d.mMeshName);
184a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        if (entries == null) {
185684267525b349eb12f4e31d88061c51115678decAlex Sakhartchouk            entries = new ArrayList<Renderable>();
186684267525b349eb12f4e31d88061c51115678decAlex Sakhartchouk            mRenderableMeshMap.put(d.mMeshName, entries);
187a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        }
188a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        entries.add(d);
189a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    }
190a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
191a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    public void destroyRS(SceneManager sceneManager) {
192a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mTransformRSData = null;
193a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        sceneManager.mRenderLoop.bind_gRootNode(mTransformRSData);
194684267525b349eb12f4e31d88061c51115678decAlex Sakhartchouk        sceneManager.mRenderLoop.set_gRenderableObjects(null);
195a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mRenderPassAlloc = null;
196a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        sceneManager.mRenderLoop.set_gRenderPasses(null);
197a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        sceneManager.mRenderLoop.bind_gFrontToBack(null);
198a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        sceneManager.mRenderLoop.bind_gBackToFront(null);
199a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        sceneManager.mRenderLoop.set_gCameras(null);
200a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
201a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mTransformMap = null;
202a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mRenderPasses = null;
203a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mLights = null;
204a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mCameras = null;
205684267525b349eb12f4e31d88061c51115678decAlex Sakhartchouk        mRenderables = null;
206684267525b349eb12f4e31d88061c51115678decAlex Sakhartchouk        mRenderableMap = null;
207a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mTextures = null;
208684267525b349eb12f4e31d88061c51115678decAlex Sakhartchouk        mRenderableMeshMap = null;
209a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mRootTransforms = null;
210a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    }
211a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
212a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    public void initRenderPassRS(RenderScriptGL rs, SceneManager sceneManager) {
213a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        if (mRenderPasses.size() != 0) {
214a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk            mRenderPassAlloc = new ScriptField_RenderPass_s(mRS, mRenderPasses.size());
215a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk            for (int i = 0; i < mRenderPasses.size(); i ++) {
216a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk                mRenderPassAlloc.set(mRenderPasses.get(i).getRsField(mRS, mRes), i, false);
217516054bf53b0a8844267185ddaf1d505c9e81da7Alex Sakhartchouk                new ImageLoaderTask().execute(mRenderPasses.get(i).getRenderables());
218a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk            }
219a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk            mRenderPassAlloc.copyAll();
220a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk            sceneManager.mRenderLoop.set_gRenderPasses(mRenderPassAlloc.getAllocation());
221516054bf53b0a8844267185ddaf1d505c9e81da7Alex Sakhartchouk        } else {
222516054bf53b0a8844267185ddaf1d505c9e81da7Alex Sakhartchouk            new ImageLoaderTask().execute(mRenderables);
223a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        }
224a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    }
225a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
2264fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk    private void addDrawables(RenderScriptGL rs, Resources res, SceneManager sceneManager) {
227a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        Allocation drawableData = Allocation.createSized(rs,
228a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk                                                         Element.ALLOCATION(rs),
229684267525b349eb12f4e31d88061c51115678decAlex Sakhartchouk                                                         mRenderables.size());
230684267525b349eb12f4e31d88061c51115678decAlex Sakhartchouk        Allocation[] drawableAllocs = new Allocation[mRenderables.size()];
231684267525b349eb12f4e31d88061c51115678decAlex Sakhartchouk        for (int i = 0; i < mRenderables.size(); i ++) {
232684267525b349eb12f4e31d88061c51115678decAlex Sakhartchouk            Renderable dI = (Renderable)mRenderables.get(i);
233a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk            dI.sceneIndex = i;
234a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk            addToMeshMap(dI);
235a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk            drawableAllocs[i] = dI.getRsField(rs, res).getAllocation();
236a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        }
237a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        drawableData.copyFrom(drawableAllocs);
238684267525b349eb12f4e31d88061c51115678decAlex Sakhartchouk        sceneManager.mRenderLoop.set_gRenderableObjects(drawableData);
239a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
240a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        initRenderPassRS(rs, sceneManager);
2414fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk    }
242a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
2434fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk    private void addShaders(RenderScriptGL rs, Resources res, SceneManager sceneManager) {
2444fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk        Allocation shaderData = Allocation.createSized(rs, Element.ALLOCATION(rs),
2454fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk                                                       mVertexShaders.size());
2464fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk        Allocation[] shaderAllocs = new Allocation[mVertexShaders.size()];
2474fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk        for (int i = 0; i < mVertexShaders.size(); i ++) {
2484fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk            VertexShader sI = mVertexShaders.get(i);
2494fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk            shaderAllocs[i] = sI.getRSData(rs).getAllocation();
2504fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk        }
2514fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk        shaderData.copyFrom(shaderAllocs);
2524fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk        sceneManager.mRenderLoop.set_gVertexShaders(shaderData);
2534fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk
2544fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk        shaderData = Allocation.createSized(rs, Element.ALLOCATION(rs), mFragmentShaders.size());
2554fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk        shaderAllocs = new Allocation[mFragmentShaders.size()];
2564fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk        for (int i = 0; i < mFragmentShaders.size(); i ++) {
2574fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk            FragmentShader sI = mFragmentShaders.get(i);
2584fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk            shaderAllocs[i] = sI.getRSData(rs).getAllocation();
2594fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk        }
2604fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk        shaderData.copyFrom(shaderAllocs);
2614fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk        sceneManager.mRenderLoop.set_gFragmentShaders(shaderData);
2624fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk    }
2634fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk
2644fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk    public void initRS(RenderScriptGL rs, Resources res, SceneManager sceneManager) {
2654fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk        mRS = rs;
2664fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk        mRes = res;
2674fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk        long start = System.currentTimeMillis();
2684fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk        mTransformRSData = mRootTransforms.getRSData(rs);
2694fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk        long end = System.currentTimeMillis();
2704fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk        Log.v(TIMER_TAG, "Transform init time: " + (end - start));
2714fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk
2724fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk        start = System.currentTimeMillis();
2734fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk
2744fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk        sceneManager.mRenderLoop.bind_gRootNode(mTransformRSData);
2754fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk        end = System.currentTimeMillis();
2764fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk        Log.v(TIMER_TAG, "Script init time: " + (end - start));
2774fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk
2784fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk        start = System.currentTimeMillis();
2794fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk        addDrawables(rs, res, sceneManager);
280a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        end = System.currentTimeMillis();
281684267525b349eb12f4e31d88061c51115678decAlex Sakhartchouk        Log.v(TIMER_TAG, "Renderable init time: " + (end - start));
282a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
2834fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk        addShaders(rs, res, sceneManager);
2844fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk
285684267525b349eb12f4e31d88061c51115678decAlex Sakhartchouk        Allocation opaqueBuffer = Allocation.createSized(rs, Element.U32(rs), mRenderables.size());
286a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        Allocation transparentBuffer = Allocation.createSized(rs,
287684267525b349eb12f4e31d88061c51115678decAlex Sakhartchouk                                                              Element.U32(rs), mRenderables.size());
288a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
289a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        sceneManager.mRenderLoop.bind_gFrontToBack(opaqueBuffer);
290a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        sceneManager.mRenderLoop.bind_gBackToFront(transparentBuffer);
291a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
292a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        Allocation cameraData = Allocation.createSized(rs, Element.ALLOCATION(rs), mCameras.size());
293a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        Allocation[] cameraAllocs = new Allocation[mCameras.size()];
294a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        for (int i = 0; i < mCameras.size(); i ++) {
295a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk            cameraAllocs[i] = mCameras.get(i).getRSData(rs).getAllocation();
296a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        }
297a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        cameraData.copyFrom(cameraAllocs);
298a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        sceneManager.mRenderLoop.set_gCameras(cameraData);
299875a538d5db06e7e055401050e03b86bf8598536Alex Sakhartchouk
300875a538d5db06e7e055401050e03b86bf8598536Alex Sakhartchouk        if (mLights.size() != 0) {
301875a538d5db06e7e055401050e03b86bf8598536Alex Sakhartchouk            Allocation lightData = Allocation.createSized(rs,
302875a538d5db06e7e055401050e03b86bf8598536Alex Sakhartchouk                                                          Element.ALLOCATION(rs),
303875a538d5db06e7e055401050e03b86bf8598536Alex Sakhartchouk                                                          mCameras.size());
304875a538d5db06e7e055401050e03b86bf8598536Alex Sakhartchouk            Allocation[] lightAllocs = new Allocation[mLights.size()];
305875a538d5db06e7e055401050e03b86bf8598536Alex Sakhartchouk            for (int i = 0; i < mLights.size(); i ++) {
306875a538d5db06e7e055401050e03b86bf8598536Alex Sakhartchouk                lightAllocs[i] = mLights.get(i).getRSData(rs).getAllocation();
307875a538d5db06e7e055401050e03b86bf8598536Alex Sakhartchouk            }
308875a538d5db06e7e055401050e03b86bf8598536Alex Sakhartchouk            lightData.copyFrom(lightAllocs);
309875a538d5db06e7e055401050e03b86bf8598536Alex Sakhartchouk            sceneManager.mRenderLoop.set_gLights(lightData);
310875a538d5db06e7e055401050e03b86bf8598536Alex Sakhartchouk        }
311a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    }
312a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk}
313a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
314a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
315a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
316a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
317