1 /*
2  * Copyright (C) 2011 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package com.android.scenegraph;
18 
19 import java.io.File;
20 import java.io.IOException;
21 import java.io.InputStream;
22 import java.io.FileInputStream;
23 import java.io.BufferedInputStream;
24 import java.io.Writer;
25 import java.util.ArrayList;
26 import java.util.HashMap;
27 import java.util.Map;
28 import java.util.Vector;
29 
30 import android.content.res.Resources;
31 import android.graphics.Bitmap;
32 import android.graphics.BitmapFactory;
33 import android.os.AsyncTask;
34 import android.renderscript.*;
35 import android.renderscript.Allocation.MipmapControl;
36 import android.renderscript.Element.Builder;
37 import android.renderscript.Font.Style;
38 import android.renderscript.Program.TextureType;
39 import android.renderscript.ProgramStore.DepthFunc;
40 import android.util.Log;
41 import com.android.scenegraph.SceneManager.SceneLoadedCallback;
42 
43 
44 public class ColladaScene {
45 
46     private String modelName;
47     private static String TAG = "ColladaScene";
48     private final int STATE_LAST_FOCUS = 1;
49     boolean mLoadFromSD = false;
50 
51     SceneLoadedCallback mCallback;
52 
ColladaScene(String name, SceneLoadedCallback cb)53     public ColladaScene(String name, SceneLoadedCallback cb) {
54         modelName = name;
55         mCallback = cb;
56     }
57 
init(RenderScriptGL rs, Resources res)58     public void init(RenderScriptGL rs, Resources res) {
59         mRS = rs;
60         mRes = res;
61 
62         mLoadFromSD = SceneManager.isSDCardPath(modelName);
63 
64         new ColladaLoaderTask().execute(modelName);
65     }
66 
67     private Resources mRes;
68     private RenderScriptGL mRS;
69     Scene mActiveScene;
70 
71     private class ColladaLoaderTask extends AsyncTask<String, Void, Boolean> {
72         ColladaParser sceneSource;
doInBackground(String... names)73         protected Boolean doInBackground(String... names) {
74             String rootDir = names[0].substring(0, names[0].lastIndexOf('/') + 1);
75             long start = System.currentTimeMillis();
76             sceneSource = new ColladaParser();
77             InputStream is = null;
78             try {
79                 if (!mLoadFromSD) {
80                     is = mRes.getAssets().open(names[0]);
81                 } else {
82                     File f = new File(names[0]);
83                     is = new BufferedInputStream(new FileInputStream(f));
84                 }
85             } catch (IOException e) {
86                 Log.e(TAG, "Could not open collada file");
87                 return new Boolean(false);
88             }
89             long end = System.currentTimeMillis();
90             Log.v("TIMER", "Stream load time: " + (end - start));
91 
92             start = System.currentTimeMillis();
93             sceneSource.init(is, rootDir);
94             end = System.currentTimeMillis();
95             Log.v("TIMER", "Collada parse time: " + (end - start));
96             return new Boolean(true);
97         }
98 
onPostExecute(Boolean result)99         protected void onPostExecute(Boolean result) {
100             mActiveScene = sceneSource.getScene();
101             if (mCallback != null) {
102                 mCallback.mLoadedScene = mActiveScene;
103                 mCallback.run();
104             }
105 
106             String shortName = modelName.substring(0, modelName.lastIndexOf('.'));
107             new A3DLoaderTask().execute(shortName + ".a3d");
108         }
109     }
110 
111     private class A3DLoaderTask extends AsyncTask<String, Void, Boolean> {
doInBackground(String... names)112         protected Boolean doInBackground(String... names) {
113             long start = System.currentTimeMillis();
114             FileA3D model;
115             if (!mLoadFromSD) {
116                 model = FileA3D.createFromAsset(mRS, mRes.getAssets(), names[0]);
117             } else {
118                 model = FileA3D.createFromFile(mRS, names[0]);
119             }
120             int numModels = model.getIndexEntryCount();
121             for (int i = 0; i < numModels; i ++) {
122                 FileA3D.IndexEntry entry = model.getIndexEntry(i);
123                 if (entry != null && entry.getEntryType() == FileA3D.EntryType.MESH) {
124                     mActiveScene.meshLoaded(entry.getMesh());
125                 }
126             }
127             long end = System.currentTimeMillis();
128             Log.v("TIMER", "A3D load time: " + (end - start));
129             return new Boolean(true);
130         }
131 
onPostExecute(Boolean result)132         protected void onPostExecute(Boolean result) {
133         }
134     }
135 
136 }
137 
138 
139 
140