00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #include <string.h>
00023
00024 #include <cassert>
00025 #include <deque>
00026
00027 #include "luxrays/core/trianglemesh.h"
00028 #include "luxrays/utils/core/exttrianglemesh.h"
00029
00030 using namespace luxrays;
00031
00032 BBox TriangleMesh::GetBBox() const {
00033 BBox bbox;
00034 for (unsigned int i = 0; i < vertCount; ++i)
00035 bbox = Union(bbox, vertices[i]);
00036
00037 return bbox;
00038 }
00039
00040 TriangleMesh *TriangleMesh::Merge(
00041 const std::deque<Mesh *> &meshes,
00042 TriangleMeshID **preprocessedMeshIDs,
00043 TriangleID **preprocessedMeshTriangleIDs) {
00044 unsigned int totalVertexCount = 0;
00045 unsigned int totalTriangleCount = 0;
00046
00047 for (std::deque<Mesh *>::const_iterator m = meshes.begin(); m < meshes.end(); m++) {
00048 totalVertexCount += (*m)->GetTotalVertexCount();
00049 totalTriangleCount += (*m)->GetTotalTriangleCount();
00050 }
00051
00052 return Merge(totalVertexCount, totalTriangleCount, meshes, preprocessedMeshIDs, preprocessedMeshTriangleIDs);
00053 }
00054
00055 TriangleMesh *TriangleMesh::Merge(
00056 const unsigned int totalVertexCount,
00057 const unsigned int totalTriangleCount,
00058 const std::deque<Mesh *> &meshes,
00059 TriangleMeshID **preprocessedMeshIDs,
00060 TriangleID **preprocessedMeshTriangleIDs) {
00061 assert (totalVertexCount > 0);
00062 assert (totalTriangleCount > 0);
00063 assert (meshes.size() > 0);
00064
00065 Point *v = new Point[totalVertexCount];
00066 Triangle *i = new Triangle[totalTriangleCount];
00067
00068 if (preprocessedMeshIDs)
00069 *preprocessedMeshIDs = new TriangleMeshID[totalTriangleCount];
00070 if (preprocessedMeshTriangleIDs)
00071 *preprocessedMeshTriangleIDs = new TriangleID[totalTriangleCount];
00072
00073 unsigned int vIndex = 0;
00074 unsigned int iIndex = 0;
00075 TriangleMeshID currentID = 0;
00076 for (std::deque<Mesh *>::const_iterator m = meshes.begin(); m < meshes.end(); m++) {
00077 const Triangle *tris;
00078 switch ((*m)->GetType()) {
00079 case TYPE_TRIANGLE: {
00080 const TriangleMesh *mesh = (TriangleMesh *)*m;
00081
00082 memcpy(&v[vIndex], mesh->GetVertices(), sizeof(Point) * mesh->GetTotalVertexCount());
00083
00084 tris = mesh->GetTriangles();
00085 break;
00086 }
00087 case TYPE_TRIANGLE_INSTANCE: {
00088 const InstanceTriangleMesh *mesh = (InstanceTriangleMesh *)*m;
00089
00090
00091 for (unsigned int j = 0; j < mesh->GetTotalVertexCount(); j++)
00092 v[vIndex + j] = mesh->GetVertex(j);
00093
00094 tris = mesh->GetTriangles();
00095 break;
00096 }
00097 case TYPE_EXT_TRIANGLE: {
00098 const ExtTriangleMesh *mesh = (ExtTriangleMesh *)*m;
00099
00100
00101 for (unsigned int j = 0; j <mesh->GetTotalVertexCount(); j++)
00102 v[vIndex + j] = mesh->GetVertex(j);
00103
00104 tris = mesh->GetTriangles();
00105 break;
00106 }
00107 case TYPE_EXT_TRIANGLE_INSTANCE: {
00108 const ExtInstanceTriangleMesh *mesh = (ExtInstanceTriangleMesh *)*m;
00109
00110
00111 for (unsigned int j = 0; j <mesh->GetTotalVertexCount(); j++)
00112 v[vIndex + j] = mesh->GetVertex(j);
00113
00114 tris = mesh->GetTriangles();
00115 break;
00116 }
00117 default:
00118 assert (false);
00119 tris = NULL;
00120 break;
00121 }
00122
00123
00124 for (unsigned int j = 0; j < (*m)->GetTotalTriangleCount(); j++) {
00125 i[iIndex].v[0] = tris[j].v[0] + vIndex;
00126 i[iIndex].v[1] = tris[j].v[1] + vIndex;
00127 i[iIndex].v[2] = tris[j].v[2] + vIndex;
00128
00129 if (preprocessedMeshIDs)
00130 (*preprocessedMeshIDs)[iIndex] = currentID;
00131 if (preprocessedMeshTriangleIDs)
00132 (*preprocessedMeshTriangleIDs)[iIndex] = j;
00133
00134 ++iIndex;
00135 }
00136
00137 vIndex += (*m)->GetTotalVertexCount();
00138 if (preprocessedMeshIDs) {
00139
00140 currentID = currentID + 1;
00141 }
00142 }
00143
00144 return new TriangleMesh(totalVertexCount, totalTriangleCount, v, i);
00145 }