| /* |
| * Copyright (C) 2011 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| package com.android.scenegraph; |
| |
| import java.io.File; |
| import java.io.IOException; |
| import java.io.InputStream; |
| import java.io.FileInputStream; |
| import java.io.BufferedInputStream; |
| import java.io.Writer; |
| import java.util.ArrayList; |
| import java.util.HashMap; |
| import java.util.Map; |
| import java.util.Vector; |
| |
| import android.content.res.Resources; |
| import android.graphics.Bitmap; |
| import android.graphics.BitmapFactory; |
| import android.os.AsyncTask; |
| import android.renderscript.*; |
| import android.renderscript.Allocation.MipmapControl; |
| import android.renderscript.Element.Builder; |
| import android.renderscript.Font.Style; |
| import android.renderscript.Program.TextureType; |
| import android.renderscript.ProgramStore.DepthFunc; |
| import android.util.Log; |
| import com.android.scenegraph.SceneManager.SceneLoadedCallback; |
| |
| |
| public class ColladaScene { |
| |
| private String modelName; |
| private static String TAG = "ColladaScene"; |
| private final int STATE_LAST_FOCUS = 1; |
| boolean mLoadFromSD = false; |
| |
| SceneLoadedCallback mCallback; |
| |
| public ColladaScene(String name, SceneLoadedCallback cb) { |
| modelName = name; |
| mCallback = cb; |
| } |
| |
| public void init(RenderScriptGL rs, Resources res) { |
| mRS = rs; |
| mRes = res; |
| |
| mLoadFromSD = SceneManager.isSDCardPath(modelName); |
| |
| new ColladaLoaderTask().execute(modelName); |
| } |
| |
| private Resources mRes; |
| private RenderScriptGL mRS; |
| Scene mActiveScene; |
| |
| private class ColladaLoaderTask extends AsyncTask<String, Void, Boolean> { |
| ColladaParser sceneSource; |
| protected Boolean doInBackground(String... names) { |
| String rootDir = names[0].substring(0, names[0].lastIndexOf('/') + 1); |
| long start = System.currentTimeMillis(); |
| sceneSource = new ColladaParser(); |
| InputStream is = null; |
| try { |
| if (!mLoadFromSD) { |
| is = mRes.getAssets().open(names[0]); |
| } else { |
| File f = new File(names[0]); |
| is = new BufferedInputStream(new FileInputStream(f)); |
| } |
| } catch (IOException e) { |
| Log.e(TAG, "Could not open collada file"); |
| return new Boolean(false); |
| } |
| long end = System.currentTimeMillis(); |
| Log.v("TIMER", "Stream load time: " + (end - start)); |
| |
| start = System.currentTimeMillis(); |
| sceneSource.init(is, rootDir); |
| end = System.currentTimeMillis(); |
| Log.v("TIMER", "Collada parse time: " + (end - start)); |
| return new Boolean(true); |
| } |
| |
| protected void onPostExecute(Boolean result) { |
| mActiveScene = sceneSource.getScene(); |
| if (mCallback != null) { |
| mCallback.mLoadedScene = mActiveScene; |
| mCallback.run(); |
| } |
| |
| String shortName = modelName.substring(0, modelName.lastIndexOf('.')); |
| new A3DLoaderTask().execute(shortName + ".a3d"); |
| } |
| } |
| |
| private class A3DLoaderTask extends AsyncTask<String, Void, Boolean> { |
| protected Boolean doInBackground(String... names) { |
| long start = System.currentTimeMillis(); |
| FileA3D model; |
| if (!mLoadFromSD) { |
| model = FileA3D.createFromAsset(mRS, mRes.getAssets(), names[0]); |
| } else { |
| model = FileA3D.createFromFile(mRS, names[0]); |
| } |
| int numModels = model.getIndexEntryCount(); |
| for (int i = 0; i < numModels; i ++) { |
| FileA3D.IndexEntry entry = model.getIndexEntry(i); |
| if (entry != null && entry.getEntryType() == FileA3D.EntryType.MESH) { |
| mActiveScene.meshLoaded(entry.getMesh()); |
| } |
| } |
| long end = System.currentTimeMillis(); |
| Log.v("TIMER", "A3D load time: " + (end - start)); |
| return new Boolean(true); |
| } |
| |
| protected void onPostExecute(Boolean result) { |
| } |
| } |
| |
| } |
| |
| |
| |