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