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