160 inline glm::vec2 toVec2(const QPointF& point) |
161 inline glm::vec2 toVec2(const QPointF& point) |
161 { |
162 { |
162 return {point.x(), point.y()}; |
163 return {point.x(), point.y()}; |
163 } |
164 } |
164 |
165 |
165 constexpr float PIf = static_cast<float>(M_PI); |
166 /* |
166 constexpr double PI = M_PI; |
167 * coalesce(arg1, arg2, ..., argn) |
167 constexpr long double PIl = M_PIl; |
168 * Returns the first of the given arguments that evaluates to true. |
|
169 */ |
|
170 template<typename T> |
|
171 T coalesce(T&& arg) |
|
172 { |
|
173 // recursion base: 1 argument |
|
174 return arg; |
|
175 } |
|
176 |
|
177 template<typename T, typename... Rest> |
|
178 std::common_type_t<T, Rest...> coalesce(T&& arg, Rest&&... rest) |
|
179 { |
|
180 // general case: n arguments |
|
181 return arg ? arg : coalesce(rest...); |
|
182 } |
|
183 |
|
184 template<typename T = double> |
|
185 constexpr std::enable_if_t<std::is_floating_point_v<T>, T> PI = static_cast<T>(M_PIl); |
168 |
186 |
169 Q_DECLARE_METATYPE(glm::vec3) |
187 Q_DECLARE_METATYPE(glm::vec3) |
170 Q_DECLARE_METATYPE(glm::mat4) |
188 Q_DECLARE_METATYPE(glm::mat4) |