1be5bdeb9471c4a04905edd34e6d3560315293427Alex Sakhartchouk/* 2be5bdeb9471c4a04905edd34e6d3560315293427Alex Sakhartchouk * Copyright (C) 2012 The Android Open Source Project 3be5bdeb9471c4a04905edd34e6d3560315293427Alex Sakhartchouk * 4be5bdeb9471c4a04905edd34e6d3560315293427Alex Sakhartchouk * Licensed under the Apache License, Version 2.0 (the "License"); 5be5bdeb9471c4a04905edd34e6d3560315293427Alex Sakhartchouk * you may not use this file except in compliance with the License. 6be5bdeb9471c4a04905edd34e6d3560315293427Alex Sakhartchouk * You may obtain a copy of the License at 7be5bdeb9471c4a04905edd34e6d3560315293427Alex Sakhartchouk * 8be5bdeb9471c4a04905edd34e6d3560315293427Alex Sakhartchouk * http://www.apache.org/licenses/LICENSE-2.0 9be5bdeb9471c4a04905edd34e6d3560315293427Alex Sakhartchouk * 10be5bdeb9471c4a04905edd34e6d3560315293427Alex Sakhartchouk * Unless required by applicable law or agreed to in writing, software 11be5bdeb9471c4a04905edd34e6d3560315293427Alex Sakhartchouk * distributed under the License is distributed on an "AS IS" BASIS, 12be5bdeb9471c4a04905edd34e6d3560315293427Alex Sakhartchouk * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13be5bdeb9471c4a04905edd34e6d3560315293427Alex Sakhartchouk * See the License for the specific language governing permissions and 14be5bdeb9471c4a04905edd34e6d3560315293427Alex Sakhartchouk * limitations under the License. 15be5bdeb9471c4a04905edd34e6d3560315293427Alex Sakhartchouk */ 16be5bdeb9471c4a04905edd34e6d3560315293427Alex Sakhartchouk 17d4cb9c587c23e3c24d928b0ac1a4de5679846f93Alex Sakhartchoukpackage com.android.testapp; 18be5bdeb9471c4a04905edd34e6d3560315293427Alex Sakhartchouk 19be5bdeb9471c4a04905edd34e6d3560315293427Alex Sakhartchoukimport java.util.ArrayList; 20be5bdeb9471c4a04905edd34e6d3560315293427Alex Sakhartchoukimport java.util.HashMap; 21be5bdeb9471c4a04905edd34e6d3560315293427Alex Sakhartchoukimport java.util.Map; 22be5bdeb9471c4a04905edd34e6d3560315293427Alex Sakhartchoukimport java.util.Vector; 23be5bdeb9471c4a04905edd34e6d3560315293427Alex Sakhartchouk 24e8bb420a687598be9801e7ff4a0d114fa72ac5bcAlex Sakhartchoukimport com.android.scenegraph.SceneManager; 25e8bb420a687598be9801e7ff4a0d114fa72ac5bcAlex Sakhartchouk 26be5bdeb9471c4a04905edd34e6d3560315293427Alex Sakhartchoukimport android.content.res.Resources; 27be5bdeb9471c4a04905edd34e6d3560315293427Alex Sakhartchoukimport android.graphics.Bitmap; 28be5bdeb9471c4a04905edd34e6d3560315293427Alex Sakhartchoukimport android.graphics.BitmapFactory; 29be5bdeb9471c4a04905edd34e6d3560315293427Alex Sakhartchoukimport android.os.AsyncTask; 30be5bdeb9471c4a04905edd34e6d3560315293427Alex Sakhartchoukimport android.renderscript.*; 31be5bdeb9471c4a04905edd34e6d3560315293427Alex Sakhartchoukimport android.renderscript.Allocation.MipmapControl; 32be5bdeb9471c4a04905edd34e6d3560315293427Alex Sakhartchoukimport android.renderscript.Element.Builder; 33be5bdeb9471c4a04905edd34e6d3560315293427Alex Sakhartchoukimport android.renderscript.Font.Style; 34be5bdeb9471c4a04905edd34e6d3560315293427Alex Sakhartchoukimport android.renderscript.Program.TextureType; 35be5bdeb9471c4a04905edd34e6d3560315293427Alex Sakhartchoukimport android.renderscript.ProgramStore.DepthFunc; 36be5bdeb9471c4a04905edd34e6d3560315293427Alex Sakhartchoukimport android.util.Log; 37be5bdeb9471c4a04905edd34e6d3560315293427Alex Sakhartchouk 38be5bdeb9471c4a04905edd34e6d3560315293427Alex Sakhartchouk// This is where the scenegraph and the rendered objects are initialized and used 39be5bdeb9471c4a04905edd34e6d3560315293427Alex Sakhartchoukpublic class TestAppLoadingScreen { 40be5bdeb9471c4a04905edd34e6d3560315293427Alex Sakhartchouk 41be5bdeb9471c4a04905edd34e6d3560315293427Alex Sakhartchouk private static String TAG = "TestAppLoadingScreen"; 42be5bdeb9471c4a04905edd34e6d3560315293427Alex Sakhartchouk 43be5bdeb9471c4a04905edd34e6d3560315293427Alex Sakhartchouk private Resources mRes; 44be5bdeb9471c4a04905edd34e6d3560315293427Alex Sakhartchouk private RenderScriptGL mRS; 45d4cb9c587c23e3c24d928b0ac1a4de5679846f93Alex Sakhartchouk private ScriptC_test_app mScript; 46be5bdeb9471c4a04905edd34e6d3560315293427Alex Sakhartchouk 47be5bdeb9471c4a04905edd34e6d3560315293427Alex Sakhartchouk public TestAppLoadingScreen(RenderScriptGL rs, Resources res) { 48be5bdeb9471c4a04905edd34e6d3560315293427Alex Sakhartchouk mRS = rs; 49be5bdeb9471c4a04905edd34e6d3560315293427Alex Sakhartchouk mRes = res; 50be5bdeb9471c4a04905edd34e6d3560315293427Alex Sakhartchouk // Shows the loading screen with some text 51be5bdeb9471c4a04905edd34e6d3560315293427Alex Sakhartchouk renderLoading(); 52be5bdeb9471c4a04905edd34e6d3560315293427Alex Sakhartchouk // Adds a little 3D bugdroid model to the laoding screen asynchronously. 53be5bdeb9471c4a04905edd34e6d3560315293427Alex Sakhartchouk new LoadingScreenLoaderTask().execute(); 54be5bdeb9471c4a04905edd34e6d3560315293427Alex Sakhartchouk } 55be5bdeb9471c4a04905edd34e6d3560315293427Alex Sakhartchouk 56be5bdeb9471c4a04905edd34e6d3560315293427Alex Sakhartchouk public void showLoadingScreen(boolean show) { 57e8bb420a687598be9801e7ff4a0d114fa72ac5bcAlex Sakhartchouk if (show) { 58e8bb420a687598be9801e7ff4a0d114fa72ac5bcAlex Sakhartchouk mRS.bindRootScript(mScript); 59e8bb420a687598be9801e7ff4a0d114fa72ac5bcAlex Sakhartchouk } else { 60e8bb420a687598be9801e7ff4a0d114fa72ac5bcAlex Sakhartchouk mRS.bindRootScript(SceneManager.getInstance().getRenderLoop()); 61e8bb420a687598be9801e7ff4a0d114fa72ac5bcAlex Sakhartchouk } 62be5bdeb9471c4a04905edd34e6d3560315293427Alex Sakhartchouk } 63be5bdeb9471c4a04905edd34e6d3560315293427Alex Sakhartchouk 64be5bdeb9471c4a04905edd34e6d3560315293427Alex Sakhartchouk // The loading screen has some elements that shouldn't be loaded on the UI thread 65be5bdeb9471c4a04905edd34e6d3560315293427Alex Sakhartchouk private class LoadingScreenLoaderTask extends AsyncTask<String, Void, Boolean> { 66be5bdeb9471c4a04905edd34e6d3560315293427Alex Sakhartchouk Allocation robotTex; 67be5bdeb9471c4a04905edd34e6d3560315293427Alex Sakhartchouk Mesh robotMesh; 68be5bdeb9471c4a04905edd34e6d3560315293427Alex Sakhartchouk protected Boolean doInBackground(String... names) { 69be5bdeb9471c4a04905edd34e6d3560315293427Alex Sakhartchouk long start = System.currentTimeMillis(); 70be5bdeb9471c4a04905edd34e6d3560315293427Alex Sakhartchouk robotTex = Allocation.createFromBitmapResource(mRS, mRes, R.drawable.robot, 71be5bdeb9471c4a04905edd34e6d3560315293427Alex Sakhartchouk MipmapControl.MIPMAP_ON_SYNC_TO_TEXTURE, 72be5bdeb9471c4a04905edd34e6d3560315293427Alex Sakhartchouk Allocation.USAGE_GRAPHICS_TEXTURE); 73be5bdeb9471c4a04905edd34e6d3560315293427Alex Sakhartchouk 74be5bdeb9471c4a04905edd34e6d3560315293427Alex Sakhartchouk FileA3D model = FileA3D.createFromResource(mRS, mRes, R.raw.robot); 75be5bdeb9471c4a04905edd34e6d3560315293427Alex Sakhartchouk FileA3D.IndexEntry entry = model.getIndexEntry(0); 76be5bdeb9471c4a04905edd34e6d3560315293427Alex Sakhartchouk if (entry != null && entry.getEntryType() == FileA3D.EntryType.MESH) { 77be5bdeb9471c4a04905edd34e6d3560315293427Alex Sakhartchouk robotMesh = entry.getMesh(); 78be5bdeb9471c4a04905edd34e6d3560315293427Alex Sakhartchouk } 79be5bdeb9471c4a04905edd34e6d3560315293427Alex Sakhartchouk 80be5bdeb9471c4a04905edd34e6d3560315293427Alex Sakhartchouk mScript.set_gPFSBackground(ProgramStore.BLEND_NONE_DEPTH_TEST(mRS)); 81be5bdeb9471c4a04905edd34e6d3560315293427Alex Sakhartchouk 82be5bdeb9471c4a04905edd34e6d3560315293427Alex Sakhartchouk ProgramFragmentFixedFunction.Builder b = new ProgramFragmentFixedFunction.Builder(mRS); 83be5bdeb9471c4a04905edd34e6d3560315293427Alex Sakhartchouk b.setTexture(ProgramFragmentFixedFunction.Builder.EnvMode.REPLACE, 84be5bdeb9471c4a04905edd34e6d3560315293427Alex Sakhartchouk ProgramFragmentFixedFunction.Builder.Format.RGBA, 0); 85be5bdeb9471c4a04905edd34e6d3560315293427Alex Sakhartchouk ProgramFragment pfDefault = b.create(); 86be5bdeb9471c4a04905edd34e6d3560315293427Alex Sakhartchouk pfDefault.bindSampler(Sampler.CLAMP_LINEAR(mRS), 0); 87be5bdeb9471c4a04905edd34e6d3560315293427Alex Sakhartchouk mScript.set_gPFBackground(pfDefault); 88be5bdeb9471c4a04905edd34e6d3560315293427Alex Sakhartchouk 89be5bdeb9471c4a04905edd34e6d3560315293427Alex Sakhartchouk ProgramVertexFixedFunction.Builder pvb = new ProgramVertexFixedFunction.Builder(mRS); 90be5bdeb9471c4a04905edd34e6d3560315293427Alex Sakhartchouk ProgramVertexFixedFunction pvDefault = pvb.create(); 91be5bdeb9471c4a04905edd34e6d3560315293427Alex Sakhartchouk ProgramVertexFixedFunction.Constants va = new ProgramVertexFixedFunction.Constants(mRS); 92be5bdeb9471c4a04905edd34e6d3560315293427Alex Sakhartchouk ((ProgramVertexFixedFunction)pvDefault).bindConstants(va); 93be5bdeb9471c4a04905edd34e6d3560315293427Alex Sakhartchouk mScript.set_gPVBackground(pvDefault); 94be5bdeb9471c4a04905edd34e6d3560315293427Alex Sakhartchouk 95be5bdeb9471c4a04905edd34e6d3560315293427Alex Sakhartchouk long end = System.currentTimeMillis(); 96be5bdeb9471c4a04905edd34e6d3560315293427Alex Sakhartchouk Log.v("TIMER", "Loading load time: " + (end - start)); 97be5bdeb9471c4a04905edd34e6d3560315293427Alex Sakhartchouk return new Boolean(true); 98be5bdeb9471c4a04905edd34e6d3560315293427Alex Sakhartchouk } 99be5bdeb9471c4a04905edd34e6d3560315293427Alex Sakhartchouk 100be5bdeb9471c4a04905edd34e6d3560315293427Alex Sakhartchouk protected void onPostExecute(Boolean result) { 101be5bdeb9471c4a04905edd34e6d3560315293427Alex Sakhartchouk mScript.set_gRobotTex(robotTex); 102be5bdeb9471c4a04905edd34e6d3560315293427Alex Sakhartchouk mScript.set_gRobotMesh(robotMesh); 103be5bdeb9471c4a04905edd34e6d3560315293427Alex Sakhartchouk } 104be5bdeb9471c4a04905edd34e6d3560315293427Alex Sakhartchouk } 105be5bdeb9471c4a04905edd34e6d3560315293427Alex Sakhartchouk 106be5bdeb9471c4a04905edd34e6d3560315293427Alex Sakhartchouk // Creates a simple script to show a loding screen until everything is initialized 107be5bdeb9471c4a04905edd34e6d3560315293427Alex Sakhartchouk // Could also be used to do some custom renderscript work before handing things over 108be5bdeb9471c4a04905edd34e6d3560315293427Alex Sakhartchouk // to the scenegraph 109be5bdeb9471c4a04905edd34e6d3560315293427Alex Sakhartchouk void renderLoading() { 110d4cb9c587c23e3c24d928b0ac1a4de5679846f93Alex Sakhartchouk mScript = new ScriptC_test_app(mRS, mRes, R.raw.test_app); 111be5bdeb9471c4a04905edd34e6d3560315293427Alex Sakhartchouk mRS.bindRootScript(mScript); 112be5bdeb9471c4a04905edd34e6d3560315293427Alex Sakhartchouk } 113be5bdeb9471c4a04905edd34e6d3560315293427Alex Sakhartchouk} 114