The access methods assert that the user is querying only available data.
Also updated Primitives implementation to create MeshData when
everything is done, not creating empty MeshData and then shooting the
data through interface intended for end users.
Also not through pointer, but throught const&, allows implicit
conversion from Image2D and Trade::ImageData2D, which is good.
Bumped plugin interface version a bit, as this is not so drastic change
in behavior.
Implementation is moved into private virtual `do*()` functions and
public interface does additional sanity checks around them. Exporting to
file is by default done in base implementation, which takes exported
data and then saves them to the file.
Added unit test for file export, bumped plugin interface version to 0.2.
Implementation is moved into private virtual `do*()` functions and the
public interface does additional checks aroung them to simplify plugin
development. Opening files is by default done by the base
implementation, which then calls function for opening raw data with file
contents.
Added test for file opening, bumped plugin interface version to 0.3.
Y# Please enter the commit message for your changes. Lines starting
Advantages:
* The enums were large (600-800 lines) and they polluted the header,
now they are in separate files (except for BufferTexture, which has
the enum small enough to be left in the same file).
* Image classes now don't need to include OpenGL headers, as they were
needed only for the enum values. With advantage of C++11's forward
enum declarations there is no need to include the enum headers
anywhere in implementation, only when particular values are needed.
* The values are now less verbose:
AbstractTexture::InternalFormat::RGB8 // before
TextureFormat::RGB8 // now
* Resolved another "trivial choice" problem (thanks @JanDupal for
introducing this term to me): how to specify the format if there are
ten ways to do it (some being massively confusing):
Image2D::Format f = AbstractImage::Format::RGB; // too long...
Image2D::Format f = Image3D::Format::RGBA; // why 3D? this works?
Image2D::Format f = BufferImage1D::Format::RGBA; // wat?
It is even worse (and more verbose) with textures:
Texture2D::InternalFormat f =
CubeMapTextureArray::InternalFormat::RGB8; // this is allowed?
To have consistent naming this change was done also with
BufferTexture::InternalFormat (now BufferTextureFormat), although there
were no trivial choice issues and the enum isn't too large. But at least
it is now less typing.
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.
Now it is possible to open either pure data arrays or arrays specified
with filename. The function calls might be ambiguous now (i.e.
open("image.tga") would open data array instead of handling it as
filename), renamed them to avoid that. Default implementations now
fire an assertion. Bumped plugin interface string version as this is
pretty incompatible change.
* They are now deinlined into source files, as most of the classes have
either heavy members (std::vector) or virtual methods.
* All of them are explicit now (that should be already done, don't know
why not).
* Passing huge classes by value and using move constructors to avoid
unnecessary copying.
* Calling enable_testing() only in root path.
* Using CORRADE_CXX_FLAGS instead of our own set to make things easier
to maintain.
* Various cleanup and reorganization.
Positions were originally done using Point2D/3D to simplify their
transformation using matrices and to some extent simplify their usage in
shaders. But now the disadvantages exceeded the advantages:
* They take 50% more for 2D positions and 33% more for 3D positions, as
last coordinate is always equal to 1, on the other hand when last
coordinate is errorneously not equal to 1 they have crazy behavior.
* Normalizing them or transforming them with anything else than with
matrices is PITA, as we need to strip the last component, do the
transformation, and then add the component back.
* All transformation handling classes (Complex, DualComplex,
Quaternion, DualQuaternion, Matrix3, Matrix4) now have convenience
functions for transforming points specified directly as
Vector2/Vector3 (and also for transforming vectors).
* When someone wants to use homogeneous coordinates with crazy last
component values, they can do so with plain Vector3 for 2D and
Vector4 for 3D and it will be less confusing than using Point2D/3D
which no important detail hidden.
In most cases the names aren't even supported/used and thus it is
wasteful to have them in all *Data classes. If the importer wants to
support them, it would reimplement *name() functions instead.
Removed workarounds for alias templates, variadic templates and
anonymous enums, but 1.8.2 has some bug with forward declarations
causing classes to appear in default namespace, breaking
cross-references.
It prevents unwanted implicit conversions from e.g. nullptr to Camera,
Vector2 to Physics::Point etc. By making all the constructors explicit
it is easier to routinely add the keyword to all new classes instead of
thinking about cases when to add and when not to.