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 25d2dc9838961f945c402e5d810bc715196240be6fAlex Sakhartchoukimport com.android.scenegraph.Camera; 26d2dc9838961f945c402e5d810bc715196240be6fAlex Sakhartchoukimport com.android.scenegraph.CompoundTransform; 27d2dc9838961f945c402e5d810bc715196240be6fAlex Sakhartchoukimport com.android.scenegraph.RenderPass; 28d2dc9838961f945c402e5d810bc715196240be6fAlex Sakhartchoukimport com.android.scenegraph.Renderable; 294bda82de0bca754f3ce387e9968170c5122241a9Alex Sakhartchoukimport com.android.scenegraph.SceneManager; 30e8bb420a687598be9801e7ff4a0d114fa72ac5bcAlex Sakhartchoukimport com.android.scenegraph.TextureBase; 314bda82de0bca754f3ce387e9968170c5122241a9Alex Sakhartchouk 32a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchoukimport android.content.res.Resources; 33a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchoukimport android.os.AsyncTask; 344bda82de0bca754f3ce387e9968170c5122241a9Alex Sakhartchoukimport android.renderscript.*; 354bda82de0bca754f3ce387e9968170c5122241a9Alex Sakhartchoukimport android.renderscript.Mesh; 364bda82de0bca754f3ce387e9968170c5122241a9Alex Sakhartchoukimport android.renderscript.RenderScriptGL; 374bda82de0bca754f3ce387e9968170c5122241a9Alex Sakhartchoukimport android.util.Log; 38a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk 39a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk/** 40a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk * @hide 41a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk */ 42a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchoukpublic class Scene extends SceneGraphBase { 43a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk private static String TIMER_TAG = "TIMER"; 44a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk 45a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk CompoundTransform mRootTransforms; 46a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk HashMap<String, Transform> mTransformMap; 47a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk ArrayList<RenderPass> mRenderPasses; 48a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk ArrayList<LightBase> mLights; 49a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk ArrayList<Camera> mCameras; 504fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk ArrayList<FragmentShader> mFragmentShaders; 514fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk ArrayList<VertexShader> mVertexShaders; 52684267525b349eb12f4e31d88061c51115678decAlex Sakhartchouk ArrayList<RenderableBase> mRenderables; 53684267525b349eb12f4e31d88061c51115678decAlex Sakhartchouk HashMap<String, RenderableBase> mRenderableMap; 54a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk ArrayList<Texture2D> mTextures; 55a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk 56684267525b349eb12f4e31d88061c51115678decAlex Sakhartchouk HashMap<String, ArrayList<Renderable> > mRenderableMeshMap; 57a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk 58a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk // RS Specific stuff 59a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk ScriptField_SgTransform mTransformRSData; 60a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk 61a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk RenderScriptGL mRS; 62a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk Resources mRes; 63a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk 64a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk ScriptField_RenderPass_s mRenderPassAlloc; 65a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk 66a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk public Scene() { 67a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk mRenderPasses = new ArrayList<RenderPass>(); 68a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk mLights = new ArrayList<LightBase>(); 69a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk mCameras = new ArrayList<Camera>(); 704fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk mFragmentShaders = new ArrayList<FragmentShader>(); 714fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk mVertexShaders = new ArrayList<VertexShader>(); 72684267525b349eb12f4e31d88061c51115678decAlex Sakhartchouk mRenderables = new ArrayList<RenderableBase>(); 73684267525b349eb12f4e31d88061c51115678decAlex Sakhartchouk mRenderableMap = new HashMap<String, RenderableBase>(); 74684267525b349eb12f4e31d88061c51115678decAlex Sakhartchouk mRenderableMeshMap = new HashMap<String, ArrayList<Renderable> >(); 75a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk mTextures = new ArrayList<Texture2D>(); 76a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk mRootTransforms = new CompoundTransform(); 77a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk mRootTransforms.setName("_scene_root_"); 78a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk mTransformMap = new HashMap<String, Transform>(); 79a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk } 80a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk 81a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk public void appendTransform(Transform t) { 82c71343acc469db7ec351db2344032801e0e1b30aAlex Sakhartchouk if (t == null) { 83c71343acc469db7ec351db2344032801e0e1b30aAlex Sakhartchouk throw new RuntimeException("Adding null object"); 84c71343acc469db7ec351db2344032801e0e1b30aAlex Sakhartchouk } 85a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk mRootTransforms.appendChild(t); 86a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk } 87a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk 88d2dc9838961f945c402e5d810bc715196240be6fAlex Sakhartchouk public CompoundTransform appendNewCompoundTransform() { 89d2dc9838961f945c402e5d810bc715196240be6fAlex Sakhartchouk CompoundTransform t = new CompoundTransform(); 90d2dc9838961f945c402e5d810bc715196240be6fAlex Sakhartchouk appendTransform(t); 91d2dc9838961f945c402e5d810bc715196240be6fAlex Sakhartchouk return t; 92d2dc9838961f945c402e5d810bc715196240be6fAlex Sakhartchouk } 93d2dc9838961f945c402e5d810bc715196240be6fAlex Sakhartchouk 94d2dc9838961f945c402e5d810bc715196240be6fAlex Sakhartchouk public MatrixTransform appendNewMatrixTransform() { 95d2dc9838961f945c402e5d810bc715196240be6fAlex Sakhartchouk MatrixTransform t = new MatrixTransform(); 96d2dc9838961f945c402e5d810bc715196240be6fAlex Sakhartchouk appendTransform(t); 97d2dc9838961f945c402e5d810bc715196240be6fAlex Sakhartchouk return t; 98d2dc9838961f945c402e5d810bc715196240be6fAlex Sakhartchouk } 99d2dc9838961f945c402e5d810bc715196240be6fAlex Sakhartchouk 100a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk // temporary 101a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk public void addToTransformMap(Transform t) { 102a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk mTransformMap.put(t.getName(), t); 103a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk } 104a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk 105a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk public Transform getTransformByName(String name) { 106a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk return mTransformMap.get(name); 107a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk } 108a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk 109a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk public void appendRenderPass(RenderPass p) { 110c71343acc469db7ec351db2344032801e0e1b30aAlex Sakhartchouk if (p == null) { 111c71343acc469db7ec351db2344032801e0e1b30aAlex Sakhartchouk throw new RuntimeException("Adding null object"); 112c71343acc469db7ec351db2344032801e0e1b30aAlex Sakhartchouk } 113a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk mRenderPasses.add(p); 114a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk } 115a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk 116d2dc9838961f945c402e5d810bc715196240be6fAlex Sakhartchouk public RenderPass appendNewRenderPass() { 117d2dc9838961f945c402e5d810bc715196240be6fAlex Sakhartchouk RenderPass p = new RenderPass(); 118d2dc9838961f945c402e5d810bc715196240be6fAlex Sakhartchouk appendRenderPass(p); 119d2dc9838961f945c402e5d810bc715196240be6fAlex Sakhartchouk return p; 120d2dc9838961f945c402e5d810bc715196240be6fAlex Sakhartchouk } 121d2dc9838961f945c402e5d810bc715196240be6fAlex Sakhartchouk 122a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk public void clearRenderPasses() { 123a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk mRenderPasses.clear(); 124a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk } 125a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk 126a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk public void appendLight(LightBase l) { 127c71343acc469db7ec351db2344032801e0e1b30aAlex Sakhartchouk if (l == null) { 128c71343acc469db7ec351db2344032801e0e1b30aAlex Sakhartchouk throw new RuntimeException("Adding null object"); 129c71343acc469db7ec351db2344032801e0e1b30aAlex Sakhartchouk } 130a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk mLights.add(l); 131a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk } 132a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk 133a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk public void appendCamera(Camera c) { 134c71343acc469db7ec351db2344032801e0e1b30aAlex Sakhartchouk if (c == null) { 135c71343acc469db7ec351db2344032801e0e1b30aAlex Sakhartchouk throw new RuntimeException("Adding null object"); 136c71343acc469db7ec351db2344032801e0e1b30aAlex Sakhartchouk } 137a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk mCameras.add(c); 138a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk } 139a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk 140d2dc9838961f945c402e5d810bc715196240be6fAlex Sakhartchouk public Camera appendNewCamera() { 141d2dc9838961f945c402e5d810bc715196240be6fAlex Sakhartchouk Camera c = new Camera(); 142d2dc9838961f945c402e5d810bc715196240be6fAlex Sakhartchouk appendCamera(c); 143d2dc9838961f945c402e5d810bc715196240be6fAlex Sakhartchouk return c; 144d2dc9838961f945c402e5d810bc715196240be6fAlex Sakhartchouk } 145d2dc9838961f945c402e5d810bc715196240be6fAlex Sakhartchouk 1464fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk public void appendShader(FragmentShader f) { 147c71343acc469db7ec351db2344032801e0e1b30aAlex Sakhartchouk if (f == null) { 148c71343acc469db7ec351db2344032801e0e1b30aAlex Sakhartchouk throw new RuntimeException("Adding null object"); 149c71343acc469db7ec351db2344032801e0e1b30aAlex Sakhartchouk } 1504fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk mFragmentShaders.add(f); 1514fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk } 1524fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk 1534fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk public void appendShader(VertexShader v) { 154c71343acc469db7ec351db2344032801e0e1b30aAlex Sakhartchouk if (v == null) { 155c71343acc469db7ec351db2344032801e0e1b30aAlex Sakhartchouk throw new RuntimeException("Adding null object"); 156c71343acc469db7ec351db2344032801e0e1b30aAlex Sakhartchouk } 1574fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk mVertexShaders.add(v); 1584fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk } 1594fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk 160a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk public ArrayList<Camera> getCameras() { 161a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk return mCameras; 162a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk } 163a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk 16461440e8a8bc5d0d3c7edc66eccb609e5f07fea6eAlex Sakhartchouk public ArrayList<LightBase> getLights() { 16561440e8a8bc5d0d3c7edc66eccb609e5f07fea6eAlex Sakhartchouk return mLights; 16661440e8a8bc5d0d3c7edc66eccb609e5f07fea6eAlex Sakhartchouk } 16761440e8a8bc5d0d3c7edc66eccb609e5f07fea6eAlex Sakhartchouk 168684267525b349eb12f4e31d88061c51115678decAlex Sakhartchouk public void appendRenderable(RenderableBase d) { 169c71343acc469db7ec351db2344032801e0e1b30aAlex Sakhartchouk if (d == null) { 170c71343acc469db7ec351db2344032801e0e1b30aAlex Sakhartchouk throw new RuntimeException("Adding null object"); 171c71343acc469db7ec351db2344032801e0e1b30aAlex Sakhartchouk } 172684267525b349eb12f4e31d88061c51115678decAlex Sakhartchouk mRenderables.add(d); 173d2dc9838961f945c402e5d810bc715196240be6fAlex Sakhartchouk if (d.getName() != null) { 174d2dc9838961f945c402e5d810bc715196240be6fAlex Sakhartchouk mRenderableMap.put(d.getName(), d); 175d2dc9838961f945c402e5d810bc715196240be6fAlex Sakhartchouk } 176d2dc9838961f945c402e5d810bc715196240be6fAlex Sakhartchouk } 177d2dc9838961f945c402e5d810bc715196240be6fAlex Sakhartchouk 178d2dc9838961f945c402e5d810bc715196240be6fAlex Sakhartchouk public Renderable appendNewRenderable() { 179d2dc9838961f945c402e5d810bc715196240be6fAlex Sakhartchouk Renderable r = new Renderable(); 180d2dc9838961f945c402e5d810bc715196240be6fAlex Sakhartchouk appendRenderable(r); 181d2dc9838961f945c402e5d810bc715196240be6fAlex Sakhartchouk return r; 182a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk } 183a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk 184684267525b349eb12f4e31d88061c51115678decAlex Sakhartchouk public ArrayList<RenderableBase> getRenderables() { 185684267525b349eb12f4e31d88061c51115678decAlex Sakhartchouk return mRenderables; 186a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk } 187a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk 188684267525b349eb12f4e31d88061c51115678decAlex Sakhartchouk public RenderableBase getRenderableByName(String name) { 189684267525b349eb12f4e31d88061c51115678decAlex Sakhartchouk return mRenderableMap.get(name); 190a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk } 191a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk 192a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk public void appendTextures(Texture2D tex) { 193c71343acc469db7ec351db2344032801e0e1b30aAlex Sakhartchouk if (tex == null) { 194c71343acc469db7ec351db2344032801e0e1b30aAlex Sakhartchouk throw new RuntimeException("Adding null object"); 195c71343acc469db7ec351db2344032801e0e1b30aAlex Sakhartchouk } 196a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk mTextures.add(tex); 197a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk } 198a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk 199a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk public void assignRenderStateToMaterial(RenderState renderState, String regex) { 200a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk Pattern pattern = Pattern.compile(regex); 201684267525b349eb12f4e31d88061c51115678decAlex Sakhartchouk int numRenderables = mRenderables.size(); 202684267525b349eb12f4e31d88061c51115678decAlex Sakhartchouk for (int i = 0; i < numRenderables; i ++) { 203684267525b349eb12f4e31d88061c51115678decAlex Sakhartchouk Renderable shape = (Renderable)mRenderables.get(i); 204a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk Matcher m = pattern.matcher(shape.mMaterialName); 205a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk if (m.find()) { 206a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk shape.setRenderState(renderState); 207a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk } 208a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk } 209a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk } 210a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk 211a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk public void assignRenderState(RenderState renderState) { 212684267525b349eb12f4e31d88061c51115678decAlex Sakhartchouk int numRenderables = mRenderables.size(); 213684267525b349eb12f4e31d88061c51115678decAlex Sakhartchouk for (int i = 0; i < numRenderables; i ++) { 214684267525b349eb12f4e31d88061c51115678decAlex Sakhartchouk Renderable shape = (Renderable)mRenderables.get(i); 215a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk shape.setRenderState(renderState); 216a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk } 217a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk } 218a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk 219a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk public void meshLoaded(Mesh m) { 220684267525b349eb12f4e31d88061c51115678decAlex Sakhartchouk ArrayList<Renderable> entries = mRenderableMeshMap.get(m.getName()); 221a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk int numEntries = entries.size(); 222a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk for (int i = 0; i < numEntries; i++) { 223684267525b349eb12f4e31d88061c51115678decAlex Sakhartchouk Renderable d = entries.get(i); 224a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk d.resolveMeshData(m); 225a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk } 226a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk } 227a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk 228684267525b349eb12f4e31d88061c51115678decAlex Sakhartchouk void addToMeshMap(Renderable d) { 229684267525b349eb12f4e31d88061c51115678decAlex Sakhartchouk ArrayList<Renderable> entries = mRenderableMeshMap.get(d.mMeshName); 230a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk if (entries == null) { 231684267525b349eb12f4e31d88061c51115678decAlex Sakhartchouk entries = new ArrayList<Renderable>(); 232684267525b349eb12f4e31d88061c51115678decAlex Sakhartchouk mRenderableMeshMap.put(d.mMeshName, entries); 233a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk } 234a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk entries.add(d); 235a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk } 236a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk 2374bda82de0bca754f3ce387e9968170c5122241a9Alex Sakhartchouk public void destroyRS() { 2384bda82de0bca754f3ce387e9968170c5122241a9Alex Sakhartchouk SceneManager sceneManager = SceneManager.getInstance(); 239a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk mTransformRSData = null; 240a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk sceneManager.mRenderLoop.bind_gRootNode(mTransformRSData); 241684267525b349eb12f4e31d88061c51115678decAlex Sakhartchouk sceneManager.mRenderLoop.set_gRenderableObjects(null); 242a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk mRenderPassAlloc = null; 243a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk sceneManager.mRenderLoop.set_gRenderPasses(null); 244a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk sceneManager.mRenderLoop.bind_gFrontToBack(null); 245a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk sceneManager.mRenderLoop.bind_gBackToFront(null); 246a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk sceneManager.mRenderLoop.set_gCameras(null); 247a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk 248a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk mTransformMap = null; 249a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk mRenderPasses = null; 250a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk mLights = null; 251a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk mCameras = null; 252684267525b349eb12f4e31d88061c51115678decAlex Sakhartchouk mRenderables = null; 253684267525b349eb12f4e31d88061c51115678decAlex Sakhartchouk mRenderableMap = null; 254a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk mTextures = null; 255684267525b349eb12f4e31d88061c51115678decAlex Sakhartchouk mRenderableMeshMap = null; 256a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk mRootTransforms = null; 257a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk } 258a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk 259a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk public void initRenderPassRS(RenderScriptGL rs, SceneManager sceneManager) { 260a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk if (mRenderPasses.size() != 0) { 261a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk mRenderPassAlloc = new ScriptField_RenderPass_s(mRS, mRenderPasses.size()); 262a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk for (int i = 0; i < mRenderPasses.size(); i ++) { 263a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk mRenderPassAlloc.set(mRenderPasses.get(i).getRsField(mRS, mRes), i, false); 264a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk } 265a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk mRenderPassAlloc.copyAll(); 266a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk sceneManager.mRenderLoop.set_gRenderPasses(mRenderPassAlloc.getAllocation()); 267a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk } 268a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk } 269a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk 2704fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk private void addDrawables(RenderScriptGL rs, Resources res, SceneManager sceneManager) { 271a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk Allocation drawableData = Allocation.createSized(rs, 272a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk Element.ALLOCATION(rs), 273684267525b349eb12f4e31d88061c51115678decAlex Sakhartchouk mRenderables.size()); 274684267525b349eb12f4e31d88061c51115678decAlex Sakhartchouk Allocation[] drawableAllocs = new Allocation[mRenderables.size()]; 275684267525b349eb12f4e31d88061c51115678decAlex Sakhartchouk for (int i = 0; i < mRenderables.size(); i ++) { 276684267525b349eb12f4e31d88061c51115678decAlex Sakhartchouk Renderable dI = (Renderable)mRenderables.get(i); 277a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk addToMeshMap(dI); 278a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk drawableAllocs[i] = dI.getRsField(rs, res).getAllocation(); 279a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk } 280a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk drawableData.copyFrom(drawableAllocs); 281684267525b349eb12f4e31d88061c51115678decAlex Sakhartchouk sceneManager.mRenderLoop.set_gRenderableObjects(drawableData); 282a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk 283a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk initRenderPassRS(rs, sceneManager); 2844fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk } 285a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk 2864fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk private void addShaders(RenderScriptGL rs, Resources res, SceneManager sceneManager) { 28757fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchouk if (mVertexShaders.size() > 0) { 28857fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchouk Allocation shaderData = Allocation.createSized(rs, Element.ALLOCATION(rs), 28957fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchouk mVertexShaders.size()); 29057fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchouk Allocation[] shaderAllocs = new Allocation[mVertexShaders.size()]; 29157fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchouk for (int i = 0; i < mVertexShaders.size(); i ++) { 29257fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchouk VertexShader sI = mVertexShaders.get(i); 29357fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchouk shaderAllocs[i] = sI.getRSData().getAllocation(); 29457fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchouk } 29557fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchouk shaderData.copyFrom(shaderAllocs); 29657fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchouk sceneManager.mRenderLoop.set_gVertexShaders(shaderData); 2974fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk } 29857fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchouk 29957fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchouk if (mFragmentShaders.size() > 0) { 30057fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchouk Allocation shaderData = Allocation.createSized(rs, Element.ALLOCATION(rs), 30157fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchouk mFragmentShaders.size()); 30257fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchouk Allocation[] shaderAllocs = new Allocation[mFragmentShaders.size()]; 30357fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchouk for (int i = 0; i < mFragmentShaders.size(); i ++) { 30457fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchouk FragmentShader sI = mFragmentShaders.get(i); 30557fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchouk shaderAllocs[i] = sI.getRSData().getAllocation(); 30657fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchouk } 30757fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchouk shaderData.copyFrom(shaderAllocs); 30857fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchouk sceneManager.mRenderLoop.set_gFragmentShaders(shaderData); 3094fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk } 3104fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk } 3114fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk 312e8bb420a687598be9801e7ff4a0d114fa72ac5bcAlex Sakhartchouk public void initRS() { 313e8bb420a687598be9801e7ff4a0d114fa72ac5bcAlex Sakhartchouk SceneManager sceneManager = SceneManager.getInstance(); 314e8bb420a687598be9801e7ff4a0d114fa72ac5bcAlex Sakhartchouk mRS = SceneManager.getRS(); 315e8bb420a687598be9801e7ff4a0d114fa72ac5bcAlex Sakhartchouk mRes = SceneManager.getRes(); 3164fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk long start = System.currentTimeMillis(); 317e93db17a143ff560f92d94b68ce1e76f79db7902Alex Sakhartchouk mTransformRSData = mRootTransforms.getRSData(); 3184fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk long end = System.currentTimeMillis(); 3194fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk Log.v(TIMER_TAG, "Transform init time: " + (end - start)); 3204fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk 3214fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk start = System.currentTimeMillis(); 3224fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk 3234fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk sceneManager.mRenderLoop.bind_gRootNode(mTransformRSData); 3244fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk end = System.currentTimeMillis(); 3254fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk Log.v(TIMER_TAG, "Script init time: " + (end - start)); 3264fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk 3274fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk start = System.currentTimeMillis(); 328e8bb420a687598be9801e7ff4a0d114fa72ac5bcAlex Sakhartchouk addDrawables(mRS, mRes, sceneManager); 329a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk end = System.currentTimeMillis(); 330684267525b349eb12f4e31d88061c51115678decAlex Sakhartchouk Log.v(TIMER_TAG, "Renderable init time: " + (end - start)); 331a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk 332e8bb420a687598be9801e7ff4a0d114fa72ac5bcAlex Sakhartchouk addShaders(mRS, mRes, sceneManager); 3334fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk 334e8bb420a687598be9801e7ff4a0d114fa72ac5bcAlex Sakhartchouk Allocation opaqueBuffer = null; 335e8bb420a687598be9801e7ff4a0d114fa72ac5bcAlex Sakhartchouk if (mRenderables.size() > 0) { 336e8bb420a687598be9801e7ff4a0d114fa72ac5bcAlex Sakhartchouk opaqueBuffer = Allocation.createSized(mRS, Element.U32(mRS), mRenderables.size()); 337e8bb420a687598be9801e7ff4a0d114fa72ac5bcAlex Sakhartchouk } 338e8bb420a687598be9801e7ff4a0d114fa72ac5bcAlex Sakhartchouk Allocation transparentBuffer = null; 339e8bb420a687598be9801e7ff4a0d114fa72ac5bcAlex Sakhartchouk if (mRenderables.size() > 0) { 340e8bb420a687598be9801e7ff4a0d114fa72ac5bcAlex Sakhartchouk transparentBuffer = Allocation.createSized(mRS, Element.U32(mRS), mRenderables.size()); 341e8bb420a687598be9801e7ff4a0d114fa72ac5bcAlex Sakhartchouk } 342a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk 343a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk sceneManager.mRenderLoop.bind_gFrontToBack(opaqueBuffer); 344a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk sceneManager.mRenderLoop.bind_gBackToFront(transparentBuffer); 345a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk 346e8bb420a687598be9801e7ff4a0d114fa72ac5bcAlex Sakhartchouk if (mCameras.size() > 0) { 347e8bb420a687598be9801e7ff4a0d114fa72ac5bcAlex Sakhartchouk Allocation cameraData; 348e8bb420a687598be9801e7ff4a0d114fa72ac5bcAlex Sakhartchouk cameraData = Allocation.createSized(mRS, Element.ALLOCATION(mRS), mCameras.size()); 349e8bb420a687598be9801e7ff4a0d114fa72ac5bcAlex Sakhartchouk Allocation[] cameraAllocs = new Allocation[mCameras.size()]; 350e8bb420a687598be9801e7ff4a0d114fa72ac5bcAlex Sakhartchouk for (int i = 0; i < mCameras.size(); i ++) { 351e8bb420a687598be9801e7ff4a0d114fa72ac5bcAlex Sakhartchouk cameraAllocs[i] = mCameras.get(i).getRSData().getAllocation(); 352e8bb420a687598be9801e7ff4a0d114fa72ac5bcAlex Sakhartchouk } 353e8bb420a687598be9801e7ff4a0d114fa72ac5bcAlex Sakhartchouk cameraData.copyFrom(cameraAllocs); 354e8bb420a687598be9801e7ff4a0d114fa72ac5bcAlex Sakhartchouk sceneManager.mRenderLoop.set_gCameras(cameraData); 355a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk } 356875a538d5db06e7e055401050e03b86bf8598536Alex Sakhartchouk 357e8bb420a687598be9801e7ff4a0d114fa72ac5bcAlex Sakhartchouk if (mLights.size() > 0) { 358e8bb420a687598be9801e7ff4a0d114fa72ac5bcAlex Sakhartchouk Allocation lightData = Allocation.createSized(mRS, 359e8bb420a687598be9801e7ff4a0d114fa72ac5bcAlex Sakhartchouk Element.ALLOCATION(mRS), 3606f31c36a3dbe5e61644ec39c4fcad0284d50e4f1Alex Sakhartchouk mLights.size()); 361875a538d5db06e7e055401050e03b86bf8598536Alex Sakhartchouk Allocation[] lightAllocs = new Allocation[mLights.size()]; 362875a538d5db06e7e055401050e03b86bf8598536Alex Sakhartchouk for (int i = 0; i < mLights.size(); i ++) { 363e93db17a143ff560f92d94b68ce1e76f79db7902Alex Sakhartchouk lightAllocs[i] = mLights.get(i).getRSData().getAllocation(); 364875a538d5db06e7e055401050e03b86bf8598536Alex Sakhartchouk } 365875a538d5db06e7e055401050e03b86bf8598536Alex Sakhartchouk lightData.copyFrom(lightAllocs); 366875a538d5db06e7e055401050e03b86bf8598536Alex Sakhartchouk sceneManager.mRenderLoop.set_gLights(lightData); 367875a538d5db06e7e055401050e03b86bf8598536Alex Sakhartchouk } 368a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk } 369a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk} 370a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk 371a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk 372a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk 373a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk 374