/* This file is part of Magnum. Copyright © 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022 Vladimír Vondruš Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ namespace Magnum { /** @page features Feature guide @brief High-level introduction to design of the Magnum library and basic building blocks. @m_keywords{Features} @tableofcontents @todoc FUCK OFF doxygen, why are you not able to link to Corrade, Corrade::Utility and Magnum/Math/ you dumb shit?! Before you continue further, here are the essential bits of knowledge to help you around. @section features-naming Library organization and naming scheme The @ref Magnum project consists of a library with core functionality and optional sub-libraries. Each library is in its own namespace, which corresponds to a sub-folder on the include path -- so e.g. things from @ref Magnum::Math are included from @m_class{m-doc} [Magnum/Math/](dir_d816e7cf853e6723911731706bcab386.html). @ref Magnum builds upon @m_class{m-doc-external} [Corrade](https://doc.magnum.graphics/corrade/), which provides platform abstraction, basic utilities and containers. To reduce redundant verbosity, references throughout the documentation and code in example snippets have the root @ref Magnum and @m_class{m-doc-external} [Corrade](https://doc.magnum.graphics/corrade/namespaceCorrade.html) namespaces omitted. In other words, as if the following was done: @snippet Magnum.cpp features-using-namespace If Magnum is the primary library you're building your project on, it's recommended that you do the same --- we're careful to not pollute the root namespace with overly generic names. However, except for `Literals` namespaces, @cpp using @ce the subnamespaces is *not recommended*, as naming in those is deliberately picked short and may introduce conflicts (such as @relativeref{Corrade,Containers::String} vs @relativeref{Corrade,Utility::String} or @ref GL::PixelFormat vs @ref Vk::PixelFormat). If you frown upon the thought of @cpp using namespace Magnum @ce yet don't want to wear your fingers off by repeatedly writing @cpp Magnum:: @ce everywhere, a common shorthand that projects go with is the following --- similarly in spirit to @cb{.py} import numpy as np @ce: @snippet Magnum.cpp features-using-namespace-alias @section features-includes Include files and forward declarations Depending on where you come from, the @cpp #include @ce policy used by Magnum might either make you happy or freak you out. In short, there's no "include the world" file, and instead you're supposed to include dedicated headers for APIs you want to use. The main reason is compile times, and the speed gain from doing it this way is too great to be ignored. The general rule is that each top-level class has a corresponding include, so for example @ref Math::Matrix4 is included as @ref Magnum/Math/Matrix4.h. It's not always like that though, and to help you out, documentation of each namespace and class tells you what to include, and if particular namespace members are defined in different headers, then detailed docs of each has a corresponding @cpp #include @ce directive listed as well, ready to be copied. In order to have the includes actually independent of each other, most Magnum types are forward-declared, and where possible, the header only relies on forward declarations. Which means that often the type already exists as a declaration, and in order to actually use it, you have to include the concrete definition of it. If you don't, the compiler will complain about use of an incomplete type. For example: @snippet Magnum.cpp features-forward-declaration-use Of course not all headers can be written with just forward declarations, so there still are some transitive dependencies between headers (for example, the @ref Magnum/Math/Matrix4.h header pulls in @ref Magnum/Math/Vector4.h as well). But from most part this is an implementation detail and as such shouldn't be relied on. For happy compile times you're encouraged to rely on forward declarations in your code as well. See @ref compilation-forward-declarations for more information. @section features-debug-output Debug output One of the essential debugging workflows is inspection of variable contents by printing them out. Magnum defines a lot of new math types, enums and containers and it would be very painful if you had to loop over their contents or perform manual enum-to-string conversion every time you want to see what's inside. Because writing to standard output and printing values for debugging purposes are *distinct* use cases with potentially conflicting requirements (should an enum value get written as a number? or as a name? a fully qualified name?), Magnum *doesn't* provide @cpp operator<< @ce overloads for @ref std::ostream. Instead, there's @relativeref{Corrade,Utility::Debug} (and its variants, @relativeref{Corrade,Utility::Warning}, @relativeref{Corrade,Utility::Error} and @relativeref{Corrade,Utility::Fatal}), for your typing convenience also aliased to just @ref Debug / @ref Warning / @ref Error directly in the @ref Magnum namespace. On its own it's able to print builtin types, all usual C++ containers as well as their Corrade equivalents. Magnum then implements debug printers for its own math types, basic structures and most enums, which get printed as fully-qualified names. For example: @m_class{m-code-figure} @parblock @snippet Magnum.cpp features-debug-output @m_class{m-nopad} @code{.shell-session} Image format is PixelFormat::RGBA8Srgb and size Vector(256, 192) Color of the bottom-left pixel is #33b27f @endcode @endparblock The main goal of this utility is convenience and readability --- values are implicitly delimited by spaces and ended with a newline, container contents written with commas etc. Check out the class documentation for advanced features like colors, output redirection or printing file/line info. @section features-error-handling Error handling in Magnum Magnum differentiates between two kinds of errors --- a programmer error (for example an out-of-bounds access) and a runtime error (for example when a file can't be opened). Programmer errors are assertions, directly leading to a program abort. Runtime errors expect *you* to do the error handling, and if you don't do that, then you're likely to hit an assertion --- a programmer error --- shortly after. The assertions are deliberately not recoverable and are by default @ref CORRADE_NO_ASSERT "kept in release builds as well". A lot of effort is put into assertion messages, which clearly show you what went wrong. They get always printed to the standard output or its equivalent, see the @ref troubleshooting-runtime "troubleshooting guide" for ways how to retrieve it on various platforms. To avoid polluting user code with excessive error handling, runtime errors are restricted only where strictly necessary, and always documented as such. For performance and portability reasons, exceptions aren't used, Instead, the errors usually manifest as an invalid return value (for example an empty @relativeref{Corrade,Containers::Optional}) and a diagnostic message accompanying the error is printed via @relativeref{Corrade,Utility::Error}. If needed, you can optionally @ref Utility-Debug-scoped-output "redirect the message to a string or a log file". @section features-examples Learn by example Before you do a deep dive into the documentation, and if you haven't done already, it's recommended to go through the Getting Started Guide and check out at least the first example: @m_class{m-row} @parblock @m_div{m-col-t-8 m-push-t-2 m-col-s-6 m-push-s-0 m-col-m-4 m-push-m-1} @m_div{m-button m-primary m-fullwidth} @m_div{m-big}Getting Started@m_enddiv @m_div{m-small} bootstrap a basic project structure @m_enddiv @m_enddiv @m_enddiv @m_div{m-col-t-8 m-push-t-2 m-col-s-6 m-push-s-0 m-col-m-4 m-push-m-3} @m_div{m-button m-success m-fullwidth} @m_div{m-big}Your First Triangle@m_enddiv @m_div{m-small} a step-by-step tutorial @m_enddiv @m_enddiv @m_enddiv @endparblock @section features-building-blocks Learn through documentation Each of the following pages provides a high-level description of a certain area of the library. It's recommended to read through these first to understand the overall principles and only then go to documentation of each concrete class and function. - @subpage platform --- @copybrief platform - @subpage types --- @copybrief types - @subpage matrix-vector --- @copybrief matrix-vector - @subpage transformations --- @copybrief transformations - @subpage animation --- @copybrief animation - @subpage plugins --- @copybrief plugins - @subpage file-formats --- @copybrief file-formats - @subpage opengl-wrapping --- @copybrief opengl-wrapping - @subpage vulkan-wrapping --- @copybrief vulkan-wrapping - @subpage shaders --- @copybrief shaders - @subpage scenegraph --- @copybrief scenegraph - @subpage debug-tools --- @copybrief debug-tools - @subpage ui --- @copybrief ui */ }