SimpleAppRS.java revision d2dc9838961f945c402e5d810bc715196240be6f
157fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchouk/*
257fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchouk * Copyright (C) 2012 The Android Open Source Project
357fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchouk *
457fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchouk * Licensed under the Apache License, Version 2.0 (the "License");
557fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchouk * you may not use this file except in compliance with the License.
657fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchouk * You may obtain a copy of the License at
757fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchouk *
857fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchouk *      http://www.apache.org/licenses/LICENSE-2.0
957fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchouk *
1057fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchouk * Unless required by applicable law or agreed to in writing, software
1157fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchouk * distributed under the License is distributed on an "AS IS" BASIS,
1257fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchouk * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1357fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchouk * See the License for the specific language governing permissions and
1457fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchouk * limitations under the License.
1557fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchouk */
1657fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchouk
1757fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchoukpackage com.android.testapp;
1857fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchouk
1957fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchoukimport java.util.ArrayList;
2057fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchoukimport java.util.HashMap;
2157fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchoukimport java.util.Map;
2257fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchoukimport java.util.Vector;
2357fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchouk
2457fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchoukimport com.android.scenegraph.*;
2557fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchoukimport com.android.scenegraph.SceneManager.SceneLoadedCallback;
2657fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchouk
2757fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchoukimport android.content.res.Resources;
2857fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchoukimport android.graphics.Bitmap;
2957fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchoukimport android.graphics.BitmapFactory;
3057fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchoukimport android.os.AsyncTask;
3157fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchoukimport android.renderscript.*;
3257fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchoukimport android.renderscript.Program.TextureType;
3357fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchoukimport android.util.Log;
3457fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchouk
3557fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchouk// This is where the scenegraph and the rendered objects are initialized and used
3657fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchoukpublic class SimpleAppRS {
3757fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchouk
3857fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchouk    private static String TAG = "SimpleAppRS";
3957fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchouk
4057fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchouk    SceneManager mSceneManager;
4157fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchouk
4257fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchouk    RenderScriptGL mRS;
4357fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchouk    Resources mRes;
4457fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchouk
45d2dc9838961f945c402e5d810bc715196240be6fAlex Sakhartchouk    Scene mScene;
46d2dc9838961f945c402e5d810bc715196240be6fAlex Sakhartchouk    Mesh mSimpleMesh;
47d2dc9838961f945c402e5d810bc715196240be6fAlex Sakhartchouk
4857fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchouk    public void init(RenderScriptGL rs, Resources res, int width, int height) {
4957fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchouk        mRS = rs;
5057fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchouk        mRes = res;
5157fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchouk        mSceneManager = SceneManager.getInstance();
5257fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchouk        mSceneManager.initRS(mRS, mRes, width, height);
5357fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchouk
5457fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchouk        mScene = new Scene();
5557fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchouk
5657fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchouk        setupGeometry();
57d2dc9838961f945c402e5d810bc715196240be6fAlex Sakhartchouk        setupRenderables();
5857fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchouk        setupCamera();
5957fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchouk        setupRenderPass();
6057fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchouk
6157fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchouk        mSceneManager.setActiveScene(mScene);
6257fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchouk
6357fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchouk        mScene.initRS();
6457fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchouk        mRS.bindRootScript(mSceneManager.getRenderLoop());
6557fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchouk    }
6657fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchouk
6757fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchouk    private void setupGeometry() {
68d2dc9838961f945c402e5d810bc715196240be6fAlex Sakhartchouk        Mesh.TriangleMeshBuilder tmb = new Mesh.TriangleMeshBuilder(mRS, 3,
69d2dc9838961f945c402e5d810bc715196240be6fAlex Sakhartchouk                                                         Mesh.TriangleMeshBuilder.TEXTURE_0);
7057fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchouk
7157fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchouk        tmb.setTexture(0.0f, 1.0f).addVertex(-1.0f, 1.0f, 0.0f);
7257fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchouk        tmb.setTexture(0.0f, 0.0f).addVertex(-1.0f, -1.0f, 0.0f);
7357fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchouk        tmb.setTexture(1.0f, 0.0f).addVertex(1.0f, -1.0f, 0.0f);
7457fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchouk        tmb.setTexture(1.0f, 1.0f).addVertex(1.0f, 1.0f, 0.0f);
7557fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchouk
7657fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchouk        tmb.addTriangle(0, 1, 2);
7757fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchouk        tmb.addTriangle(2, 3, 0);
78d2dc9838961f945c402e5d810bc715196240be6fAlex Sakhartchouk        mSimpleMesh = tmb.create(true);
79d2dc9838961f945c402e5d810bc715196240be6fAlex Sakhartchouk    }
8057fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchouk
81d2dc9838961f945c402e5d810bc715196240be6fAlex Sakhartchouk    private void setupRenderables() {
82d2dc9838961f945c402e5d810bc715196240be6fAlex Sakhartchouk        // Built-in shader that provides position, texcoord and normal
83d2dc9838961f945c402e5d810bc715196240be6fAlex Sakhartchouk        VertexShader genericV = SceneManager.getDefaultVS();
84d2dc9838961f945c402e5d810bc715196240be6fAlex Sakhartchouk        // Built-in shader that displays a color
85d2dc9838961f945c402e5d810bc715196240be6fAlex Sakhartchouk        FragmentShader colorF = SceneManager.getColorFS();
86d2dc9838961f945c402e5d810bc715196240be6fAlex Sakhartchouk        // Built-in shader that displays a texture
87d2dc9838961f945c402e5d810bc715196240be6fAlex Sakhartchouk        FragmentShader textureF = SceneManager.getTextureFS();
88d2dc9838961f945c402e5d810bc715196240be6fAlex Sakhartchouk        RenderState colorRS = new RenderState(genericV, colorF, null, null);
89d2dc9838961f945c402e5d810bc715196240be6fAlex Sakhartchouk        ProgramStore alphaBlend = ProgramStore.BLEND_ALPHA_DEPTH_TEST(mRS);
90d2dc9838961f945c402e5d810bc715196240be6fAlex Sakhartchouk        RenderState texRS = new RenderState(genericV, textureF, alphaBlend, null);
91d2dc9838961f945c402e5d810bc715196240be6fAlex Sakhartchouk
92d2dc9838961f945c402e5d810bc715196240be6fAlex Sakhartchouk        // Draw a simple colored quad
93d2dc9838961f945c402e5d810bc715196240be6fAlex Sakhartchouk        Renderable quad = mScene.appendNewRenderable();
94d2dc9838961f945c402e5d810bc715196240be6fAlex Sakhartchouk        quad.setMesh(mSimpleMesh);
9557fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchouk        quad.appendSourceParams(new Float4Param("color", 0.2f, 0.3f, 0.4f));
96d2dc9838961f945c402e5d810bc715196240be6fAlex Sakhartchouk        quad.setRenderState(colorRS);
97d2dc9838961f945c402e5d810bc715196240be6fAlex Sakhartchouk
98d2dc9838961f945c402e5d810bc715196240be6fAlex Sakhartchouk        // Draw a textured quad
99d2dc9838961f945c402e5d810bc715196240be6fAlex Sakhartchouk        quad = mScene.appendNewRenderable();
100d2dc9838961f945c402e5d810bc715196240be6fAlex Sakhartchouk        quad.setMesh(mSimpleMesh);
101d2dc9838961f945c402e5d810bc715196240be6fAlex Sakhartchouk        // Make a transform to position the quad
102d2dc9838961f945c402e5d810bc715196240be6fAlex Sakhartchouk        CompoundTransform t = mScene.appendNewCompoundTransform();
103d2dc9838961f945c402e5d810bc715196240be6fAlex Sakhartchouk        t.addTranslate("position", new Float3(2, 2, 0));
104d2dc9838961f945c402e5d810bc715196240be6fAlex Sakhartchouk        quad.setTransform(t);
105d2dc9838961f945c402e5d810bc715196240be6fAlex Sakhartchouk        quad.appendSourceParams(new TextureParam("color", new Texture2D(R.drawable.icon)));
106d2dc9838961f945c402e5d810bc715196240be6fAlex Sakhartchouk        quad.setRenderState(texRS);
10757fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchouk    }
10857fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchouk
10957fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchouk    private void setupCamera() {
110d2dc9838961f945c402e5d810bc715196240be6fAlex Sakhartchouk        Camera camera = mScene.appendNewCamera();
11157fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchouk        camera.setFar(200);
11257fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchouk        camera.setNear(0.1f);
11357fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchouk        camera.setFOV(60);
114d2dc9838961f945c402e5d810bc715196240be6fAlex Sakhartchouk        CompoundTransform cameraTransform = mScene.appendNewCompoundTransform();
11557fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchouk        cameraTransform.addTranslate("camera", new Float3(0, 0, 10));
11657fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchouk        camera.setTransform(cameraTransform);
11757fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchouk    }
11857fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchouk
11957fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchouk    private void setupRenderPass() {
120d2dc9838961f945c402e5d810bc715196240be6fAlex Sakhartchouk        RenderPass mainPass = mScene.appendNewRenderPass();
12157fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchouk        mainPass.setClearColor(new Float4(1.0f, 1.0f, 1.0f, 1.0f));
12257fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchouk        mainPass.setShouldClearColor(true);
12357fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchouk        mainPass.setClearDepth(1.0f);
12457fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchouk        mainPass.setShouldClearDepth(true);
12557fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchouk        mainPass.setCamera(mScene.getCameras().get(0));
126d2dc9838961f945c402e5d810bc715196240be6fAlex Sakhartchouk        ArrayList<RenderableBase> allRender = mScene.getRenderables();
127d2dc9838961f945c402e5d810bc715196240be6fAlex Sakhartchouk        for (RenderableBase renderable : allRender) {
128d2dc9838961f945c402e5d810bc715196240be6fAlex Sakhartchouk            mainPass.appendRenderable((Renderable)renderable);
12957fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchouk        }
13057fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchouk    }
13157fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchouk}
132