17 */ |
17 */ |
18 |
18 |
19 #pragma once |
19 #pragma once |
20 #include "basics.h" |
20 #include "basics.h" |
21 |
21 |
22 namespace utility |
22 // http://stackoverflow.com/a/18204188/3629665 |
|
23 template<typename T> |
|
24 inline T rotl10(T x) |
23 { |
25 { |
24 // http://stackoverflow.com/a/18204188/3629665 |
26 return (x << 10) | ((x >> 22) & 0x000000ff); |
25 template<typename T> |
|
26 inline T rotl10(T x) |
|
27 { |
|
28 return (x << 10) | ((x >> 22) & 0x000000ff); |
|
29 } |
|
30 |
|
31 template<typename T> |
|
32 inline T rotl20(T x) |
|
33 { |
|
34 return (x << 20) | ((x >> 12) & 0x000000ff); |
|
35 } |
|
36 |
|
37 inline QString format(const QString& format_string) |
|
38 { |
|
39 return format_string; |
|
40 } |
|
41 |
|
42 template<typename T, typename... Rest> |
|
43 QString format(const QString& format_string, T&& arg, Rest&&... rest) |
|
44 { |
|
45 return format(format_string.arg(arg), std::forward<Rest>(rest)...); |
|
46 } |
|
47 |
|
48 inline QString quoted(QString string) |
|
49 { |
|
50 if (string.contains("'")) |
|
51 { |
|
52 string.replace("\"", "\\\""); |
|
53 string = "\"" + string + "\""; |
|
54 } |
|
55 else |
|
56 { |
|
57 string = "'" + string + "'"; |
|
58 } |
|
59 return string; |
|
60 } |
|
61 |
|
62 /** |
|
63 * @brief Converts the specified vertex to a simple string |
|
64 * @param vertex vertex to convert |
|
65 * @return "x y z"-formatted string |
|
66 */ |
|
67 inline QString vertexToString(const glm::vec3& vertex) |
|
68 { |
|
69 return utility::format("%1 %2 %3", vertex.x, vertex.y, vertex.z); |
|
70 } |
|
71 |
|
72 inline QString vertexToStringParens(const glm::vec3& vertex) |
|
73 { |
|
74 return utility::format("(%1, %2, %3)", vertex.x, vertex.y, vertex.z); |
|
75 } |
|
76 |
|
77 inline QString transformToString(const glm::mat4& matrix) |
|
78 { |
|
79 return utility::format( |
|
80 "%1 %2 %3 %4 %5 %6 %7 %8 %9 %10 %11 %12", |
|
81 matrix[3][0], |
|
82 matrix[3][1], |
|
83 matrix[3][2], |
|
84 matrix[0][0], |
|
85 matrix[1][0], |
|
86 matrix[2][0], |
|
87 matrix[0][1], |
|
88 matrix[1][1], |
|
89 matrix[2][1], |
|
90 matrix[0][2], |
|
91 matrix[1][2], |
|
92 matrix[2][2]); |
|
93 } |
|
94 } |
27 } |
95 |
28 |
96 using namespace utility; |
29 template<typename T> |
|
30 inline T rotl20(T x) |
|
31 { |
|
32 return (x << 20) | ((x >> 12) & 0x000000ff); |
|
33 } |
|
34 |
|
35 inline QString format(const QString& format_string) |
|
36 { |
|
37 return format_string; |
|
38 } |
|
39 |
|
40 template<typename T, typename... Rest> |
|
41 QString format(const QString& format_string, T&& arg, Rest&&... rest) |
|
42 { |
|
43 return format(format_string.arg(arg), std::forward<Rest>(rest)...); |
|
44 } |
|
45 |
|
46 inline QString quoted(QString string) |
|
47 { |
|
48 if (string.contains("'")) |
|
49 { |
|
50 string.replace("\"", "\\\""); |
|
51 string = "\"" + string + "\""; |
|
52 } |
|
53 else |
|
54 { |
|
55 string = "'" + string + "'"; |
|
56 } |
|
57 return string; |
|
58 } |
|
59 |
|
60 /** |
|
61 * @brief Converts the specified vertex to a simple string |
|
62 * @param vertex vertex to convert |
|
63 * @return "x y z"-formatted string |
|
64 */ |
|
65 inline QString vertexToString(const glm::vec3& vertex) |
|
66 { |
|
67 return format("%1 %2 %3", vertex.x, vertex.y, vertex.z); |
|
68 } |
|
69 |
|
70 inline QString vertexToStringParens(const glm::vec3& vertex) |
|
71 { |
|
72 return format("(%1, %2, %3)", vertex.x, vertex.y, vertex.z); |
|
73 } |
|
74 |
|
75 inline QString transformToString(const glm::mat4& matrix) |
|
76 { |
|
77 return format( |
|
78 "%1 %2 %3 %4 %5 %6 %7 %8 %9 %10 %11 %12", |
|
79 matrix[3][0], |
|
80 matrix[3][1], |
|
81 matrix[3][2], |
|
82 matrix[0][0], |
|
83 matrix[1][0], |
|
84 matrix[2][0], |
|
85 matrix[0][1], |
|
86 matrix[1][1], |
|
87 matrix[2][1], |
|
88 matrix[0][2], |
|
89 matrix[1][2], |
|
90 matrix[2][2]); |
|
91 } |
97 |
92 |
98 template<typename T, glm::qualifier Q> |
93 template<typename T, glm::qualifier Q> |
99 inline unsigned int qHash(const glm::vec<3, T, Q>& key) |
94 constexpr unsigned int qHash(const glm::vec<3, T, Q>& key) |
100 { |
95 { |
101 return qHash(key.x) ^ utility::rotl10(qHash(key.y)) ^ utility::rotl20(qHash(key.z)); |
96 return qHash(key.x) ^ rotl10(qHash(key.y)) ^ rotl20(qHash(key.z)); |
102 } |
97 } |