Scene.java revision a7a211b8a68a7d3f5ff4409aa286db07f96c0550
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
38a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    private class ImageLoaderTask extends AsyncTask<String, Void, Boolean> {
39a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        protected Boolean doInBackground(String... names) {
40a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk            long start = System.currentTimeMillis();
41a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk            for (int i = 0; i < mDrawables.size(); i ++) {
42a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk                Drawable dI = (Drawable)mDrawables.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;
59a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    ArrayList<DrawableBase> mDrawables;
60a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    HashMap<String, DrawableBase> mDrawableMap;
61a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    ArrayList<Texture2D> mTextures;
62a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
63a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    HashMap<String, ArrayList<Drawable> > mDrawableMeshMap;
64a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
65a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    // RS Specific stuff
66a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    ScriptField_SgTransform mTransformRSData;
67a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
68a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    RenderScriptGL mRS;
69a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    Resources mRes;
70a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
71a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    ScriptField_RenderPass_s mRenderPassAlloc;
72a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
73a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    public Scene() {
74a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mRenderPasses = new ArrayList<RenderPass>();
75a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mLights = new ArrayList<LightBase>();
76a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mCameras = new ArrayList<Camera>();
77a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mDrawables = new ArrayList<DrawableBase>();
78a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mDrawableMap = new HashMap<String, DrawableBase>();
79a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mDrawableMeshMap = new HashMap<String, ArrayList<Drawable> >();
80a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mTextures = new ArrayList<Texture2D>();
81a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mRootTransforms = new CompoundTransform();
82a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mRootTransforms.setName("_scene_root_");
83a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mTransformMap = new HashMap<String, Transform>();
84a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    }
85a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
86a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    public void appendTransform(Transform t) {
87a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mRootTransforms.appendChild(t);
88a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    }
89a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
90a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    // temporary
91a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    public void addToTransformMap(Transform t) {
92a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mTransformMap.put(t.getName(), t);
93a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    }
94a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
95a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    public Transform getTransformByName(String name) {
96a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        return mTransformMap.get(name);
97a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    }
98a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
99a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    public void appendRenderPass(RenderPass p) {
100a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mRenderPasses.add(p);
101a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    }
102a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
103a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    public void clearRenderPasses() {
104a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mRenderPasses.clear();
105a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    }
106a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
107a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    public void appendLight(LightBase l) {
108a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mLights.add(l);
109a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    }
110a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
111a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    public void appendCamera(Camera c) {
112a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mCameras.add(c);
113a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    }
114a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
115a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    public ArrayList<Camera> getCameras() {
116a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        return mCameras;
117a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    }
118a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
119a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    public void appendDrawable(DrawableBase d) {
120a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mDrawables.add(d);
121a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mDrawableMap.put(d.getName(), d);
122a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    }
123a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
124a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    public ArrayList<DrawableBase> getDrawables() {
125a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        return mDrawables;
126a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    }
127a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
128a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    public DrawableBase getDrawableByName(String name) {
129a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        return mDrawableMap.get(name);
130a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    }
131a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
132a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    public void appendTextures(Texture2D tex) {
133a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mTextures.add(tex);
134a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    }
135a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
136a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    public void assignRenderStateToMaterial(RenderState renderState, String regex) {
137a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        Pattern pattern = Pattern.compile(regex);
138a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        int numDrawables = mDrawables.size();
139a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        for (int i = 0; i < numDrawables; i ++) {
140a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk            Drawable shape = (Drawable)mDrawables.get(i);
141a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk            Matcher m = pattern.matcher(shape.mMaterialName);
142a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk            if (m.find()) {
143a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk                shape.setRenderState(renderState);
144a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk            }
145a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        }
146a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    }
147a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
148a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    public void assignRenderState(RenderState renderState) {
149a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        int numDrawables = mDrawables.size();
150a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        for (int i = 0; i < numDrawables; i ++) {
151a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk            Drawable shape = (Drawable)mDrawables.get(i);
152a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk            shape.setRenderState(renderState);
153a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        }
154a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    }
155a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
156a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    public void meshLoaded(Mesh m) {
157a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        ArrayList<Drawable> entries = mDrawableMeshMap.get(m.getName());
158a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        int numEntries = entries.size();
159a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        for (int i = 0; i < numEntries; i++) {
160a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk            Drawable d = entries.get(i);
161a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk            d.resolveMeshData(m);
162a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk            //mDrawablesField.set(d.getRsField(mRS, mRes), d.sceneIndex, true);
163a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        }
164a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    }
165a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
166a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    void addToMeshMap(Drawable d) {
167a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        ArrayList<Drawable> entries = mDrawableMeshMap.get(d.mMeshName);
168a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        if (entries == null) {
169a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk            entries = new ArrayList<Drawable>();
170a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk            mDrawableMeshMap.put(d.mMeshName, entries);
171a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        }
172a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        entries.add(d);
173a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    }
174a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
175a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    public void destroyRS(SceneManager sceneManager) {
176a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mTransformRSData = null;
177a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        sceneManager.mRenderLoop.bind_gRootNode(mTransformRSData);
178a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        sceneManager.mRenderLoop.set_gDrawableObjects(null);
179a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mRenderPassAlloc = null;
180a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        sceneManager.mRenderLoop.set_gRenderPasses(null);
181a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        sceneManager.mRenderLoop.bind_gFrontToBack(null);
182a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        sceneManager.mRenderLoop.bind_gBackToFront(null);
183a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        sceneManager.mRenderLoop.set_gCameras(null);
184a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
185a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mTransformMap = null;
186a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mRenderPasses = null;
187a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mLights = null;
188a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mCameras = null;
189a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mDrawables = null;
190a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mDrawableMap = null;
191a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mTextures = null;
192a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mDrawableMeshMap = null;
193a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mRootTransforms = null;
194a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    }
195a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
196a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    public void initRenderPassRS(RenderScriptGL rs, SceneManager sceneManager) {
197a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        if (mRenderPasses.size() != 0) {
198a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk            mRenderPassAlloc = new ScriptField_RenderPass_s(mRS, mRenderPasses.size());
199a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk            for (int i = 0; i < mRenderPasses.size(); i ++) {
200a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk                mRenderPassAlloc.set(mRenderPasses.get(i).getRsField(mRS, mRes), i, false);
201a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk            }
202a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk            mRenderPassAlloc.copyAll();
203a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk            sceneManager.mRenderLoop.set_gRenderPasses(mRenderPassAlloc.getAllocation());
204a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        }
205a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    }
206a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
207a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    public void initRS(RenderScriptGL rs, Resources res, SceneManager sceneManager) {
208a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mRS = rs;
209a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        long start = System.currentTimeMillis();
210a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mTransformRSData = mRootTransforms.getRSData(rs);
211a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        long end = System.currentTimeMillis();
212a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        Log.v(TIMER_TAG, "Transform init time: " + (end - start));
213a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
214a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        start = System.currentTimeMillis();
215a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
216a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        sceneManager.mRenderLoop.bind_gRootNode(mTransformRSData);
217a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        end = System.currentTimeMillis();
218a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        Log.v(TIMER_TAG, "Script init time: " + (end - start));
219a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
220a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        start = System.currentTimeMillis();
221a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        Allocation drawableData = Allocation.createSized(rs,
222a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk                                                         Element.ALLOCATION(rs),
223a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk                                                         mDrawables.size());
224a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        Allocation[] drawableAllocs = new Allocation[mDrawables.size()];
225a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        for (int i = 0; i < mDrawables.size(); i ++) {
226a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk            Drawable dI = (Drawable)mDrawables.get(i);
227a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk            dI.sceneIndex = i;
228a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk            addToMeshMap(dI);
229a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk            drawableAllocs[i] = dI.getRsField(rs, res).getAllocation();
230a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        }
231a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        drawableData.copyFrom(drawableAllocs);
232a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        sceneManager.mRenderLoop.set_gDrawableObjects(drawableData);
233a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
234a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        initRenderPassRS(rs, sceneManager);
235a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
236a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        new ImageLoaderTask().execute();
237a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
238a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        end = System.currentTimeMillis();
239a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        Log.v(TIMER_TAG, "Drawable init time: " + (end - start));
240a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
241a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        Allocation opaqueBuffer = Allocation.createSized(rs, Element.U32(rs), mDrawables.size());
242a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        Allocation transparentBuffer = Allocation.createSized(rs,
243a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk                                                              Element.U32(rs), mDrawables.size());
244a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
245a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        sceneManager.mRenderLoop.bind_gFrontToBack(opaqueBuffer);
246a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        sceneManager.mRenderLoop.bind_gBackToFront(transparentBuffer);
247a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
248a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        Allocation cameraData = Allocation.createSized(rs, Element.ALLOCATION(rs), mCameras.size());
249a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        Allocation[] cameraAllocs = new Allocation[mCameras.size()];
250a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        for (int i = 0; i < mCameras.size(); i ++) {
251a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk            cameraAllocs[i] = mCameras.get(i).getRSData(rs).getAllocation();
252a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        }
253a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        cameraData.copyFrom(cameraAllocs);
254a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        sceneManager.mRenderLoop.set_gCameras(cameraData);
255a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    }
256a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk}
257a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
258a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
259a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
260a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
261