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