SimpleAppRS.java revision 57fc7109e4e1ec0a32d1661779e8d7babab0279b
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    ArrayList<Renderable> geometry = new ArrayList<Renderable>();
4257fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchouk
4357fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchouk    Scene mScene;
4457fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchouk    RenderScriptGL mRS;
4557fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchouk    Resources mRes;
4657fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchouk
4757fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchouk    public void init(RenderScriptGL rs, Resources res, int width, int height) {
4857fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchouk        mRS = rs;
4957fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchouk        mRes = res;
5057fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchouk        mSceneManager = SceneManager.getInstance();
5157fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchouk        mSceneManager.initRS(mRS, mRes, width, height);
5257fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchouk
5357fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchouk        mScene = new Scene();
5457fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchouk
5557fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchouk        setupGeometry();
5657fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchouk        setupCamera();
5757fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchouk        setupRenderPass();
5857fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchouk        setupShaders();
5957fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchouk
6057fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchouk        mSceneManager.setActiveScene(mScene);
6157fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchouk
6257fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchouk        mScene.initRS();
6357fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchouk        mRS.bindRootScript(mSceneManager.getRenderLoop());
6457fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchouk    }
6557fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchouk
6657fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchouk    private void setupShaders() {
6757fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchouk        // Built-in shader that provides position, texcoord and normal
6857fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchouk        VertexShader genericV = SceneManager.getDefaultVS();
6957fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchouk        // Built-in shader that displays a color
7057fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchouk        FragmentShader colorF = SceneManager.getColorFS();
7157fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchouk        mScene.assignRenderState(new RenderState(genericV, colorF, null, null));
7257fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchouk    }
7357fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchouk    private void setupGeometry() {
7457fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchouk        Mesh.TriangleMeshBuilder tmb = new Mesh.TriangleMeshBuilder(mRS,
7557fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchouk                                           3, Mesh.TriangleMeshBuilder.TEXTURE_0);
7657fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchouk
7757fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchouk        tmb.setTexture(0.0f, 1.0f).addVertex(-1.0f, 1.0f, 0.0f);
7857fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchouk        tmb.setTexture(0.0f, 0.0f).addVertex(-1.0f, -1.0f, 0.0f);
7957fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchouk        tmb.setTexture(1.0f, 0.0f).addVertex(1.0f, -1.0f, 0.0f);
8057fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchouk        tmb.setTexture(1.0f, 1.0f).addVertex(1.0f, 1.0f, 0.0f);
8157fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchouk
8257fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchouk        tmb.addTriangle(0, 1, 2);
8357fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchouk        tmb.addTriangle(2, 3, 0);
8457fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchouk
8557fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchouk        Mesh mesh  = tmb.create(true);
8657fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchouk
8757fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchouk        Renderable quad = new Renderable();
8857fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchouk        quad.setMesh(mesh);
8957fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchouk        quad.setTransform(new CompoundTransform());
9057fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchouk        quad.appendSourceParams(new Float4Param("color", 0.2f, 0.3f, 0.4f));
9157fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchouk
9257fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchouk        mScene.appendRenderable(quad);
9357fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchouk        geometry.add(quad);
9457fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchouk    }
9557fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchouk
9657fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchouk    private void setupCamera() {
9757fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchouk        Camera camera = new Camera();
9857fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchouk        camera.setFar(200);
9957fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchouk        camera.setNear(0.1f);
10057fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchouk        camera.setFOV(60);
10157fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchouk        CompoundTransform cameraTransform = new CompoundTransform();
10257fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchouk        cameraTransform.addTranslate("camera", new Float3(0, 0, 10));
10357fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchouk        mScene.appendTransform(cameraTransform);
10457fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchouk        camera.setTransform(cameraTransform);
10557fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchouk        mScene.appendCamera(camera);
10657fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchouk    }
10757fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchouk
10857fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchouk    private void setupRenderPass() {
10957fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchouk        RenderPass mainPass = new RenderPass();
11057fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchouk        mainPass.setClearColor(new Float4(1.0f, 1.0f, 1.0f, 1.0f));
11157fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchouk        mainPass.setShouldClearColor(true);
11257fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchouk        mainPass.setClearDepth(1.0f);
11357fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchouk        mainPass.setShouldClearDepth(true);
11457fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchouk        mainPass.setCamera(mScene.getCameras().get(0));
11557fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchouk        for (Renderable renderable : geometry) {
11657fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchouk            mainPass.appendRenderable(renderable);
11757fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchouk        }
11857fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchouk        mScene.appendRenderPass(mainPass);
11957fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchouk    }
12057fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchouk}
121