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