blob: 301075e52441eb34432e7f2597093d543e2a96c5 [file] [log] [blame]
/*
* 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) {
}
}
}