OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2009, Google Inc. | 2 * Copyright 2009, Google Inc. |
3 * All rights reserved. | 3 * All rights reserved. |
4 * | 4 * |
5 * Redistribution and use in source and binary forms, with or without | 5 * Redistribution and use in source and binary forms, with or without |
6 * modification, are permitted provided that the following conditions are | 6 * modification, are permitted provided that the following conditions are |
7 * met: | 7 * met: |
8 * | 8 * |
9 * * Redistributions of source code must retain the above copyright | 9 * * Redistributions of source code must retain the above copyright |
10 * notice, this list of conditions and the following disclaimer. | 10 * notice, this list of conditions and the following disclaimer. |
11 * * Redistributions in binary form must reproduce the above | 11 * * Redistributions in binary form must reproduce the above |
12 * copyright notice, this list of conditions and the following disclaimer | 12 * copyright notice, this list of conditions and the following disclaimer |
13 * in the documentation and/or other materials provided with the | 13 * in the documentation and/or other materials provided with the |
14 * distribution. | 14 * distribution. |
15 * * Neither the name of Google Inc. nor the names of its | 15 * * Neither the name of Google Inc. nor the names of its |
16 * contributors may be used to endorse or promote products derived from | 16 * contributors may be used to endorse or promote products derived from |
17 * this software without specific prior written permission. | 17 * this software without specific prior written permission. |
18 * | 18 * |
19 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | 19 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
20 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | 20 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
21 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR | 21 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
22 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT | 22 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
23 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | 23 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
24 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | 24 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
25 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | 25 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
26 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | 26 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
27 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | 27 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
28 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | 28 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
29 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | 29 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
30 */ | 30 */ |
31 #include "precompile.h" | 31 #include "precompile.h" |
32 | 32 |
33 #include "conditioner.h" | 33 #include "conditioner.h" |
34 | 34 |
35 #include <cstdio> | 35 #include <cstdio> |
36 #include <map> | 36 #include <map> |
37 #include <vector> | 37 #include <vector> |
38 | 38 |
39 const float kEpsilon = 0.001f; | 39 const float kEpsilon = 0.001f; |
40 static const float kPi = 3.14159265358979f; | 40 static const float kPi = 3.14159265358979f; |
(...skipping 22 matching lines...) Expand all Loading... |
63 indices.push_back(i1); | 63 indices.push_back(i1); |
64 indices.push_back(i2); | 64 indices.push_back(i2); |
65 } else { | 65 } else { |
66 pts.push_back(p2); | 66 pts.push_back(p2); |
67 pts.push_back(p1); | 67 pts.push_back(p1); |
68 indices.push_back(i2); | 68 indices.push_back(i2); |
69 indices.push_back(i1); | 69 indices.push_back(i1); |
70 } | 70 } |
71 } | 71 } |
72 | 72 |
73 // less than operator overload, necessary function for edge-triangle map. | 73 // Less than operator overload, necessary function for edge-triangle map. |
74 bool operator<(const Edge& left, const Edge& right) { | 74 bool operator<(const Edge& left, const Edge& right) { |
75 // compare two edges by their actually coordinates. | 75 // compare two edges by their actually coordinates. |
76 if (dist(left.pts[0], right.pts[0]) < kEpsilon) { | 76 if (dist(left.pts[0], right.pts[0]) < kEpsilon) { |
77 if (fabs(left.pts[1].getX() - right.pts[1].getX()) < kEpsilon) { | 77 if (fabs(left.pts[1].getX() - right.pts[1].getX()) < kEpsilon) { |
78 if (fabs(left.pts[1].getY() - right.pts[1].getY()) < kEpsilon) { | 78 if (fabs(left.pts[1].getY() - right.pts[1].getY()) < kEpsilon) { |
79 return left.pts[1].getZ() < right.pts[1].getZ(); | 79 return left.pts[1].getZ() < right.pts[1].getZ(); |
80 } | 80 } |
81 return left.pts[1].getY() < right.pts[1].getY(); | 81 return left.pts[1].getY() < right.pts[1].getY(); |
82 } | 82 } |
83 return left.pts[1].getX() < right.pts[1].getX(); | 83 return left.pts[1].getX() < right.pts[1].getX(); |
84 } else { | 84 } else { |
85 if (fabs(left.pts[0].getX() - right.pts[0].getX()) < kEpsilon) { | 85 if (fabs(left.pts[0].getX() - right.pts[0].getX()) < kEpsilon) { |
86 if (fabs(left.pts[0].getY() - right.pts[0].getY()) < kEpsilon) { | 86 if (fabs(left.pts[0].getY() - right.pts[0].getY()) < kEpsilon) { |
87 return left.pts[0].getZ() < right.pts[0].getZ(); | 87 return left.pts[0].getZ() < right.pts[0].getZ(); |
88 } | 88 } |
89 return left.pts[0].getY() < right.pts[0].getY(); | 89 return left.pts[0].getY() < right.pts[0].getY(); |
90 } | 90 } |
91 return left.pts[0].getX() < right.pts[0].getX(); | 91 return left.pts[0].getX() < right.pts[0].getX(); |
92 } | 92 } |
93 } | 93 } |
94 | 94 |
95 // go through triangles who share this edge. And check whether | 95 // Go through triangles who share this edge. And check whether |
96 // the max normal angle is larger than the threshold. | 96 // the max normal angle is larger than the threshold. |
97 void CheckSharpEdge(const Edge& shared_edge, | 97 void CheckSharpEdge(const Edge& shared_edge, |
98 const std::vector<Triangle>& triangle_list, | 98 const std::vector<Triangle>& triangle_list, |
99 std::vector<Edge>* sharp_edges, float threshold) { | 99 std::vector<Edge>* sharp_edges, float threshold) { |
100 for (size_t i = 0; i < triangle_list.size(); i++) | 100 for (size_t i = 0; i < triangle_list.size(); i++) |
101 for (size_t j = i + 1; j < triangle_list.size(); j++) { | 101 for (size_t j = i + 1; j < triangle_list.size(); j++) { |
102 Triangle t1 = triangle_list[i]; | 102 Triangle t1 = triangle_list[i]; |
103 Triangle t2 = triangle_list[j]; | 103 Triangle t2 = triangle_list[j]; |
104 int same_vertices_count = 0; | 104 int same_vertices_count = 0; |
105 // Same triangle might be stored twice to represent inner and | 105 // Same triangle might be stored twice to represent inner and |
(...skipping 26 matching lines...) Expand all Loading... |
132 Vector3 n2 = cross(v22, v23); | 132 Vector3 n2 = cross(v22, v23); |
133 float iAngle = acos(dot(n1, n2) / (length(n1) * length(n2))); | 133 float iAngle = acos(dot(n1, n2) / (length(n1) * length(n2))); |
134 iAngle = iAngle * 180 / kPi; | 134 iAngle = iAngle * 180 / kPi; |
135 if (iAngle >= threshold) { | 135 if (iAngle >= threshold) { |
136 sharp_edges->push_back(shared_edge); | 136 sharp_edges->push_back(shared_edge); |
137 return; | 137 return; |
138 } | 138 } |
139 } | 139 } |
140 } | 140 } |
141 | 141 |
142 // insert edge-triangle pair to edge triangle map. | 142 // Insert edge-triangle pair to edge triangle map. |
143 void InsertEdgeTrianglePair(const Edge& edge, const Triangle& triangle, | 143 void InsertEdgeTrianglePair(const Edge& edge, const Triangle& triangle, |
144 std::map<Edge, std::vector<Triangle>>* et_map) { | 144 std::map<Edge, std::vector<Triangle>>* et_map) { |
145 std::map<Edge, std::vector<Triangle>>::iterator iter1 = | 145 std::map<Edge, std::vector<Triangle>>::iterator iter1 = |
146 et_map->find(edge); | 146 et_map->find(edge); |
147 if (iter1 == et_map->end()) { | 147 if (iter1 == et_map->end()) { |
148 std::vector<Triangle> same_edge_triangle_list; | 148 std::vector<Triangle> same_edge_triangle_list; |
149 same_edge_triangle_list.push_back(triangle); | 149 same_edge_triangle_list.push_back(triangle); |
150 et_map->insert(make_pair(edge, same_edge_triangle_list)); | 150 et_map->insert(make_pair(edge, same_edge_triangle_list)); |
151 } else { | 151 } else { |
152 iter1->second.push_back(triangle); | 152 iter1->second.push_back(triangle); |
153 } | 153 } |
154 } | 154 } |
155 | 155 |
156 NodeInstance* CreateInstanceTree(FCDSceneNode *node) { | 156 NodeInstance* CreateInstanceTree(FCDSceneNode *node) { |
157 NodeInstance *instance = new NodeInstance(node); | 157 NodeInstance *instance = new NodeInstance(node); |
158 NodeInstance::NodeInstanceList &children = instance->children(); | 158 NodeInstance::NodeInstanceList &children = instance->children(); |
159 for (size_t i = 0; i < node->GetChildrenCount(); ++i) { | 159 for (size_t i = 0; i < node->GetChildrenCount(); ++i) { |
160 FCDSceneNode *child_node = node->GetChild(i); | 160 FCDSceneNode *child_node = node->GetChild(i); |
161 NodeInstance *child_instance = CreateInstanceTree(child_node); | 161 NodeInstance *child_instance = CreateInstanceTree(child_node); |
162 children.push_back(child_instance); | 162 children.push_back(child_instance); |
163 } | 163 } |
164 return instance; | 164 return instance; |
165 } | 165 } |
166 | 166 |
167 // go through all polygons in geom_instance, and add all sharp edges | 167 // Go through all polygons in geom_instance, and add all sharp edges |
168 // as a new polygon in geom. And also, add material and effect based | 168 // as a new polygon in geom. And also, add material and effect based |
169 // on the given sharpEdgeColor option. | 169 // on the given sharpEdgeColor option. |
170 void BuildSharpEdge(FCDocument* doc, FCDGeometryInstance* geom_instance, | 170 void BuildSharpEdge(FCDocument* doc, FCDGeometryInstance* geom_instance, |
171 const Options& options) { | 171 const Options& options) { |
172 FCDGeometry* geom = static_cast<FCDGeometry*>(geom_instance->GetEntity()); | 172 FCDGeometry* geom = static_cast<FCDGeometry*>(geom_instance->GetEntity()); |
173 if (!(geom && geom->IsMesh())) | 173 if (!(geom && geom->IsMesh())) |
174 return; | 174 return; |
175 FCDGeometryMesh* mesh = geom->GetMesh(); | 175 FCDGeometryMesh* mesh = geom->GetMesh(); |
176 FCDGeometryPolygonsTools::Triangulate(mesh); | 176 FCDGeometryPolygonsTools::Triangulate(mesh); |
177 FCDGeometryPolygonsTools::GenerateUniqueIndices(mesh, NULL, NULL); | 177 FCDGeometryPolygonsTools::GenerateUniqueIndices(mesh, NULL, NULL); |
(...skipping 182 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
360 } | 360 } |
361 } else { | 361 } else { |
362 printf("Error: couldn't open the input file.\n"); | 362 printf("Error: couldn't open the input file.\n"); |
363 } | 363 } |
364 doc->Release(); | 364 doc->Release(); |
365 } else { | 365 } else { |
366 printf("Internal error: Couldn't create FCollada document.\n"); | 366 printf("Internal error: Couldn't create FCollada document.\n"); |
367 } | 367 } |
368 FCollada::Release(); | 368 FCollada::Release(); |
369 return retval; | 369 return retval; |
370 } | 370 } |
| 371 |
OLD | NEW |