33 #include <QSet> |
33 #include <QSet> |
34 #include <QString> |
34 #include <QString> |
35 #include <QStringList> |
35 #include <QStringList> |
36 #include <QVariant> |
36 #include <QVariant> |
37 #include <QVector> |
37 #include <QVector> |
|
38 #include <QMdiArea> |
38 #include <glm/glm.hpp> |
39 #include <glm/glm.hpp> |
39 #include "geometry.h" |
40 #include "geometry.h" |
40 #include "functional.h" |
41 #include "functional.h" |
41 #include "typeconversions.h" |
42 #include "typeconversions.h" |
42 |
43 |
43 template<typename T> |
44 template<typename T> |
44 using opt = std::optional<T>; |
45 using opt = std::optional<T>; |
45 |
46 |
|
47 //! \brief Return type of qHash. unsigned int on Qt5, unsigned long on Qt6. |
|
48 using hash_t = decltype(qHash(0)); |
|
49 |
46 Q_DECLARE_METATYPE(glm::vec3) |
50 Q_DECLARE_METATYPE(glm::vec3) |
47 Q_DECLARE_METATYPE(glm::mat4) |
51 Q_DECLARE_METATYPE(glm::mat4) |
|
52 Q_DECLARE_METATYPE(QMdiArea::ViewMode) |
48 |
53 |
49 //! \brief count the amount of elements in a basic array |
54 //! \brief count the amount of elements in a basic array |
50 template<typename T, int N> |
55 template<typename T, int N> |
51 constexpr int countof(T(&)[N]) |
56 constexpr int countof(T(&)[N]) |
52 { |
57 { |
263 .arg(matrix[0][1]).arg(matrix[1][1]).arg(matrix[2][1]) |
268 .arg(matrix[0][1]).arg(matrix[1][1]).arg(matrix[2][1]) |
264 .arg(matrix[0][2]).arg(matrix[1][2]).arg(matrix[2][2]); |
269 .arg(matrix[0][2]).arg(matrix[1][2]).arg(matrix[2][2]); |
265 } |
270 } |
266 |
271 |
267 template<typename T, glm::qualifier Q> |
272 template<typename T, glm::qualifier Q> |
268 constexpr unsigned int qHash(const glm::vec<3, T, Q>& key) |
273 constexpr auto qHash(const glm::vec<3, T, Q>& key) |
269 { |
274 { |
270 return qHash(key.x) ^ rotl10(qHash(key.y)) ^ rotl20(qHash(key.z)); |
275 return qHash(key.x) ^ rotl10(qHash(key.y)) ^ rotl20(qHash(key.z)); |
271 } |
276 } |
272 |
277 |
273 template<typename T, typename Fn> |
278 template<typename T, typename Fn> |