Scene.java revision e93db17a143ff560f92d94b68ce1e76f79db7902
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;
264bda82de0bca754f3ce387e9968170c5122241a9Alex Sakhartchouk
27a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchoukimport android.content.res.Resources;
28a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchoukimport android.os.AsyncTask;
294bda82de0bca754f3ce387e9968170c5122241a9Alex Sakhartchoukimport android.renderscript.*;
304bda82de0bca754f3ce387e9968170c5122241a9Alex Sakhartchoukimport android.renderscript.Mesh;
314bda82de0bca754f3ce387e9968170c5122241a9Alex Sakhartchoukimport android.renderscript.RenderScriptGL;
324bda82de0bca754f3ce387e9968170c5122241a9Alex Sakhartchoukimport android.util.Log;
33a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
34a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk/**
35a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk * @hide
36a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk */
37a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchoukpublic class Scene extends SceneGraphBase {
38a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    private static String TIMER_TAG = "TIMER";
39a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
40516054bf53b0a8844267185ddaf1d505c9e81da7Alex Sakhartchouk    private class ImageLoaderTask extends AsyncTask<ArrayList<RenderableBase>, Void, Boolean> {
41516054bf53b0a8844267185ddaf1d505c9e81da7Alex Sakhartchouk        protected Boolean doInBackground(ArrayList<RenderableBase>... objects) {
42a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk            long start = System.currentTimeMillis();
43516054bf53b0a8844267185ddaf1d505c9e81da7Alex Sakhartchouk            for (int i = 0; i < objects[0].size(); i ++) {
44516054bf53b0a8844267185ddaf1d505c9e81da7Alex Sakhartchouk                Renderable dI = (Renderable)objects[0].get(i);
45a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk                dI.updateTextures(mRS, mRes);
46a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk            }
47a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk            long end = System.currentTimeMillis();
48a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk            Log.v(TIMER_TAG, "Texture init time: " + (end - start));
49a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk            return new Boolean(true);
50a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        }
51a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
52a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        protected void onPostExecute(Boolean result) {
53a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        }
54a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    }
55a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
5699b93819f12f18b8559f702d7a303c31fe05205aAlex Sakhartchouk    private class ShaderImageLoader extends AsyncTask<ArrayList<FragmentShader>, Void, Boolean> {
5799b93819f12f18b8559f702d7a303c31fe05205aAlex Sakhartchouk        protected Boolean doInBackground(ArrayList<FragmentShader>... objects) {
5899b93819f12f18b8559f702d7a303c31fe05205aAlex Sakhartchouk            long start = System.currentTimeMillis();
5999b93819f12f18b8559f702d7a303c31fe05205aAlex Sakhartchouk            for (int i = 0; i < objects[0].size(); i ++) {
6099b93819f12f18b8559f702d7a303c31fe05205aAlex Sakhartchouk                FragmentShader sI = objects[0].get(i);
61e93db17a143ff560f92d94b68ce1e76f79db7902Alex Sakhartchouk                sI.updateTextures();
6299b93819f12f18b8559f702d7a303c31fe05205aAlex Sakhartchouk            }
6399b93819f12f18b8559f702d7a303c31fe05205aAlex Sakhartchouk            long end = System.currentTimeMillis();
6499b93819f12f18b8559f702d7a303c31fe05205aAlex Sakhartchouk            Log.v(TIMER_TAG, "Shader texture init time: " + (end - start));
6599b93819f12f18b8559f702d7a303c31fe05205aAlex Sakhartchouk            return new Boolean(true);
6699b93819f12f18b8559f702d7a303c31fe05205aAlex Sakhartchouk        }
6799b93819f12f18b8559f702d7a303c31fe05205aAlex Sakhartchouk
6899b93819f12f18b8559f702d7a303c31fe05205aAlex Sakhartchouk        protected void onPostExecute(Boolean result) {
6999b93819f12f18b8559f702d7a303c31fe05205aAlex Sakhartchouk        }
7099b93819f12f18b8559f702d7a303c31fe05205aAlex Sakhartchouk    }
7199b93819f12f18b8559f702d7a303c31fe05205aAlex Sakhartchouk
72a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    CompoundTransform mRootTransforms;
73a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    HashMap<String, Transform> mTransformMap;
74a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    ArrayList<RenderPass> mRenderPasses;
75a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    ArrayList<LightBase> mLights;
76a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    ArrayList<Camera> mCameras;
774fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk    ArrayList<FragmentShader> mFragmentShaders;
784fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk    ArrayList<VertexShader> mVertexShaders;
79684267525b349eb12f4e31d88061c51115678decAlex Sakhartchouk    ArrayList<RenderableBase> mRenderables;
80684267525b349eb12f4e31d88061c51115678decAlex Sakhartchouk    HashMap<String, RenderableBase> mRenderableMap;
81a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    ArrayList<Texture2D> mTextures;
82a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
83684267525b349eb12f4e31d88061c51115678decAlex Sakhartchouk    HashMap<String, ArrayList<Renderable> > mRenderableMeshMap;
84a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
85a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    // RS Specific stuff
86a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    ScriptField_SgTransform mTransformRSData;
87a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
88a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    RenderScriptGL mRS;
89a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    Resources mRes;
90a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
91a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    ScriptField_RenderPass_s mRenderPassAlloc;
92a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
93a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    public Scene() {
94a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mRenderPasses = new ArrayList<RenderPass>();
95a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mLights = new ArrayList<LightBase>();
96a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mCameras = new ArrayList<Camera>();
974fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk        mFragmentShaders = new ArrayList<FragmentShader>();
984fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk        mVertexShaders = new ArrayList<VertexShader>();
99684267525b349eb12f4e31d88061c51115678decAlex Sakhartchouk        mRenderables = new ArrayList<RenderableBase>();
100684267525b349eb12f4e31d88061c51115678decAlex Sakhartchouk        mRenderableMap = new HashMap<String, RenderableBase>();
101684267525b349eb12f4e31d88061c51115678decAlex Sakhartchouk        mRenderableMeshMap = new HashMap<String, ArrayList<Renderable> >();
102a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mTextures = new ArrayList<Texture2D>();
103a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mRootTransforms = new CompoundTransform();
104a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mRootTransforms.setName("_scene_root_");
105a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mTransformMap = new HashMap<String, Transform>();
106a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    }
107a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
108a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    public void appendTransform(Transform t) {
109a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mRootTransforms.appendChild(t);
110a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    }
111a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
112a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    // temporary
113a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    public void addToTransformMap(Transform t) {
114a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mTransformMap.put(t.getName(), t);
115a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    }
116a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
117a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    public Transform getTransformByName(String name) {
118a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        return mTransformMap.get(name);
119a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    }
120a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
121a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    public void appendRenderPass(RenderPass p) {
122a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mRenderPasses.add(p);
123a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    }
124a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
125a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    public void clearRenderPasses() {
126a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mRenderPasses.clear();
127a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    }
128a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
129a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    public void appendLight(LightBase l) {
130a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mLights.add(l);
131a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    }
132a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
133a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    public void appendCamera(Camera c) {
134a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mCameras.add(c);
135a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    }
136a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
1374fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk    public void appendShader(FragmentShader f) {
1384fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk        mFragmentShaders.add(f);
1394fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk    }
1404fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk
1414fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk    public void appendShader(VertexShader v) {
1424fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk        mVertexShaders.add(v);
1434fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk    }
1444fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk
145a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    public ArrayList<Camera> getCameras() {
146a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        return mCameras;
147a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    }
148a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
14961440e8a8bc5d0d3c7edc66eccb609e5f07fea6eAlex Sakhartchouk    public ArrayList<LightBase> getLights() {
15061440e8a8bc5d0d3c7edc66eccb609e5f07fea6eAlex Sakhartchouk        return mLights;
15161440e8a8bc5d0d3c7edc66eccb609e5f07fea6eAlex Sakhartchouk    }
15261440e8a8bc5d0d3c7edc66eccb609e5f07fea6eAlex Sakhartchouk
153684267525b349eb12f4e31d88061c51115678decAlex Sakhartchouk    public void appendRenderable(RenderableBase d) {
154684267525b349eb12f4e31d88061c51115678decAlex Sakhartchouk        mRenderables.add(d);
155684267525b349eb12f4e31d88061c51115678decAlex Sakhartchouk        mRenderableMap.put(d.getName(), d);
156a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    }
157a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
158684267525b349eb12f4e31d88061c51115678decAlex Sakhartchouk    public ArrayList<RenderableBase> getRenderables() {
159684267525b349eb12f4e31d88061c51115678decAlex Sakhartchouk        return mRenderables;
160a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    }
161a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
162684267525b349eb12f4e31d88061c51115678decAlex Sakhartchouk    public RenderableBase getRenderableByName(String name) {
163684267525b349eb12f4e31d88061c51115678decAlex Sakhartchouk        return mRenderableMap.get(name);
164a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    }
165a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
166a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    public void appendTextures(Texture2D tex) {
167a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mTextures.add(tex);
168a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    }
169a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
170a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    public void assignRenderStateToMaterial(RenderState renderState, String regex) {
171a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        Pattern pattern = Pattern.compile(regex);
172684267525b349eb12f4e31d88061c51115678decAlex Sakhartchouk        int numRenderables = mRenderables.size();
173684267525b349eb12f4e31d88061c51115678decAlex Sakhartchouk        for (int i = 0; i < numRenderables; i ++) {
174684267525b349eb12f4e31d88061c51115678decAlex Sakhartchouk            Renderable shape = (Renderable)mRenderables.get(i);
175a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk            Matcher m = pattern.matcher(shape.mMaterialName);
176a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk            if (m.find()) {
177a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk                shape.setRenderState(renderState);
178a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk            }
179a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        }
180a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    }
181a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
182a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    public void assignRenderState(RenderState renderState) {
183684267525b349eb12f4e31d88061c51115678decAlex Sakhartchouk        int numRenderables = mRenderables.size();
184684267525b349eb12f4e31d88061c51115678decAlex Sakhartchouk        for (int i = 0; i < numRenderables; i ++) {
185684267525b349eb12f4e31d88061c51115678decAlex Sakhartchouk            Renderable shape = (Renderable)mRenderables.get(i);
186a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk            shape.setRenderState(renderState);
187a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        }
188a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    }
189a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
190a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    public void meshLoaded(Mesh m) {
191684267525b349eb12f4e31d88061c51115678decAlex Sakhartchouk        ArrayList<Renderable> entries = mRenderableMeshMap.get(m.getName());
192a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        int numEntries = entries.size();
193a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        for (int i = 0; i < numEntries; i++) {
194684267525b349eb12f4e31d88061c51115678decAlex Sakhartchouk            Renderable d = entries.get(i);
195a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk            d.resolveMeshData(m);
196684267525b349eb12f4e31d88061c51115678decAlex Sakhartchouk            //mRenderablesField.set(d.getRsField(mRS, mRes), d.sceneIndex, true);
197a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        }
198a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    }
199a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
200684267525b349eb12f4e31d88061c51115678decAlex Sakhartchouk    void addToMeshMap(Renderable d) {
201684267525b349eb12f4e31d88061c51115678decAlex Sakhartchouk        ArrayList<Renderable> entries = mRenderableMeshMap.get(d.mMeshName);
202a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        if (entries == null) {
203684267525b349eb12f4e31d88061c51115678decAlex Sakhartchouk            entries = new ArrayList<Renderable>();
204684267525b349eb12f4e31d88061c51115678decAlex Sakhartchouk            mRenderableMeshMap.put(d.mMeshName, entries);
205a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        }
206a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        entries.add(d);
207a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    }
208a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
2094bda82de0bca754f3ce387e9968170c5122241a9Alex Sakhartchouk    public void destroyRS() {
2104bda82de0bca754f3ce387e9968170c5122241a9Alex Sakhartchouk        SceneManager sceneManager = SceneManager.getInstance();
211a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mTransformRSData = null;
212a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        sceneManager.mRenderLoop.bind_gRootNode(mTransformRSData);
213684267525b349eb12f4e31d88061c51115678decAlex Sakhartchouk        sceneManager.mRenderLoop.set_gRenderableObjects(null);
214a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mRenderPassAlloc = null;
215a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        sceneManager.mRenderLoop.set_gRenderPasses(null);
216a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        sceneManager.mRenderLoop.bind_gFrontToBack(null);
217a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        sceneManager.mRenderLoop.bind_gBackToFront(null);
218a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        sceneManager.mRenderLoop.set_gCameras(null);
219a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
220a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mTransformMap = null;
221a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mRenderPasses = null;
222a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mLights = null;
223a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mCameras = null;
224684267525b349eb12f4e31d88061c51115678decAlex Sakhartchouk        mRenderables = null;
225684267525b349eb12f4e31d88061c51115678decAlex Sakhartchouk        mRenderableMap = null;
226a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mTextures = null;
227684267525b349eb12f4e31d88061c51115678decAlex Sakhartchouk        mRenderableMeshMap = null;
228a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mRootTransforms = null;
229a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    }
230a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
231a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    public void initRenderPassRS(RenderScriptGL rs, SceneManager sceneManager) {
23299b93819f12f18b8559f702d7a303c31fe05205aAlex Sakhartchouk        new ShaderImageLoader().execute(mFragmentShaders);
233a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        if (mRenderPasses.size() != 0) {
234a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk            mRenderPassAlloc = new ScriptField_RenderPass_s(mRS, mRenderPasses.size());
235a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk            for (int i = 0; i < mRenderPasses.size(); i ++) {
236a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk                mRenderPassAlloc.set(mRenderPasses.get(i).getRsField(mRS, mRes), i, false);
237516054bf53b0a8844267185ddaf1d505c9e81da7Alex Sakhartchouk                new ImageLoaderTask().execute(mRenderPasses.get(i).getRenderables());
238a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk            }
239a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk            mRenderPassAlloc.copyAll();
240a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk            sceneManager.mRenderLoop.set_gRenderPasses(mRenderPassAlloc.getAllocation());
241516054bf53b0a8844267185ddaf1d505c9e81da7Alex Sakhartchouk        } else {
242516054bf53b0a8844267185ddaf1d505c9e81da7Alex Sakhartchouk            new ImageLoaderTask().execute(mRenderables);
243a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        }
244a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    }
245a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
2464fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk    private void addDrawables(RenderScriptGL rs, Resources res, SceneManager sceneManager) {
247a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        Allocation drawableData = Allocation.createSized(rs,
248a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk                                                         Element.ALLOCATION(rs),
249684267525b349eb12f4e31d88061c51115678decAlex Sakhartchouk                                                         mRenderables.size());
250684267525b349eb12f4e31d88061c51115678decAlex Sakhartchouk        Allocation[] drawableAllocs = new Allocation[mRenderables.size()];
251684267525b349eb12f4e31d88061c51115678decAlex Sakhartchouk        for (int i = 0; i < mRenderables.size(); i ++) {
252684267525b349eb12f4e31d88061c51115678decAlex Sakhartchouk            Renderable dI = (Renderable)mRenderables.get(i);
253a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk            dI.sceneIndex = i;
254a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk            addToMeshMap(dI);
255a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk            drawableAllocs[i] = dI.getRsField(rs, res).getAllocation();
256a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        }
257a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        drawableData.copyFrom(drawableAllocs);
258684267525b349eb12f4e31d88061c51115678decAlex Sakhartchouk        sceneManager.mRenderLoop.set_gRenderableObjects(drawableData);
259a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
260a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        initRenderPassRS(rs, sceneManager);
2614fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk    }
262a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
2634fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk    private void addShaders(RenderScriptGL rs, Resources res, SceneManager sceneManager) {
2644fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk        Allocation shaderData = Allocation.createSized(rs, Element.ALLOCATION(rs),
2654fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk                                                       mVertexShaders.size());
2664fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk        Allocation[] shaderAllocs = new Allocation[mVertexShaders.size()];
2674fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk        for (int i = 0; i < mVertexShaders.size(); i ++) {
2684fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk            VertexShader sI = mVertexShaders.get(i);
269e93db17a143ff560f92d94b68ce1e76f79db7902Alex Sakhartchouk            shaderAllocs[i] = sI.getRSData().getAllocation();
2704fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk        }
2714fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk        shaderData.copyFrom(shaderAllocs);
2724fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk        sceneManager.mRenderLoop.set_gVertexShaders(shaderData);
2734fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk
2744fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk        shaderData = Allocation.createSized(rs, Element.ALLOCATION(rs), mFragmentShaders.size());
2754fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk        shaderAllocs = new Allocation[mFragmentShaders.size()];
2764fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk        for (int i = 0; i < mFragmentShaders.size(); i ++) {
2774fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk            FragmentShader sI = mFragmentShaders.get(i);
278e93db17a143ff560f92d94b68ce1e76f79db7902Alex Sakhartchouk            shaderAllocs[i] = sI.getRSData().getAllocation();
2794fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk        }
2804fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk        shaderData.copyFrom(shaderAllocs);
2814fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk        sceneManager.mRenderLoop.set_gFragmentShaders(shaderData);
2824fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk    }
2834fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk
2844fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk    public void initRS(RenderScriptGL rs, Resources res, SceneManager sceneManager) {
2854fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk        mRS = rs;
2864fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk        mRes = res;
2874fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk        long start = System.currentTimeMillis();
288e93db17a143ff560f92d94b68ce1e76f79db7902Alex Sakhartchouk        mTransformRSData = mRootTransforms.getRSData();
2894fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk        long end = System.currentTimeMillis();
2904fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk        Log.v(TIMER_TAG, "Transform init time: " + (end - start));
2914fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk
2924fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk        start = System.currentTimeMillis();
2934fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk
2944fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk        sceneManager.mRenderLoop.bind_gRootNode(mTransformRSData);
2954fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk        end = System.currentTimeMillis();
2964fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk        Log.v(TIMER_TAG, "Script init time: " + (end - start));
2974fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk
2984fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk        start = System.currentTimeMillis();
2994fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk        addDrawables(rs, res, sceneManager);
300a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        end = System.currentTimeMillis();
301684267525b349eb12f4e31d88061c51115678decAlex Sakhartchouk        Log.v(TIMER_TAG, "Renderable init time: " + (end - start));
302a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
3034fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk        addShaders(rs, res, sceneManager);
3044fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk
305684267525b349eb12f4e31d88061c51115678decAlex Sakhartchouk        Allocation opaqueBuffer = Allocation.createSized(rs, Element.U32(rs), mRenderables.size());
306a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        Allocation transparentBuffer = Allocation.createSized(rs,
307684267525b349eb12f4e31d88061c51115678decAlex Sakhartchouk                                                              Element.U32(rs), mRenderables.size());
308a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
309a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        sceneManager.mRenderLoop.bind_gFrontToBack(opaqueBuffer);
310a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        sceneManager.mRenderLoop.bind_gBackToFront(transparentBuffer);
311a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
312a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        Allocation cameraData = Allocation.createSized(rs, Element.ALLOCATION(rs), mCameras.size());
313a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        Allocation[] cameraAllocs = new Allocation[mCameras.size()];
314a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        for (int i = 0; i < mCameras.size(); i ++) {
315e93db17a143ff560f92d94b68ce1e76f79db7902Alex Sakhartchouk            cameraAllocs[i] = mCameras.get(i).getRSData().getAllocation();
316a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        }
317a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        cameraData.copyFrom(cameraAllocs);
318a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        sceneManager.mRenderLoop.set_gCameras(cameraData);
319875a538d5db06e7e055401050e03b86bf8598536Alex Sakhartchouk
320875a538d5db06e7e055401050e03b86bf8598536Alex Sakhartchouk        if (mLights.size() != 0) {
321875a538d5db06e7e055401050e03b86bf8598536Alex Sakhartchouk            Allocation lightData = Allocation.createSized(rs,
322875a538d5db06e7e055401050e03b86bf8598536Alex Sakhartchouk                                                          Element.ALLOCATION(rs),
323875a538d5db06e7e055401050e03b86bf8598536Alex Sakhartchouk                                                          mCameras.size());
324875a538d5db06e7e055401050e03b86bf8598536Alex Sakhartchouk            Allocation[] lightAllocs = new Allocation[mLights.size()];
325875a538d5db06e7e055401050e03b86bf8598536Alex Sakhartchouk            for (int i = 0; i < mLights.size(); i ++) {
326e93db17a143ff560f92d94b68ce1e76f79db7902Alex Sakhartchouk                lightAllocs[i] = mLights.get(i).getRSData().getAllocation();
327875a538d5db06e7e055401050e03b86bf8598536Alex Sakhartchouk            }
328875a538d5db06e7e055401050e03b86bf8598536Alex Sakhartchouk            lightData.copyFrom(lightAllocs);
329875a538d5db06e7e055401050e03b86bf8598536Alex Sakhartchouk            sceneManager.mRenderLoop.set_gLights(lightData);
330875a538d5db06e7e055401050e03b86bf8598536Alex Sakhartchouk        }
331a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    }
332a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk}
333a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
334a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
335a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
336a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
337