blob: 8a747481f2a3b9ea8bfd4d5f3dab81f62a3b6ca3 [file] [log] [blame]
Alex Sakhartchouk17bd28b2011-02-11 17:51:44 -08001/*
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#include "ColladaLoader.h"
18#include "ColladaConditioner.h"
19#include "ColladaGeometry.h"
20#include "rsContext.h"
21#include "rsFileA3D.h"
22
23#include <dae.h>
24#include <dom/domCOLLADA.h>
25
26ColladaLoader::ColladaLoader() {
27
28}
29
30ColladaLoader::~ColladaLoader() {
31 clearGeometry();
32}
33
34void ColladaLoader::clearGeometry() {
35 for (uint32_t i = 0; i < mGeometries.size(); i++) {
36 delete mGeometries[i];
37 }
38 mGeometries.clear();
39}
40
41bool ColladaLoader::init(const char *colladaFile) {
42 DAE dae;
43
44 clearGeometry();
45
46 bool convertSuceeded = true;
47
48 domCOLLADA* root = dae.open(colladaFile);
49 if (!root) {
50 fprintf(stderr, "Failed to read file %s.\n", colladaFile);
51 return false;
52 }
53
54 // We only want to deal with triangulated meshes since rendering complex polygons is not feasible
55 ColladaConditioner conditioner;
56 conditioner.triangulate(&dae);
57
58 domLibrary_geometries *allGeometry = daeSafeCast<domLibrary_geometries>(root->getDescendant("library_geometries"));
59
60 if (allGeometry) {
61 convertSuceeded = convertAllGeometry(allGeometry) && convertSuceeded;
62 }
63
64 return convertSuceeded;
65}
66
67bool ColladaLoader::convertToA3D(const char *a3dFile) {
68 if (mGeometries.size() == 0) {
69 return false;
70 }
71 // Now write all this stuff out
72 Context rsc;
73 FileA3D file(&rsc);
74
75 for (uint32_t i = 0; i < mGeometries.size(); i++) {
76 Mesh *exportedMesh = mGeometries[i]->getMesh(&rsc);
77 file.appendToFile(exportedMesh);
78 delete exportedMesh;
79 }
80
81 file.writeFile(a3dFile);
82 return true;
83}
84
85bool ColladaLoader::convertAllGeometry(domLibrary_geometries *allGeometry) {
86
87 bool convertSuceeded = true;
88 domGeometry_Array &geo_array = allGeometry->getGeometry_array();
89 for (size_t i = 0; i < geo_array.getCount(); i++) {
90 domGeometry *geometry = geo_array[i];
91 const char *geometryName = geometry->getName();
92 if (geometryName == NULL) {
93 geometryName = geometry->getId();
94 }
95
96 domMeshRef mesh = geometry->getMesh();
97 if (mesh != NULL) {
98 printf("Converting geometry: %s\n", geometryName);
99 convertSuceeded = convertGeometry(geometry) && convertSuceeded;
100 } else {
101 printf("Skipping geometry: %s, unsupported type\n", geometryName);
102 }
103
104 }
105
106 return convertSuceeded;
107}
108
109bool ColladaLoader::convertGeometry(domGeometry *geometry) {
110 bool convertSuceeded = true;
111
112 domMeshRef mesh = geometry->getMesh();
113
114 ColladaGeometry *convertedGeo = new ColladaGeometry();
115 convertedGeo->init(geometry);
116
117 mGeometries.push_back(convertedGeo);
118
119 return convertSuceeded;
120}