| /* |
| * 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. |
| */ |
| |
| #include "ColladaLoader.h" |
| #include "ColladaConditioner.h" |
| #include "ColladaGeometry.h" |
| |
| #include <dae.h> |
| #include <dom/domCOLLADA.h> |
| |
| ColladaLoader::ColladaLoader() { |
| |
| } |
| |
| ColladaLoader::~ColladaLoader() { |
| if (mDae) { |
| delete mDae; |
| } |
| clearGeometry(); |
| } |
| |
| void ColladaLoader::clearGeometry() { |
| for (uint32_t i = 0; i < mGeometries.size(); i++) { |
| delete mGeometries[i]; |
| } |
| mGeometries.clear(); |
| } |
| |
| bool ColladaLoader::init(const char *colladaFile) { |
| if (mDae) { |
| delete mDae; |
| } |
| clearGeometry(); |
| |
| mDae = new DAE(); |
| |
| bool convertSuceeded = true; |
| |
| domCOLLADA* root = mDae->open(colladaFile); |
| if (!root) { |
| fprintf(stderr, "Failed to read file %s.\n", colladaFile); |
| return false; |
| } |
| |
| // We only want to deal with triangulated meshes since rendering complex polygons is not feasible |
| ColladaConditioner conditioner; |
| conditioner.triangulate(mDae); |
| |
| domLibrary_geometries *allGeometry = daeSafeCast<domLibrary_geometries>(root->getDescendant("library_geometries")); |
| |
| if (allGeometry) { |
| convertSuceeded = convertAllGeometry(allGeometry) && convertSuceeded; |
| } |
| |
| return convertSuceeded; |
| } |
| |
| SimpleMesh *ColladaLoader::getMesh(uint32_t meshIndex) { |
| return mGeometries[meshIndex]->getMesh(); |
| } |
| |
| bool ColladaLoader::convertAllGeometry(domLibrary_geometries *allGeometry) { |
| |
| bool convertSuceeded = true; |
| domGeometry_Array &geo_array = allGeometry->getGeometry_array(); |
| for (size_t i = 0; i < geo_array.getCount(); i++) { |
| domGeometry *geometry = geo_array[i]; |
| const char *geometryName = geometry->getName(); |
| if (geometryName == NULL) { |
| geometryName = geometry->getId(); |
| } |
| |
| domMeshRef mesh = geometry->getMesh(); |
| if (mesh != NULL) { |
| printf("Converting geometry: %s\n", geometryName); |
| convertSuceeded = convertGeometry(geometry) && convertSuceeded; |
| } else { |
| printf("Skipping geometry: %s, unsupported type\n", geometryName); |
| } |
| |
| } |
| |
| return convertSuceeded; |
| } |
| |
| bool ColladaLoader::convertGeometry(domGeometry *geometry) { |
| bool convertSuceeded = true; |
| |
| domMeshRef mesh = geometry->getMesh(); |
| |
| ColladaGeometry *convertedGeo = new ColladaGeometry(); |
| convertedGeo->init(geometry); |
| |
| mGeometries.push_back(convertedGeo); |
| |
| return convertSuceeded; |
| } |
| |
| bool ColladaLoader::stripGeometryAndSave() { |
| |
| ColladaConditioner conditioner; |
| bool convertSuceeded = conditioner.stripGeometry(mDae); |
| |
| mDae->writeAll(); |
| if(!convertSuceeded) { |
| printf("Encountered errors\n"); |
| } else { |
| printf("Stripped geometry data from collada file\n"); |
| } |
| |
| return convertSuceeded; |
| } |