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    SceneManager mSceneManager;
3857fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchouk
3957fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchouk    RenderScriptGL mRS;
4057fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchouk    Resources mRes;
4157fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchouk
42d2dc9838961f945c402e5d810bc715196240be6fAlex Sakhartchouk    Scene mScene;
43d2dc9838961f945c402e5d810bc715196240be6fAlex Sakhartchouk    Mesh mSimpleMesh;
443c8eed3bdc000df08ccf5628ef43f52c478465ecAlex Sakhartchouk    Mesh mSphereMesh;
453c8eed3bdc000df08ccf5628ef43f52c478465ecAlex Sakhartchouk    Mesh mCubeMesh;
46d2dc9838961f945c402e5d810bc715196240be6fAlex 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();
563c8eed3bdc000df08ccf5628ef43f52c478465ecAlex Sakhartchouk        setupColoredQuad();
573c8eed3bdc000df08ccf5628ef43f52c478465ecAlex Sakhartchouk        setupTexturedQuad();
583c8eed3bdc000df08ccf5628ef43f52c478465ecAlex Sakhartchouk        setupShadedGeometry();
5957fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchouk        setupCamera();
6057fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchouk        setupRenderPass();
6157fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchouk
6257fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchouk        mSceneManager.setActiveScene(mScene);
6357fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchouk
6457fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchouk        mScene.initRS();
6557fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchouk        mRS.bindRootScript(mSceneManager.getRenderLoop());
6657fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchouk    }
6757fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchouk
6857fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchouk    private void setupGeometry() {
69d2dc9838961f945c402e5d810bc715196240be6fAlex Sakhartchouk        Mesh.TriangleMeshBuilder tmb = new Mesh.TriangleMeshBuilder(mRS, 3,
70d2dc9838961f945c402e5d810bc715196240be6fAlex Sakhartchouk                                                         Mesh.TriangleMeshBuilder.TEXTURE_0);
7157fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchouk
723c8eed3bdc000df08ccf5628ef43f52c478465ecAlex Sakhartchouk        // Create four vertices with texture coordinates
7357fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchouk        tmb.setTexture(0.0f, 1.0f).addVertex(-1.0f, 1.0f, 0.0f);
7457fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchouk        tmb.setTexture(0.0f, 0.0f).addVertex(-1.0f, -1.0f, 0.0f);
7557fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchouk        tmb.setTexture(1.0f, 0.0f).addVertex(1.0f, -1.0f, 0.0f);
7657fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchouk        tmb.setTexture(1.0f, 1.0f).addVertex(1.0f, 1.0f, 0.0f);
7757fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchouk
7857fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchouk        tmb.addTriangle(0, 1, 2);
7957fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchouk        tmb.addTriangle(2, 3, 0);
80d2dc9838961f945c402e5d810bc715196240be6fAlex Sakhartchouk        mSimpleMesh = tmb.create(true);
813c8eed3bdc000df08ccf5628ef43f52c478465ecAlex Sakhartchouk
823c8eed3bdc000df08ccf5628ef43f52c478465ecAlex Sakhartchouk        // Load a file that constains two pieces of geometry, a sphere and a cube
833c8eed3bdc000df08ccf5628ef43f52c478465ecAlex Sakhartchouk        FileA3D model = FileA3D.createFromResource(mRS, mRes, R.raw.unit_obj);
843c8eed3bdc000df08ccf5628ef43f52c478465ecAlex Sakhartchouk        for (int i = 0; i < model.getIndexEntryCount(); i ++) {
853c8eed3bdc000df08ccf5628ef43f52c478465ecAlex Sakhartchouk            FileA3D.IndexEntry entry = model.getIndexEntry(i);
863c8eed3bdc000df08ccf5628ef43f52c478465ecAlex Sakhartchouk            if (entry != null && entry.getName().equals("CubeMesh")) {
873c8eed3bdc000df08ccf5628ef43f52c478465ecAlex Sakhartchouk                mCubeMesh = entry.getMesh();
883c8eed3bdc000df08ccf5628ef43f52c478465ecAlex Sakhartchouk            } else if (entry != null && entry.getName().equals("SphereMesh")) {
893c8eed3bdc000df08ccf5628ef43f52c478465ecAlex Sakhartchouk                mSphereMesh = entry.getMesh();
903c8eed3bdc000df08ccf5628ef43f52c478465ecAlex Sakhartchouk            }
913c8eed3bdc000df08ccf5628ef43f52c478465ecAlex Sakhartchouk        }
92d2dc9838961f945c402e5d810bc715196240be6fAlex Sakhartchouk    }
9357fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchouk
943c8eed3bdc000df08ccf5628ef43f52c478465ecAlex Sakhartchouk    private void setupColoredQuad() {
95d2dc9838961f945c402e5d810bc715196240be6fAlex Sakhartchouk        // Built-in shader that provides position, texcoord and normal
96d2dc9838961f945c402e5d810bc715196240be6fAlex Sakhartchouk        VertexShader genericV = SceneManager.getDefaultVS();
97d2dc9838961f945c402e5d810bc715196240be6fAlex Sakhartchouk        // Built-in shader that displays a color
98d2dc9838961f945c402e5d810bc715196240be6fAlex Sakhartchouk        FragmentShader colorF = SceneManager.getColorFS();
99d2dc9838961f945c402e5d810bc715196240be6fAlex Sakhartchouk        RenderState colorRS = new RenderState(genericV, colorF, null, null);
100d2dc9838961f945c402e5d810bc715196240be6fAlex Sakhartchouk
101d2dc9838961f945c402e5d810bc715196240be6fAlex Sakhartchouk        // Draw a simple colored quad
102d2dc9838961f945c402e5d810bc715196240be6fAlex Sakhartchouk        Renderable quad = mScene.appendNewRenderable();
103d2dc9838961f945c402e5d810bc715196240be6fAlex Sakhartchouk        quad.setMesh(mSimpleMesh);
1043c8eed3bdc000df08ccf5628ef43f52c478465ecAlex Sakhartchouk        // Our shader has a constant input called "color"
1053c8eed3bdc000df08ccf5628ef43f52c478465ecAlex Sakhartchouk        // This tells the scenegraph to assign the following float3 to that input
10657fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchouk        quad.appendSourceParams(new Float4Param("color", 0.2f, 0.3f, 0.4f));
107d2dc9838961f945c402e5d810bc715196240be6fAlex Sakhartchouk        quad.setRenderState(colorRS);
1083c8eed3bdc000df08ccf5628ef43f52c478465ecAlex Sakhartchouk    }
1093c8eed3bdc000df08ccf5628ef43f52c478465ecAlex Sakhartchouk
1103c8eed3bdc000df08ccf5628ef43f52c478465ecAlex Sakhartchouk    private void setupTexturedQuad() {
1113c8eed3bdc000df08ccf5628ef43f52c478465ecAlex Sakhartchouk        // Built-in shader that provides position, texcoord and normal
1123c8eed3bdc000df08ccf5628ef43f52c478465ecAlex Sakhartchouk        VertexShader genericV = SceneManager.getDefaultVS();
1133c8eed3bdc000df08ccf5628ef43f52c478465ecAlex Sakhartchouk        // Built-in shader that displays a texture
1143c8eed3bdc000df08ccf5628ef43f52c478465ecAlex Sakhartchouk        FragmentShader textureF = SceneManager.getTextureFS();
1153c8eed3bdc000df08ccf5628ef43f52c478465ecAlex Sakhartchouk        // We want to use transparency based on the alpha channel of the texture
1163c8eed3bdc000df08ccf5628ef43f52c478465ecAlex Sakhartchouk        ProgramStore alphaBlend = ProgramStore.BLEND_ALPHA_DEPTH_TEST(mRS);
1173c8eed3bdc000df08ccf5628ef43f52c478465ecAlex Sakhartchouk        RenderState texRS = new RenderState(genericV, textureF, alphaBlend, null);
118d2dc9838961f945c402e5d810bc715196240be6fAlex Sakhartchouk
119d2dc9838961f945c402e5d810bc715196240be6fAlex Sakhartchouk        // Draw a textured quad
1203c8eed3bdc000df08ccf5628ef43f52c478465ecAlex Sakhartchouk        Renderable quad = mScene.appendNewRenderable();
121d2dc9838961f945c402e5d810bc715196240be6fAlex Sakhartchouk        quad.setMesh(mSimpleMesh);
122d2dc9838961f945c402e5d810bc715196240be6fAlex Sakhartchouk        // Make a transform to position the quad
123d2dc9838961f945c402e5d810bc715196240be6fAlex Sakhartchouk        CompoundTransform t = mScene.appendNewCompoundTransform();
124d2dc9838961f945c402e5d810bc715196240be6fAlex Sakhartchouk        t.addTranslate("position", new Float3(2, 2, 0));
125d2dc9838961f945c402e5d810bc715196240be6fAlex Sakhartchouk        quad.setTransform(t);
1263c8eed3bdc000df08ccf5628ef43f52c478465ecAlex Sakhartchouk        // Our fragment shader has a constant texture input called "color"
1273c8eed3bdc000df08ccf5628ef43f52c478465ecAlex Sakhartchouk        // This will assign an icon from drawables to that input
128d2dc9838961f945c402e5d810bc715196240be6fAlex Sakhartchouk        quad.appendSourceParams(new TextureParam("color", new Texture2D(R.drawable.icon)));
129d2dc9838961f945c402e5d810bc715196240be6fAlex Sakhartchouk        quad.setRenderState(texRS);
13057fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchouk    }
13157fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchouk
1323c8eed3bdc000df08ccf5628ef43f52c478465ecAlex Sakhartchouk    private FragmentShader createLambertShader() {
1333c8eed3bdc000df08ccf5628ef43f52c478465ecAlex Sakhartchouk        // Describe what constant inputs our shader wants
1343c8eed3bdc000df08ccf5628ef43f52c478465ecAlex Sakhartchouk        Element.Builder b = new Element.Builder(mRS);
1353c8eed3bdc000df08ccf5628ef43f52c478465ecAlex Sakhartchouk        b.add(Element.F32_4(mRS), "cameraPos");
1363c8eed3bdc000df08ccf5628ef43f52c478465ecAlex Sakhartchouk
1373c8eed3bdc000df08ccf5628ef43f52c478465ecAlex Sakhartchouk        // Create a shader from a text file in resources
1383c8eed3bdc000df08ccf5628ef43f52c478465ecAlex Sakhartchouk        FragmentShader.Builder fb = new FragmentShader.Builder(mRS);
1393c8eed3bdc000df08ccf5628ef43f52c478465ecAlex Sakhartchouk        // Tell the shader what constants we want
1403c8eed3bdc000df08ccf5628ef43f52c478465ecAlex Sakhartchouk        fb.setShaderConst(new Type.Builder(mRS, b.create()).setX(1).create());
1413c8eed3bdc000df08ccf5628ef43f52c478465ecAlex Sakhartchouk        // Shader code location
1423c8eed3bdc000df08ccf5628ef43f52c478465ecAlex Sakhartchouk        fb.setShader(mRes, R.raw.diffuse);
1433c8eed3bdc000df08ccf5628ef43f52c478465ecAlex Sakhartchouk        // We want a texture called diffuse on our shader
1443c8eed3bdc000df08ccf5628ef43f52c478465ecAlex Sakhartchouk        fb.addTexture(TextureType.TEXTURE_2D, "diffuse");
1453c8eed3bdc000df08ccf5628ef43f52c478465ecAlex Sakhartchouk        FragmentShader shader = fb.create();
1463c8eed3bdc000df08ccf5628ef43f52c478465ecAlex Sakhartchouk        mScene.appendShader(shader);
1473c8eed3bdc000df08ccf5628ef43f52c478465ecAlex Sakhartchouk        return shader;
1483c8eed3bdc000df08ccf5628ef43f52c478465ecAlex Sakhartchouk    }
1493c8eed3bdc000df08ccf5628ef43f52c478465ecAlex Sakhartchouk
1503c8eed3bdc000df08ccf5628ef43f52c478465ecAlex Sakhartchouk    private void setupShadedGeometry() {
1513c8eed3bdc000df08ccf5628ef43f52c478465ecAlex Sakhartchouk        // Built-in shader that provides position, texcoord and normal
1523c8eed3bdc000df08ccf5628ef43f52c478465ecAlex Sakhartchouk        VertexShader genericV = SceneManager.getDefaultVS();
1533c8eed3bdc000df08ccf5628ef43f52c478465ecAlex Sakhartchouk        // Custom shader
1543c8eed3bdc000df08ccf5628ef43f52c478465ecAlex Sakhartchouk        FragmentShader diffuseF = createLambertShader();
1553c8eed3bdc000df08ccf5628ef43f52c478465ecAlex Sakhartchouk        RenderState diffuseRS = new RenderState(genericV, diffuseF, null, null);
1563c8eed3bdc000df08ccf5628ef43f52c478465ecAlex Sakhartchouk
1573c8eed3bdc000df08ccf5628ef43f52c478465ecAlex Sakhartchouk        // Draw a sphere
1583c8eed3bdc000df08ccf5628ef43f52c478465ecAlex Sakhartchouk        Renderable sphere = mScene.appendNewRenderable();
1593c8eed3bdc000df08ccf5628ef43f52c478465ecAlex Sakhartchouk        // Use the sphere geometry loaded earlier
1603c8eed3bdc000df08ccf5628ef43f52c478465ecAlex Sakhartchouk        sphere.setMesh(mSphereMesh);
1613c8eed3bdc000df08ccf5628ef43f52c478465ecAlex Sakhartchouk        // Make a transform to position the sphere
1623c8eed3bdc000df08ccf5628ef43f52c478465ecAlex Sakhartchouk        CompoundTransform t = mScene.appendNewCompoundTransform();
1633c8eed3bdc000df08ccf5628ef43f52c478465ecAlex Sakhartchouk        t.addTranslate("position", new Float3(-1, 2, 3));
1643c8eed3bdc000df08ccf5628ef43f52c478465ecAlex Sakhartchouk        t.addScale("scale", new Float3(1.4f, 1.4f, 1.4f));
1653c8eed3bdc000df08ccf5628ef43f52c478465ecAlex Sakhartchouk        sphere.setTransform(t);
1663c8eed3bdc000df08ccf5628ef43f52c478465ecAlex Sakhartchouk        // Tell the renderable which texture to use when we draw
1673c8eed3bdc000df08ccf5628ef43f52c478465ecAlex Sakhartchouk        // This will mean a texture param in the shader called "diffuse"
1683c8eed3bdc000df08ccf5628ef43f52c478465ecAlex Sakhartchouk        // will be assigned a texture called red.jpg
1693c8eed3bdc000df08ccf5628ef43f52c478465ecAlex Sakhartchouk        sphere.appendSourceParams(new TextureParam("diffuse", new Texture2D("", "red.jpg")));
1703c8eed3bdc000df08ccf5628ef43f52c478465ecAlex Sakhartchouk        sphere.setRenderState(diffuseRS);
1713c8eed3bdc000df08ccf5628ef43f52c478465ecAlex Sakhartchouk
1723c8eed3bdc000df08ccf5628ef43f52c478465ecAlex Sakhartchouk        // Draw a cube
1733c8eed3bdc000df08ccf5628ef43f52c478465ecAlex Sakhartchouk        Renderable cube = mScene.appendNewRenderable();
1743c8eed3bdc000df08ccf5628ef43f52c478465ecAlex Sakhartchouk        cube.setMesh(mCubeMesh);
1753c8eed3bdc000df08ccf5628ef43f52c478465ecAlex Sakhartchouk        t = mScene.appendNewCompoundTransform();
1763c8eed3bdc000df08ccf5628ef43f52c478465ecAlex Sakhartchouk        t.addTranslate("position", new Float3(-2, -2.1f, 0));
1773c8eed3bdc000df08ccf5628ef43f52c478465ecAlex Sakhartchouk        t.addRotate("rotateX", new Float3(1, 0, 0), 30);
1783c8eed3bdc000df08ccf5628ef43f52c478465ecAlex Sakhartchouk        t.addRotate("rotateY", new Float3(0, 1, 0), 30);
1793c8eed3bdc000df08ccf5628ef43f52c478465ecAlex Sakhartchouk        t.addScale("scale", new Float3(2, 2, 2));
1803c8eed3bdc000df08ccf5628ef43f52c478465ecAlex Sakhartchouk        cube.setTransform(t);
1813c8eed3bdc000df08ccf5628ef43f52c478465ecAlex Sakhartchouk        cube.appendSourceParams(new TextureParam("diffuse", new Texture2D("", "orange.jpg")));
1823c8eed3bdc000df08ccf5628ef43f52c478465ecAlex Sakhartchouk        cube.setRenderState(diffuseRS);
1833c8eed3bdc000df08ccf5628ef43f52c478465ecAlex Sakhartchouk    }
1843c8eed3bdc000df08ccf5628ef43f52c478465ecAlex Sakhartchouk
18557fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchouk    private void setupCamera() {
186d2dc9838961f945c402e5d810bc715196240be6fAlex Sakhartchouk        Camera camera = mScene.appendNewCamera();
18757fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchouk        camera.setFar(200);
18857fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchouk        camera.setNear(0.1f);
18957fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchouk        camera.setFOV(60);
190d2dc9838961f945c402e5d810bc715196240be6fAlex Sakhartchouk        CompoundTransform cameraTransform = mScene.appendNewCompoundTransform();
19157fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchouk        cameraTransform.addTranslate("camera", new Float3(0, 0, 10));
19257fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchouk        camera.setTransform(cameraTransform);
19357fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchouk    }
19457fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchouk
19557fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchouk    private void setupRenderPass() {
196d2dc9838961f945c402e5d810bc715196240be6fAlex Sakhartchouk        RenderPass mainPass = mScene.appendNewRenderPass();
19757fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchouk        mainPass.setClearColor(new Float4(1.0f, 1.0f, 1.0f, 1.0f));
19857fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchouk        mainPass.setShouldClearColor(true);
19957fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchouk        mainPass.setClearDepth(1.0f);
20057fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchouk        mainPass.setShouldClearDepth(true);
20157fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchouk        mainPass.setCamera(mScene.getCameras().get(0));
202d2dc9838961f945c402e5d810bc715196240be6fAlex Sakhartchouk        ArrayList<RenderableBase> allRender = mScene.getRenderables();
203d2dc9838961f945c402e5d810bc715196240be6fAlex Sakhartchouk        for (RenderableBase renderable : allRender) {
204d2dc9838961f945c402e5d810bc715196240be6fAlex Sakhartchouk            mainPass.appendRenderable((Renderable)renderable);
20557fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchouk        }
20657fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchouk    }
20757fc7109e4e1ec0a32d1661779e8d7babab0279bAlex Sakhartchouk}
208