qxLib
geom.h
Go to the documentation of this file.
1 /**
2 
3  @file geom.h
4  @author Khrapov
5  @date 4.04.2021
6  @copyright (c) Nick Khrapov, 2021. All right reserved.
7 
8 **/
9 #pragma once
10 
11 #include <qx/render/draw_mode.h>
12 #include <qx/typedefs.h>
13 
14 #include <array>
15 #include <cmath>
16 #include <glm/geometric.hpp>
17 #include <glm/vec3.hpp>
18 #include <numbers>
19 #include <span>
20 #include <unordered_map>
21 #include <vector>
22 
23 namespace qx
24 {
25 
26 struct vertex
27 {
28  glm::vec3 pos = glm::vec3(0.f);
29  glm::vec3 normal = glm::vec3(0.f);
30  glm::vec3 tangent = glm::vec3(0.f);
31 };
32 
33 using index_type = u32;
34 using vertices = std::vector<vertex>;
35 using indices = std::vector<index_type>;
36 using indices_view = std::span<const index_type>;
37 
38 struct geometry
39 {
40  vertices geomVertices; //!< vertices array
41  indices geomIndices; //!< indices array
42  glm::vec3 offset = glm::vec3(0.f); //!< offset of the center
43  draw_mode eDrawMode = draw_mode::triangles_list; //!< draw mode
44 };
45 
46 namespace shape_indices
47 {
48 
49 constexpr std::array<index_type, 60> icosahedron { {
50  1, 4, 0, 4, 9, 0, 4, 5, 9, 8, 5, 4, 1, 8, 4, 1, 10, 8, 10, 3, 8, 8, 3, 5, 3, 2, 5, 3, 7, 2,
51  3, 10, 7, 10, 6, 7, 6, 11, 7, 6, 0, 11, 6, 1, 0, 10, 1, 6, 11, 0, 9, 2, 11, 9, 5, 2, 9, 11, 2, 7,
52 } };
53 
54 constexpr std::array<index_type, 36> parallelogram = {
55  3, 1, 0, 2, 1, 3, 2, 5, 1, 6, 5, 2, 6, 4, 5, 7, 4, 6, 7, 0, 4, 3, 0, 7, 7, 2, 3, 6, 2, 7, 0, 5, 4, 1, 5, 0,
56 };
57 
58 constexpr std::array<index_type, 6> rect = { 0, 1, 3, 1, 2, 3 };
59 
60 } // namespace shape_indices
61 
62 /**
63  @brief Create tangent vector for a given normal
64  @param normal - normal vector
65  @retval - tangent vector
66 **/
67 glm::vec3 create_tangent(const glm::vec3& normal);
68 
69 /**
70  @brief Transform triangle indices to line indices
71  @param triangles - triangle indices
72  @retval - line indices
73 **/
74 indices transform_triangle_indices_to_lines(indices_view triangles);
75 
76 /**
77  @brief Create parallelogram geometry
78  @param fSide1 - side 1 length
79  @param fSide2 - side 2 length
80  @param fSide3 - side 3 length
81  @param bFlatNormals - if true, each vertex will have independent normal
82  @retval - parallelogram geometry
83 **/
84 geometry create_parallelogram(float fSide1, float fSide2, float fSide3, bool bFlatNormals = true);
85 
86 /**
87  @brief Create parallelogram geometry for lines drawing
88  @param fSide1 - side 1 length
89  @param fSide2 - side 2 length
90  @param fSide3 - side 3 length
91  @retval - parallelogram geometry
92 **/
93 geometry create_parallelogram_lines(float fSide1, float fSide2, float fSide3);
94 
95 /**
96  @brief Create cube geometry
97  @param fSide - cube side length
98  @param bFlatNormals - if true, each vertex will have independent normal
99  @retval - cube geometry
100 **/
101 geometry create_cube(float fSide, bool bFlatNormals = true);
102 
103 /**
104  @brief Create cube geometry for lines drawing
105  @param fSide - cube side length
106  @retval - cube geometry
107 **/
108 geometry create_cube_lines(float fSide);
109 
110 /**
111  @brief Create icosahedron geometry
112  @param fRadius - icosahedron radius
113  @param bFlatNormals - if true, each vertex will have independent normal
114  @retval - icosahedron geometry
115 **/
116 geometry create_icosahedron(float fRadius, bool bFlatNormals = true);
117 
118 /**
119  @brief Create icosahedron geometry for lines drawing
120  @param fRadius - icosahedron radius
121  @retval - icosahedron geometry
122 **/
123 geometry create_icosahedron_lines(float fRadius);
124 
125 /**
126  @brief Create icosphere geometry
127  @param fRadius - icosphere radius
128  @param nDivides - num of divides of icosahedron (bigger is higher precision)
129  @param bFlatNormals - if true, each vertex will have independent normal
130  @retval - icosphere geometry
131 **/
132 geometry create_icosphere(float fRadius, size_t nDivides, bool bFlatNormals = false);
133 
134 /**
135  @brief Create icosphere geometry for lines drawing
136  @param fRadius - icosphere radius
137  @param nDivides - num of divides of icosahedron (bigger is higher precision)
138  @retval - icosphere geometry
139 **/
140 geometry create_icosphere_lines(float fRadius, size_t nDivides);
141 
142 /**
143  @brief Create rectangle geometry
144  @param fWidth - rectangle width
145  @param fHeight - rectangle height
146  @retval - rectangle geometry
147 **/
148 geometry create_rect(float fWidth, float fHeight);
149 
150 /**
151  @brief Create rectangle geometry for lines drawing
152  @param fWidth - rectangle width
153  @param fHeight - rectangle height
154  @retval - rectangle geometry
155 **/
156 geometry create_rect_lines(float fWidth, float fHeight);
157 
158 /**
159  @brief Create square geometry
160  @param fSideLength - square side length
161  @retval - square geometry
162 **/
163 geometry create_square(float fSideLength);
164 
165 /**
166  @brief Create square geometry for lines drawing
167  @param fSideLength - square side length
168  @retval - square geometry
169 **/
170 geometry create_square_lines(float fSideLength);
171 
172 /**
173  @brief Create ellipse geometry
174  @param fHorRadius - ellipse horizontal radius
175  @param fVertRadius - ellipse vertical radius
176  @param nSides - number of lines in ellipse edge, must be > 3
177  the greater value, the smoother еру edge
178  @retval - ellipse geometry
179 **/
180 geometry create_ellipse(float fHorRadius, float fVertRadius, size_t nSides);
181 
182 /**
183  @brief Create ellipse geometry for lines drawing
184  @param fHorRadius - ellipse horizontal radius
185  @param fVertRadius - ellipse vertical radius
186  @param nSides - number of lines in ellipse edge, must be > 3
187  the greater value, the smoother еру edge
188  @retval - ellipse geometry
189 **/
190 geometry create_ellipse_lines(float fHorRadius, float fVertRadius, size_t nSides);
191 
192 /**
193  @brief Create circle geometry for lines drawing
194  @param fRadius - circle radius
195  @param nSides - number of lines in ellipse edge, must be > 3
196  the greater value, the smoother еру edge
197  @retval - circle geometry
198 **/
199 geometry create_circle(float fRadius, size_t nSides);
200 
201 /**
202  @brief Create circle geometry for lines drawing
203  @param fRadius - circle radius
204  @param nSides - number of lines in ellipse edge, must be > 3
205  the greater value, the smoother еру edge
206  @retval - circle geometry
207 **/
208 geometry create_circle_lines(float fRadius, size_t nSides);
209 
210 } // namespace qx
211 
212 #include <qx/render/geom.inl>
Rectangle class.
geometry create_cube(float fSide, bool bFlatNormals=true)
Create cube geometry.
Definition: geom.inl:165
geometry create_circle_lines(float fRadius, size_t nSides)
Create circle geometry for lines drawing.
Definition: geom.inl:363
geometry create_ellipse(float fHorRadius, float fVertRadius, size_t nSides)
Create ellipse geometry.
Definition: geom.inl:322
geometry create_icosahedron(float fRadius, bool bFlatNormals=true)
Create icosahedron geometry.
Definition: geom.inl:179
geometry create_square_lines(float fSideLength)
Create square geometry for lines drawing.
Definition: geom.inl:317
geometry create_parallelogram_lines(float fSide1, float fSide2, float fSide3)
Create parallelogram geometry for lines drawing.
Definition: geom.inl:156
geometry create_icosphere_lines(float fRadius, size_t nDivides)
Create icosphere geometry for lines drawing.
Definition: geom.inl:270
geometry create_ellipse_lines(float fHorRadius, float fVertRadius, size_t nSides)
Create ellipse geometry for lines drawing.
Definition: geom.inl:350
glm::vec3 create_tangent(const glm::vec3 &normal)
Create tangent vector for a given normal.
Definition: geom.inl:125
geometry create_parallelogram(float fSide1, float fSide2, float fSide3, bool bFlatNormals=true)
Create parallelogram geometry.
Definition: geom.inl:151
geometry create_square(float fSideLength)
Create square geometry.
Definition: geom.inl:312
geometry create_cube_lines(float fSide)
Create cube geometry for lines drawing.
Definition: geom.inl:170
indices transform_triangle_indices_to_lines(indices_view triangles)
Transform triangle indices to line indices.
Definition: geom.inl:132
geometry create_icosahedron_lines(float fRadius)
Create icosahedron geometry for lines drawing.
Definition: geom.inl:188
geometry create_circle(float fRadius, size_t nSides)
Create circle geometry for lines drawing.
Definition: geom.inl:358
geometry create_icosphere(float fRadius, size_t nDivides, bool bFlatNormals=false)
Create icosphere geometry.
Definition: geom.inl:197
geometry create_rect(float fWidth, float fHeight)
Create rectangle geometry.
Definition: geom.inl:279
geometry create_rect_lines(float fWidth, float fHeight)
Create rectangle geometry for lines drawing.
Definition: geom.inl:293
indices geomIndices
indices array
Definition: geom.h:41
vertices geomVertices
vertices array
Definition: geom.h:40
glm::vec3 offset
offset of the center
Definition: geom.h:42
draw_mode eDrawMode
draw mode
Definition: geom.h:43
std::uint32_t u32
0 .. 18 446 744 073 709 551 615
Definition: typedefs.h:23