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