SceneManager.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.lang.Math;
20a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchoukimport java.util.ArrayList;
21a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchoukimport java.util.HashMap;
22a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchoukimport java.util.regex.Matcher;
23a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchoukimport java.util.regex.Pattern;
24a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
25a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchoukimport android.renderscript.RenderScriptGL;
26a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchoukimport android.renderscript.Mesh;
27a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchoukimport android.renderscript.*;
28a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchoukimport android.renderscript.Allocation.MipmapControl;
29a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchoukimport android.content.res.Resources;
30a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchoukimport android.view.SurfaceHolder;
31a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchoukimport android.util.Log;
32a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchoukimport android.os.AsyncTask;
33a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
34a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk/**
35a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk * @hide
36a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk */
37a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchoukpublic class SceneManager extends SceneGraphBase {
38a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
39a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    ScriptC_render mRenderLoop;
40a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    ScriptC_camera mCameraScript;
41a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    ScriptC_transform mTransformScript;
42a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
43a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    RenderScriptGL mRS;
44a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    Resources mRes;
45a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    Mesh mQuad;
46a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    int mWidth;
47a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    int mHeight;
48a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
49a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    public static class SceneLoadedCallback implements Runnable {
50a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        Scene mLoadedScene;
51a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        String mName;
52a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        public void run() {
53a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        }
54a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    }
55a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
56a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    private void initPFS() {
57a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        ProgramStore.Builder b = new ProgramStore.Builder(mRS);
58a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
59a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        b.setDepthFunc(ProgramStore.DepthFunc.LESS);
60a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        b.setDitherEnabled(false);
61a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        b.setDepthMaskEnabled(true);
62a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
63a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mRenderLoop.set_gPFSBackground(b.create());
64a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    }
65a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
66a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    public SceneManager() {
67a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    }
68a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
69a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    public void loadModel(String name, SceneLoadedCallback cb) {
70a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        ColladaScene scene = new ColladaScene(name, cb);
71a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        scene.init(mRS, mRes);
72a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    }
73a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
74a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    public Mesh getScreenAlignedQuad() {
75a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        if (mQuad != null) {
76a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk            return mQuad;
77a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        }
78a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
79a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        Mesh.TriangleMeshBuilder tmb = new Mesh.TriangleMeshBuilder(mRS,
80a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk                                           3, Mesh.TriangleMeshBuilder.TEXTURE_0);
81a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
82a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        tmb.setTexture(0.0f, 1.0f);
83a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        tmb.addVertex(-1.0f, 1.0f, 1.0f);
84a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
85a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        tmb.setTexture(0.0f, 0.0f);
86a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        tmb.addVertex(-1.0f, -1.0f, 1.0f);
87a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
88a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        tmb.setTexture(1.0f, 0.0f);
89a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        tmb.addVertex(1.0f, -1.0f, 1.0f);
90a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
91a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        tmb.setTexture(1.0f, 1.0f);
92a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        tmb.addVertex(1.0f, 1.0f, 1.0f);
93a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
94a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        tmb.addTriangle(0, 1, 2);
95a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        tmb.addTriangle(2, 3, 0);
96a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
97a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mQuad = tmb.create(true);
98a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        return mQuad;
99a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    }
100a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
101a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    public void initRS(RenderScriptGL rs, Resources res, int w, int h) {
102a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mRS = rs;
103a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mRes = res;
104a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mTransformScript = new ScriptC_transform(rs, res, R.raw.transform);
105a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mTransformScript.set_gTransformScript(mTransformScript);
106a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
107a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mCameraScript = new ScriptC_camera(rs, res, R.raw.camera);
108a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
109a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mRenderLoop = new ScriptC_render(rs, res, R.raw.render);
110a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mRenderLoop.set_gTransformScript(mTransformScript);
111a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mRenderLoop.set_gCameraScript(mCameraScript);
112a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
113a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        Allocation checker = Allocation.createFromBitmapResource(mRS, mRes, R.drawable.checker,
114a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk                                                         MipmapControl.MIPMAP_ON_SYNC_TO_TEXTURE,
115a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk                                                         Allocation.USAGE_GRAPHICS_TEXTURE);
116a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mRenderLoop.set_gTGrid(checker);
117a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        initPFS();
118a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    }
119a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
120a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    public ScriptC_render getRenderLoop() {
121a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        return mRenderLoop;
122a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    }
123a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk}
124a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
125a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
126a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
127a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
128