Scene.java revision c71343acc469db7ec351db2344032801e0e1b30a
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
254bda82de0bca754f3ce387e9968170c5122241a9Alex Sakhartchoukimport com.android.scenegraph.SceneManager;
26e8bb420a687598be9801e7ff4a0d114fa72ac5bcAlex Sakhartchoukimport com.android.scenegraph.TextureBase;
274bda82de0bca754f3ce387e9968170c5122241a9Alex Sakhartchouk
28a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchoukimport android.content.res.Resources;
29a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchoukimport android.os.AsyncTask;
304bda82de0bca754f3ce387e9968170c5122241a9Alex Sakhartchoukimport android.renderscript.*;
314bda82de0bca754f3ce387e9968170c5122241a9Alex Sakhartchoukimport android.renderscript.Mesh;
324bda82de0bca754f3ce387e9968170c5122241a9Alex Sakhartchoukimport android.renderscript.RenderScriptGL;
334bda82de0bca754f3ce387e9968170c5122241a9Alex Sakhartchoukimport android.util.Log;
34a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
35a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk/**
36a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk * @hide
37a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk */
38a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchoukpublic class Scene extends SceneGraphBase {
39a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    private static String TIMER_TAG = "TIMER";
40a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
41a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    CompoundTransform mRootTransforms;
42a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    HashMap<String, Transform> mTransformMap;
43a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    ArrayList<RenderPass> mRenderPasses;
44a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    ArrayList<LightBase> mLights;
45a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    ArrayList<Camera> mCameras;
464fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk    ArrayList<FragmentShader> mFragmentShaders;
474fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk    ArrayList<VertexShader> mVertexShaders;
48684267525b349eb12f4e31d88061c51115678decAlex Sakhartchouk    ArrayList<RenderableBase> mRenderables;
49684267525b349eb12f4e31d88061c51115678decAlex Sakhartchouk    HashMap<String, RenderableBase> mRenderableMap;
50a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    ArrayList<Texture2D> mTextures;
51a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
52684267525b349eb12f4e31d88061c51115678decAlex Sakhartchouk    HashMap<String, ArrayList<Renderable> > mRenderableMeshMap;
53a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
54a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    // RS Specific stuff
55a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    ScriptField_SgTransform mTransformRSData;
56a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
57a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    RenderScriptGL mRS;
58a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    Resources mRes;
59a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
60a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    ScriptField_RenderPass_s mRenderPassAlloc;
61a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
62a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    public Scene() {
63a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mRenderPasses = new ArrayList<RenderPass>();
64a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mLights = new ArrayList<LightBase>();
65a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mCameras = new ArrayList<Camera>();
664fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk        mFragmentShaders = new ArrayList<FragmentShader>();
674fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk        mVertexShaders = new ArrayList<VertexShader>();
68684267525b349eb12f4e31d88061c51115678decAlex Sakhartchouk        mRenderables = new ArrayList<RenderableBase>();
69684267525b349eb12f4e31d88061c51115678decAlex Sakhartchouk        mRenderableMap = new HashMap<String, RenderableBase>();
70684267525b349eb12f4e31d88061c51115678decAlex Sakhartchouk        mRenderableMeshMap = new HashMap<String, ArrayList<Renderable> >();
71a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mTextures = new ArrayList<Texture2D>();
72a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mRootTransforms = new CompoundTransform();
73a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mRootTransforms.setName("_scene_root_");
74a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mTransformMap = new HashMap<String, Transform>();
75a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    }
76a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
77a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    public void appendTransform(Transform t) {
78c71343acc469db7ec351db2344032801e0e1b30aAlex Sakhartchouk        if (t == null) {
79c71343acc469db7ec351db2344032801e0e1b30aAlex Sakhartchouk            throw new RuntimeException("Adding null object");
80c71343acc469db7ec351db2344032801e0e1b30aAlex Sakhartchouk        }
81a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mRootTransforms.appendChild(t);
82a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    }
83a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
84a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    // temporary
85a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    public void addToTransformMap(Transform t) {
86a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mTransformMap.put(t.getName(), t);
87a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    }
88a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
89a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    public Transform getTransformByName(String name) {
90a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        return mTransformMap.get(name);
91a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    }
92a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
93a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    public void appendRenderPass(RenderPass p) {
94c71343acc469db7ec351db2344032801e0e1b30aAlex Sakhartchouk        if (p == null) {
95c71343acc469db7ec351db2344032801e0e1b30aAlex Sakhartchouk            throw new RuntimeException("Adding null object");
96c71343acc469db7ec351db2344032801e0e1b30aAlex Sakhartchouk        }
97a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mRenderPasses.add(p);
98a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    }
99a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
100a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    public void clearRenderPasses() {
101a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mRenderPasses.clear();
102a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    }
103a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
104a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    public void appendLight(LightBase l) {
105c71343acc469db7ec351db2344032801e0e1b30aAlex Sakhartchouk        if (l == null) {
106c71343acc469db7ec351db2344032801e0e1b30aAlex Sakhartchouk            throw new RuntimeException("Adding null object");
107c71343acc469db7ec351db2344032801e0e1b30aAlex Sakhartchouk        }
108a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mLights.add(l);
109a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    }
110a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
111a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    public void appendCamera(Camera c) {
112c71343acc469db7ec351db2344032801e0e1b30aAlex Sakhartchouk        if (c == null) {
113c71343acc469db7ec351db2344032801e0e1b30aAlex Sakhartchouk            throw new RuntimeException("Adding null object");
114c71343acc469db7ec351db2344032801e0e1b30aAlex Sakhartchouk        }
115a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mCameras.add(c);
116a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    }
117a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
1184fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk    public void appendShader(FragmentShader f) {
119c71343acc469db7ec351db2344032801e0e1b30aAlex Sakhartchouk        if (f == null) {
120c71343acc469db7ec351db2344032801e0e1b30aAlex Sakhartchouk            throw new RuntimeException("Adding null object");
121c71343acc469db7ec351db2344032801e0e1b30aAlex Sakhartchouk        }
1224fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk        mFragmentShaders.add(f);
1234fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk    }
1244fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk
1254fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk    public void appendShader(VertexShader v) {
126c71343acc469db7ec351db2344032801e0e1b30aAlex Sakhartchouk        if (v == null) {
127c71343acc469db7ec351db2344032801e0e1b30aAlex Sakhartchouk            throw new RuntimeException("Adding null object");
128c71343acc469db7ec351db2344032801e0e1b30aAlex Sakhartchouk        }
1294fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk        mVertexShaders.add(v);
1304fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk    }
1314fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk
132a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    public ArrayList<Camera> getCameras() {
133a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        return mCameras;
134a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    }
135a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
13661440e8a8bc5d0d3c7edc66eccb609e5f07fea6eAlex Sakhartchouk    public ArrayList<LightBase> getLights() {
13761440e8a8bc5d0d3c7edc66eccb609e5f07fea6eAlex Sakhartchouk        return mLights;
13861440e8a8bc5d0d3c7edc66eccb609e5f07fea6eAlex Sakhartchouk    }
13961440e8a8bc5d0d3c7edc66eccb609e5f07fea6eAlex Sakhartchouk
140684267525b349eb12f4e31d88061c51115678decAlex Sakhartchouk    public void appendRenderable(RenderableBase d) {
141c71343acc469db7ec351db2344032801e0e1b30aAlex Sakhartchouk        if (d == null) {
142c71343acc469db7ec351db2344032801e0e1b30aAlex Sakhartchouk            throw new RuntimeException("Adding null object");
143c71343acc469db7ec351db2344032801e0e1b30aAlex Sakhartchouk        }
144684267525b349eb12f4e31d88061c51115678decAlex Sakhartchouk        mRenderables.add(d);
145684267525b349eb12f4e31d88061c51115678decAlex Sakhartchouk        mRenderableMap.put(d.getName(), d);
146a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    }
147a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
148684267525b349eb12f4e31d88061c51115678decAlex Sakhartchouk    public ArrayList<RenderableBase> getRenderables() {
149684267525b349eb12f4e31d88061c51115678decAlex Sakhartchouk        return mRenderables;
150a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    }
151a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
152684267525b349eb12f4e31d88061c51115678decAlex Sakhartchouk    public RenderableBase getRenderableByName(String name) {
153684267525b349eb12f4e31d88061c51115678decAlex Sakhartchouk        return mRenderableMap.get(name);
154a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    }
155a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
156a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    public void appendTextures(Texture2D tex) {
157c71343acc469db7ec351db2344032801e0e1b30aAlex Sakhartchouk        if (tex == null) {
158c71343acc469db7ec351db2344032801e0e1b30aAlex Sakhartchouk            throw new RuntimeException("Adding null object");
159c71343acc469db7ec351db2344032801e0e1b30aAlex Sakhartchouk        }
160a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mTextures.add(tex);
161a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    }
162a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
163a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    public void assignRenderStateToMaterial(RenderState renderState, String regex) {
164a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        Pattern pattern = Pattern.compile(regex);
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            Matcher m = pattern.matcher(shape.mMaterialName);
169a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk            if (m.find()) {
170a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk                shape.setRenderState(renderState);
171a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk            }
172a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        }
173a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    }
174a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
175a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    public void assignRenderState(RenderState renderState) {
176684267525b349eb12f4e31d88061c51115678decAlex Sakhartchouk        int numRenderables = mRenderables.size();
177684267525b349eb12f4e31d88061c51115678decAlex Sakhartchouk        for (int i = 0; i < numRenderables; i ++) {
178684267525b349eb12f4e31d88061c51115678decAlex Sakhartchouk            Renderable shape = (Renderable)mRenderables.get(i);
179a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk            shape.setRenderState(renderState);
180a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        }
181a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    }
182a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
183a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    public void meshLoaded(Mesh m) {
184684267525b349eb12f4e31d88061c51115678decAlex Sakhartchouk        ArrayList<Renderable> entries = mRenderableMeshMap.get(m.getName());
185a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        int numEntries = entries.size();
186a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        for (int i = 0; i < numEntries; i++) {
187684267525b349eb12f4e31d88061c51115678decAlex Sakhartchouk            Renderable d = entries.get(i);
188a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk            d.resolveMeshData(m);
189a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        }
190a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    }
191a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
192684267525b349eb12f4e31d88061c51115678decAlex Sakhartchouk    void addToMeshMap(Renderable d) {
193684267525b349eb12f4e31d88061c51115678decAlex Sakhartchouk        ArrayList<Renderable> entries = mRenderableMeshMap.get(d.mMeshName);
194a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        if (entries == null) {
195684267525b349eb12f4e31d88061c51115678decAlex Sakhartchouk            entries = new ArrayList<Renderable>();
196684267525b349eb12f4e31d88061c51115678decAlex Sakhartchouk            mRenderableMeshMap.put(d.mMeshName, entries);
197a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        }
198a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        entries.add(d);
199a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    }
200a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
2014bda82de0bca754f3ce387e9968170c5122241a9Alex Sakhartchouk    public void destroyRS() {
2024bda82de0bca754f3ce387e9968170c5122241a9Alex Sakhartchouk        SceneManager sceneManager = SceneManager.getInstance();
203a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mTransformRSData = null;
204a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        sceneManager.mRenderLoop.bind_gRootNode(mTransformRSData);
205684267525b349eb12f4e31d88061c51115678decAlex Sakhartchouk        sceneManager.mRenderLoop.set_gRenderableObjects(null);
206a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mRenderPassAlloc = null;
207a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        sceneManager.mRenderLoop.set_gRenderPasses(null);
208a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        sceneManager.mRenderLoop.bind_gFrontToBack(null);
209a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        sceneManager.mRenderLoop.bind_gBackToFront(null);
210a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        sceneManager.mRenderLoop.set_gCameras(null);
211a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
212a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mTransformMap = null;
213a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mRenderPasses = null;
214a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mLights = null;
215a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mCameras = null;
216684267525b349eb12f4e31d88061c51115678decAlex Sakhartchouk        mRenderables = null;
217684267525b349eb12f4e31d88061c51115678decAlex Sakhartchouk        mRenderableMap = null;
218a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mTextures = null;
219684267525b349eb12f4e31d88061c51115678decAlex Sakhartchouk        mRenderableMeshMap = null;
220a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mRootTransforms = null;
221a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    }
222a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
223a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    public void initRenderPassRS(RenderScriptGL rs, SceneManager sceneManager) {
224a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        if (mRenderPasses.size() != 0) {
225a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk            mRenderPassAlloc = new ScriptField_RenderPass_s(mRS, mRenderPasses.size());
226a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk            for (int i = 0; i < mRenderPasses.size(); i ++) {
227a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk                mRenderPassAlloc.set(mRenderPasses.get(i).getRsField(mRS, mRes), i, false);
228a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk            }
229a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk            mRenderPassAlloc.copyAll();
230a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk            sceneManager.mRenderLoop.set_gRenderPasses(mRenderPassAlloc.getAllocation());
231a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        }
232a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    }
233a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
2344fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk    private void addDrawables(RenderScriptGL rs, Resources res, SceneManager sceneManager) {
235a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        Allocation drawableData = Allocation.createSized(rs,
236a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk                                                         Element.ALLOCATION(rs),
237684267525b349eb12f4e31d88061c51115678decAlex Sakhartchouk                                                         mRenderables.size());
238684267525b349eb12f4e31d88061c51115678decAlex Sakhartchouk        Allocation[] drawableAllocs = new Allocation[mRenderables.size()];
239684267525b349eb12f4e31d88061c51115678decAlex Sakhartchouk        for (int i = 0; i < mRenderables.size(); i ++) {
240684267525b349eb12f4e31d88061c51115678decAlex Sakhartchouk            Renderable dI = (Renderable)mRenderables.get(i);
241a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk            addToMeshMap(dI);
242a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk            drawableAllocs[i] = dI.getRsField(rs, res).getAllocation();
243a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        }
244a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        drawableData.copyFrom(drawableAllocs);
245684267525b349eb12f4e31d88061c51115678decAlex Sakhartchouk        sceneManager.mRenderLoop.set_gRenderableObjects(drawableData);
246a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
247a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        initRenderPassRS(rs, sceneManager);
2484fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk    }
249a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
2504fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk    private void addShaders(RenderScriptGL rs, Resources res, SceneManager sceneManager) {
2514fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk        Allocation shaderData = Allocation.createSized(rs, Element.ALLOCATION(rs),
2524fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk                                                       mVertexShaders.size());
2534fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk        Allocation[] shaderAllocs = new Allocation[mVertexShaders.size()];
2544fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk        for (int i = 0; i < mVertexShaders.size(); i ++) {
2554fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk            VertexShader sI = mVertexShaders.get(i);
256e93db17a143ff560f92d94b68ce1e76f79db7902Alex Sakhartchouk            shaderAllocs[i] = sI.getRSData().getAllocation();
2574fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk        }
2584fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk        shaderData.copyFrom(shaderAllocs);
2594fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk        sceneManager.mRenderLoop.set_gVertexShaders(shaderData);
2604fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk
2614fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk        shaderData = Allocation.createSized(rs, Element.ALLOCATION(rs), mFragmentShaders.size());
2624fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk        shaderAllocs = new Allocation[mFragmentShaders.size()];
2634fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk        for (int i = 0; i < mFragmentShaders.size(); i ++) {
2644fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk            FragmentShader sI = mFragmentShaders.get(i);
265e93db17a143ff560f92d94b68ce1e76f79db7902Alex Sakhartchouk            shaderAllocs[i] = sI.getRSData().getAllocation();
2664fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk        }
2674fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk        shaderData.copyFrom(shaderAllocs);
2684fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk        sceneManager.mRenderLoop.set_gFragmentShaders(shaderData);
2694fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk    }
2704fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk
271e8bb420a687598be9801e7ff4a0d114fa72ac5bcAlex Sakhartchouk    public void initRS() {
272e8bb420a687598be9801e7ff4a0d114fa72ac5bcAlex Sakhartchouk        SceneManager sceneManager = SceneManager.getInstance();
273e8bb420a687598be9801e7ff4a0d114fa72ac5bcAlex Sakhartchouk        mRS = SceneManager.getRS();
274e8bb420a687598be9801e7ff4a0d114fa72ac5bcAlex Sakhartchouk        mRes = SceneManager.getRes();
2754fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk        long start = System.currentTimeMillis();
276e93db17a143ff560f92d94b68ce1e76f79db7902Alex Sakhartchouk        mTransformRSData = mRootTransforms.getRSData();
2774fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk        long end = System.currentTimeMillis();
2784fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk        Log.v(TIMER_TAG, "Transform init time: " + (end - start));
2794fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk
2804fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk        start = System.currentTimeMillis();
2814fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk
2824fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk        sceneManager.mRenderLoop.bind_gRootNode(mTransformRSData);
2834fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk        end = System.currentTimeMillis();
2844fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk        Log.v(TIMER_TAG, "Script init time: " + (end - start));
2854fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk
2864fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk        start = System.currentTimeMillis();
287e8bb420a687598be9801e7ff4a0d114fa72ac5bcAlex Sakhartchouk        addDrawables(mRS, mRes, sceneManager);
288a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        end = System.currentTimeMillis();
289684267525b349eb12f4e31d88061c51115678decAlex Sakhartchouk        Log.v(TIMER_TAG, "Renderable init time: " + (end - start));
290a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
291e8bb420a687598be9801e7ff4a0d114fa72ac5bcAlex Sakhartchouk        addShaders(mRS, mRes, sceneManager);
2924fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk
293e8bb420a687598be9801e7ff4a0d114fa72ac5bcAlex Sakhartchouk        Allocation opaqueBuffer = null;
294e8bb420a687598be9801e7ff4a0d114fa72ac5bcAlex Sakhartchouk        if (mRenderables.size() > 0) {
295e8bb420a687598be9801e7ff4a0d114fa72ac5bcAlex Sakhartchouk            opaqueBuffer = Allocation.createSized(mRS, Element.U32(mRS), mRenderables.size());
296e8bb420a687598be9801e7ff4a0d114fa72ac5bcAlex Sakhartchouk        }
297e8bb420a687598be9801e7ff4a0d114fa72ac5bcAlex Sakhartchouk        Allocation transparentBuffer = null;
298e8bb420a687598be9801e7ff4a0d114fa72ac5bcAlex Sakhartchouk        if (mRenderables.size() > 0) {
299e8bb420a687598be9801e7ff4a0d114fa72ac5bcAlex Sakhartchouk            transparentBuffer = Allocation.createSized(mRS, Element.U32(mRS), mRenderables.size());
300e8bb420a687598be9801e7ff4a0d114fa72ac5bcAlex Sakhartchouk        }
301a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
302a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        sceneManager.mRenderLoop.bind_gFrontToBack(opaqueBuffer);
303a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        sceneManager.mRenderLoop.bind_gBackToFront(transparentBuffer);
304a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
305e8bb420a687598be9801e7ff4a0d114fa72ac5bcAlex Sakhartchouk        if (mCameras.size() > 0) {
306e8bb420a687598be9801e7ff4a0d114fa72ac5bcAlex Sakhartchouk            Allocation cameraData;
307e8bb420a687598be9801e7ff4a0d114fa72ac5bcAlex Sakhartchouk            cameraData = Allocation.createSized(mRS, Element.ALLOCATION(mRS), mCameras.size());
308e8bb420a687598be9801e7ff4a0d114fa72ac5bcAlex Sakhartchouk            Allocation[] cameraAllocs = new Allocation[mCameras.size()];
309e8bb420a687598be9801e7ff4a0d114fa72ac5bcAlex Sakhartchouk            for (int i = 0; i < mCameras.size(); i ++) {
310e8bb420a687598be9801e7ff4a0d114fa72ac5bcAlex Sakhartchouk                cameraAllocs[i] = mCameras.get(i).getRSData().getAllocation();
311e8bb420a687598be9801e7ff4a0d114fa72ac5bcAlex Sakhartchouk            }
312e8bb420a687598be9801e7ff4a0d114fa72ac5bcAlex Sakhartchouk            cameraData.copyFrom(cameraAllocs);
313e8bb420a687598be9801e7ff4a0d114fa72ac5bcAlex Sakhartchouk            sceneManager.mRenderLoop.set_gCameras(cameraData);
314a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        }
315875a538d5db06e7e055401050e03b86bf8598536Alex Sakhartchouk
316e8bb420a687598be9801e7ff4a0d114fa72ac5bcAlex Sakhartchouk        if (mLights.size() > 0) {
317e8bb420a687598be9801e7ff4a0d114fa72ac5bcAlex Sakhartchouk            Allocation lightData = Allocation.createSized(mRS,
318e8bb420a687598be9801e7ff4a0d114fa72ac5bcAlex Sakhartchouk                                                          Element.ALLOCATION(mRS),
3196f31c36a3dbe5e61644ec39c4fcad0284d50e4f1Alex Sakhartchouk                                                          mLights.size());
320875a538d5db06e7e055401050e03b86bf8598536Alex Sakhartchouk            Allocation[] lightAllocs = new Allocation[mLights.size()];
321875a538d5db06e7e055401050e03b86bf8598536Alex Sakhartchouk            for (int i = 0; i < mLights.size(); i ++) {
322e93db17a143ff560f92d94b68ce1e76f79db7902Alex Sakhartchouk                lightAllocs[i] = mLights.get(i).getRSData().getAllocation();
323875a538d5db06e7e055401050e03b86bf8598536Alex Sakhartchouk            }
324875a538d5db06e7e055401050e03b86bf8598536Alex Sakhartchouk            lightData.copyFrom(lightAllocs);
325875a538d5db06e7e055401050e03b86bf8598536Alex Sakhartchouk            sceneManager.mRenderLoop.set_gLights(lightData);
326875a538d5db06e7e055401050e03b86bf8598536Alex Sakhartchouk        }
327a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    }
328a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk}
329a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
330a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
331a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
332a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
333