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