Blue Brain BioExplorer
TriangleMesh.h
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2015-2024, EPFL/Blue Brain Project
3  *
4  * The Blue Brain BioExplorer is a tool for scientists to extract and analyse
5  * scientific data from visualization
6  *
7  * This file is part of Blue Brain BioExplorer <https://github.com/BlueBrain/BioExplorer>
8  *
9  * This library is free software; you can redistribute it and/or modify it under
10  * the terms of the GNU Lesser General Public License version 3.0 as published
11  * by the Free Software Foundation.
12  *
13  * This library is distributed in the hope that it will be useful, but WITHOUT
14  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
15  * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
16  * details.
17  *
18  * You should have received a copy of the GNU Lesser General Public License
19  * along with this library; if not, write to the Free Software Foundation, Inc.,
20  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
21  */
22 
23 #pragma once
24 
26 
27 namespace core
28 {
30 {
34  std::vector<Vector3ui> indices;
35  std::vector<Vector2f> textureCoordinates;
36 
37  void clear()
38  {
39  vertices.clear();
40  normals.clear();
41  colors.clear();
42  indices.clear();
43  textureCoordinates.clear();
44  }
45 };
46 
47 inline TriangleMesh createBox(const Vector3f& minCorner, const Vector3f& maxCorner)
48 {
49  TriangleMesh result;
50  const size_t numVertices = 24;
51  const size_t numFaces = 12;
52  result.vertices.reserve(numVertices);
53  result.normals.reserve(numVertices);
54  result.indices.reserve(numFaces);
55  // Front face
56  result.vertices.emplace_back(minCorner.x, maxCorner.y, maxCorner.z);
57  result.vertices.emplace_back(maxCorner);
58  result.vertices.emplace_back(minCorner.x, minCorner.y, maxCorner.z);
59  result.vertices.emplace_back(maxCorner.x, minCorner.y, maxCorner.z);
60  result.normals.emplace_back(0.f, 0.f, -1.f);
61  result.normals.emplace_back(0.f, 0.f, -1.f);
62  result.normals.emplace_back(0.f, 0.f, -1.f);
63  result.normals.emplace_back(0.f, 0.f, -1.f);
64  result.indices.emplace_back(0, 2, 1);
65  result.indices.emplace_back(1, 2, 3);
66  // Back face
67  result.vertices.emplace_back(minCorner.x, maxCorner.y, minCorner.z);
68  result.vertices.emplace_back(maxCorner.x, maxCorner.y, minCorner.z);
69  result.vertices.emplace_back(minCorner);
70  result.vertices.emplace_back(maxCorner.x, minCorner.y, minCorner.z);
71  result.normals.emplace_back(0.f, 0.f, 1.f);
72  result.normals.emplace_back(0.f, 0.f, 1.f);
73  result.normals.emplace_back(0.f, 0.f, 1.f);
74  result.normals.emplace_back(0.f, 0.f, 1.f);
75  result.indices.emplace_back(4, 6, 5);
76  result.indices.emplace_back(5, 6, 7);
77  // Left face
78  result.vertices.emplace_back(minCorner.x, maxCorner.y, minCorner.z);
79  result.vertices.emplace_back(minCorner.x, maxCorner.y, maxCorner.z);
80  result.vertices.emplace_back(minCorner);
81  result.vertices.emplace_back(minCorner.x, minCorner.y, maxCorner.z);
82  result.normals.emplace_back(-1.f, 0.f, 0.f);
83  result.normals.emplace_back(-1.f, 0.f, 0.f);
84  result.normals.emplace_back(-1.f, 0.f, 0.f);
85  result.normals.emplace_back(-1.f, 0.f, 0.f);
86  result.indices.emplace_back(8, 10, 9);
87  result.indices.emplace_back(9, 10, 11);
88  // Right face
89  result.vertices.emplace_back(maxCorner);
90  result.vertices.emplace_back(maxCorner.x, maxCorner.y, minCorner.z);
91  result.vertices.emplace_back(maxCorner.x, minCorner.y, maxCorner.z);
92  result.vertices.emplace_back(maxCorner.x, minCorner.y, minCorner.z);
93  result.normals.emplace_back(1.f, 0.f, 0.f);
94  result.normals.emplace_back(1.f, 0.f, 0.f);
95  result.normals.emplace_back(1.f, 0.f, 0.f);
96  result.normals.emplace_back(1.f, 0.f, 0.f);
97  result.indices.emplace_back(12, 14, 13);
98  result.indices.emplace_back(13, 14, 15);
99  // Top face
100  result.vertices.emplace_back(minCorner.x, maxCorner.y, minCorner.z);
101  result.vertices.emplace_back(maxCorner.x, maxCorner.y, minCorner.z);
102  result.vertices.emplace_back(minCorner.x, maxCorner.y, maxCorner.z);
103  result.vertices.emplace_back(maxCorner);
104  result.normals.emplace_back(0.f, 1.f, 0.f);
105  result.normals.emplace_back(0.f, 1.f, 0.f);
106  result.normals.emplace_back(0.f, 1.f, 0.f);
107  result.normals.emplace_back(0.f, 1.f, 0.f);
108  result.indices.emplace_back(16, 18, 17);
109  result.indices.emplace_back(17, 18, 19);
110  // Bottom face
111  result.vertices.emplace_back(maxCorner.x, minCorner.y, minCorner.z);
112  result.vertices.emplace_back(minCorner);
113  result.vertices.emplace_back(maxCorner.x, minCorner.y, maxCorner.z);
114  result.vertices.emplace_back(minCorner.x, minCorner.y, maxCorner.z);
115  result.normals.emplace_back(0.f, -1.f, 0.f);
116  result.normals.emplace_back(0.f, -1.f, 0.f);
117  result.normals.emplace_back(0.f, -1.f, 0.f);
118  result.normals.emplace_back(0.f, -1.f, 0.f);
119  result.indices.emplace_back(20, 22, 21);
120  result.indices.emplace_back(21, 22, 23);
121 
122  return result;
123 }
124 
125 } // namespace core
glm::vec3 Vector3f
Definition: MathTypes.h:137
std::vector< Vector4f > Vector4fs
Definition: MathTypes.h:140
TriangleMesh createBox(const Vector3f &minCorner, const Vector3f &maxCorner)
Definition: TriangleMesh.h:47
std::vector< Vector3f > Vector3fs
Definition: MathTypes.h:139
std::vector< Vector2f > textureCoordinates
Definition: TriangleMesh.h:35
Vector3fs vertices
Definition: TriangleMesh.h:31
std::vector< Vector3ui > indices
Definition: TriangleMesh.h:34