1a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk/*
2be5bdeb9471c4a04905edd34e6d3560315293427Alex Sakhartchouk * Copyright (C) 2011-2012 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
17d4cb9c587c23e3c24d928b0ac1a4de5679846f93Alex Sakhartchoukpackage com.android.testapp;
18a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
19a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchoukimport java.util.ArrayList;
20a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchoukimport java.util.HashMap;
21a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchoukimport java.util.Map;
22a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchoukimport java.util.Vector;
23a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
24d4cb9c587c23e3c24d928b0ac1a4de5679846f93Alex Sakhartchoukimport com.android.scenegraph.*;
25e57b34155269cc030b4b241f556207f7012a0f07Alex Sakhartchoukimport com.android.scenegraph.SceneManager.SceneLoadedCallback;
26e57b34155269cc030b4b241f556207f7012a0f07Alex Sakhartchouk
27a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchoukimport android.content.res.Resources;
28a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchoukimport android.graphics.Bitmap;
29a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchoukimport android.graphics.BitmapFactory;
30a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchoukimport android.os.AsyncTask;
31a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchoukimport android.renderscript.*;
32a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchoukimport android.renderscript.Program.TextureType;
33a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchoukimport android.util.Log;
34a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
35006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchouk// This is where the scenegraph and the rendered objects are initialized and used
363fc86ec3d03bb4a0ae61e41d0cfba43595ecc23dAlex Sakhartchoukpublic class TestAppRS {
37a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
381168868e766f0696c30f644292a5a833ee3983e4Alex Sakhartchouk    private static String modelName = "orientation_test.dae";
393fc86ec3d03bb4a0ae61e41d0cfba43595ecc23dAlex Sakhartchouk    private static String TAG = "TestAppRS";
4018f6419bfe5f2ee11a43713770d17888fd61ed69Alex Sakhartchouk    private static String mFilePath = "";
41a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
42a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    int mWidth;
43a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    int mHeight;
44a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
45a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    boolean mUseBlur;
46a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
47be5bdeb9471c4a04905edd34e6d3560315293427Alex Sakhartchouk    TestAppLoadingScreen mLoadingScreen;
48be5bdeb9471c4a04905edd34e6d3560315293427Alex Sakhartchouk
49006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchouk    // Used to asynchronously load scene elements like meshes and transform hierarchies
50a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    SceneLoadedCallback mLoadedCallback = new SceneLoadedCallback() {
51a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        public void run() {
52a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk            prepareToRender(mLoadedScene);
53a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        }
54a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    };
55a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
56006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchouk    // Top level class that initializes all the elements needed to use the scene graph
57a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    SceneManager mSceneManager;
58a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
59006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchouk    // Used to move the camera around in the 3D world
60a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    TouchHandler mTouchHandler;
61a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
62be5bdeb9471c4a04905edd34e6d3560315293427Alex Sakhartchouk    private Resources mRes;
63be5bdeb9471c4a04905edd34e6d3560315293427Alex Sakhartchouk    private RenderScriptGL mRS;
64be5bdeb9471c4a04905edd34e6d3560315293427Alex Sakhartchouk
654fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk    // Shaders
664fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk    private FragmentShader mPaintF;
674fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk    private FragmentShader mLightsF;
68b23b58ad343ccbf8835c7067698a60fc6bc1a870Alex Sakhartchouk    private FragmentShader mLightsDiffF;
694fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk    private FragmentShader mAluminumF;
704fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk    private FragmentShader mPlasticF;
714fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk    private FragmentShader mDiffuseF;
724fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk    private FragmentShader mTextureF;
734bda82de0bca754f3ce387e9968170c5122241a9Alex Sakhartchouk    private VertexShader mGenericV;
74be5bdeb9471c4a04905edd34e6d3560315293427Alex Sakhartchouk
75be5bdeb9471c4a04905edd34e6d3560315293427Alex Sakhartchouk    Scene mActiveScene;
76be5bdeb9471c4a04905edd34e6d3560315293427Alex Sakhartchouk
77006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchouk    // This is a part of the test app, it's used to tests multiple render passes and is toggled
78006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchouk    // on and off in the menu, off by default
79a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    void toggleBlur() {
80a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mUseBlur = !mUseBlur;
81a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
82a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mActiveScene.clearRenderPasses();
83a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        initRenderPasses();
84a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mActiveScene.initRenderPassRS(mRS, mSceneManager);
85006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchouk
86006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchouk        // This is just a hardcoded object in the scene that gets turned on and off for the demo
87006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchouk        // to make things look a bit better. This could be deleted in the cleanup
88684267525b349eb12f4e31d88061c51115678decAlex Sakhartchouk        Renderable plane = (Renderable)mActiveScene.getRenderableByName("pPlaneShape1");
89a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        if (plane != null) {
90e31264694e9729db49acbb2d32eab2703efc8501Alex Sakhartchouk            plane.setVisible(!mUseBlur);
91a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        }
92a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    }
93a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
94a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    public void init(RenderScriptGL rs, Resources res, int width, int height) {
954bda82de0bca754f3ce387e9968170c5122241a9Alex Sakhartchouk        mUseBlur = false;
96a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mRS = rs;
97a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mRes = res;
98a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mWidth = width;
99a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mHeight = height;
100a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
101a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mTouchHandler = new TouchHandler();
102a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
10361440e8a8bc5d0d3c7edc66eccb609e5f07fea6eAlex Sakhartchouk        mSceneManager = SceneManager.getInstance();
10418f6419bfe5f2ee11a43713770d17888fd61ed69Alex Sakhartchouk        // Initializes all the RS specific scenegraph elements
105a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mSceneManager.initRS(mRS, mRes, mWidth, mHeight);
106a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
107be5bdeb9471c4a04905edd34e6d3560315293427Alex Sakhartchouk        mLoadingScreen = new TestAppLoadingScreen(mRS, mRes);
108a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
109006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchouk        // Initi renderscript stuff specific to the app. This will need to be abstracted out later.
1104bda82de0bca754f3ce387e9968170c5122241a9Alex Sakhartchouk        FullscreenBlur.createRenderTargets(mRS, mWidth, mHeight);
1114bda82de0bca754f3ce387e9968170c5122241a9Alex Sakhartchouk        initPaintShaders();
112a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
113006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchouk        // Load a scene to render
11418f6419bfe5f2ee11a43713770d17888fd61ed69Alex Sakhartchouk        mSceneManager.loadModel(mFilePath + modelName, mLoadedCallback);
115a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    }
116a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
117006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchouk    // When a new model file is selected from the UI, this function gets called to init everything
118a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    void loadModel(String path) {
119be5bdeb9471c4a04905edd34e6d3560315293427Alex Sakhartchouk        mLoadingScreen.showLoadingScreen(true);
1204bda82de0bca754f3ce387e9968170c5122241a9Alex Sakhartchouk        mActiveScene.destroyRS();
1211168868e766f0696c30f644292a5a833ee3983e4Alex Sakhartchouk        mSceneManager.loadModel(path, mLoadedCallback);
122a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    }
123a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
124a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    public void onActionDown(float x, float y) {
125a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mTouchHandler.onActionDown(x, y);
126a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    }
127a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
128a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    public void onActionScale(float scale) {
129a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mTouchHandler.onActionScale(scale);
130a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    }
131a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
132a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    public void onActionMove(float x, float y) {
133a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mTouchHandler.onActionMove(x, y);
134a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    }
135a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
1364bda82de0bca754f3ce387e9968170c5122241a9Alex Sakhartchouk    FragmentShader createFromResource(int id, boolean addCubemap, Type constType) {
1374fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk        FragmentShader.Builder fb = new FragmentShader.Builder(mRS);
1384bda82de0bca754f3ce387e9968170c5122241a9Alex Sakhartchouk        fb.setShaderConst(constType);
139b98f6d3466f15a250e4f2851bbae16c66b014cf1Alex Sakhartchouk        fb.setShader(mRes, id);
1404fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk        fb.addTexture(TextureType.TEXTURE_2D, "diffuse");
141b98f6d3466f15a250e4f2851bbae16c66b014cf1Alex Sakhartchouk        if (addCubemap) {
14299b93819f12f18b8559f702d7a303c31fe05205aAlex Sakhartchouk            fb.addShaderTexture(TextureType.TEXTURE_CUBE, "reflection");
143b98f6d3466f15a250e4f2851bbae16c66b014cf1Alex Sakhartchouk        }
1444fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk        FragmentShader pf = fb.create();
145d4cb9c587c23e3c24d928b0ac1a4de5679846f93Alex Sakhartchouk        pf.getProgram().bindSampler(Sampler.WRAP_LINEAR_MIP_LINEAR(mRS), 0);
146b98f6d3466f15a250e4f2851bbae16c66b014cf1Alex Sakhartchouk        if (addCubemap) {
147d4cb9c587c23e3c24d928b0ac1a4de5679846f93Alex Sakhartchouk            pf.getProgram().bindSampler(Sampler.CLAMP_LINEAR_MIP_LINEAR(mRS), 1);
148b98f6d3466f15a250e4f2851bbae16c66b014cf1Alex Sakhartchouk        }
149b98f6d3466f15a250e4f2851bbae16c66b014cf1Alex Sakhartchouk        return pf;
150b98f6d3466f15a250e4f2851bbae16c66b014cf1Alex Sakhartchouk    }
151b98f6d3466f15a250e4f2851bbae16c66b014cf1Alex Sakhartchouk
152a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    private void initPaintShaders() {
153c71343acc469db7ec351db2344032801e0e1b30aAlex Sakhartchouk        mGenericV = SceneManager.getDefaultVS();
1544fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk
155c71343acc469db7ec351db2344032801e0e1b30aAlex Sakhartchouk        ScriptField_CameraParams camParams = new ScriptField_CameraParams(mRS, 1);
156c71343acc469db7ec351db2344032801e0e1b30aAlex Sakhartchouk        Type camParamType = camParams.getAllocation().getType();
157c71343acc469db7ec351db2344032801e0e1b30aAlex Sakhartchouk        ScriptField_LightParams lightParams = new ScriptField_LightParams(mRS, 1);
1584bda82de0bca754f3ce387e9968170c5122241a9Alex Sakhartchouk
159c71343acc469db7ec351db2344032801e0e1b30aAlex Sakhartchouk        mPaintF = createFromResource(R.raw.paintf, true, camParamType);
1604bda82de0bca754f3ce387e9968170c5122241a9Alex Sakhartchouk        // Assign a reflection map
1614bda82de0bca754f3ce387e9968170c5122241a9Alex Sakhartchouk        TextureCube envCube = new TextureCube("sdcard/scenegraph/", "cube_env.png");
1624bda82de0bca754f3ce387e9968170c5122241a9Alex Sakhartchouk        mPaintF.appendSourceParams(new TextureParam("reflection", envCube));
163a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
164c71343acc469db7ec351db2344032801e0e1b30aAlex Sakhartchouk        mAluminumF = createFromResource(R.raw.metal, true, camParamType);
1654bda82de0bca754f3ce387e9968170c5122241a9Alex Sakhartchouk        TextureCube diffCube = new TextureCube("sdcard/scenegraph/", "cube_spec.png");
1664bda82de0bca754f3ce387e9968170c5122241a9Alex Sakhartchouk        mAluminumF.appendSourceParams(new TextureParam("reflection", diffCube));
167a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
168c71343acc469db7ec351db2344032801e0e1b30aAlex Sakhartchouk        mPlasticF = createFromResource(R.raw.plastic, false, camParamType);
169c71343acc469db7ec351db2344032801e0e1b30aAlex Sakhartchouk        mDiffuseF = createFromResource(R.raw.diffuse, false, camParamType);
170c71343acc469db7ec351db2344032801e0e1b30aAlex Sakhartchouk        mTextureF = SceneManager.getTextureFS();
171a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
1724fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk        FragmentShader.Builder fb = new FragmentShader.Builder(mRS);
173c71343acc469db7ec351db2344032801e0e1b30aAlex Sakhartchouk        fb.setObjectConst(lightParams.getAllocation().getType());
17461440e8a8bc5d0d3c7edc66eccb609e5f07fea6eAlex Sakhartchouk        fb.setShader(mRes, R.raw.plastic_lights);
1754fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk        mLightsF = fb.create();
1761e69f42fa2332496943cf66ee047a107e882240dAlex Sakhartchouk
177b23b58ad343ccbf8835c7067698a60fc6bc1a870Alex Sakhartchouk        fb = new FragmentShader.Builder(mRS);
178b23b58ad343ccbf8835c7067698a60fc6bc1a870Alex Sakhartchouk        fb.setObjectConst(lightParams.getAllocation().getType());
179b23b58ad343ccbf8835c7067698a60fc6bc1a870Alex Sakhartchouk        fb.setShader(mRes, R.raw.diffuse_lights);
180b23b58ad343ccbf8835c7067698a60fc6bc1a870Alex Sakhartchouk        mLightsDiffF = fb.create();
181b23b58ad343ccbf8835c7067698a60fc6bc1a870Alex Sakhartchouk
1821e69f42fa2332496943cf66ee047a107e882240dAlex Sakhartchouk        FullscreenBlur.initShaders(mRes, mRS);
183a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    }
184a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
185a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    void initRenderPasses() {
186684267525b349eb12f4e31d88061c51115678decAlex Sakhartchouk        ArrayList<RenderableBase> allDraw = mActiveScene.getRenderables();
187a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        int numDraw = allDraw.size();
188a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
189a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        if (mUseBlur) {
1906f31c36a3dbe5e61644ec39c4fcad0284d50e4f1Alex Sakhartchouk            FullscreenBlur.addBlurPasses(mActiveScene, mRS, mTouchHandler.getCamera());
191a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        }
192a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
193a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        RenderPass mainPass = new RenderPass();
194a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mainPass.setClearColor(new Float4(1.0f, 1.0f, 1.0f, 1.0f));
195a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mainPass.setShouldClearColor(true);
196a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mainPass.setClearDepth(1.0f);
197a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mainPass.setShouldClearDepth(true);
1986f31c36a3dbe5e61644ec39c4fcad0284d50e4f1Alex Sakhartchouk        mainPass.setCamera(mTouchHandler.getCamera());
199a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        for (int i = 0; i < numDraw; i ++) {
200684267525b349eb12f4e31d88061c51115678decAlex Sakhartchouk            mainPass.appendRenderable((Renderable)allDraw.get(i));
201a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        }
202a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mActiveScene.appendRenderPass(mainPass);
203a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
204a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        if (mUseBlur) {
2056f31c36a3dbe5e61644ec39c4fcad0284d50e4f1Alex Sakhartchouk            FullscreenBlur.addCompositePass(mActiveScene, mRS, mTouchHandler.getCamera());
206a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        }
207a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    }
208a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
2094fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk    private void addShadersToScene() {
2104fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk        mActiveScene.appendShader(mPaintF);
2114fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk        mActiveScene.appendShader(mLightsF);
212b23b58ad343ccbf8835c7067698a60fc6bc1a870Alex Sakhartchouk        mActiveScene.appendShader(mLightsDiffF);
2134fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk        mActiveScene.appendShader(mAluminumF);
2144fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk        mActiveScene.appendShader(mPlasticF);
2154fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk        mActiveScene.appendShader(mDiffuseF);
2164fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk        mActiveScene.appendShader(mTextureF);
2174fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk    }
2184fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk
219a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    public void prepareToRender(Scene s) {
22061440e8a8bc5d0d3c7edc66eccb609e5f07fea6eAlex Sakhartchouk        mSceneManager.setActiveScene(s);
221a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mActiveScene = s;
2226f31c36a3dbe5e61644ec39c4fcad0284d50e4f1Alex Sakhartchouk        mTouchHandler.init(mActiveScene);
2234fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk        addShadersToScene();
2244bda82de0bca754f3ce387e9968170c5122241a9Alex Sakhartchouk        RenderState plastic = new RenderState(mGenericV, mPlasticF, null, null);
2254bda82de0bca754f3ce387e9968170c5122241a9Alex Sakhartchouk        RenderState diffuse = new RenderState(mGenericV, mDiffuseF, null, null);
2264bda82de0bca754f3ce387e9968170c5122241a9Alex Sakhartchouk        RenderState paint = new RenderState(mGenericV, mPaintF, null, null);
2274bda82de0bca754f3ce387e9968170c5122241a9Alex Sakhartchouk        RenderState aluminum = new RenderState(mGenericV, mAluminumF, null, null);
2284bda82de0bca754f3ce387e9968170c5122241a9Alex Sakhartchouk        RenderState lights = new RenderState(mGenericV, mLightsF, null, null);
229b23b58ad343ccbf8835c7067698a60fc6bc1a870Alex Sakhartchouk        RenderState diff_lights = new RenderState(mGenericV, mLightsDiffF, null, null);
230b23b58ad343ccbf8835c7067698a60fc6bc1a870Alex Sakhartchouk        RenderState diff_lights_no_cull = new RenderState(mGenericV, mLightsDiffF, null,
231b23b58ad343ccbf8835c7067698a60fc6bc1a870Alex Sakhartchouk                                                          ProgramRaster.CULL_NONE(mRS));
2324bda82de0bca754f3ce387e9968170c5122241a9Alex Sakhartchouk        RenderState glassTransp = new RenderState(mGenericV, mPaintF,
2334fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk                                                  ProgramStore.BLEND_ALPHA_DEPTH_TEST(mRS), null);
234b23b58ad343ccbf8835c7067698a60fc6bc1a870Alex Sakhartchouk        RenderState texState = new RenderState(mGenericV, mTextureF, null, null);
235a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
236a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        initRenderPasses();
237a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
238a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mActiveScene.assignRenderState(plastic);
239a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
240a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mActiveScene.assignRenderStateToMaterial(diffuse, "lambert2$");
241a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
242a18d676edefbafc0b745ab98edab8f50b1c81c61Alex Sakhartchouk        mActiveScene.assignRenderStateToMaterial(paint, "^Paint");
243a18d676edefbafc0b745ab98edab8f50b1c81c61Alex Sakhartchouk        mActiveScene.assignRenderStateToMaterial(paint, "^Carbon");
244a18d676edefbafc0b745ab98edab8f50b1c81c61Alex Sakhartchouk        mActiveScene.assignRenderStateToMaterial(paint, "^Glass");
245a18d676edefbafc0b745ab98edab8f50b1c81c61Alex Sakhartchouk        mActiveScene.assignRenderStateToMaterial(paint, "^MainGlass");
246a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
247a18d676edefbafc0b745ab98edab8f50b1c81c61Alex Sakhartchouk        mActiveScene.assignRenderStateToMaterial(aluminum, "^Metal");
248a18d676edefbafc0b745ab98edab8f50b1c81c61Alex Sakhartchouk        mActiveScene.assignRenderStateToMaterial(aluminum, "^Brake");
249a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
250a18d676edefbafc0b745ab98edab8f50b1c81c61Alex Sakhartchouk        mActiveScene.assignRenderStateToMaterial(glassTransp, "^GlassLight");
251a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
252a18d676edefbafc0b745ab98edab8f50b1c81c61Alex Sakhartchouk        mActiveScene.assignRenderStateToMaterial(lights, "^LightBlinn");
253b23b58ad343ccbf8835c7067698a60fc6bc1a870Alex Sakhartchouk        mActiveScene.assignRenderStateToMaterial(diff_lights, "^LightLambert");
254b23b58ad343ccbf8835c7067698a60fc6bc1a870Alex Sakhartchouk        mActiveScene.assignRenderStateToMaterial(diff_lights_no_cull, "^LightLambertNoCull");
255b23b58ad343ccbf8835c7067698a60fc6bc1a870Alex Sakhartchouk        mActiveScene.assignRenderStateToMaterial(texState, "^TextureOnly");
25661440e8a8bc5d0d3c7edc66eccb609e5f07fea6eAlex Sakhartchouk
257684267525b349eb12f4e31d88061c51115678decAlex Sakhartchouk        Renderable plane = (Renderable)mActiveScene.getRenderableByName("pPlaneShape1");
258a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        if (plane != null) {
259a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk            plane.setRenderState(texState);
260e31264694e9729db49acbb2d32eab2703efc8501Alex Sakhartchouk            plane.setVisible(!mUseBlur);
261a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        }
262a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
263a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        long start = System.currentTimeMillis();
264e8bb420a687598be9801e7ff4a0d114fa72ac5bcAlex Sakhartchouk        mActiveScene.initRS();
265a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        long end = System.currentTimeMillis();
266a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        Log.v("TIMER", "Scene init time: " + (end - start));
267a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
268be5bdeb9471c4a04905edd34e6d3560315293427Alex Sakhartchouk        mLoadingScreen.showLoadingScreen(false);
269a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    }
270a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk}
271