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