SceneManager.java revision ce047cb47b761f00593f247a3901fe8155371d47
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
44a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk/**
45a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk * @hide
46a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk */
47a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchoukpublic class SceneManager extends SceneGraphBase {
48a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
49a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    ScriptC_render mRenderLoop;
50a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    ScriptC_camera mCameraScript;
51875a538d5db06e7e055401050e03b86bf8598536Alex Sakhartchouk    ScriptC_light mLightScript;
52dd1da451159578d865230ceada3e1f0058e3c18eAlex Sakhartchouk    ScriptC_params mParamsScript;
53ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk    ScriptC_cull mCullScript;
54a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    ScriptC_transform mTransformScript;
55a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
56a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    RenderScriptGL mRS;
57a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    Resources mRes;
58a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    Mesh mQuad;
59a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    int mWidth;
60a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    int mHeight;
61a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
6261440e8a8bc5d0d3c7edc66eccb609e5f07fea6eAlex Sakhartchouk    Scene mActiveScene;
6361440e8a8bc5d0d3c7edc66eccb609e5f07fea6eAlex Sakhartchouk    private static SceneManager sSceneManager;
6461440e8a8bc5d0d3c7edc66eccb609e5f07fea6eAlex Sakhartchouk
65f92189d2aea9856c11c26ebe392cd53dd969c0b8Alex Sakhartchouk    public static boolean isSDCardPath(String path) {
66f92189d2aea9856c11c26ebe392cd53dd969c0b8Alex Sakhartchouk        int sdCardIndex = path.indexOf("sdcard/");
67f92189d2aea9856c11c26ebe392cd53dd969c0b8Alex Sakhartchouk        // We are looking for /sdcard/ or sdcard/
68f92189d2aea9856c11c26ebe392cd53dd969c0b8Alex Sakhartchouk        if (sdCardIndex == 0 || sdCardIndex == 1) {
69f92189d2aea9856c11c26ebe392cd53dd969c0b8Alex Sakhartchouk            return true;
70f92189d2aea9856c11c26ebe392cd53dd969c0b8Alex Sakhartchouk        }
71f92189d2aea9856c11c26ebe392cd53dd969c0b8Alex Sakhartchouk        sdCardIndex = path.indexOf("mnt/sdcard/");
72f92189d2aea9856c11c26ebe392cd53dd969c0b8Alex Sakhartchouk        if (sdCardIndex == 0 || sdCardIndex == 1) {
73f92189d2aea9856c11c26ebe392cd53dd969c0b8Alex Sakhartchouk            return true;
74f92189d2aea9856c11c26ebe392cd53dd969c0b8Alex Sakhartchouk        }
75f92189d2aea9856c11c26ebe392cd53dd969c0b8Alex Sakhartchouk        return false;
76f92189d2aea9856c11c26ebe392cd53dd969c0b8Alex Sakhartchouk    }
77f92189d2aea9856c11c26ebe392cd53dd969c0b8Alex Sakhartchouk
78e57b34155269cc030b4b241f556207f7012a0f07Alex Sakhartchouk    static Bitmap loadBitmap(String name, Resources res) {
79e57b34155269cc030b4b241f556207f7012a0f07Alex Sakhartchouk        InputStream is = null;
80e57b34155269cc030b4b241f556207f7012a0f07Alex Sakhartchouk        boolean loadFromSD = isSDCardPath(name);
81e57b34155269cc030b4b241f556207f7012a0f07Alex Sakhartchouk        try {
82e57b34155269cc030b4b241f556207f7012a0f07Alex Sakhartchouk            if (!loadFromSD) {
83e57b34155269cc030b4b241f556207f7012a0f07Alex Sakhartchouk                is = res.getAssets().open(name);
84e57b34155269cc030b4b241f556207f7012a0f07Alex Sakhartchouk            } else {
85e57b34155269cc030b4b241f556207f7012a0f07Alex Sakhartchouk                File f = new File(name);
86e57b34155269cc030b4b241f556207f7012a0f07Alex Sakhartchouk                is = new BufferedInputStream(new FileInputStream(f));
87e57b34155269cc030b4b241f556207f7012a0f07Alex Sakhartchouk            }
88e57b34155269cc030b4b241f556207f7012a0f07Alex Sakhartchouk        } catch (IOException e) {
89e57b34155269cc030b4b241f556207f7012a0f07Alex Sakhartchouk            Log.e("ImageLoaderTask", " Message: " + e.getMessage());
90e57b34155269cc030b4b241f556207f7012a0f07Alex Sakhartchouk            return null;
91e57b34155269cc030b4b241f556207f7012a0f07Alex Sakhartchouk        }
92e57b34155269cc030b4b241f556207f7012a0f07Alex Sakhartchouk
93e57b34155269cc030b4b241f556207f7012a0f07Alex Sakhartchouk        Bitmap b = BitmapFactory.decodeStream(is);
94e57b34155269cc030b4b241f556207f7012a0f07Alex Sakhartchouk        try {
95e57b34155269cc030b4b241f556207f7012a0f07Alex Sakhartchouk            is.close();
96e57b34155269cc030b4b241f556207f7012a0f07Alex Sakhartchouk        } catch (IOException e) {
97e57b34155269cc030b4b241f556207f7012a0f07Alex Sakhartchouk            Log.e("ImageLoaderTask", " Message: " + e.getMessage());
98e57b34155269cc030b4b241f556207f7012a0f07Alex Sakhartchouk        }
99e57b34155269cc030b4b241f556207f7012a0f07Alex Sakhartchouk        return b;
100e57b34155269cc030b4b241f556207f7012a0f07Alex Sakhartchouk    }
101e57b34155269cc030b4b241f556207f7012a0f07Alex Sakhartchouk
102e57b34155269cc030b4b241f556207f7012a0f07Alex Sakhartchouk    public static Allocation loadCubemap(String name, RenderScriptGL rs, Resources res) {
103e57b34155269cc030b4b241f556207f7012a0f07Alex Sakhartchouk        Bitmap b = loadBitmap(name, res);
104e57b34155269cc030b4b241f556207f7012a0f07Alex Sakhartchouk        return Allocation.createCubemapFromBitmap(rs, b,
105e57b34155269cc030b4b241f556207f7012a0f07Alex Sakhartchouk                                                  MipmapControl.MIPMAP_ON_SYNC_TO_TEXTURE,
106e57b34155269cc030b4b241f556207f7012a0f07Alex Sakhartchouk                                                  Allocation.USAGE_GRAPHICS_TEXTURE);
107e57b34155269cc030b4b241f556207f7012a0f07Alex Sakhartchouk    }
108e57b34155269cc030b4b241f556207f7012a0f07Alex Sakhartchouk
109e57b34155269cc030b4b241f556207f7012a0f07Alex Sakhartchouk    public static Allocation loadTexture2D(String name, RenderScriptGL rs, Resources res) {
110e57b34155269cc030b4b241f556207f7012a0f07Alex Sakhartchouk        Bitmap b = loadBitmap(name, res);
111e57b34155269cc030b4b241f556207f7012a0f07Alex Sakhartchouk        return Allocation.createFromBitmap(rs, b,
112e57b34155269cc030b4b241f556207f7012a0f07Alex Sakhartchouk                                           Allocation.MipmapControl.MIPMAP_ON_SYNC_TO_TEXTURE,
113e57b34155269cc030b4b241f556207f7012a0f07Alex Sakhartchouk                                           Allocation.USAGE_GRAPHICS_TEXTURE);
114e57b34155269cc030b4b241f556207f7012a0f07Alex Sakhartchouk    }
115e57b34155269cc030b4b241f556207f7012a0f07Alex Sakhartchouk
116ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk    public static ProgramStore BLEND_ADD_DEPTH_NONE(RenderScript rs) {
117ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk        ProgramStore.Builder builder = new ProgramStore.Builder(rs);
118ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk        builder.setDepthFunc(ProgramStore.DepthFunc.ALWAYS);
119ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk        builder.setBlendFunc(ProgramStore.BlendSrcFunc.ONE, ProgramStore.BlendDstFunc.ONE);
120ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk        builder.setDitherEnabled(false);
121ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk        builder.setDepthMaskEnabled(false);
122ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk        return builder.create();
123ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk    }
124ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk
125ee1031d1a280924bf9485b80638dc61d2812b12aAlex Sakhartchouk    static Allocation getStringAsAllocation(RenderScript rs, String str) {
126ee1031d1a280924bf9485b80638dc61d2812b12aAlex Sakhartchouk        if (str == null) {
127ee1031d1a280924bf9485b80638dc61d2812b12aAlex Sakhartchouk            return null;
128ee1031d1a280924bf9485b80638dc61d2812b12aAlex Sakhartchouk        }
129ee1031d1a280924bf9485b80638dc61d2812b12aAlex Sakhartchouk        if (str.length() == 0) {
130ee1031d1a280924bf9485b80638dc61d2812b12aAlex Sakhartchouk            return null;
131ee1031d1a280924bf9485b80638dc61d2812b12aAlex Sakhartchouk        }
132ee1031d1a280924bf9485b80638dc61d2812b12aAlex Sakhartchouk        byte[] allocArray = null;
133ee1031d1a280924bf9485b80638dc61d2812b12aAlex Sakhartchouk        byte[] nullChar = new byte[1];
134ee1031d1a280924bf9485b80638dc61d2812b12aAlex Sakhartchouk        nullChar[0] = 0;
135ee1031d1a280924bf9485b80638dc61d2812b12aAlex Sakhartchouk        try {
136ee1031d1a280924bf9485b80638dc61d2812b12aAlex Sakhartchouk            allocArray = str.getBytes("UTF-8");
137ee1031d1a280924bf9485b80638dc61d2812b12aAlex Sakhartchouk            Allocation alloc = Allocation.createSized(rs, Element.U8(rs),
138ee1031d1a280924bf9485b80638dc61d2812b12aAlex Sakhartchouk                                                      allocArray.length + 1,
139ee1031d1a280924bf9485b80638dc61d2812b12aAlex Sakhartchouk                                                      Allocation.USAGE_SCRIPT);
140ee1031d1a280924bf9485b80638dc61d2812b12aAlex Sakhartchouk            alloc.copy1DRangeFrom(0, allocArray.length, allocArray);
141ee1031d1a280924bf9485b80638dc61d2812b12aAlex Sakhartchouk            alloc.copy1DRangeFrom(allocArray.length, 1, nullChar);
142ee1031d1a280924bf9485b80638dc61d2812b12aAlex Sakhartchouk            return alloc;
143ee1031d1a280924bf9485b80638dc61d2812b12aAlex Sakhartchouk        }
144ee1031d1a280924bf9485b80638dc61d2812b12aAlex Sakhartchouk        catch (Exception e) {
145ee1031d1a280924bf9485b80638dc61d2812b12aAlex Sakhartchouk            throw new RSRuntimeException("Could not convert string to utf-8.");
146ee1031d1a280924bf9485b80638dc61d2812b12aAlex Sakhartchouk        }
147ee1031d1a280924bf9485b80638dc61d2812b12aAlex Sakhartchouk    }
148ee1031d1a280924bf9485b80638dc61d2812b12aAlex Sakhartchouk
149a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    public static class SceneLoadedCallback implements Runnable {
150a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        Scene mLoadedScene;
151a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        String mName;
152a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        public void run() {
153a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        }
154a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    }
155a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
15661440e8a8bc5d0d3c7edc66eccb609e5f07fea6eAlex Sakhartchouk    public Scene getActiveScene() {
15761440e8a8bc5d0d3c7edc66eccb609e5f07fea6eAlex Sakhartchouk        return mActiveScene;
15861440e8a8bc5d0d3c7edc66eccb609e5f07fea6eAlex Sakhartchouk    }
15961440e8a8bc5d0d3c7edc66eccb609e5f07fea6eAlex Sakhartchouk
16061440e8a8bc5d0d3c7edc66eccb609e5f07fea6eAlex Sakhartchouk    public void setActiveScene(Scene s) {
16161440e8a8bc5d0d3c7edc66eccb609e5f07fea6eAlex Sakhartchouk        mActiveScene = s;
16261440e8a8bc5d0d3c7edc66eccb609e5f07fea6eAlex Sakhartchouk    }
16361440e8a8bc5d0d3c7edc66eccb609e5f07fea6eAlex Sakhartchouk
16461440e8a8bc5d0d3c7edc66eccb609e5f07fea6eAlex Sakhartchouk    public static SceneManager getInstance() {
16561440e8a8bc5d0d3c7edc66eccb609e5f07fea6eAlex Sakhartchouk        if (sSceneManager == null) {
16661440e8a8bc5d0d3c7edc66eccb609e5f07fea6eAlex Sakhartchouk            sSceneManager = new SceneManager();
16761440e8a8bc5d0d3c7edc66eccb609e5f07fea6eAlex Sakhartchouk        }
16861440e8a8bc5d0d3c7edc66eccb609e5f07fea6eAlex Sakhartchouk        return sSceneManager;
16961440e8a8bc5d0d3c7edc66eccb609e5f07fea6eAlex Sakhartchouk    }
17061440e8a8bc5d0d3c7edc66eccb609e5f07fea6eAlex Sakhartchouk
17161440e8a8bc5d0d3c7edc66eccb609e5f07fea6eAlex Sakhartchouk    protected SceneManager() {
172a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    }
173a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
174a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    public void loadModel(String name, SceneLoadedCallback cb) {
175a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        ColladaScene scene = new ColladaScene(name, cb);
176a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        scene.init(mRS, mRes);
177a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    }
178a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
179a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    public Mesh getScreenAlignedQuad() {
180a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        if (mQuad != null) {
181a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk            return mQuad;
182a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        }
183a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
184a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        Mesh.TriangleMeshBuilder tmb = new Mesh.TriangleMeshBuilder(mRS,
185a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk                                           3, Mesh.TriangleMeshBuilder.TEXTURE_0);
186a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
187a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        tmb.setTexture(0.0f, 1.0f);
188a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        tmb.addVertex(-1.0f, 1.0f, 1.0f);
189a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
190a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        tmb.setTexture(0.0f, 0.0f);
191a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        tmb.addVertex(-1.0f, -1.0f, 1.0f);
192a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
193a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        tmb.setTexture(1.0f, 0.0f);
194a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        tmb.addVertex(1.0f, -1.0f, 1.0f);
195a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
196a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        tmb.setTexture(1.0f, 1.0f);
197a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        tmb.addVertex(1.0f, 1.0f, 1.0f);
198a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
199a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        tmb.addTriangle(0, 1, 2);
200a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        tmb.addTriangle(2, 3, 0);
201a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
202a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mQuad = tmb.create(true);
203a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        return mQuad;
204a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    }
205a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
206f92189d2aea9856c11c26ebe392cd53dd969c0b8Alex Sakhartchouk    public Renderable getRenderableQuad(String name, RenderState state) {
207f92189d2aea9856c11c26ebe392cd53dd969c0b8Alex Sakhartchouk        Renderable quad = new Renderable();
208f92189d2aea9856c11c26ebe392cd53dd969c0b8Alex Sakhartchouk        quad.setTransform(new MatrixTransform());
209f92189d2aea9856c11c26ebe392cd53dd969c0b8Alex Sakhartchouk        quad.setMesh(getScreenAlignedQuad());
210f92189d2aea9856c11c26ebe392cd53dd969c0b8Alex Sakhartchouk        quad.setName(name);
211f92189d2aea9856c11c26ebe392cd53dd969c0b8Alex Sakhartchouk        quad.setRenderState(state);
212f92189d2aea9856c11c26ebe392cd53dd969c0b8Alex Sakhartchouk        quad.setCullType(1);
213f92189d2aea9856c11c26ebe392cd53dd969c0b8Alex Sakhartchouk        return quad;
214f92189d2aea9856c11c26ebe392cd53dd969c0b8Alex Sakhartchouk    }
215f92189d2aea9856c11c26ebe392cd53dd969c0b8Alex Sakhartchouk
216a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    public void initRS(RenderScriptGL rs, Resources res, int w, int h) {
217a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mRS = rs;
218a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mRes = res;
219a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mTransformScript = new ScriptC_transform(rs, res, R.raw.transform);
220a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mTransformScript.set_gTransformScript(mTransformScript);
221a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
222a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mCameraScript = new ScriptC_camera(rs, res, R.raw.camera);
223875a538d5db06e7e055401050e03b86bf8598536Alex Sakhartchouk        mLightScript = new ScriptC_light(rs, res, R.raw.light);
224dd1da451159578d865230ceada3e1f0058e3c18eAlex Sakhartchouk        mParamsScript = new ScriptC_params(rs, res, R.raw.params);
225ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk        mCullScript = new ScriptC_cull(rs, res, R.raw.cull);
226a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
227a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mRenderLoop = new ScriptC_render(rs, res, R.raw.render);
228a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mRenderLoop.set_gTransformScript(mTransformScript);
229a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mRenderLoop.set_gCameraScript(mCameraScript);
230875a538d5db06e7e055401050e03b86bf8598536Alex Sakhartchouk        mRenderLoop.set_gLightScript(mLightScript);
231dd1da451159578d865230ceada3e1f0058e3c18eAlex Sakhartchouk        mRenderLoop.set_gParamsScript(mParamsScript);
232ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk        mRenderLoop.set_gCullScript(mCullScript);
233a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
234a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        Allocation checker = Allocation.createFromBitmapResource(mRS, mRes, R.drawable.checker,
235a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk                                                         MipmapControl.MIPMAP_ON_SYNC_TO_TEXTURE,
236a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk                                                         Allocation.USAGE_GRAPHICS_TEXTURE);
237a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mRenderLoop.set_gTGrid(checker);
238be5bdeb9471c4a04905edd34e6d3560315293427Alex Sakhartchouk        mRenderLoop.set_gPFSBackground(ProgramStore.BLEND_NONE_DEPTH_TEST(mRS));
239a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    }
240a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
241a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    public ScriptC_render getRenderLoop() {
242a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        return mRenderLoop;
243a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    }
244a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk}
245a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
246a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
247a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
248a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
249