Now line 41 of third added file is marked as 3(41). Source 0 is the
`#version` string added in Shader constructor.
Huh, deinlining that Shader::addSource() function also significantly
reduced debug binary sizes.
All work is now done in AbstractQuery, subclasses define only
strongly-typed interface around it. No heap allocations, no virtual
destructors needed. Added also asserts into result(), begin() and end()
to harden the implementation.
The methods return reference instead of pointer, as the class is
commonly created on the stack. Removed static functions
Shader::fromFile() and Shader::fromData(), as they are not needed now.
Also asserting that the file exists and is readable in addFile().
There is no point in using this class at compile-time. Ever. Moreover
clang called through Emscripten complains that it cannot be constexpr.
Clang called normally doesn't complain, don't know why.
Brain fart in 39348ddf06 (or probably f'ed
up merge conflict after crashed KDevelop while being interrupted for
lack of attention). Next time commit, stash and _then_ test.
The original workaround for enums didn't work (all enums were treated as
UnsignedInt even though they had Int as underlying type), moreover the
solution didn't scale for other possible types with implicit
conversions. Now explicitly listing all scalar types and templated
vectors/matrices, it should work for most cases.
Default implementation of move constructor won't set pointer to indices
to `nullptr` in `other` object, thus implementing it explicitly. Not
sure what will happen in move assignment, implementing it explicitly
too.
First, removed functions which can be done with Vector's member
functions and functions from Functions.h. More flexibility and less
redundant code which leads to easier SIMD implementation later.
Vector4 a;
Float b = a.maxAbs(); // before
Float b = Math::abs(a).max(); // now
Second, removed all functions from RectangularMatrix which are
implemented in Vector and added conversion from RectangularMatrix to
Vector and back. Also for more flexibility and less redundant code (i.e.
reusing SIMD-optimized Vector::max() instead of writing it again).
Matrix4x3 a;
Float b = a.max(); // before
Float b = a.toVector().max(); // now