TestAppRS.java revision a7a211b8a68a7d3f5ff4409aa286db07f96c0550
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.io.File;
20a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchoukimport java.io.IOException;
21a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchoukimport java.io.InputStream;
22a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchoukimport java.io.FileInputStream;
23a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchoukimport java.io.BufferedInputStream;
24a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchoukimport java.io.Writer;
25a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchoukimport java.util.ArrayList;
26a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchoukimport java.util.HashMap;
27a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchoukimport java.util.Map;
28a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchoukimport java.util.Vector;
29a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
30a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchoukimport android.content.res.Resources;
31a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchoukimport android.graphics.Bitmap;
32a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchoukimport android.graphics.BitmapFactory;
33a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchoukimport android.os.AsyncTask;
34a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchoukimport android.renderscript.*;
35a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchoukimport android.renderscript.Allocation.MipmapControl;
36a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchoukimport android.renderscript.Element.Builder;
37a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchoukimport android.renderscript.Font.Style;
38a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchoukimport android.renderscript.Program.TextureType;
39a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchoukimport android.renderscript.ProgramStore.DepthFunc;
40a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchoukimport android.util.Log;
41a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
42a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchoukimport com.android.scenegraph.SceneManager.SceneLoadedCallback;
43a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
44a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchoukpublic class SceneGraphRS {
45a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
46a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    private static String modelName = "orientation_test";
47a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    private static String TAG = "SceneGraphRS";
48a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    private final int STATE_LAST_FOCUS = 1;
49a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    private final boolean mLoadFromSD = true;
50a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    private static String mSDCardPath = "sdcard/scenegraph/";
51a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
52a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    int mWidth;
53a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    int mHeight;
54a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    int mRotation;
55a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
56a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    boolean mUseBlur;
57a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
58a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    SceneLoadedCallback mLoadedCallback = new SceneLoadedCallback() {
59a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        public void run() {
60a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk            prepareToRender(mLoadedScene);
61a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        }
62a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    };
63a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
64a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    SceneManager mSceneManager;
65a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
66a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    TouchHandler mTouchHandler;
67a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
68a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    public SceneGraphRS() {
69a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mUseBlur = false;
70a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    }
71a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
72a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    void toggleBlur() {
73a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mUseBlur = !mUseBlur;
74a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
75a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mActiveScene.clearRenderPasses();
76a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        initRenderPasses();
77a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mActiveScene.initRenderPassRS(mRS, mSceneManager);
78a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        Drawable plane = (Drawable)mActiveScene.getDrawableByName("pPlaneShape1");
79a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        if (plane != null) {
80a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk            plane.setVisible(mRS, !mUseBlur);
81a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        }
82a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    }
83a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
84a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    public void init(RenderScriptGL rs, Resources res, int width, int height) {
85a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mRS = rs;
86a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mRes = res;
87a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mWidth = width;
88a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mHeight = height;
89a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mRotation = 0;
90a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
91a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mTouchHandler = new TouchHandler();
92a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
93a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mSceneManager = new SceneManager();
94a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mSceneManager.initRS(mRS, mRes, mWidth, mHeight);
95a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
96a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        renderLoading();
97a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
98a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        new LoadingScreenLoaderTask().execute();
99a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
100a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        initRS();
101a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
102a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mSceneManager.loadModel(modelName, mLoadedCallback);
103a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    }
104a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
105a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    void loadModel(String path) {
106a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        String shortName = path.substring(path.lastIndexOf('/') + 1);
107a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        shortName = shortName.substring(0, shortName.lastIndexOf('.'));
108a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mScript.set_gInitialized(false);
109a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mActiveScene.destroyRS(mSceneManager);
110a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mSceneManager.loadModel(shortName, mLoadedCallback);
111a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    }
112a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
113a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    private Resources mRes;
114a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    private RenderScriptGL mRS;
115a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    private Sampler mSampler;
116a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    private ProgramStore mPSBackground;
117a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    private ProgramFragment mPFBackground;
118a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    private ProgramVertex mPVBackground;
119a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    private ProgramVertexFixedFunction.Constants mPVA;
120a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
121a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    private ProgramFragment mPF_Paint;
122a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    private ProgramFragment mPF_Aluminum;
123a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    private ProgramFragment mPF_Plastic;
124a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    private ProgramFragment mPF_Diffuse;
125a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    private ProgramFragment mPF_BlurH;
126a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    private ProgramFragment mPF_BlurV;
127a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    private ProgramFragment mPF_SelectColor;
128a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    private ProgramFragment mPF_Texture;
129a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    ScriptField_FShaderParams_s mFsConst;
130a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    ScriptField_FBlurOffsets_s mFsBlurHConst;
131a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    ScriptField_FBlurOffsets_s mFsBlurVConst;
132a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    private ProgramVertex mPV_Paint;
133a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    ScriptField_VShaderParams_s mVsConst;
134a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    private ProgramVertex mPV_Blur;
135a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
136a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    private Allocation mDefaultCube;
137a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    private Allocation mAllocPV;
138a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    private Allocation mEnvCube;
139a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    private Allocation mDiffCube;
140a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
141a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    private Allocation mRenderTargetBlur0Color;
142a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    private Allocation mRenderTargetBlur0Depth;
143a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    private Allocation mRenderTargetBlur1Color;
144a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    private Allocation mRenderTargetBlur1Depth;
145a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    private Allocation mRenderTargetBlur2Color;
146a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    private Allocation mRenderTargetBlur2Depth;
147a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
148a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    Scene mActiveScene;
149a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
150a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    private ScriptC_scenegraph mScript;
151a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
152a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    private class LoadingScreenLoaderTask extends AsyncTask<String, Void, Boolean> {
153a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        Allocation robotTex;
154a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        Mesh robotMesh;
155a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        protected Boolean doInBackground(String... names) {
156a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk            long start = System.currentTimeMillis();
157a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk            robotTex = Allocation.createFromBitmapResource(mRS, mRes, R.drawable.robot,
158a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk                                                           MipmapControl.MIPMAP_ON_SYNC_TO_TEXTURE,
159a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk                                                           Allocation.USAGE_GRAPHICS_TEXTURE);
160a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
161a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk            FileA3D model = FileA3D.createFromResource(mRS, mRes, R.raw.robot);
162a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk            FileA3D.IndexEntry entry = model.getIndexEntry(0);
163a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk            if (entry != null && entry.getEntryType() == FileA3D.EntryType.MESH) {
164a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk                robotMesh = entry.getMesh();
165a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk            }
166a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
167a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk            initPFS();
168a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk            initPF();
169a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk            initPV();
170a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
171a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk            long end = System.currentTimeMillis();
172a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk            Log.v("TIMER", "Loading load time: " + (end - start));
173a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk            return new Boolean(true);
174a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        }
175a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
176a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        protected void onPostExecute(Boolean result) {
177a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk            mScript.set_gRobotTex(robotTex);
178a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk            mScript.set_gRobotMesh(robotMesh);
179a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        }
180a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    }
181a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
182a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
183a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    private class ImageLoaderTask extends AsyncTask<String, Void, Boolean> {
184a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        Allocation tempEnv;
185a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        Allocation tempDiff;
186a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
187a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        InputStream openStream(String name) {
188a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk            InputStream is = null;
189a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk            try {
190a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk                if (!mLoadFromSD) {
191a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk                    is = mRes.getAssets().open(name);
192a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk                } else {
193a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk                    File f = new File(mSDCardPath + name);
194a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk                    is = new BufferedInputStream(new FileInputStream(f));
195a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk                }
196a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk            } catch (IOException e) {
197a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk                Log.e("PAINTSHADERS", " Message: " + e.getMessage());
198a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk            }
199a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk            return is;
200a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        }
201a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
202a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        protected Boolean doInBackground(String... names) {
203a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk            long start = System.currentTimeMillis();
204a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk            InputStream is = openStream("cube_env.png");
205a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk            if (is == null) {
206a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk                return new Boolean(false);
207a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk            }
208a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
209a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk            Bitmap b = BitmapFactory.decodeStream(is);
210a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk            tempEnv = Allocation.createCubemapFromBitmap(mRS,
211a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk                                                         b,
212a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk                                                         MipmapControl.MIPMAP_ON_SYNC_TO_TEXTURE,
213a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk                                                         Allocation.USAGE_GRAPHICS_TEXTURE);
214a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
215a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk            is = openStream("cube_spec.png");
216a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk            if (is == null) {
217a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk                return new Boolean(false);
218a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk            }
219a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
220a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk            b = BitmapFactory.decodeStream(is);
221a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk            tempDiff = Allocation.createCubemapFromBitmap(mRS,
222a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk                                                          b,
223a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk                                                          MipmapControl.MIPMAP_ON_SYNC_TO_TEXTURE,
224a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk                                                          Allocation.USAGE_GRAPHICS_TEXTURE);
225a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk            long end = System.currentTimeMillis();
226a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk            Log.v("TIMER", "Image load time: " + (end - start));
227a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk            return new Boolean(true);
228a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        }
229a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
230a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        protected void onPostExecute(Boolean result) {
231a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk            mEnvCube = tempEnv;
232a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk            mDiffCube = tempDiff;
233a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
234a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk            mPF_Paint.bindTexture(mEnvCube, 1);
235a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk            mPF_Aluminum.bindTexture(mDiffCube, 1);
236a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        }
237a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    }
238a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
239a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    public void onActionDown(float x, float y) {
240a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mTouchHandler.onActionDown(x, y);
241a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
242a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        //mSceneManager.getRenderLoop().invoke_pick((int)x, (int)y);
243a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    }
244a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
245a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    public void onActionScale(float scale) {
246a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mTouchHandler.onActionScale(scale);
247a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    }
248a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
249a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    public void onActionMove(float x, float y) {
250a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mTouchHandler.onActionMove(x, y);
251a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    }
252a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
253a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    private void initPaintShaders() {
254a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        ProgramVertex.Builder vb = new ProgramVertex.Builder(mRS);
255a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mVsConst = new ScriptField_VShaderParams_s(mRS, 1);
256a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        vb.addConstant(mVsConst.getAllocation().getType());
257a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        vb.addInput(ScriptField_VertexShaderInputs_s.createElement(mRS));
258a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        vb.setShader(mRes, R.raw.shader2v);
259a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mPV_Paint = vb.create();
260a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mPV_Paint.bindConstants(mVsConst.getAllocation(), 0);
261a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
262a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        vb = new ProgramVertex.Builder(mRS);
263a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        vb.addConstant(mVsConst.getAllocation().getType());
264a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        vb.addInput(ScriptField_VertexShaderInputs_s.createElement(mRS));
265a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        vb.setShader(mRes, R.raw.blur_vertex);
266a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mPV_Blur = vb.create();
267a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mPV_Blur.bindConstants(mVsConst.getAllocation(), 0);
268a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
269a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        ProgramFragment.Builder fb = new ProgramFragment.Builder(mRS);
270a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mFsConst = new ScriptField_FShaderParams_s(mRS, 1);
271a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        fb.addConstant(mFsConst.getAllocation().getType());
272a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        fb.setShader(mRes, R.raw.paintf);
273a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        fb.addTexture(TextureType.TEXTURE_2D);
274a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        fb.addTexture(TextureType.TEXTURE_CUBE);
275a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mPF_Paint = fb.create();
276a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
277a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mPF_Paint.bindConstants(mFsConst.getAllocation(), 0);
278a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mPF_Paint.bindSampler(Sampler.WRAP_LINEAR_MIP_LINEAR(mRS), 0);
279a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mPF_Paint.bindSampler(Sampler.CLAMP_LINEAR_MIP_LINEAR(mRS), 1);
280a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
281a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        fb = new ProgramFragment.Builder(mRS);
282a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        fb.addConstant(mFsConst.getAllocation().getType());
283a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        fb.setShader(mRes, R.raw.metal);
284a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        fb.addTexture(TextureType.TEXTURE_2D);
285a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        fb.addTexture(TextureType.TEXTURE_CUBE);
286a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mPF_Aluminum = fb.create();
287a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
288a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mPF_Aluminum.bindConstants(mFsConst.getAllocation(), 0);
289a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mPF_Aluminum.bindSampler(Sampler.WRAP_LINEAR_MIP_LINEAR(mRS), 0);
290a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mPF_Aluminum.bindSampler(Sampler.CLAMP_LINEAR_MIP_LINEAR(mRS), 1);
291a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
292a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        fb = new ProgramFragment.Builder(mRS);
293a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        fb.addConstant(mFsConst.getAllocation().getType());
294a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        fb.setShader(mRes, R.raw.plastic);
295a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        fb.addTexture(TextureType.TEXTURE_2D);
296a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mPF_Plastic = fb.create();
297a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mPF_Plastic.bindConstants(mFsConst.getAllocation(), 0);
298a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mPF_Plastic.bindSampler(Sampler.WRAP_LINEAR_MIP_LINEAR(mRS), 0);
299a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
300a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        fb = new ProgramFragment.Builder(mRS);
301a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        fb.addConstant(mFsConst.getAllocation().getType());
302a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        fb.setShader(mRes, R.raw.diffuse);
303a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        fb.addTexture(TextureType.TEXTURE_2D);
304a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mPF_Diffuse = fb.create();
305a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mPF_Diffuse.bindConstants(mFsConst.getAllocation(), 0);
306a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mPF_Diffuse.bindSampler(Sampler.WRAP_LINEAR_MIP_LINEAR(mRS), 0);
307a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
308a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        fb = new ProgramFragment.Builder(mRS);
309a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        fb.addConstant(mFsConst.getAllocation().getType());
310a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        fb.setShader(mRes, R.raw.texture);
311a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        fb.addTexture(TextureType.TEXTURE_2D);
312a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mPF_Texture = fb.create();
313a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mPF_Texture.bindConstants(mFsConst.getAllocation(), 0);
314a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mPF_Texture.bindSampler(Sampler.WRAP_LINEAR_MIP_LINEAR(mRS), 0);
315a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
316a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mFsBlurHConst = new ScriptField_FBlurOffsets_s(mRS, 1);
317a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        float xAdvance = 1.0f / (float)mRenderTargetBlur0Color.getType().getX();
318a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        ScriptField_FBlurOffsets_s.Item item = new ScriptField_FBlurOffsets_s.Item();
319a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        item.blurOffset0 = - xAdvance * 2.5f;
320a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        item.blurOffset1 = - xAdvance * 0.5f;
321a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        item.blurOffset2 =   xAdvance * 1.5f;
322a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        item.blurOffset3 =   xAdvance * 3.5f;
323a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mFsBlurHConst.set(item, 0, true);
324a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
325a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        fb = new ProgramFragment.Builder(mRS);
326a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        fb.addConstant(mFsBlurHConst.getAllocation().getType());
327a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        fb.setShader(mRes, R.raw.blur_h);
328a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        fb.addTexture(TextureType.TEXTURE_2D);
329a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mPF_BlurH = fb.create();
330a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mPF_BlurH.bindConstants(mFsBlurHConst.getAllocation(), 0);
331a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mPF_BlurH.bindTexture(mRenderTargetBlur0Color, 0);
332a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mPF_BlurH.bindSampler(Sampler.CLAMP_LINEAR(mRS), 0);
333a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
334a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mFsBlurVConst = new ScriptField_FBlurOffsets_s(mRS, 1);
335a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        float yAdvance = 1.0f / (float)mRenderTargetBlur0Color.getType().getY();
336a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        item.blurOffset0 = - yAdvance * 2.5f;
337a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        item.blurOffset1 = - yAdvance * 0.5f;
338a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        item.blurOffset2 =   yAdvance * 1.5f;
339a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        item.blurOffset3 =   yAdvance * 3.5f;
340a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mFsBlurVConst.set(item, 0, true);
341a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
342a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        fb = new ProgramFragment.Builder(mRS);
343a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        fb.addConstant(mFsBlurVConst.getAllocation().getType());
344a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        fb.setShader(mRes, R.raw.blur_v);
345a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        fb.addTexture(TextureType.TEXTURE_2D);
346a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mPF_BlurV = fb.create();
347a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mPF_BlurV.bindConstants(mFsBlurVConst.getAllocation(), 0);
348a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mPF_BlurV.bindTexture(mRenderTargetBlur1Color, 0);
349a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mPF_BlurV.bindSampler(Sampler.CLAMP_LINEAR(mRS), 0);
350a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
351a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        fb = new ProgramFragment.Builder(mRS);
352a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        //fb.addConstant(mFsBlurVConst.getAllocation().getType());
353a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        fb.setShader(mRes, R.raw.select_color);
354a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        fb.addTexture(TextureType.TEXTURE_2D);
355a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mPF_SelectColor = fb.create();
356a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        //mPF_SelectColor.bindConstants(mFsBlurVConst.getAllocation(), 0);
357a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        //mPF_SelectColor.bindTexture(mRenderTargetBlur1Color, 0);
358a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mPF_SelectColor.bindSampler(Sampler.CLAMP_LINEAR(mRS), 0);
359a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    }
360a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
361a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    private void initPFS() {
362a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        ProgramStore.Builder b = new ProgramStore.Builder(mRS);
363a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
364a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        b.setDepthFunc(ProgramStore.DepthFunc.LESS);
365a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        b.setDitherEnabled(false);
366a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        b.setDepthMaskEnabled(true);
367a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mPSBackground = b.create();
368a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
369a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mScript.set_gPFSBackground(mPSBackground);
370a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    }
371a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
372a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    private void initPF() {
373a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        Sampler.Builder bs = new Sampler.Builder(mRS);
374a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        bs.setMinification(Sampler.Value.LINEAR);
375a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        bs.setMagnification(Sampler.Value.LINEAR);
376a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        bs.setWrapS(Sampler.Value.CLAMP);
377a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        bs.setWrapT(Sampler.Value.CLAMP);
378a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mSampler = bs.create();
379a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
380a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        ProgramFragmentFixedFunction.Builder b = new ProgramFragmentFixedFunction.Builder(mRS);
381a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        b.setTexture(ProgramFragmentFixedFunction.Builder.EnvMode.REPLACE,
382a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk                     ProgramFragmentFixedFunction.Builder.Format.RGBA, 0);
383a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mPFBackground = b.create();
384a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mPFBackground.bindSampler(Sampler.CLAMP_LINEAR(mRS), 0);
385a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
386a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mScript.set_gPFBackground(mPFBackground);
387a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    }
388a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
389a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    private void initPV() {
390a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        ProgramVertexFixedFunction.Builder pvb = new ProgramVertexFixedFunction.Builder(mRS);
391a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mPVBackground = pvb.create();
392a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
393a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mPVA = new ProgramVertexFixedFunction.Constants(mRS);
394a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        ((ProgramVertexFixedFunction)mPVBackground).bindConstants(mPVA);
395a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
396a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mScript.set_gPVBackground(mPVBackground);
397a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    }
398a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
399a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    void renderLoading() {
400a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mScript = new ScriptC_scenegraph(mRS, mRes, R.raw.scenegraph);
401a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mRS.bindRootScript(mScript);
402a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    }
403a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
404a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    void initSceneRS() {
405a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
406a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    }
407a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
408a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    void createRenderTargets() {
409a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        Type.Builder b = new Type.Builder(mRS, Element.RGBA_8888(mRS));
410a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        b.setX(mWidth/8).setY(mHeight/8);
411a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        Type renderType = b.create();
412a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mRenderTargetBlur0Color = Allocation.createTyped(mRS, renderType,
413a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk                                                         Allocation.USAGE_GRAPHICS_TEXTURE |
414a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk                                                         Allocation.USAGE_GRAPHICS_RENDER_TARGET);
415a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mRenderTargetBlur1Color = Allocation.createTyped(mRS, renderType,
416a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk                                                         Allocation.USAGE_GRAPHICS_TEXTURE |
417a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk                                                         Allocation.USAGE_GRAPHICS_RENDER_TARGET);
418a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mRenderTargetBlur2Color = Allocation.createTyped(mRS, renderType,
419a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk                                                         Allocation.USAGE_GRAPHICS_TEXTURE |
420a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk                                                         Allocation.USAGE_GRAPHICS_RENDER_TARGET);
421a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
422a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        b = new Type.Builder(mRS,
423a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk                             Element.createPixel(mRS, Element.DataType.UNSIGNED_16,
424a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk                                                 Element.DataKind.PIXEL_DEPTH));
425a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        b.setX(mWidth/8).setY(mHeight/8);
426a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mRenderTargetBlur0Depth = Allocation.createTyped(mRS,
427a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk                                                         b.create(),
428a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk                                                         Allocation.USAGE_GRAPHICS_RENDER_TARGET);
429a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
430a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mRenderTargetBlur1Depth = Allocation.createTyped(mRS,
431a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk                                                         b.create(),
432a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk                                                         Allocation.USAGE_GRAPHICS_RENDER_TARGET);
433a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mRenderTargetBlur2Depth = Allocation.createTyped(mRS,
434a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk                                                         b.create(),
435a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk                                                         Allocation.USAGE_GRAPHICS_RENDER_TARGET);
436a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    }
437a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
438a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    ProgramStore BLEND_ADD_DEPTH_NONE(RenderScript rs) {
439a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        ProgramStore.Builder builder = new ProgramStore.Builder(rs);
440a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        builder.setDepthFunc(ProgramStore.DepthFunc.ALWAYS);
441a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        builder.setBlendFunc(ProgramStore.BlendSrcFunc.ONE, ProgramStore.BlendDstFunc.ONE);
442a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        builder.setDitherEnabled(false);
443a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        builder.setDepthMaskEnabled(false);
444a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        return builder.create();
445a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    }
446a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
447a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    Drawable getDrawableQuad(String name, RenderState state) {
448a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        Drawable quad = new Drawable();
449a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        quad.setTransform(new MatrixTransform());
450a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        quad.setMesh(mSceneManager.getScreenAlignedQuad());
451a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        quad.setName(name);
452a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        quad.setRenderState(state);
453a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        quad.setCullType(1);
454a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        return quad;
455a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    }
456a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
457a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    void addBlurPasses() {
458a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        ArrayList<DrawableBase> allDraw = mActiveScene.getDrawables();
459a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        int numDraw = allDraw.size();
460a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
461a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        RenderState drawTex = new RenderState(mPV_Blur, mPF_Texture,
462a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk                                            BLEND_ADD_DEPTH_NONE(mRS),
463a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk                                            ProgramRaster.CULL_NONE(mRS));
464a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
465a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        RenderState selectCol = new RenderState(mPV_Blur, mPF_SelectColor,
466a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk                                            ProgramStore.BLEND_NONE_DEPTH_NONE(mRS),
467a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk                                            ProgramRaster.CULL_NONE(mRS));
468a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
469a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        RenderState hBlur = new RenderState(mPV_Blur, mPF_BlurH,
470a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk                                            ProgramStore.BLEND_NONE_DEPTH_NONE(mRS),
471a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk                                            ProgramRaster.CULL_NONE(mRS));
472a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
473a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        RenderState vBlur = new RenderState(mPV_Blur, mPF_BlurV,
474a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk                                            ProgramStore.BLEND_NONE_DEPTH_NONE(mRS),
475a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk                                            ProgramRaster.CULL_NONE(mRS));
476a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
477a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        RenderPass blurSourcePass = new RenderPass();
478a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        blurSourcePass.setColorTarget(mRenderTargetBlur0Color);
479a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        blurSourcePass.setDepthTarget(mRenderTargetBlur0Depth);
480a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        blurSourcePass.setClearColor(new Float4(1.0f, 1.0f, 1.0f, 1.0f));
481a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        blurSourcePass.setShouldClearColor(true);
482a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        blurSourcePass.setClearDepth(1.0f);
483a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        blurSourcePass.setShouldClearDepth(true);
484a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        blurSourcePass.setCamera(mActiveScene.getCameras().get(1));
485a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        for (int i = 0; i < numDraw; i ++) {
486a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk            blurSourcePass.appendDrawable((Drawable)allDraw.get(i));
487a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        }
488a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mActiveScene.appendRenderPass(blurSourcePass);
489a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
490a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        RenderPass selectColorPass = new RenderPass();
491a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        selectColorPass.setColorTarget(mRenderTargetBlur2Color);
492a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        selectColorPass.setDepthTarget(mRenderTargetBlur2Depth);
493a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        selectColorPass.setShouldClearColor(false);
494a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        selectColorPass.setShouldClearDepth(false);
495a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        selectColorPass.setCamera(mActiveScene.getCameras().get(1));
496a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        // Make blur shape
497a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        Drawable quad = getDrawableQuad("ScreenAlignedQuadS", selectCol);
498a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        quad.updateTextures(mRS, mRenderTargetBlur0Color, 0);
499a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        selectColorPass.appendDrawable(quad);
500a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mActiveScene.appendRenderPass(selectColorPass);
501a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
502a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        RenderPass horizontalBlurPass = new RenderPass();
503a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        horizontalBlurPass.setColorTarget(mRenderTargetBlur1Color);
504a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        horizontalBlurPass.setDepthTarget(mRenderTargetBlur1Depth);
505a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        horizontalBlurPass.setShouldClearColor(false);
506a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        horizontalBlurPass.setShouldClearDepth(false);
507a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        horizontalBlurPass.setCamera(mActiveScene.getCameras().get(1));
508a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        // Make blur shape
509a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        quad = getDrawableQuad("ScreenAlignedQuadH", hBlur);
510a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        quad.updateTextures(mRS, mRenderTargetBlur2Color, 0);
511a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        horizontalBlurPass.appendDrawable(quad);
512a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mActiveScene.appendRenderPass(horizontalBlurPass);
513a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
514a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        RenderPass verticalBlurPass = new RenderPass();
515a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        verticalBlurPass.setColorTarget(mRenderTargetBlur2Color);
516a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        verticalBlurPass.setDepthTarget(mRenderTargetBlur2Depth);
517a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        verticalBlurPass.setShouldClearColor(false);
518a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        verticalBlurPass.setShouldClearDepth(false);
519a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        verticalBlurPass.setCamera(mActiveScene.getCameras().get(1));
520a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        // Make blur shape
521a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        quad = getDrawableQuad("ScreenAlignedQuadV", vBlur);
522a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        quad.updateTextures(mRS, mRenderTargetBlur1Color, 0);
523a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        verticalBlurPass.appendDrawable(quad);
524a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mActiveScene.appendRenderPass(verticalBlurPass);
525a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
526a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    }
527a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
528a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    void initRenderPasses() {
529a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        ArrayList<DrawableBase> allDraw = mActiveScene.getDrawables();
530a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        int numDraw = allDraw.size();
531a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
532a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        if (mUseBlur) {
533a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk            addBlurPasses();
534a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        }
535a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
536a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        RenderPass mainPass = new RenderPass();
537a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mainPass.setClearColor(new Float4(1.0f, 1.0f, 1.0f, 1.0f));
538a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mainPass.setShouldClearColor(true);
539a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mainPass.setClearDepth(1.0f);
540a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mainPass.setShouldClearDepth(true);
541a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mainPass.setCamera(mActiveScene.getCameras().get(1));
542a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        for (int i = 0; i < numDraw; i ++) {
543a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk            mainPass.appendDrawable((Drawable)allDraw.get(i));
544a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        }
545a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mActiveScene.appendRenderPass(mainPass);
546a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
547a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        if (mUseBlur) {
548a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk            RenderState drawTex = new RenderState(mPV_Blur, mPF_Texture,
549a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk                                            BLEND_ADD_DEPTH_NONE(mRS),
550a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk                                            ProgramRaster.CULL_NONE(mRS));
551a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
552a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk            RenderPass compositePass = new RenderPass();
553a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk            compositePass.setClearColor(new Float4(1.0f, 1.0f, 1.0f, 0.0f));
554a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk            compositePass.setShouldClearColor(false);
555a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk            compositePass.setClearDepth(1.0f);
556a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk            compositePass.setShouldClearDepth(false);
557a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk            compositePass.setCamera(mActiveScene.getCameras().get(1));
558a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk            Drawable quad = getDrawableQuad("ScreenAlignedQuad", drawTex);
559a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk            quad.updateTextures(mRS, mRenderTargetBlur2Color, 0);
560a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk            compositePass.appendDrawable(quad);
561a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
562a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk            mActiveScene.appendRenderPass(compositePass);
563a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        }
564a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    }
565a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
566a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    public void prepareToRender(Scene s) {
567a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mActiveScene = s;
568a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        RenderState plastic = new RenderState(mPV_Paint, mPF_Plastic, null, null);
569a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        RenderState diffuse = new RenderState(mPV_Paint, mPF_Diffuse, null, null);
570a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        RenderState paint = new RenderState(mPV_Paint, mPF_Paint, null, null);
571a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        RenderState aluminum = new RenderState(mPV_Paint, mPF_Aluminum, null, null);
572a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        RenderState glassTransp = new RenderState(mPV_Paint,
573a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk                                                  mPF_Paint,
574a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk                                                  ProgramStore.BLEND_ALPHA_DEPTH_TEST(mRS),
575a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk                                                  null);
576a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
577a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        initRenderPasses();
578a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
579a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mActiveScene.assignRenderState(plastic);
580a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
581a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mActiveScene.assignRenderStateToMaterial(diffuse, "lambert2$");
582a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
583a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mActiveScene.assignRenderStateToMaterial(paint, "^#Paint");
584a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mActiveScene.assignRenderStateToMaterial(paint, "^#Carbon");
585a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mActiveScene.assignRenderStateToMaterial(paint, "^#Glass");
586a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mActiveScene.assignRenderStateToMaterial(paint, "^#MainGlass");
587a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
588a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mActiveScene.assignRenderStateToMaterial(aluminum, "^#Metal");
589a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mActiveScene.assignRenderStateToMaterial(aluminum, "^#Brake");
590a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
591a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mActiveScene.assignRenderStateToMaterial(glassTransp, "^#GlassLight");
592a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
593a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        Drawable plane = (Drawable)mActiveScene.getDrawableByName("pPlaneShape1");
594a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        if (plane != null) {
595a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk            RenderState texState = new RenderState(mPV_Paint, mPF_Texture, null, null);
596a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk            plane.setRenderState(texState);
597a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk            plane.setVisible(mRS, !mUseBlur);
598a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        }
599a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
600a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mTouchHandler.init(mActiveScene);
601a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
602a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        long start = System.currentTimeMillis();
603a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mActiveScene.initRS(mRS, mRes, mSceneManager);
604a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        long end = System.currentTimeMillis();
605a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        Log.v("TIMER", "Scene init time: " + (end - start));
606a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
607a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mScript.set_gInitialized(true);
608a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    }
609a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
610a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    private void initRS() {
611a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
612a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        createRenderTargets();
613a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        initPaintShaders();
614a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        new ImageLoaderTask().execute();
615a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
616a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        Bitmap b = BitmapFactory.decodeResource(mRes, R.drawable.defaultcube);
617a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mDefaultCube = Allocation.createCubemapFromBitmap(mRS, b);
618a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mPF_Paint.bindTexture(mDefaultCube, 1);
619a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mPF_Aluminum.bindTexture(mDefaultCube, 1);
620a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
621a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        ScriptC_render renderLoop = mSceneManager.getRenderLoop();
622a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        renderLoop.bind_vConst(mVsConst);
623a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        renderLoop.bind_fConst(mFsConst);
624a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
625a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mScript.set_gRenderLoop(renderLoop);
626a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        Allocation dummyAlloc = Allocation.createSized(mRS, Element.I32(mRS), 1);
627a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mScript.set_gDummyAlloc(dummyAlloc);
628a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    }
629a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk}
630