SceneManager.java revision e93db17a143ff560f92d94b68ce1e76f79db7902
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
1961440e8a8bc5d0d3c7edc66eccb609e5f07fea6eAlex Sakhartchoukimport java.io.BufferedInputStream;
20e57b34155269cc030b4b241f556207f7012a0f07Alex Sakhartchoukimport java.io.File;
2161440e8a8bc5d0d3c7edc66eccb609e5f07fea6eAlex Sakhartchoukimport java.io.FileInputStream;
22e57b34155269cc030b4b241f556207f7012a0f07Alex Sakhartchoukimport java.io.IOException;
23e57b34155269cc030b4b241f556207f7012a0f07Alex Sakhartchoukimport java.io.InputStream;
24e57b34155269cc030b4b241f556207f7012a0f07Alex Sakhartchoukimport java.io.Writer;
25a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchoukimport java.lang.Math;
26a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchoukimport java.util.ArrayList;
27a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchoukimport java.util.HashMap;
28a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchoukimport java.util.regex.Matcher;
29a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchoukimport java.util.regex.Pattern;
30a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
3161440e8a8bc5d0d3c7edc66eccb609e5f07fea6eAlex Sakhartchoukimport com.android.scenegraph.Scene;
3261440e8a8bc5d0d3c7edc66eccb609e5f07fea6eAlex Sakhartchouk
3361440e8a8bc5d0d3c7edc66eccb609e5f07fea6eAlex Sakhartchoukimport android.content.res.Resources;
34e57b34155269cc030b4b241f556207f7012a0f07Alex Sakhartchoukimport android.graphics.Bitmap;
35e57b34155269cc030b4b241f556207f7012a0f07Alex Sakhartchoukimport android.graphics.BitmapFactory;
3661440e8a8bc5d0d3c7edc66eccb609e5f07fea6eAlex Sakhartchoukimport android.os.AsyncTask;
37a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchoukimport android.renderscript.*;
38a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchoukimport android.renderscript.Allocation.MipmapControl;
3961440e8a8bc5d0d3c7edc66eccb609e5f07fea6eAlex Sakhartchoukimport android.renderscript.Mesh;
4061440e8a8bc5d0d3c7edc66eccb609e5f07fea6eAlex Sakhartchoukimport android.renderscript.RenderScriptGL;
41a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchoukimport android.util.Log;
4261440e8a8bc5d0d3c7edc66eccb609e5f07fea6eAlex Sakhartchoukimport android.view.SurfaceHolder;
43a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
44e93db17a143ff560f92d94b68ce1e76f79db7902Alex Sakhartchoukimport com.android.testapp.R;
45e93db17a143ff560f92d94b68ce1e76f79db7902Alex Sakhartchouk
46a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk/**
47a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk * @hide
48a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk */
49a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchoukpublic class SceneManager extends SceneGraphBase {
50a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
51a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    ScriptC_render mRenderLoop;
524fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk    ScriptC mCameraScript;
534fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk    ScriptC mLightScript;
544fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk    ScriptC mObjectParamsScript;
554fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk    ScriptC mFragmentParamsScript;
564fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk    ScriptC mVertexParamsScript;
574fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk    ScriptC mCullScript;
58a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    ScriptC_transform mTransformScript;
59a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
60a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    RenderScriptGL mRS;
61a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    Resources mRes;
62a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    Mesh mQuad;
63a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    int mWidth;
64a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    int mHeight;
65a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
6661440e8a8bc5d0d3c7edc66eccb609e5f07fea6eAlex Sakhartchouk    Scene mActiveScene;
6761440e8a8bc5d0d3c7edc66eccb609e5f07fea6eAlex Sakhartchouk    private static SceneManager sSceneManager;
6861440e8a8bc5d0d3c7edc66eccb609e5f07fea6eAlex Sakhartchouk
69f92189d2aea9856c11c26ebe392cd53dd969c0b8Alex Sakhartchouk    public static boolean isSDCardPath(String path) {
70f92189d2aea9856c11c26ebe392cd53dd969c0b8Alex Sakhartchouk        int sdCardIndex = path.indexOf("sdcard/");
71f92189d2aea9856c11c26ebe392cd53dd969c0b8Alex Sakhartchouk        // We are looking for /sdcard/ or sdcard/
72f92189d2aea9856c11c26ebe392cd53dd969c0b8Alex Sakhartchouk        if (sdCardIndex == 0 || sdCardIndex == 1) {
73f92189d2aea9856c11c26ebe392cd53dd969c0b8Alex Sakhartchouk            return true;
74f92189d2aea9856c11c26ebe392cd53dd969c0b8Alex Sakhartchouk        }
75f92189d2aea9856c11c26ebe392cd53dd969c0b8Alex Sakhartchouk        sdCardIndex = path.indexOf("mnt/sdcard/");
76f92189d2aea9856c11c26ebe392cd53dd969c0b8Alex Sakhartchouk        if (sdCardIndex == 0 || sdCardIndex == 1) {
77f92189d2aea9856c11c26ebe392cd53dd969c0b8Alex Sakhartchouk            return true;
78f92189d2aea9856c11c26ebe392cd53dd969c0b8Alex Sakhartchouk        }
79f92189d2aea9856c11c26ebe392cd53dd969c0b8Alex Sakhartchouk        return false;
80f92189d2aea9856c11c26ebe392cd53dd969c0b8Alex Sakhartchouk    }
81f92189d2aea9856c11c26ebe392cd53dd969c0b8Alex Sakhartchouk
82e57b34155269cc030b4b241f556207f7012a0f07Alex Sakhartchouk    static Bitmap loadBitmap(String name, Resources res) {
83e57b34155269cc030b4b241f556207f7012a0f07Alex Sakhartchouk        InputStream is = null;
84e57b34155269cc030b4b241f556207f7012a0f07Alex Sakhartchouk        boolean loadFromSD = isSDCardPath(name);
85e57b34155269cc030b4b241f556207f7012a0f07Alex Sakhartchouk        try {
86e57b34155269cc030b4b241f556207f7012a0f07Alex Sakhartchouk            if (!loadFromSD) {
87e57b34155269cc030b4b241f556207f7012a0f07Alex Sakhartchouk                is = res.getAssets().open(name);
88e57b34155269cc030b4b241f556207f7012a0f07Alex Sakhartchouk            } else {
89e57b34155269cc030b4b241f556207f7012a0f07Alex Sakhartchouk                File f = new File(name);
90e57b34155269cc030b4b241f556207f7012a0f07Alex Sakhartchouk                is = new BufferedInputStream(new FileInputStream(f));
91e57b34155269cc030b4b241f556207f7012a0f07Alex Sakhartchouk            }
92e57b34155269cc030b4b241f556207f7012a0f07Alex Sakhartchouk        } catch (IOException e) {
93e57b34155269cc030b4b241f556207f7012a0f07Alex Sakhartchouk            Log.e("ImageLoaderTask", " Message: " + e.getMessage());
94e57b34155269cc030b4b241f556207f7012a0f07Alex Sakhartchouk            return null;
95e57b34155269cc030b4b241f556207f7012a0f07Alex Sakhartchouk        }
96e57b34155269cc030b4b241f556207f7012a0f07Alex Sakhartchouk
97e57b34155269cc030b4b241f556207f7012a0f07Alex Sakhartchouk        Bitmap b = BitmapFactory.decodeStream(is);
98e57b34155269cc030b4b241f556207f7012a0f07Alex Sakhartchouk        try {
99e57b34155269cc030b4b241f556207f7012a0f07Alex Sakhartchouk            is.close();
100e57b34155269cc030b4b241f556207f7012a0f07Alex Sakhartchouk        } catch (IOException e) {
101e57b34155269cc030b4b241f556207f7012a0f07Alex Sakhartchouk            Log.e("ImageLoaderTask", " Message: " + e.getMessage());
102e57b34155269cc030b4b241f556207f7012a0f07Alex Sakhartchouk        }
103e57b34155269cc030b4b241f556207f7012a0f07Alex Sakhartchouk        return b;
104e57b34155269cc030b4b241f556207f7012a0f07Alex Sakhartchouk    }
105e57b34155269cc030b4b241f556207f7012a0f07Alex Sakhartchouk
106e57b34155269cc030b4b241f556207f7012a0f07Alex Sakhartchouk    public static Allocation loadCubemap(String name, RenderScriptGL rs, Resources res) {
107e57b34155269cc030b4b241f556207f7012a0f07Alex Sakhartchouk        Bitmap b = loadBitmap(name, res);
108e57b34155269cc030b4b241f556207f7012a0f07Alex Sakhartchouk        return Allocation.createCubemapFromBitmap(rs, b,
109e57b34155269cc030b4b241f556207f7012a0f07Alex Sakhartchouk                                                  MipmapControl.MIPMAP_ON_SYNC_TO_TEXTURE,
110e57b34155269cc030b4b241f556207f7012a0f07Alex Sakhartchouk                                                  Allocation.USAGE_GRAPHICS_TEXTURE);
111e57b34155269cc030b4b241f556207f7012a0f07Alex Sakhartchouk    }
112e57b34155269cc030b4b241f556207f7012a0f07Alex Sakhartchouk
113e57b34155269cc030b4b241f556207f7012a0f07Alex Sakhartchouk    public static Allocation loadTexture2D(String name, RenderScriptGL rs, Resources res) {
114e57b34155269cc030b4b241f556207f7012a0f07Alex Sakhartchouk        Bitmap b = loadBitmap(name, res);
115e57b34155269cc030b4b241f556207f7012a0f07Alex Sakhartchouk        return Allocation.createFromBitmap(rs, b,
116e57b34155269cc030b4b241f556207f7012a0f07Alex Sakhartchouk                                           Allocation.MipmapControl.MIPMAP_ON_SYNC_TO_TEXTURE,
117e57b34155269cc030b4b241f556207f7012a0f07Alex Sakhartchouk                                           Allocation.USAGE_GRAPHICS_TEXTURE);
118e57b34155269cc030b4b241f556207f7012a0f07Alex Sakhartchouk    }
119e57b34155269cc030b4b241f556207f7012a0f07Alex Sakhartchouk
120ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk    public static ProgramStore BLEND_ADD_DEPTH_NONE(RenderScript rs) {
121ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk        ProgramStore.Builder builder = new ProgramStore.Builder(rs);
122ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk        builder.setDepthFunc(ProgramStore.DepthFunc.ALWAYS);
123ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk        builder.setBlendFunc(ProgramStore.BlendSrcFunc.ONE, ProgramStore.BlendDstFunc.ONE);
124ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk        builder.setDitherEnabled(false);
125ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk        builder.setDepthMaskEnabled(false);
126ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk        return builder.create();
127ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk    }
128ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk
129ee1031d1a280924bf9485b80638dc61d2812b12aAlex Sakhartchouk    static Allocation getStringAsAllocation(RenderScript rs, String str) {
130ee1031d1a280924bf9485b80638dc61d2812b12aAlex Sakhartchouk        if (str == null) {
131ee1031d1a280924bf9485b80638dc61d2812b12aAlex Sakhartchouk            return null;
132ee1031d1a280924bf9485b80638dc61d2812b12aAlex Sakhartchouk        }
133ee1031d1a280924bf9485b80638dc61d2812b12aAlex Sakhartchouk        if (str.length() == 0) {
134ee1031d1a280924bf9485b80638dc61d2812b12aAlex Sakhartchouk            return null;
135ee1031d1a280924bf9485b80638dc61d2812b12aAlex Sakhartchouk        }
136ee1031d1a280924bf9485b80638dc61d2812b12aAlex Sakhartchouk        byte[] allocArray = null;
137ee1031d1a280924bf9485b80638dc61d2812b12aAlex Sakhartchouk        byte[] nullChar = new byte[1];
138ee1031d1a280924bf9485b80638dc61d2812b12aAlex Sakhartchouk        nullChar[0] = 0;
139ee1031d1a280924bf9485b80638dc61d2812b12aAlex Sakhartchouk        try {
140ee1031d1a280924bf9485b80638dc61d2812b12aAlex Sakhartchouk            allocArray = str.getBytes("UTF-8");
141ee1031d1a280924bf9485b80638dc61d2812b12aAlex Sakhartchouk            Allocation alloc = Allocation.createSized(rs, Element.U8(rs),
142ee1031d1a280924bf9485b80638dc61d2812b12aAlex Sakhartchouk                                                      allocArray.length + 1,
143ee1031d1a280924bf9485b80638dc61d2812b12aAlex Sakhartchouk                                                      Allocation.USAGE_SCRIPT);
144ee1031d1a280924bf9485b80638dc61d2812b12aAlex Sakhartchouk            alloc.copy1DRangeFrom(0, allocArray.length, allocArray);
145ee1031d1a280924bf9485b80638dc61d2812b12aAlex Sakhartchouk            alloc.copy1DRangeFrom(allocArray.length, 1, nullChar);
146ee1031d1a280924bf9485b80638dc61d2812b12aAlex Sakhartchouk            return alloc;
147ee1031d1a280924bf9485b80638dc61d2812b12aAlex Sakhartchouk        }
148ee1031d1a280924bf9485b80638dc61d2812b12aAlex Sakhartchouk        catch (Exception e) {
149ee1031d1a280924bf9485b80638dc61d2812b12aAlex Sakhartchouk            throw new RSRuntimeException("Could not convert string to utf-8.");
150ee1031d1a280924bf9485b80638dc61d2812b12aAlex Sakhartchouk        }
151ee1031d1a280924bf9485b80638dc61d2812b12aAlex Sakhartchouk    }
152ee1031d1a280924bf9485b80638dc61d2812b12aAlex Sakhartchouk
153a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    public static class SceneLoadedCallback implements Runnable {
154d4cb9c587c23e3c24d928b0ac1a4de5679846f93Alex Sakhartchouk        public Scene mLoadedScene;
155d4cb9c587c23e3c24d928b0ac1a4de5679846f93Alex Sakhartchouk        public String mName;
156a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        public void run() {
157a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        }
158a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    }
159a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
16061440e8a8bc5d0d3c7edc66eccb609e5f07fea6eAlex Sakhartchouk    public Scene getActiveScene() {
16161440e8a8bc5d0d3c7edc66eccb609e5f07fea6eAlex Sakhartchouk        return mActiveScene;
16261440e8a8bc5d0d3c7edc66eccb609e5f07fea6eAlex Sakhartchouk    }
16361440e8a8bc5d0d3c7edc66eccb609e5f07fea6eAlex Sakhartchouk
16461440e8a8bc5d0d3c7edc66eccb609e5f07fea6eAlex Sakhartchouk    public void setActiveScene(Scene s) {
16561440e8a8bc5d0d3c7edc66eccb609e5f07fea6eAlex Sakhartchouk        mActiveScene = s;
16661440e8a8bc5d0d3c7edc66eccb609e5f07fea6eAlex Sakhartchouk    }
16761440e8a8bc5d0d3c7edc66eccb609e5f07fea6eAlex Sakhartchouk
168e93db17a143ff560f92d94b68ce1e76f79db7902Alex Sakhartchouk    static RenderScriptGL getRS() {
169e93db17a143ff560f92d94b68ce1e76f79db7902Alex Sakhartchouk        if (sSceneManager == null) {
170e93db17a143ff560f92d94b68ce1e76f79db7902Alex Sakhartchouk            return null;
171e93db17a143ff560f92d94b68ce1e76f79db7902Alex Sakhartchouk        }
172e93db17a143ff560f92d94b68ce1e76f79db7902Alex Sakhartchouk        return sSceneManager.mRS;
173e93db17a143ff560f92d94b68ce1e76f79db7902Alex Sakhartchouk    }
174e93db17a143ff560f92d94b68ce1e76f79db7902Alex Sakhartchouk
175e93db17a143ff560f92d94b68ce1e76f79db7902Alex Sakhartchouk    static Resources getRes() {
176e93db17a143ff560f92d94b68ce1e76f79db7902Alex Sakhartchouk        if (sSceneManager == null) {
177e93db17a143ff560f92d94b68ce1e76f79db7902Alex Sakhartchouk            return null;
178e93db17a143ff560f92d94b68ce1e76f79db7902Alex Sakhartchouk        }
179e93db17a143ff560f92d94b68ce1e76f79db7902Alex Sakhartchouk        return sSceneManager.mRes;
180e93db17a143ff560f92d94b68ce1e76f79db7902Alex Sakhartchouk    }
181e93db17a143ff560f92d94b68ce1e76f79db7902Alex Sakhartchouk
18261440e8a8bc5d0d3c7edc66eccb609e5f07fea6eAlex Sakhartchouk    public static SceneManager getInstance() {
18361440e8a8bc5d0d3c7edc66eccb609e5f07fea6eAlex Sakhartchouk        if (sSceneManager == null) {
18461440e8a8bc5d0d3c7edc66eccb609e5f07fea6eAlex Sakhartchouk            sSceneManager = new SceneManager();
18561440e8a8bc5d0d3c7edc66eccb609e5f07fea6eAlex Sakhartchouk        }
18661440e8a8bc5d0d3c7edc66eccb609e5f07fea6eAlex Sakhartchouk        return sSceneManager;
18761440e8a8bc5d0d3c7edc66eccb609e5f07fea6eAlex Sakhartchouk    }
18861440e8a8bc5d0d3c7edc66eccb609e5f07fea6eAlex Sakhartchouk
18961440e8a8bc5d0d3c7edc66eccb609e5f07fea6eAlex Sakhartchouk    protected SceneManager() {
190a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    }
191a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
192a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    public void loadModel(String name, SceneLoadedCallback cb) {
193a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        ColladaScene scene = new ColladaScene(name, cb);
194a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        scene.init(mRS, mRes);
195a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    }
196a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
197a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    public Mesh getScreenAlignedQuad() {
198a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        if (mQuad != null) {
199a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk            return mQuad;
200a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        }
201a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
202a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        Mesh.TriangleMeshBuilder tmb = new Mesh.TriangleMeshBuilder(mRS,
203a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk                                           3, Mesh.TriangleMeshBuilder.TEXTURE_0);
204a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
205a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        tmb.setTexture(0.0f, 1.0f);
206a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        tmb.addVertex(-1.0f, 1.0f, 1.0f);
207a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
208a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        tmb.setTexture(0.0f, 0.0f);
209a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        tmb.addVertex(-1.0f, -1.0f, 1.0f);
210a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
211a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        tmb.setTexture(1.0f, 0.0f);
212a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        tmb.addVertex(1.0f, -1.0f, 1.0f);
213a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
214a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        tmb.setTexture(1.0f, 1.0f);
215a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        tmb.addVertex(1.0f, 1.0f, 1.0f);
216a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
217a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        tmb.addTriangle(0, 1, 2);
218a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        tmb.addTriangle(2, 3, 0);
219a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
220a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mQuad = tmb.create(true);
221a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        return mQuad;
222a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    }
223a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
224f92189d2aea9856c11c26ebe392cd53dd969c0b8Alex Sakhartchouk    public Renderable getRenderableQuad(String name, RenderState state) {
225f92189d2aea9856c11c26ebe392cd53dd969c0b8Alex Sakhartchouk        Renderable quad = new Renderable();
226f92189d2aea9856c11c26ebe392cd53dd969c0b8Alex Sakhartchouk        quad.setTransform(new MatrixTransform());
227f92189d2aea9856c11c26ebe392cd53dd969c0b8Alex Sakhartchouk        quad.setMesh(getScreenAlignedQuad());
228f92189d2aea9856c11c26ebe392cd53dd969c0b8Alex Sakhartchouk        quad.setName(name);
229f92189d2aea9856c11c26ebe392cd53dd969c0b8Alex Sakhartchouk        quad.setRenderState(state);
230f92189d2aea9856c11c26ebe392cd53dd969c0b8Alex Sakhartchouk        quad.setCullType(1);
231f92189d2aea9856c11c26ebe392cd53dd969c0b8Alex Sakhartchouk        return quad;
232f92189d2aea9856c11c26ebe392cd53dd969c0b8Alex Sakhartchouk    }
233f92189d2aea9856c11c26ebe392cd53dd969c0b8Alex Sakhartchouk
234a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    public void initRS(RenderScriptGL rs, Resources res, int w, int h) {
235a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mRS = rs;
236a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mRes = res;
237a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mTransformScript = new ScriptC_transform(rs, res, R.raw.transform);
238a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mTransformScript.set_gTransformScript(mTransformScript);
239a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
240a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mCameraScript = new ScriptC_camera(rs, res, R.raw.camera);
241875a538d5db06e7e055401050e03b86bf8598536Alex Sakhartchouk        mLightScript = new ScriptC_light(rs, res, R.raw.light);
2424fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk        mObjectParamsScript = new ScriptC_object_params(rs, res, R.raw.object_params);
2434fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk        mFragmentParamsScript = new ScriptC_object_params(rs, res, R.raw.fragment_params);
2444fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk        mVertexParamsScript = new ScriptC_object_params(rs, res, R.raw.vertex_params);
245ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk        mCullScript = new ScriptC_cull(rs, res, R.raw.cull);
246a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
247a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mRenderLoop = new ScriptC_render(rs, res, R.raw.render);
248a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mRenderLoop.set_gTransformScript(mTransformScript);
249a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mRenderLoop.set_gCameraScript(mCameraScript);
250875a538d5db06e7e055401050e03b86bf8598536Alex Sakhartchouk        mRenderLoop.set_gLightScript(mLightScript);
2514fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk        mRenderLoop.set_gObjectParamsScript(mObjectParamsScript);
2524fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk        mRenderLoop.set_gFragmentParamsScript(mFragmentParamsScript);
2534fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk        mRenderLoop.set_gVertexParamsScript(mVertexParamsScript);
254ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk        mRenderLoop.set_gCullScript(mCullScript);
255a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
256a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        Allocation checker = Allocation.createFromBitmapResource(mRS, mRes, R.drawable.checker,
257a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk                                                         MipmapControl.MIPMAP_ON_SYNC_TO_TEXTURE,
258a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk                                                         Allocation.USAGE_GRAPHICS_TEXTURE);
259a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mRenderLoop.set_gTGrid(checker);
260be5bdeb9471c4a04905edd34e6d3560315293427Alex Sakhartchouk        mRenderLoop.set_gPFSBackground(ProgramStore.BLEND_NONE_DEPTH_TEST(mRS));
261a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    }
262a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
263a18d676edefbafc0b745ab98edab8f50b1c81c61Alex Sakhartchouk    public ScriptC getRenderLoop() {
264a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        return mRenderLoop;
265a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    }
266a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk}
267a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
268a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
269a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
270a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
271