TestAppRS.java revision 4bda82de0bca754f3ce387e9968170c5122241a9
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;
684fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk    private FragmentShader mAluminumF;
694fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk    private FragmentShader mPlasticF;
704fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk    private FragmentShader mDiffuseF;
714fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk    private FragmentShader mTextureF;
724bda82de0bca754f3ce387e9968170c5122241a9Alex Sakhartchouk    private VertexShader mGenericV;
73be5bdeb9471c4a04905edd34e6d3560315293427Alex Sakhartchouk
74be5bdeb9471c4a04905edd34e6d3560315293427Alex Sakhartchouk    Scene mActiveScene;
75be5bdeb9471c4a04905edd34e6d3560315293427Alex Sakhartchouk
76006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchouk    // This is a part of the test app, it's used to tests multiple render passes and is toggled
77006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchouk    // on and off in the menu, off by default
78a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    void toggleBlur() {
79a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mUseBlur = !mUseBlur;
80a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
81a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mActiveScene.clearRenderPasses();
82a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        initRenderPasses();
83a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mActiveScene.initRenderPassRS(mRS, mSceneManager);
84006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchouk
85006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchouk        // This is just a hardcoded object in the scene that gets turned on and off for the demo
86006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchouk        // to make things look a bit better. This could be deleted in the cleanup
87684267525b349eb12f4e31d88061c51115678decAlex Sakhartchouk        Renderable plane = (Renderable)mActiveScene.getRenderableByName("pPlaneShape1");
88a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        if (plane != null) {
89a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk            plane.setVisible(mRS, !mUseBlur);
90a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        }
91a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    }
92a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
93a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    public void init(RenderScriptGL rs, Resources res, int width, int height) {
944bda82de0bca754f3ce387e9968170c5122241a9Alex Sakhartchouk        mUseBlur = false;
95a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mRS = rs;
96a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mRes = res;
97a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mWidth = width;
98a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mHeight = height;
99a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
100a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mTouchHandler = new TouchHandler();
101a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
10261440e8a8bc5d0d3c7edc66eccb609e5f07fea6eAlex Sakhartchouk        mSceneManager = SceneManager.getInstance();
10318f6419bfe5f2ee11a43713770d17888fd61ed69Alex Sakhartchouk        // Initializes all the RS specific scenegraph elements
104a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mSceneManager.initRS(mRS, mRes, mWidth, mHeight);
105a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
106be5bdeb9471c4a04905edd34e6d3560315293427Alex Sakhartchouk        mLoadingScreen = new TestAppLoadingScreen(mRS, mRes);
107a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
108006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchouk        // Initi renderscript stuff specific to the app. This will need to be abstracted out later.
1094bda82de0bca754f3ce387e9968170c5122241a9Alex Sakhartchouk        FullscreenBlur.createRenderTargets(mRS, mWidth, mHeight);
1104bda82de0bca754f3ce387e9968170c5122241a9Alex Sakhartchouk        initPaintShaders();
1114bda82de0bca754f3ce387e9968170c5122241a9Alex Sakhartchouk        mLoadingScreen.setRenderLoop(mSceneManager.getRenderLoop());
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() {
1534bda82de0bca754f3ce387e9968170c5122241a9Alex Sakhartchouk        ScriptField_ModelParams objConst = new ScriptField_ModelParams(mRS, 1);
1544bda82de0bca754f3ce387e9968170c5122241a9Alex Sakhartchouk        ScriptField_ViewProjParams shaderConst = new ScriptField_ViewProjParams(mRS, 1);
1554fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk
1564fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk        VertexShader.Builder vb = new VertexShader.Builder(mRS);
1574bda82de0bca754f3ce387e9968170c5122241a9Alex Sakhartchouk        vb.addInput(ScriptField_VertexShaderInputs.createElement(mRS));
158a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        vb.setShader(mRes, R.raw.shader2v);
1594fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk        vb.setObjectConst(objConst.getAllocation().getType());
1604fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk        vb.setShaderConst(shaderConst.getAllocation().getType());
1614bda82de0bca754f3ce387e9968170c5122241a9Alex Sakhartchouk        mGenericV = vb.create();
1624bda82de0bca754f3ce387e9968170c5122241a9Alex Sakhartchouk
1634bda82de0bca754f3ce387e9968170c5122241a9Alex Sakhartchouk        ScriptField_CameraParams fsConst = new ScriptField_CameraParams(mRS, 1);
1644bda82de0bca754f3ce387e9968170c5122241a9Alex Sakhartchouk        ScriptField_LightParams fsConst2 = new ScriptField_LightParams(mRS, 1);
165a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
1664bda82de0bca754f3ce387e9968170c5122241a9Alex Sakhartchouk        mPaintF = createFromResource(R.raw.paintf, true, fsConst.getAllocation().getType());
1674bda82de0bca754f3ce387e9968170c5122241a9Alex Sakhartchouk        // Assign a reflection map
1684bda82de0bca754f3ce387e9968170c5122241a9Alex Sakhartchouk        TextureCube envCube = new TextureCube("sdcard/scenegraph/", "cube_env.png");
1694bda82de0bca754f3ce387e9968170c5122241a9Alex Sakhartchouk        mPaintF.appendSourceParams(new TextureParam("reflection", envCube));
170a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
1714bda82de0bca754f3ce387e9968170c5122241a9Alex Sakhartchouk        mAluminumF = createFromResource(R.raw.metal, true, fsConst.getAllocation().getType());
1724bda82de0bca754f3ce387e9968170c5122241a9Alex Sakhartchouk        TextureCube diffCube = new TextureCube("sdcard/scenegraph/", "cube_spec.png");
1734bda82de0bca754f3ce387e9968170c5122241a9Alex Sakhartchouk        mAluminumF.appendSourceParams(new TextureParam("reflection", diffCube));
174a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
1754bda82de0bca754f3ce387e9968170c5122241a9Alex Sakhartchouk        mPlasticF = createFromResource(R.raw.plastic, false, fsConst.getAllocation().getType());
1764bda82de0bca754f3ce387e9968170c5122241a9Alex Sakhartchouk        mDiffuseF = createFromResource(R.raw.diffuse, false, fsConst.getAllocation().getType());
1774bda82de0bca754f3ce387e9968170c5122241a9Alex Sakhartchouk        mTextureF = createFromResource(R.raw.texture, false, fsConst.getAllocation().getType());
178a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
1794fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk        FragmentShader.Builder fb = new FragmentShader.Builder(mRS);
1804bda82de0bca754f3ce387e9968170c5122241a9Alex Sakhartchouk        fb.setObjectConst(fsConst2.getAllocation().getType());
18161440e8a8bc5d0d3c7edc66eccb609e5f07fea6eAlex Sakhartchouk        fb.setShader(mRes, R.raw.plastic_lights);
1824fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk        mLightsF = fb.create();
1831e69f42fa2332496943cf66ee047a107e882240dAlex Sakhartchouk
1841e69f42fa2332496943cf66ee047a107e882240dAlex Sakhartchouk        FullscreenBlur.initShaders(mRes, mRS);
185a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    }
186a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
187a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    void initRenderPasses() {
188684267525b349eb12f4e31d88061c51115678decAlex Sakhartchouk        ArrayList<RenderableBase> allDraw = mActiveScene.getRenderables();
189a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        int numDraw = allDraw.size();
190a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
191a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        if (mUseBlur) {
192ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk            FullscreenBlur.addBlurPasses(mActiveScene, mRS);
193a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        }
194a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
195a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        RenderPass mainPass = new RenderPass();
196a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mainPass.setClearColor(new Float4(1.0f, 1.0f, 1.0f, 1.0f));
197a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mainPass.setShouldClearColor(true);
198a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mainPass.setClearDepth(1.0f);
199a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mainPass.setShouldClearDepth(true);
200a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mainPass.setCamera(mActiveScene.getCameras().get(1));
201a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        for (int i = 0; i < numDraw; i ++) {
202684267525b349eb12f4e31d88061c51115678decAlex Sakhartchouk            mainPass.appendRenderable((Renderable)allDraw.get(i));
203a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        }
204a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mActiveScene.appendRenderPass(mainPass);
205a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
206a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        if (mUseBlur) {
207ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk            FullscreenBlur.addCompositePass(mActiveScene, mRS);
208a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        }
209a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    }
210a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
2114fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk    private void addShadersToScene() {
2124fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk        mActiveScene.appendShader(mPaintF);
2134fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk        mActiveScene.appendShader(mLightsF);
2144fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk        mActiveScene.appendShader(mAluminumF);
2154fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk        mActiveScene.appendShader(mPlasticF);
2164fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk        mActiveScene.appendShader(mDiffuseF);
2174fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk        mActiveScene.appendShader(mTextureF);
2184bda82de0bca754f3ce387e9968170c5122241a9Alex Sakhartchouk        mActiveScene.appendShader(mGenericV);
2194fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk    }
2204fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk
221a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    public void prepareToRender(Scene s) {
22261440e8a8bc5d0d3c7edc66eccb609e5f07fea6eAlex Sakhartchouk        mSceneManager.setActiveScene(s);
223a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mActiveScene = s;
2244fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk        addShadersToScene();
2254bda82de0bca754f3ce387e9968170c5122241a9Alex Sakhartchouk        RenderState plastic = new RenderState(mGenericV, mPlasticF, null, null);
2264bda82de0bca754f3ce387e9968170c5122241a9Alex Sakhartchouk        RenderState diffuse = new RenderState(mGenericV, mDiffuseF, null, null);
2274bda82de0bca754f3ce387e9968170c5122241a9Alex Sakhartchouk        RenderState paint = new RenderState(mGenericV, mPaintF, null, null);
2284bda82de0bca754f3ce387e9968170c5122241a9Alex Sakhartchouk        RenderState aluminum = new RenderState(mGenericV, mAluminumF, null, null);
2294bda82de0bca754f3ce387e9968170c5122241a9Alex Sakhartchouk        RenderState lights = new RenderState(mGenericV, mLightsF, null, null);
2304bda82de0bca754f3ce387e9968170c5122241a9Alex Sakhartchouk        RenderState glassTransp = new RenderState(mGenericV, mPaintF,
2314fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk                                                  ProgramStore.BLEND_ALPHA_DEPTH_TEST(mRS), null);
232a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
233a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        initRenderPasses();
234a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
235a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mActiveScene.assignRenderState(plastic);
236a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
237a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mActiveScene.assignRenderStateToMaterial(diffuse, "lambert2$");
238a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
239a18d676edefbafc0b745ab98edab8f50b1c81c61Alex Sakhartchouk        mActiveScene.assignRenderStateToMaterial(paint, "^Paint");
240a18d676edefbafc0b745ab98edab8f50b1c81c61Alex Sakhartchouk        mActiveScene.assignRenderStateToMaterial(paint, "^Carbon");
241a18d676edefbafc0b745ab98edab8f50b1c81c61Alex Sakhartchouk        mActiveScene.assignRenderStateToMaterial(paint, "^Glass");
242a18d676edefbafc0b745ab98edab8f50b1c81c61Alex Sakhartchouk        mActiveScene.assignRenderStateToMaterial(paint, "^MainGlass");
243a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
244a18d676edefbafc0b745ab98edab8f50b1c81c61Alex Sakhartchouk        mActiveScene.assignRenderStateToMaterial(aluminum, "^Metal");
245a18d676edefbafc0b745ab98edab8f50b1c81c61Alex Sakhartchouk        mActiveScene.assignRenderStateToMaterial(aluminum, "^Brake");
246a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
247a18d676edefbafc0b745ab98edab8f50b1c81c61Alex Sakhartchouk        mActiveScene.assignRenderStateToMaterial(glassTransp, "^GlassLight");
248a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
249a18d676edefbafc0b745ab98edab8f50b1c81c61Alex Sakhartchouk        mActiveScene.assignRenderStateToMaterial(lights, "^LightBlinn");
25061440e8a8bc5d0d3c7edc66eccb609e5f07fea6eAlex Sakhartchouk
251684267525b349eb12f4e31d88061c51115678decAlex Sakhartchouk        Renderable plane = (Renderable)mActiveScene.getRenderableByName("pPlaneShape1");
252a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        if (plane != null) {
2534bda82de0bca754f3ce387e9968170c5122241a9Alex Sakhartchouk            RenderState texState = new RenderState(mGenericV, mTextureF, null, null);
254a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk            plane.setRenderState(texState);
255a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk            plane.setVisible(mRS, !mUseBlur);
256a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        }
257a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
258a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mTouchHandler.init(mActiveScene);
259a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
260a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        long start = System.currentTimeMillis();
261a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mActiveScene.initRS(mRS, mRes, mSceneManager);
262a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        long end = System.currentTimeMillis();
263a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        Log.v("TIMER", "Scene init time: " + (end - start));
264a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
265be5bdeb9471c4a04905edd34e6d3560315293427Alex Sakhartchouk        mLoadingScreen.showLoadingScreen(false);
266a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    }
267a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk}
268