From c33fd4d9c6b01613441ac6a62c05c7d8156cd5bc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Fri, 9 Mar 2018 13:26:24 +0100 Subject: [PATCH] doc: show how each primitive looks. --- doc/changelog.dox | 2 + doc/generated/CMakeLists.txt | 9 + doc/generated/README.md | 7 + doc/generated/primitives.cpp | 467 ++++++++++++++++++++++++++ doc/primitives-axis2d.png | Bin 0 -> 1293 bytes doc/primitives-axis3d.png | Bin 0 -> 1336 bytes doc/primitives-capsule2dwireframe.png | Bin 0 -> 2188 bytes doc/primitives-capsule3dsolid.png | Bin 0 -> 32667 bytes doc/primitives-capsule3dwireframe.png | Bin 0 -> 4430 bytes doc/primitives-circle2dsolid.png | Bin 0 -> 12594 bytes doc/primitives-circle2dwireframe.png | Bin 0 -> 2106 bytes doc/primitives-circle3dsolid.png | Bin 0 -> 14673 bytes doc/primitives-circle3dwireframe.png | Bin 0 -> 1724 bytes doc/primitives-crosshair2d.png | Bin 0 -> 1188 bytes doc/primitives-crosshair3d.png | Bin 0 -> 1272 bytes doc/primitives-cubesolid.png | Bin 0 -> 18318 bytes doc/primitives-cubewireframe.png | Bin 0 -> 3657 bytes doc/primitives-cylindersolid.png | Bin 0 -> 29091 bytes doc/primitives-cylinderwireframe.png | Bin 0 -> 3657 bytes doc/primitives-icospheresolid.png | Bin 0 -> 25419 bytes doc/primitives-line2d.png | Bin 0 -> 525 bytes doc/primitives-line3d.png | Bin 0 -> 479 bytes doc/primitives-planesolid.png | Bin 0 -> 7568 bytes doc/primitives-planewireframe.png | Bin 0 -> 1228 bytes doc/primitives-squaresolid.png | Bin 0 -> 7049 bytes doc/primitives-squarewireframe.png | Bin 0 -> 1799 bytes doc/primitives-uvspheresolid.png | Bin 0 -> 33374 bytes doc/primitives-uvspherewireframe.png | Bin 0 -> 3641 bytes src/Magnum/Primitives/Axis.h | 6 + src/Magnum/Primitives/Capsule.h | 8 + src/Magnum/Primitives/Circle.h | 12 + src/Magnum/Primitives/Crosshair.h | 6 + src/Magnum/Primitives/Cube.h | 9 + src/Magnum/Primitives/Cylinder.h | 4 + src/Magnum/Primitives/Icosphere.h | 3 + src/Magnum/Primitives/Line.h | 6 + src/Magnum/Primitives/Plane.h | 6 + src/Magnum/Primitives/Square.h | 6 + src/Magnum/Primitives/UVSphere.h | 6 + 39 files changed, 557 insertions(+) create mode 100644 doc/generated/primitives.cpp create mode 100644 doc/primitives-axis2d.png create mode 100644 doc/primitives-axis3d.png create mode 100644 doc/primitives-capsule2dwireframe.png create mode 100644 doc/primitives-capsule3dsolid.png create mode 100644 doc/primitives-capsule3dwireframe.png create mode 100644 doc/primitives-circle2dsolid.png create mode 100644 doc/primitives-circle2dwireframe.png create mode 100644 doc/primitives-circle3dsolid.png create mode 100644 doc/primitives-circle3dwireframe.png create mode 100644 doc/primitives-crosshair2d.png create mode 100644 doc/primitives-crosshair3d.png create mode 100644 doc/primitives-cubesolid.png create mode 100644 doc/primitives-cubewireframe.png create mode 100644 doc/primitives-cylindersolid.png create mode 100644 doc/primitives-cylinderwireframe.png create mode 100644 doc/primitives-icospheresolid.png create mode 100644 doc/primitives-line2d.png create mode 100644 doc/primitives-line3d.png create mode 100644 doc/primitives-planesolid.png create mode 100644 doc/primitives-planewireframe.png create mode 100644 doc/primitives-squaresolid.png create mode 100644 doc/primitives-squarewireframe.png create mode 100644 doc/primitives-uvspheresolid.png create mode 100644 doc/primitives-uvspherewireframe.png diff --git a/doc/changelog.dox b/doc/changelog.dox index 5a06da54b..98d0fb02c 100644 --- a/doc/changelog.dox +++ b/doc/changelog.dox @@ -202,6 +202,8 @@ See also: - A new @ref developers page containing step-by-step checklists for maintainers and core developers +- The @ref Primitives namespace now has contains images visualizing how + each primitive looks - Compiling majority of code snippets to ensure they don't get out of sync with the code diff --git a/doc/generated/CMakeLists.txt b/doc/generated/CMakeLists.txt index 175afcaa5..21cb405c5 100644 --- a/doc/generated/CMakeLists.txt +++ b/doc/generated/CMakeLists.txt @@ -57,3 +57,12 @@ target_link_libraries(shaders Magnum::Primitives Magnum::Shaders Magnum::WindowlessApplication) + +add_executable(primitives primitives.cpp) +target_include_directories(primitives PRIVATE ${CMAKE_CURRENT_BINARY_DIR}) +target_link_libraries(primitives + Magnum::Magnum + Magnum::MeshTools + Magnum::Primitives + Magnum::Shaders + Magnum::WindowlessApplication) diff --git a/doc/generated/README.md b/doc/generated/README.md index 6b2fe1856..f8e235b64 100644 --- a/doc/generated/README.md +++ b/doc/generated/README.md @@ -12,6 +12,13 @@ Create build dir, point CMake to this directory and compile the executables: cmake ../doc/generated cmake --build . +### Primitive images + +Generated by the `primitives` executable. Run it in this directory, the output +is put into `doc/` directory. Apply `pngcrush` to them for smaller file sizes: + + for f in $(ls primitives-*.png); do pngcrush -ow $f; done + ### Shader images Generated by the `shaders` executable. Must be run in this directory, the diff --git a/doc/generated/primitives.cpp b/doc/generated/primitives.cpp new file mode 100644 index 000000000..0d16ac2b7 --- /dev/null +++ b/doc/generated/primitives.cpp @@ -0,0 +1,467 @@ +/* + This file is part of Magnum. + + Copyright © 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 + 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. +*/ + +#include +#include + +#ifdef CORRADE_TARGET_APPLE +#include +#elif defined(CORRADE_TARGET_UNIX) +#include +#elif defined(CORRADE_TARGET_WINDOWS) +#include +#else +#error no windowless application available on this platform +#endif + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "configure.h" + +using namespace Magnum; +using namespace Magnum::Math::Literals; + +struct PrimitiveVisualizer: Platform::WindowlessApplication { + explicit PrimitiveVisualizer(const Arguments& arguments): Platform::WindowlessApplication{arguments} {} + + int exec() override; + + std::pair axis2D(); + std::pair axis3D(); + + std::pair capsule2DWireframe(); + std::pair circle2DWireframe(); + std::pair crosshair2D(); + std::pair line2D(); + std::pair squareWireframe(); + + std::pair capsule3DWireframe(); + std::pair circle3DWireframe(); + std::pair crosshair3D(); + std::pair cubeWireframe(); + std::pair cylinderWireframe(); + std::pair line3D(); + std::pair planeWireframe(); + std::pair uvSphereWireframe(); + + std::pair circle2DSolid(); + std::pair squareSolid(); + + std::pair capsule3DSolid(); + std::pair circle3DSolid(); + std::pair cubeSolid(); + std::pair cylinderSolid(); + std::pair icosphereSolid(); + std::pair planeSolid(); + std::pair uvSphereSolid(); +}; + +namespace { + constexpr const Vector2i ImageSize{256}; + const auto BaseColor = 0x2f83cc_rgbf; + const auto OutlineColor = 0xdcdcdc_rgbf; + const auto Projection2D = Matrix3::projection({3.0f, 3.0f}); + const auto Projection3D = Matrix4::perspectiveProjection(35.0_degf, 1.0f, 0.001f, 100.0f); + const auto Transformation2D = Matrix3::rotation(13.2_degf); + const auto Transformation3D = Matrix4::translation(Vector3::zAxis(-6.0f))* + Matrix4::rotationY(-10.82_degf)* + Matrix4::rotationX(24.37_degf)* + Matrix4::rotationZ(18.3_degf); +} + +int PrimitiveVisualizer::exec() { + PluginManager::Manager converterManager{MAGNUM_PLUGINS_IMAGECONVERTER_DIR}; + std::unique_ptr converter = converterManager.loadAndInstantiate("PngImageConverter"); + if(!converter) { + Error() << "Cannot load image converter plugin"; + std::exit(1); + } + + Renderbuffer multisampleColor, multisampleDepth; + multisampleColor.setStorageMultisample(16, RenderbufferFormat::RGBA8, ImageSize); + multisampleDepth.setStorageMultisample(16, RenderbufferFormat::DepthComponent24, ImageSize); + + Framebuffer multisampleFramebuffer{{{}, ImageSize}}; + multisampleFramebuffer.attachRenderbuffer(Framebuffer::ColorAttachment{0}, multisampleColor) + .attachRenderbuffer(Framebuffer::BufferAttachment::Depth, multisampleDepth) + .bind(); + CORRADE_INTERNAL_ASSERT(multisampleFramebuffer.checkStatus(FramebufferTarget::Draw) == Framebuffer::Status::Complete); + + Renderbuffer color; + color.setStorage(RenderbufferFormat::RGBA8, ImageSize); + Framebuffer framebuffer{{{}, ImageSize}}; + framebuffer.attachRenderbuffer(Framebuffer::ColorAttachment{0}, color); + + /* Cheating a bit and enabling only face culling instead of depth test in + order to draw the wireframe over. I couldn't get polygon offset to work + on the first try so I gave up. This will of course break with things + like torus later. */ + Renderer::enable(Renderer::Feature::FaceCulling); + Renderer::enable(Renderer::Feature::Blending); + Renderer::setBlendFunction(Renderer::BlendFunction::One, Renderer::BlendFunction::One); + Renderer::setClearColor(0x000000_rgbaf); + Renderer::setLineWidth(1.5f); + + { + Shaders::VertexColor2D shader; + shader.setTransformationProjectionMatrix(Projection2D*Transformation2D); + + for(auto fun: {&PrimitiveVisualizer::axis2D}) { + multisampleFramebuffer.clear(FramebufferClear::Color|FramebufferClear::Depth); + + std::string filename; + Containers::Optional data; + std::tie(data, filename) = (this->*fun)(); + + /* TODO: use MeshTools::compile() once it can handle colors */ + Buffer vertices, indices; + vertices.setData(MeshTools::interleave(data->positions(0), data->colors(0)), BufferUsage::StaticDraw); + indices.setData(data->indices(), BufferUsage::StaticDraw); + Mesh mesh; + mesh.addVertexBuffer(vertices, 0, Shaders::VertexColor2D::Position{}, Shaders::VertexColor2D::Color{Shaders::VertexColor2D::Color::Components::Four}) + .setIndexBuffer(indices, 0, Mesh::IndexType::UnsignedInt) + .setCount(data->indices().size()) + .setPrimitive(data->primitive()); + + mesh.draw(shader); + + AbstractFramebuffer::blit(multisampleFramebuffer, framebuffer, framebuffer.viewport(), FramebufferBlit::Color); + Image2D result = framebuffer.read(framebuffer.viewport(), {PixelFormat::RGBA, PixelType::UnsignedByte}); + converter->exportToFile(result, Utility::Directory::join("../", "primitives-" + filename)); + } + } + + { + Shaders::VertexColor3D shader; + shader.setTransformationProjectionMatrix(Projection3D*Transformation3D); + + for(auto fun: {&PrimitiveVisualizer::axis3D}) { + multisampleFramebuffer.clear(FramebufferClear::Color|FramebufferClear::Depth); + + std::string filename; + Containers::Optional data; + std::tie(data, filename) = (this->*fun)(); + + /* TODO: use MeshTools::compile() once it can handle colors */ + Buffer vertices, indices; + vertices.setData(MeshTools::interleave(data->positions(0), data->colors(0)), BufferUsage::StaticDraw); + indices.setData(data->indices(), BufferUsage::StaticDraw); + Mesh mesh; + mesh.addVertexBuffer(vertices, 0, Shaders::VertexColor3D::Position{}, Shaders::VertexColor3D::Color{Shaders::VertexColor3D::Color::Components::Four}) + .setIndexBuffer(indices, 0, Mesh::IndexType::UnsignedInt) + .setCount(data->indices().size()) + .setPrimitive(data->primitive()); + + mesh.draw(shader); + + AbstractFramebuffer::blit(multisampleFramebuffer, framebuffer, framebuffer.viewport(), FramebufferBlit::Color); + Image2D result = framebuffer.read(framebuffer.viewport(), {PixelFormat::RGBA, PixelType::UnsignedByte}); + converter->exportToFile(result, Utility::Directory::join("../", "primitives-" + filename)); + } + } + + { + Shaders::Flat2D shader; + shader.setColor(OutlineColor) + .setTransformationProjectionMatrix(Projection2D*Transformation2D); + + for(auto fun: {&PrimitiveVisualizer::capsule2DWireframe, + &PrimitiveVisualizer::circle2DWireframe, + &PrimitiveVisualizer::crosshair2D, + &PrimitiveVisualizer::line2D, + &PrimitiveVisualizer::squareWireframe}) + { + multisampleFramebuffer.clear(FramebufferClear::Color|FramebufferClear::Depth); + + std::string filename; + Containers::Optional data; + std::tie(data, filename) = (this->*fun)(); + + std::unique_ptr vertices, indices; + Mesh mesh{NoCreate}; + std::tie(mesh, vertices, indices) = MeshTools::compile(*data, BufferUsage::StaticDraw); + + mesh.draw(shader); + + AbstractFramebuffer::blit(multisampleFramebuffer, framebuffer, framebuffer.viewport(), FramebufferBlit::Color); + Image2D result = framebuffer.read(framebuffer.viewport(), {PixelFormat::RGBA, PixelType::UnsignedByte}); + converter->exportToFile(result, Utility::Directory::join("../", "primitives-" + filename)); + } + } + + { + Shaders::Flat3D shader; + shader.setColor(OutlineColor) + .setTransformationProjectionMatrix(Projection3D*Transformation3D); + + for(auto fun: {&PrimitiveVisualizer::capsule3DWireframe, + &PrimitiveVisualizer::circle3DWireframe, + &PrimitiveVisualizer::crosshair3D, + &PrimitiveVisualizer::cubeWireframe, + &PrimitiveVisualizer::cylinderWireframe, + &PrimitiveVisualizer::line3D, + &PrimitiveVisualizer::planeWireframe, + &PrimitiveVisualizer::uvSphereWireframe}) + { + multisampleFramebuffer.clear(FramebufferClear::Color|FramebufferClear::Depth); + + std::string filename; + Containers::Optional data; + std::tie(data, filename) = (this->*fun)(); + + std::unique_ptr vertices, indices; + Mesh mesh{NoCreate}; + std::tie(mesh, vertices, indices) = MeshTools::compile(*data, BufferUsage::StaticDraw); + + mesh.draw(shader); + + AbstractFramebuffer::blit(multisampleFramebuffer, framebuffer, framebuffer.viewport(), FramebufferBlit::Color); + Image2D result = framebuffer.read(framebuffer.viewport(), {PixelFormat::RGBA, PixelType::UnsignedByte}); + converter->exportToFile(result, Utility::Directory::join("../", "primitives-" + filename)); + } + } + + { + const Matrix3 projection = Projection2D*Transformation2D; + Shaders::MeshVisualizer shader{Shaders::MeshVisualizer::Flag::Wireframe}; + shader.setColor(BaseColor) + .setWireframeColor(OutlineColor) + .setViewportSize(Vector2{ImageSize}) + .setTransformationProjectionMatrix(Matrix4{ + {projection[0], 0.0f}, + {projection[1], 0.0f}, + {0.0f, 0.0f, 1.0f, 0.0f}, + {{projection[2].xy(), 0.0f}, 1.0f}}); + + for(auto fun: {&PrimitiveVisualizer::circle2DSolid, + &PrimitiveVisualizer::squareSolid}) + { + multisampleFramebuffer.clear(FramebufferClear::Color|FramebufferClear::Depth); + + std::string filename; + Containers::Optional data; + std::tie(data, filename) = (this->*fun)(); + + /* TODO: use MeshTools::compile() and MeshVisualizer2D once it exists */ + Buffer vertices; + vertices.setData(data->positions(0), BufferUsage::StaticDraw); + Mesh mesh; + mesh.addVertexBuffer(vertices, 0, Shaders::MeshVisualizer::Position{Shaders::MeshVisualizer::Position::Components::Two}) + .setCount(data->positions(0).size()) + .setPrimitive(data->primitive()); + + mesh.draw(shader); + + AbstractFramebuffer::blit(multisampleFramebuffer, framebuffer, framebuffer.viewport(), FramebufferBlit::Color); + Image2D result = framebuffer.read(framebuffer.viewport(), {PixelFormat::RGBA, PixelType::UnsignedByte}); + converter->exportToFile(result, Utility::Directory::join("../", "primitives-" + filename)); + } + } + + { + Shaders::Phong phong; + phong.setAmbientColor(0x22272e_rgbf) + .setDiffuseColor(BaseColor) + .setSpecularColor(0x000000_rgbf) + .setLightPosition({5.0f, 5.0f, 7.0f}) + .setProjectionMatrix(Projection3D) + .setTransformationMatrix(Transformation3D) + .setNormalMatrix(Transformation3D.rotationScaling()); + + Shaders::MeshVisualizer wireframe{Shaders::MeshVisualizer::Flag::Wireframe}; + wireframe.setColor(0x000000_rgbaf) + .setWireframeColor(OutlineColor) + .setViewportSize(Vector2{ImageSize}) + .setTransformationProjectionMatrix(Projection3D*Transformation3D); + + for(auto fun: {&PrimitiveVisualizer::capsule3DSolid, + &PrimitiveVisualizer::circle3DSolid, + &PrimitiveVisualizer::cubeSolid, + &PrimitiveVisualizer::cylinderSolid, + &PrimitiveVisualizer::icosphereSolid, + &PrimitiveVisualizer::planeSolid, + &PrimitiveVisualizer::uvSphereSolid}) + { + multisampleFramebuffer.clear(FramebufferClear::Color|FramebufferClear::Depth); + + std::string filename; + Containers::Optional data; + std::tie(data, filename) = (this->*fun)(); + + std::unique_ptr vertices, indices; + Mesh mesh{NoCreate}; + std::tie(mesh, vertices, indices) = MeshTools::compile(*data, BufferUsage::StaticDraw); + + mesh.draw(phong); + mesh.draw(wireframe); + + AbstractFramebuffer::blit(multisampleFramebuffer, framebuffer, framebuffer.viewport(), FramebufferBlit::Color); + Image2D result = framebuffer.read(framebuffer.viewport(), {PixelFormat::RGBA, PixelType::UnsignedByte}); + converter->exportToFile(result, Utility::Directory::join("../", "primitives-" + filename)); + } + } + + return 0; +} + +std::pair PrimitiveVisualizer::axis2D() { + return {Primitives::axis2D(), "axis2d.png"}; +} + +std::pair PrimitiveVisualizer::axis3D() { + return {Primitives::axis3D(), "axis3d.png"}; +} + +std::pair PrimitiveVisualizer::capsule2DWireframe() { + auto capsule = Primitives::capsule2DWireframe(8, 1, 0.75f); + MeshTools::transformPointsInPlace(Matrix3::scaling(Vector2{0.75f}), capsule.positions(0)); + return {std::move(capsule), "capsule2dwireframe.png"}; +} + +std::pair PrimitiveVisualizer::circle2DWireframe() { + return {Primitives::circle2DWireframe(32), "circle2dwireframe.png"}; +} + +std::pair PrimitiveVisualizer::crosshair2D() { + return {Primitives::crosshair2D(), "crosshair2d.png"}; +} + +std::pair PrimitiveVisualizer::line2D() { + auto line = Primitives::line2D(); + MeshTools::transformPointsInPlace(Matrix3::translation(Vector2::xAxis(-1.0f))*Matrix3::scaling(Vector2::xScale(2.0f)), line.positions(0)); + return {std::move(line), "line2d.png"}; +} + +std::pair PrimitiveVisualizer::squareWireframe() { + return {Primitives::squareWireframe(), "squarewireframe.png"}; +} + +std::pair PrimitiveVisualizer::capsule3DWireframe() { + auto capsule = Primitives::capsule3DWireframe(8, 1, 16, 1.0f); + MeshTools::transformPointsInPlace(Matrix4::scaling(Vector3{0.75f}), capsule.positions(0)); + return {std::move(capsule), "capsule3dwireframe.png"}; +} + +std::pair PrimitiveVisualizer::circle3DWireframe() { + return {Primitives::circle3DWireframe(32), "circle3dwireframe.png"}; +} + +std::pair PrimitiveVisualizer::crosshair3D() { + return {Primitives::crosshair3D(), "crosshair3d.png"}; +} + +std::pair PrimitiveVisualizer::cubeWireframe() { + return {Primitives::cubeWireframe(), "cubewireframe.png"}; +} + +std::pair PrimitiveVisualizer::cylinderWireframe() { + return {Primitives::cylinderWireframe(1, 32, 1.0f), "cylinderwireframe.png"}; +} + +std::pair PrimitiveVisualizer::line3D() { + auto line = Primitives::line3D(); + MeshTools::transformPointsInPlace(Matrix4::translation(Vector3::xAxis(-1.0f))*Matrix4::scaling(Vector3::xScale(2.0f)), line.positions(0)); + return {std::move(line), "line3d.png"}; +} + +std::pair PrimitiveVisualizer::planeWireframe() { + return {Primitives::planeWireframe(), "planewireframe.png"}; +} + +std::pair PrimitiveVisualizer::uvSphereWireframe() { + return {Primitives::uvSphereWireframe(16, 32), "uvspherewireframe.png"}; +} + +std::pair PrimitiveVisualizer::circle2DSolid() { + return {Primitives::circle2DSolid(16), "circle2dsolid.png"}; +} + +std::pair PrimitiveVisualizer::squareSolid() { + return {Primitives::squareSolid(), "squaresolid.png"}; +} + +std::pair PrimitiveVisualizer::capsule3DSolid() { + auto capsule = Primitives::capsule3DSolid(4, 1, 12, 0.75f); + MeshTools::transformPointsInPlace(Matrix4::scaling(Vector3{0.75f}), capsule.positions(0)); + return {std::move(capsule), "capsule3dsolid.png"}; +} + +std::pair PrimitiveVisualizer::circle3DSolid() { + return {Primitives::circle3DSolid(16), "circle3dsolid.png"}; +} + +std::pair PrimitiveVisualizer::cubeSolid() { + return {Primitives::cubeSolid(), "cubesolid.png"}; +} + +std::pair PrimitiveVisualizer::cylinderSolid() { + return {Primitives::cylinderSolid(1, 12, 1.0f, Primitives::CylinderFlag::CapEnds), "cylindersolid.png"}; +} + +std::pair PrimitiveVisualizer::icosphereSolid() { + return {Primitives::icosphereSolid(1), "icospheresolid.png"}; +} + +std::pair PrimitiveVisualizer::planeSolid() { + return {Primitives::planeSolid(), "planesolid.png"}; +} + +std::pair PrimitiveVisualizer::uvSphereSolid() { + return {Primitives::uvSphereSolid(8, 16), "uvspheresolid.png"}; +} + +MAGNUM_WINDOWLESSAPPLICATION_MAIN(PrimitiveVisualizer) diff --git a/doc/primitives-axis2d.png b/doc/primitives-axis2d.png new file mode 100644 index 0000000000000000000000000000000000000000..dc1c80088b5363e825750d2bf6653bdcb5e04044 GIT binary patch literal 1293 zcmeAS@N?(olHy`uVBq!ia0y~yU<5K5893O0R7}x|GzJEiE1oWnAr-gY-t7%k@)clv zz}YCkb5MZep_2iN(GC!k2gGzTX!-qZ?e2B`iv&U}?%u7NH!+BD>#0TQ%bzcoWCj{W zEO@Z{j_=#VEc<0_CZDsj_W$2jGnbDsLm~Vx%fHuwzb&_(z0xq%t3mxn@zwfyx9YNX z>c=k+KJoqbN=EH37F$_<{k>8aeEPcSAO8o-nNQSK&b!F4#)D~3ll3LeC%+GO9$={r zYV;Dk{ttQUnTey_z6!!N-hqDf5mkDI9A;__&tp0TqjK zFiKhJ2{4%yt#aVF;4zI!mZxc%9#AxF%_~MN0VZBe0jA!o2N(3PG%Wkfz{lno%+=zM z%+=CR$-wHgVD%f;0t1d&K?*EV!9cva*%2rkypp%z)!gPrHY3g#2?8cd9XL$F*qcQ- z8kYg_F$iV^o8=BvU3||{Lh7_uL$l+BDNKqNBK8(<08$ll4vhjCTFaUC78`&~SOzp@ z`cem=oti*w2*o=~7`R$$ZvEZRb!bxM^9TObGwka8V_$qZ|GU(DNubU|CdKfZzVhpn z_dMGsy)A6>l}ZNoW;@;R|2<4bQWcVqQ?38#M{=<`<=vRx_qML5)~e~ap`7{Q6yxx_8?s0$&m*ccT#`MJK)zK&sM`^E$isUFk9I8-&Cd(|7Y&k61emy z;X>lSIPWUc#q%4^C*Lk#^ZB{u&zOs0-iTJ`?w6ITEK%l`fM z^Y71|7vH|YeIRMg9)}Z4|JZ&H|5tbRzGwTS`#ZNPPjHRAY0dupRIOgU|AKu}_s1Kj z2Us)iT@W!%OJLK5X2;w6PZuu#^!?8Fdw>4!vist%mH6Vkka7kv=+8ZUzg6b@OrY?; z;y0hZm;149iZIp{n6$9;>HFh{e?~uhe|^PHR(+*uw)_Uo&5rqC<@%q#NB8>d>4;bt z^VgW`$FVkx%>XP%m2RmBl|;m?(ArJ9;@m5ub16=f9`%`QEKCa zQ}^%R^0U7FN4Db)+aHI<32$dU-Y|8)^tr=9b2J5le*WJ1c*D+LAg-(k$I3r{?-bs! z$+O_s-gLA7@4uJ-6aK#_j7Yd>d*H^CRr>Yp#Fhp$QJ0|hkJ&e&so`aH`Vo)?p00i_ I>zopr0Kb_M+yDRo literal 0 HcmV?d00001 diff --git a/doc/primitives-axis3d.png b/doc/primitives-axis3d.png new file mode 100644 index 0000000000000000000000000000000000000000..398a21ce5f4937cd8d2757dbb6fba8bd32e7c4a2 GIT binary patch literal 1336 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

-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 literal 0 HcmV?d00001 diff --git a/doc/primitives-capsule3dwireframe.png b/doc/primitives-capsule3dwireframe.png new file mode 100644 index 0000000000000000000000000000000000000000..1e7eaa401a1d0682a43928fbec41b6a82afd07b1 GIT binary patch literal 4430 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 Q2>;9&=o#x)={Q9F2mZHNsQ>@~ literal 0 HcmV?d00001 diff --git a/doc/primitives-circle2dsolid.png b/doc/primitives-circle2dsolid.png new file mode 100644 index 0000000000000000000000000000000000000000..1a76f6ab0f6fb06d308a8fb3e68fe0198f7af8f1 GIT binary patch literal 12594 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 literal 0 HcmV?d00001 diff --git a/doc/primitives-circle2dwireframe.png b/doc/primitives-circle2dwireframe.png new file mode 100644 index 0000000000000000000000000000000000000000..b049fabc62fe51d892ffe3603ee5a681cb1d214b GIT binary patch literal 2106 zcma)-`6CmI1IFhb4HGjgDeoM$Le9{ebFVDl*>VgqX0GMRm8;oCz0stUE+I$c-0)V0 zGNhcVTy111XIO|N*S@{~!TbF3JU=|o^Xn%AgLaUWQIi1x0J4r}?9TxJBEO>u04V<3 zHj@1W0022VN{TB74gMO=~}Qv`oSZ`r6nb$MGklxj`|XSU{rWFJ+Z|eg&qUA z13aza^k+FjR9ci@H6FY&2g& zkS}#|2(OO!%pB!FJ@f2W!%jbx`#X)me4q62Dfh8c@EX!RXHn3SwBt$H7@o!CkO~4w zE#6<7IfVFAWXe|jVtB4|S$V3>S?4v*XLt`k>Xi>e`C;{T-pScFYp=R#t{p4_#Be&aa@$4N_~$ygq$~&>J?eS3P15<3;WW0 zxbnGWS)!7niUoX2ch90E|SDS$?8wp_;t3?L%sUun)Y^0J84FH7@nRI z!@_$PIB|8`OwzybSHGGo#~;?RlWyS)^l_+;VwNRE5w&syIXR;V zM#IuU zvl=VuX<2!rACaQfSWcbtN;GgSKC8Ea+S%^GWf-f4MkZ^SL#2G2i3U>qo@A{v)L&C_TmMz~q` zKh8hV;6v+nZT1K5*(+J1u7%!rSQqBQ_XSHXXw0`9d||t1AM|-L_`)DJql}`d2s{ny zn~iOqa3J>=l8HqdGwujXUwG*uYG{x=60eOSRK!4%?KG1_^T~wDQ;=mq}%e54?O(Az~ljtI5 z_@^Ek5JHrYm7*C>;DB``u)$?&Q2a5}m3dR33KyRWKsw?2y506xuTo>uUc;lfb&_63}-b$d|lT*eH@P{^D8kDepaBv*HF~JOY)7X*dJ#CTg)ujK zx~Zlo68Mt&fVnDCb=*kQke3(uK&04X=kY_b$aERDzrrt%Y6YN1s++pf9d1lsEAILa}l=W31In~;wkKJSq z4*9#$oZ4{F$JOXtwfx7GSnolAU&@aJ^C#V-s$&vx;4_j?q|aSZ-1`${*G>f-7b^5O zr4+*^xqENErOUHUU6hP{fyy|P*s2vGd8mACxM@1mtF>a6y#q(@YkE#;OGqbfGbtax zopJt9v&(*xnv;eWJdR$ODl)`uL)9R2v$xhZgcylew!M&w$?f&6M|Q0n&gPrhs3V)b z&yA-$I3mkh-Fk9Ew`KPDX5SDxYj*}>8FwhK-9Y7t`aiCUScpd6A>zy`!{h=)bz-S+ zMW0QQM7%f#Mz&E_Vjz$Tb(-9T45*tAChg zZnu>CLRhLzH}=>iax5#ea(IGowz#E0Ci5+dsvxX7*LBCFd^K%TH~?Wq)xmp`Or`vV zzRjYaf4c+W5z}#1{k~~SXna2x9vRYmXb_+mGnaWO|Fuat7iAP z_65+qS@us~6~z52j4dsw5X}DMW&X=;+cdT@{eq z;8K>8m8tD{q_TRs+G$=2qHlJ4p$HXYi2}cg-sy!zv7cA^WeX6nvlc2BB8@uGk|^sT z2kCcEM)b}-+q)z!kI3d{F=vM2tHjfajtQkZmz|~INm`e;V7%$Z%Kc;E(2@AcHb0d& z7qE`&*vwDt`u#6~L|;f?-sPH;=;Db3U~=csADSMo z-h0op8CK`ClaeLHUI*mP>R(^kDycJiMe@k$b<5T9%!QURLM+M5W#y5u@u6$h4z2`) z1E4@Y_J9sOn5K_IRzNw%F@^8{rQ$)I@B6Ev{|&&uTbK2PBE1uRJ1ZoZ*S{l2B-)-~ H>zDd}{WIIn literal 0 HcmV?d00001 diff --git a/doc/primitives-circle3dsolid.png b/doc/primitives-circle3dsolid.png new file mode 100644 index 0000000000000000000000000000000000000000..a8772ce0a97a592951eb34ca853e198e5eb98b6e GIT binary patch literal 14673 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

R&h9YVvTOy7_At-y( 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 literal 0 HcmV?d00001 diff --git a/doc/primitives-crosshair2d.png b/doc/primitives-crosshair2d.png new file mode 100644 index 0000000000000000000000000000000000000000..1dd240a242d1cf6ded7d94b0aec3639c482458bc GIT binary patch literal 1188 zcmeAS@N?(olHy`uVBq!ia0y~yU<5K588}#g)VJz{w+sv{*`6+rAr*0N?-&LtMN70j zjAV4pOUg=1%Sy`I*%a4!lxc;Lnv#i%l34=d4yGFp;X7H<*lkPKnJ)dZ_wkFVZEf!> z4^3Y5$9MksIr8>EQ?URm0|~yix28!vZKc7zw^p-M)>YPItrvXq@#W8@d)+2vg_x&5 ze;b+<6LanC+1%=>3aihiT#HjaQL{5*`*n_>c}#n_Im$|7&BL$14Q;w|w&E5@&N6=6 zbq=F>*L!v-0kpP@qN*=R=%O z^k}Wwww6Ue-d%eRXAnJAcj52$Z(5EmiVtDvqgZyd(?tmH)U*i(Dz`p&Z$5NUZhj7@ zt8iP3cC^!>2^ohb6d<9Bb6oAx{<#qO^ww5IkajiW^wz~-iy!TDv72L{0zvbwZ8V<;K{39QfH^H_Pu+>cjwzZ zQa_n*Y_yA0vX{7br*HY^)SowAr)`{fCNFRAmUkZW^(NX|?_aI9`RK2&&GYq-UtXR4 z|D&vS;)#X-ci&U1xx2>fbE@g5vZQ=I@iv~e@ay0C->d(LE#=`~qMm*~(WClM|8liI zj&EPD`Ec~w#27rO6-|E+9^Ahkc= z%HEt^tN)83)%sid=g;%|@0R6E_%6Kf595pvg12sOTz_!t=0oc5A3s>tqPY9M&?0s_ z>6o|HJPU*4`PY3DZM(4Y`t+^;)pxwI0t(&dU$<|cstf-cqaC+WC7hP;;#^lI2vm~S zy!w5MVo8?$!KvO)s?+x$y!!mGfK};^2e0xIIp+Ra{~+so{1^G3!9Xp)gkyHP)UE#| z9y8V8i9vd6^B3zKuO9a*sz0)5T5We%qDYDD@cG>1-|f}iaTp;5 zyCKA-#?uK>1XK}zNC4<1PUlC!bPG?Uz!VBhs^?TcfwG8~M3T40EMQ^=CSyqA29t+w m3UQfB{Q3bZWH3NO-XEsR-W%nz)`!`GBt2dIT-G@yGywqNLLLbK literal 0 HcmV?d00001 diff --git a/doc/primitives-crosshair3d.png b/doc/primitives-crosshair3d.png new file mode 100644 index 0000000000000000000000000000000000000000..a44400a75477f5e689c07feeb87441ceac81c571 GIT binary patch literal 1272 zcmaJ>ZB&v66n^QoH#4aB*e0Ydu{_o~X;d1eVx(qTQ*b$_YoyGU3MpjHC_jKwIju}5 zp1GsU?=s8MXiiOq$Skd8YLZBPm6qZc8YV7!c}MN+oc-$lx%WKxKF|GgpL>oTxDRJx zZ2(<1$M_5y4#OxSYj)aNJ(aas zu$HDR%`Oh|+h&pOTLXk*jumgauqM-nTuBS|L+75`xjd#kxh0(GxkM|{_cZ6(?Ka7N zGKzyMPea1YsFrgTu!@_5uf076hg>hjv#7JyHT~n@5_YYwRD5csFaZB3vjPs?a1cCm zDDLtKnmrE(L*62VGK7F#3n>M|uEZ_x)<3aN_yBK*EjY3e@UBP^^8AGPUsOL6SSH#7 zmJBoLIP-8&S~v!)c#hbNqeKU6T#sOu*-72_QE+l)nqv0D(BqG!$P?c?)K^5g5|as% zYD)SYY+4Th+B50@?Tl#HRSkJi8lxP#ths@Ns$gBI`)reC!XUM6vaGyiSYutIb_>ep z5y>;>Gw=TN$c`_vxFIBVdWI?inuP z8bvbot4yqMoq?gOTHb(yl~iCJTIos2J0MqIjQahn&ZbC$M=-casZ8`}G}5MyjD#H? zZH?b9@t_9=Y_*+}e$ z@HmuuMJc-ow6wX##a&N_Ly;81=gyPKkEJOmHUFwQ9 zu2g*$v#MdfXwAz%)!I5iJ$-@s&cHs_J)Y%Rh#|rItJ>Wc>`%)#@bIQ%<=md{9VkCO z4qvG*Kr#@-X-AB$n;DCk>%->b;2VmLPr%V-Ut%2xzAK#3;nFM?8X*pOyo&<19F4?>)X2>f0 zpdEops)S~{*~BrnE3p#bY1}gq{KGfdo@Dh_c)!ne&v5>0P9JsS`(^tG*bb9xW?iLS zYypXoFU&UA7_(Kj_#kjcFY4yM*6-PBsO5h)OjC5);+LB^g#O&2&0ciKizOIYce8;W zLU4h9ew;34nPdutbS~}5fbc;1Cm+ebP2yD)*xep$bC2z`^aJ9*H_+#XSHzir0R3-6 A!vFvP literal 0 HcmV?d00001 diff --git a/doc/primitives-cubesolid.png b/doc/primitives-cubesolid.png new file mode 100644 index 0000000000000000000000000000000000000000..ad86392e596be9aa5bb12c851bdd0db242328ae2 GIT binary patch literal 18318 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 literal 0 HcmV?d00001 diff --git a/doc/primitives-cylindersolid.png b/doc/primitives-cylindersolid.png new file mode 100644 index 0000000000000000000000000000000000000000..0190e5e317173cb2853128f0d9305509eac8662d GIT binary patch literal 29091 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 Dl2R|N literal 0 HcmV?d00001 diff --git a/doc/primitives-cylinderwireframe.png b/doc/primitives-cylinderwireframe.png new file mode 100644 index 0000000000000000000000000000000000000000..9afe77f60bb95725fd1774d64ab9add2534e93f7 GIT binary patch literal 3657 zcmb7{`8yQe7sqFsLO#t{vyMoXB9RP3GIqu`vS&{cV;fS^SSCJgvQI|V@rf7|6=jPV zlrYwY#0c4jG$#AlztiXY4}8D(mwTV{yw5qWbDsO0=ibM*HfCU630?pI07jY{+W`PT z&JhUUIn3EMu-;4n0K$(nHgLEz%Jd*VIW;0sK-NF){H09&dTX{|SQ$TDE$hR_GXG<} z9|P>=>Ak{v$rKrgqDbDMY4g^$x7jrq_lN|n_sAstfu2Y;^sE^cEgkcvci!xPaYAI_I}EU73E=Fz?-e&hPuHLp*yI4w6Ahj<5Px9{9a?XTBV9Zd{1= zAI+aGp72jmm@wM|n!Xa5-)O%F+f~R@NuFT7xU$Ha8aRB-c^Nj&e)4Xe{b`gv@^!s- znWzRV|FxRiZ?^}Z-*}5?VM|ZNvD7k-YwSgYSR>pZ)>JB0Dsp-8bLq_9CS}OlORgwX z!@1Gg9Ph33xz4F$jZPvhsCXWxKO!WLgbVpZSQd<8|zVpLmn;#$=3b?W(c)Xu6cC=ai9^tEwKz}`zbHBeA;wU02OD}lzX9!FGY zYhAsKm-|SJ`Kb@ayq$8JW+>04A>Tf3*$6H|7KEQ41epC8_sQ34K}R_p>NVZ1@Q77? zAVEP#OD-KhHB|FPnd zQ=0_P6!8eG=6c48K;ztj7&(rqHjYCI!209}Bsj z7O*9IH0bS`KhTPs-!m(K$Ty#wmT4ivS(=Gx7==xrcfzr&gN3tTynB91tm8J3&k_Ug zb-s@>wtIfLoa|U0}U|Qi@0$v4j!;qFkROU!?)yA0E;^L2FNZ{UAdonO)H%y z7=`0JUtPg!`!Tx|(^B8V9Tl>>LOP+fF( zY-E{oL0~yo|FA2Ql@zeek;64i9JC7tRx&Ou1E`i}1+G;Q*M= zG@g^7Trw#-W7flK!;9I$A2y)MCn(wQ{=SI|j3-=Fl`9GvOaYD2O59UCu`mjlyRO8# ze%0`gA{Ln~**w#F;rJ%kZ%CLlZTk%Uz;kCk5rm461> zG46A;Bnj?*7BvP~iH6~bps~6BKV}ke7dok9g}2}uA^|@@C-tH;MrBJ#Z8ECdb(_#L z6AndOzr%4mG~NG-$DotV@U!^hGj^am$#by@j|RCyOr*H#wJA&r((#CJ*`IKl@g?h5 zo&(?en$dE?C_z^q`r4*TQ2Kzk=2eT$!T&`z&o<@QsK6z8w_$3x-l**bAY5K#Grhrz zTgVX&V0Hb>0TpK$m~f8Kk)bl#Dn8}^wg`*G9lKOv2V!eeUfp~9_p4+DST9n~$cVU) zlVG?jZIL)&XNZ~oG>Hv)PW~HS80?1^Psl7x+v-?$87*&7i)#mKuCwlF<`5A4p!!rQ&X8FCh@}5<#e3Q6c{Fxr7C4yECKQpV3 ztx4DtJGd2f69mC%WG8ufPSaVx$?W7x-?S`HuRK9>Qn_kbrP(7+xW1^E0L8evziqEA z$JQ@%3w`#I!06jRg|dP=HkDqQVut+njN@o8xG>?A)v4FZwF8>v8D0B2dFWg~9u(sO zEm<|1^;#$TNG2!bN@Db{LS&-u2sx=#5CX3`UxT>349;vqH=_z^_Uf0q(cM7AXV!@r za!w{po+8f?{4DZM^G;QLh+lk;sb3syoi8ij}b-9OuJG6hvc95KfooR^sy^W9(tsh8=F37b- zh~`obls^GAf~sfjuhH=3C8V;=1Kk44IfUMI_lXmehCth;gAr|9cbpQsGKbXQ(spnm zoT9x-Kl#eWX0LHP4)zt0hyh5Ebch$68QsCuwryfMX#U1IONFH>0;2`37^W4L4428@ zlCLB%0Abl(yxyLWx|$8=Cm{a}rLjX9M3Db=6jAZ%rTW&N99MseQ+5g}b888#GwiPN zZmJ8a4hv#HfBZgb---8rJlRmLE+ zpV{=dnfFe~m-VZbF6AllqA=+9p6p0UmlIUaqxF!DSV{(Ymx1m21oVyd-4_Sf9(8W? zu`fHj@O4&#>vs|;k(K#F_paUA4rNyyY^Jp?B6`zzJ1)Vv zp`>-g1G}N%LS6sJ6I0~ZhcUxrGGA6a??--HNguu$HS=Zh_(Nv%^+(OxMRU7b2lnno z@Uay?D!Rbo+);Q%)CyF;R>*PjL583oFt1I~4O)^XJv(kV8B%e&*5IS3Z9;KXM0%rD z*fWJCg^xDmRu`tHdM-64?3<_6!`G<+hcLt40ruIJ5V0IOe>~r`AVs>SUKv7{L=vSP zk66HfW5N&JP9U3x8lP3p6cQ?SQL}S^#-D9$t#ekhhKcEssdvLh;(KOiy*wYV2-UYvR%`URyw=+x53#Vsb#m|ZhUi;(2z z*{~o83ZAsL6suHR3gs(QOHClWmg?d)Ahlf0|$4P3n#d{I|O%kcXtc!5FA2qcX#&?+}&Lc1bexkzw!23v!*}I zba%r*W08nJ4#Z>_Sh_5LG03P=1rRP#+0RWhSWW+_jd#zpi!x>>N zH$Szm{oWz~6@&m(sKl>9-JToveYnfqErtdYavwt;Ym=@ZzG-C$MvfH7?SY+yYWeC^{mtxjHN8Gb9JV{UH&{Z=AY01~>FCQer3qNceMO9woCH z|3Rn9%rT^ZwSRpXVCYEU7ncW5nVp~lR8kVQgyw$$cysfQooj$V+(}7E&Q8lU`lDlc zpMU=M!HmSzoSX{+TwHD|Hy0NxGkJL{GrNnR{`&f8)8rIi-*KppC};4`T?qzl$A_SF z+@@jSkClVkY7F5k3UT2UVvISNr)slvQl$&h+0zTo;^LHx&Z(2L22yTr__o+jMgbNJlYAB zNanzxSWHqesLt3y=x++wMn@&Cg2Hqrmo0aC!o$!wVnJaE9P5_;G>yj(GpC#s2pT~A zXP)2ZZmprO{mdE`J=5W0ad}B7p0kuDGwYtiUXt(JrWhASM>H82B*vK~LBY9>l7-Lu zc*iLg5drT71iGB`$D8{C;|_A(GjV%0A`cG8v@-C2+$ru9Zw{B$)R^bb8?hUWJQ%mp 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 G8Sy^}HM>~= literal 0 HcmV?d00001 diff --git a/doc/primitives-line2d.png b/doc/primitives-line2d.png new file mode 100644 index 0000000000000000000000000000000000000000..57b080f2b30b0875ab353be040e7f47edcedf712 GIT binary patch literal 525 zcmeAS@N?(olHy`uVBq!ia0y~yU<5K588}#g)VJz{w?NJnPZ!6Kid%1QZOlF7Akmhn z)^X|bg-aJN?kdbTY*crUW9Xc9N>z1gHW!n-PND} zZt?(4BOTP;Kfc_wV@u4{vma|}c^2ymq{d$Hy?%e*VT+#Y$3MoHn>ieDj1Swr?R9&h zMEl1g`#Gnw_HEGnf3IfaO8(`i|Nd@&|0{O4-k-;dx$Jwkr(eH*cGm_iM)tqEZoIqC zy?^C&?bkx#KVnyZP-OqR<-_g0hmOZQjcc`^Cu+Ch!}Q+|mwZqR-?{15R(tlnhup>f zeGB=q;n4p2HK9Ki9NKSpO{*s1;qJJH&0PQgZ43ia_O*Sb7urSYe#z`!Df>mSb-vy4 zX;Yi+7JZnPEE@N)m@EH*)|L-!>qO!nPF`2Uw$5oikWk{UVh-OJZpj?}u=Tr)bXWy* z_(c#S9LQMMYF;23TXBA4AczqKWK4uGn8PRj2l5_DJ3M^6y}^|9Kn3b}z+c1o=f$m( T7g3qZKn8fa`njxgN@xNAGLy;p literal 0 HcmV?d00001 diff --git a/doc/primitives-line3d.png b/doc/primitives-line3d.png new file mode 100644 index 0000000000000000000000000000000000000000..c8c8c5d2b0f771794727744d38aa57b7a7986c77 GIT binary patch literal 479 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 YB@QaP9l4wVZ(1Q&^iA|Cb@7q^1O2Vte*gdg literal 0 HcmV?d00001 diff --git a/doc/primitives-planewireframe.png b/doc/primitives-planewireframe.png new file mode 100644 index 0000000000000000000000000000000000000000..89cf7c455759bda82a4a877552679ac5c62c2904 GIT binary patch literal 1228 zcma)+YfMvj7{<@xuofAo>(m4(M{HaIEW`$oGH_yxD-0q+Wh#(x&4QYG;i@fI*qOkl zT<7QnCJd;ktjKL_1ZmS2hhR#|CEPZlP=o^p2IYW48(O+kSu#J&Wbc>v|K@$3=l6d4 z-{OXT4%^af0RVu5gE-*;01{6Su(2lE#`XAR0I)6%=J=l$JYUwdUZF)Hf%s8S{IK@w zLh+q%oN()PYn%Il;%jXpM$D;8Z43eG|J+HE9;AQo;0Em6NegJTmr3&*;rXp9@9?_E zzgKQmA1*h%+C`+lyR^0yr-uWYllEIV*y)_Szs*{YXq$>Ea?Laap9wX|A79^R=Q1jv zLFriYV(MbV>$=7CiIUF@^vH^RSQ2F&>vP-QPDyJy=AmMlHirb$g*{^*a|{cAAeXHC zRV-|!i!R7hO*;*^nMHRevJU_JD7tVhEJ}Cww^8YC%p5ZD1tb=IwPNO4T0V_>-?+}y zo;Q7Mjxvn?)u@VqUi{EZ60)(R65T@~lOAi}u{+jA(PXRv#EI<_Vw>w02j7g4)2K~C zrq)Unr)DhWPaq@2#SNe$#89>co*}|5I2+G1gnNqRU>DRht+Js~NaF9Agdq9IpSJBgbufc5vX#l}h6 z;F38*e{waX2^`LInI2-+jBgHpBqJp&6|IuyPEs;k2y4+*ni9mBD70PCwW?A$D#00I zcybXScaH-Un`RK9#z8)G87UVL)2Mz+5)j{%o^{C{NeH3{PQc|1A2zH7m`Z;MhOj8q#j(*-rK+m1Tj`@IR|Q*$>_jWV2b`($?-ydE#+l;5&t&Ded_5ErNDj>^_x@tRO3}Yys_R;Z*8oHR%auAEYSNmv8wD^nNN8 zzJVr|eKM8jqs0Uf2a9n=H<&29$Tuu|=-nbS2u|J(XBh8i9GC%SV;(`4D=sK*B+3fX zP@FLW_DH#85x#;&v{dS;!Wki`%j L5Xxyf9)II+TaPK2 literal 0 HcmV?d00001 diff --git a/doc/primitives-squaresolid.png b/doc/primitives-squaresolid.png new file mode 100644 index 0000000000000000000000000000000000000000..a73bad2605e8c3bb22112c49895a28c736945fdf GIT binary patch literal 7049 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 literal 0 HcmV?d00001 diff --git a/doc/primitives-uvspheresolid.png b/doc/primitives-uvspheresolid.png new file mode 100644 index 0000000000000000000000000000000000000000..2b6e73c246ad65e7856024d892137485a9ae2c15 GIT binary patch literal 33374 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 TAcJ`NF9`wN$3~i1br|}8MwAOV literal 0 HcmV?d00001 diff --git a/src/Magnum/Primitives/Axis.h b/src/Magnum/Primitives/Axis.h index d54b32c31..8a4ee24ac 100644 --- a/src/Magnum/Primitives/Axis.h +++ b/src/Magnum/Primitives/Axis.h @@ -39,6 +39,9 @@ namespace Magnum { namespace Primitives { Two color-coded arrows for visualizing orientation (XY is RG). Indexed @ref MeshPrimitive::Lines with vertex colors. + +@image html primitives-axis2d.png + @see @ref axis3D(), @ref crosshair2D(), @ref line2D() */ MAGNUM_PRIMITIVES_EXPORT Trade::MeshData2D axis2D(); @@ -48,6 +51,9 @@ MAGNUM_PRIMITIVES_EXPORT Trade::MeshData2D axis2D(); Three color-coded arrows for visualizing orientation (XYZ is RGB). Indexed @ref MeshPrimitive::Lines with vertex colors. + +@image html primitives-axis3d.png + @see @ref axis2D(), @ref crosshair3D(), @ref line3D() */ MAGNUM_PRIMITIVES_EXPORT Trade::MeshData3D axis3D(); diff --git a/src/Magnum/Primitives/Capsule.h b/src/Magnum/Primitives/Capsule.h index 1dc569d13..0b650d934 100644 --- a/src/Magnum/Primitives/Capsule.h +++ b/src/Magnum/Primitives/Capsule.h @@ -48,6 +48,9 @@ namespace Magnum { namespace Primitives { Cylinder of radius @cpp 1.0f @ce along Y axis with hemispheres instead of caps. Indexed @ref MeshPrimitive::Lines. + +@image html primitives-capsule2dwireframe.png + @see @ref capsule3DSolid(), @ref capsule3DWireframe(), @ref circle2DWireframe(), @ref squareWireframe() */ @@ -92,6 +95,8 @@ Indexed @ref MeshPrimitive::Triangles with normals and optional 2D texture coordinates. If texture coordinates are generated, vertices of one segment are duplicated for texture wrapping. +@image html primitives-capsule3dsolid.png + The capsule is by default created with radius set to @f$ 1.0 @f$. In order to get radius @f$ r @f$, length @f$ l @f$ and preserve correct normals, set @p halfLength to @f$ 0.5 \frac{l}{r} @f$ and then scale all @@ -113,6 +118,9 @@ MAGNUM_PRIMITIVES_EXPORT Trade::MeshData3D capsule3DSolid(UnsignedInt hemisphere Cylinder of radius @cpp 1.0f @ce along Y axis with hemispheres instead of caps. Indexed @ref MeshPrimitive::Lines. + +@image html primitives-capsule3dwireframe.png + @see @ref capsule2DWireframe(), @ref capsule3DSolid(), @ref cylinderSolid() */ MAGNUM_PRIMITIVES_EXPORT Trade::MeshData3D capsule3DWireframe(UnsignedInt hemisphereRings, UnsignedInt cylinderRings, UnsignedInt segments, Float halfLength); diff --git a/src/Magnum/Primitives/Circle.h b/src/Magnum/Primitives/Circle.h index b94b75c6a..7b124e40c 100644 --- a/src/Magnum/Primitives/Circle.h +++ b/src/Magnum/Primitives/Circle.h @@ -43,6 +43,9 @@ namespace Magnum { namespace Primitives { @param segments Number of segments. Must be greater or equal to @cpp 3 @ce. Circle with radius @cpp 1.0f @ce. Non-indexed @ref MeshPrimitive::TriangleFan. + +@image html primitives-circle2dsolid.png + @see @ref circle2DWireframe(), @ref circle3DSolid() */ MAGNUM_PRIMITIVES_EXPORT Trade::MeshData2D circle2DSolid(UnsignedInt segments); @@ -52,6 +55,9 @@ MAGNUM_PRIMITIVES_EXPORT Trade::MeshData2D circle2DSolid(UnsignedInt segments); @param segments Number of segments. Must be greater or equal to @cpp 3 @ce. Circle with radius @cpp 1.0f @ce. Non-indexed @ref MeshPrimitive::LineLoop. + +@image html primitives-circle2dwireframe.png + @see @ref circle2DSolid(), @ref circle3DWireframe() */ MAGNUM_PRIMITIVES_EXPORT Trade::MeshData2D circle2DWireframe(UnsignedInt segments); @@ -80,6 +86,9 @@ struct MAGNUM_PRIMITIVES_EXPORT Circle { Circle on the XY plane with radius @cpp 1.0f @ce. Non-indexed @ref MeshPrimitive::TriangleFan with normals in positive Z direction. + +@image html primitives-circle3dsolid.png + @see @ref circle3DWireframe(), @ref circle2DSolid() */ MAGNUM_PRIMITIVES_EXPORT Trade::MeshData3D circle3DSolid(UnsignedInt segments); @@ -90,6 +99,9 @@ MAGNUM_PRIMITIVES_EXPORT Trade::MeshData3D circle3DSolid(UnsignedInt segments); Circle on the XY plane with radius @cpp 1.0f @ce. Non-indexed @ref MeshPrimitive::LineLoop. + +@image html primitives-circle3dwireframe.png + @see @ref circle2DSolid(), @ref circle3DWireframe() */ MAGNUM_PRIMITIVES_EXPORT Trade::MeshData3D circle3DWireframe(UnsignedInt segments); diff --git a/src/Magnum/Primitives/Crosshair.h b/src/Magnum/Primitives/Crosshair.h index c7d505ff2..5640a0f3e 100644 --- a/src/Magnum/Primitives/Crosshair.h +++ b/src/Magnum/Primitives/Crosshair.h @@ -42,6 +42,9 @@ namespace Magnum { namespace Primitives { @brief 2D crosshair 2x2 crosshair (two crossed lines), non-indexed @ref MeshPrimitive::Lines. + +@image html primitives-crosshair2d.png + @see @ref crosshair3D(), @ref axis2D(), @ref line2D() */ MAGNUM_PRIMITIVES_EXPORT Trade::MeshData2D crosshair2D(); @@ -63,6 +66,9 @@ struct MAGNUM_PRIMITIVES_EXPORT Crosshair2D { @brief 3D crosshair 2x2x2 crosshair (three crossed lines), non-indexed @ref MeshPrimitive::Lines. + +@image html primitives-crosshair3d.png + @see @ref crosshair2D(), @ref axis2D(), @ref line3D() */ MAGNUM_PRIMITIVES_EXPORT Trade::MeshData3D crosshair3D(); diff --git a/src/Magnum/Primitives/Cube.h b/src/Magnum/Primitives/Cube.h index 676b55f9e..618d160a2 100644 --- a/src/Magnum/Primitives/Cube.h +++ b/src/Magnum/Primitives/Cube.h @@ -42,6 +42,9 @@ namespace Magnum { namespace Primitives { @brief Solid 3D cube Indexed @ref MeshPrimitive::Triangles with flat normals. + +@image html primitives-cubesolid.png + @see @ref cubeSolidStrip(), @ref cubeWireframe() */ MAGNUM_PRIMITIVES_EXPORT Trade::MeshData3D cubeSolid(); @@ -51,6 +54,9 @@ MAGNUM_PRIMITIVES_EXPORT Trade::MeshData3D cubeSolid(); Non-indexed @ref MeshPrimitive::TriangleStrip. Just positions, no normals or anything else. + +@image html primitives-cubesolid.png + @see @ref cubeSolid(), @ref cubeWireframe() */ MAGNUM_PRIMITIVES_EXPORT Trade::MeshData3D cubeSolidStrip(); @@ -59,6 +65,9 @@ MAGNUM_PRIMITIVES_EXPORT Trade::MeshData3D cubeSolidStrip(); @brief Wireframe 3D cube Indexed @ref MeshPrimitive::Lines. + +@image html primitives-cubewireframe.png + @see @ref cubeSolid(), @ref cubeSolidStrip() */ MAGNUM_PRIMITIVES_EXPORT Trade::MeshData3D cubeWireframe(); diff --git a/src/Magnum/Primitives/Cylinder.h b/src/Magnum/Primitives/Cylinder.h index 8e6578faf..b466125e7 100644 --- a/src/Magnum/Primitives/Cylinder.h +++ b/src/Magnum/Primitives/Cylinder.h @@ -70,6 +70,7 @@ Cylinder along Y axis of radius @cpp 1.0f @ce. Indexed optional capped ends. If texture coordinates are generated, vertices of one segment are duplicated for texture wrapping. +@image html primitives-cylindersolid.png The cylinder is by default created with radius set to @f$ 1.0 @f$. In order to get radius @f$ r @f$, length @f$ l @f$ and preserve correct normals, set @@ -90,6 +91,9 @@ MAGNUM_PRIMITIVES_EXPORT Trade::MeshData3D cylinderSolid(UnsignedInt rings, Unsi Cylinder along Y axis of radius @cpp 1.0f @ce. Indexed @ref MeshPrimitive::Lines. + +@image html primitives-cylinderwireframe.png + @see @ref cylinderSolid() */ MAGNUM_PRIMITIVES_EXPORT Trade::MeshData3D cylinderWireframe(UnsignedInt rings, UnsignedInt segments, Float halfLength); diff --git a/src/Magnum/Primitives/Icosphere.h b/src/Magnum/Primitives/Icosphere.h index df96855cd..8559446e2 100644 --- a/src/Magnum/Primitives/Icosphere.h +++ b/src/Magnum/Primitives/Icosphere.h @@ -44,6 +44,9 @@ namespace Magnum { namespace Primitives { Sphere with radius @cpp 1.0f @ce. Indexed @ref MeshPrimitive::Triangles with normals. + +@image html primitives-icospheresolid.png + @see @ref uvSphereSolid(), @ref uvSphereWireframe() */ MAGNUM_PRIMITIVES_EXPORT Trade::MeshData3D icosphereSolid(UnsignedInt subdivisions); diff --git a/src/Magnum/Primitives/Line.h b/src/Magnum/Primitives/Line.h index 4f573ba91..5e86a373e 100644 --- a/src/Magnum/Primitives/Line.h +++ b/src/Magnum/Primitives/Line.h @@ -43,6 +43,9 @@ namespace Magnum { namespace Primitives { Unit-size line in direction of positive X axis. Non-indexed @ref MeshPrimitive::Lines. + +@image html primitives-line2d.png + @see @ref line3D(), @ref axis2D(), @ref crosshair2D() */ MAGNUM_PRIMITIVES_EXPORT Trade::MeshData2D line2D(); @@ -52,6 +55,9 @@ MAGNUM_PRIMITIVES_EXPORT Trade::MeshData2D line2D(); Unit-size line in direction of positive X axis. Non-indexed @ref MeshPrimitive::Lines. + +@image html primitives-line3d.png + @see @ref line2D(), @ref axis3D(), @ref crosshair3D() */ MAGNUM_PRIMITIVES_EXPORT Trade::MeshData3D line3D(); diff --git a/src/Magnum/Primitives/Plane.h b/src/Magnum/Primitives/Plane.h index 558235c7d..9a433588d 100644 --- a/src/Magnum/Primitives/Plane.h +++ b/src/Magnum/Primitives/Plane.h @@ -55,6 +55,9 @@ enum class PlaneTextureCoords: UnsignedByte { 2x2 plane. Non-indexed @ref MeshPrimitive::TriangleStrip on the XY plane with normals in positive Z direction. + +@image html primitives-planesolid.png + @see @ref planeWireframe(), @ref squareSolid() */ MAGNUM_PRIMITIVES_EXPORT Trade::MeshData3D planeSolid(PlaneTextureCoords textureCoords = PlaneTextureCoords::DontGenerate); @@ -63,6 +66,9 @@ MAGNUM_PRIMITIVES_EXPORT Trade::MeshData3D planeSolid(PlaneTextureCoords texture @brief Wireframe 3D plane 2x2 plane. Non-indexed @ref MeshPrimitive::LineLoop on the XY plane. + +@image html primitives-planewireframe.png + @see @ref planeSolid(), @ref squareWireframe() */ MAGNUM_PRIMITIVES_EXPORT Trade::MeshData3D planeWireframe(); diff --git a/src/Magnum/Primitives/Square.h b/src/Magnum/Primitives/Square.h index 6ec853b37..043d2f72e 100644 --- a/src/Magnum/Primitives/Square.h +++ b/src/Magnum/Primitives/Square.h @@ -54,6 +54,9 @@ enum class SquareTextureCoords: UnsignedByte { @brief Solid 2D square 2x2 square. Non-indexed @ref MeshPrimitive::TriangleStrip. + +@image html primitives-squaresolid.png + @see @ref squareWireframe(), @ref planeSolid() */ MAGNUM_PRIMITIVES_EXPORT Trade::MeshData2D squareSolid(SquareTextureCoords textureCoords = SquareTextureCoords::DontGenerate); @@ -62,6 +65,9 @@ MAGNUM_PRIMITIVES_EXPORT Trade::MeshData2D squareSolid(SquareTextureCoords textu @brief Wireframe 2D square 2x2 square. Non-indexed @ref MeshPrimitive::LineLoop. + +@image html primitives-squarewireframe.png + @see @ref squareSolid(), @ref planeWireframe() */ MAGNUM_PRIMITIVES_EXPORT Trade::MeshData2D squareWireframe(); diff --git a/src/Magnum/Primitives/UVSphere.h b/src/Magnum/Primitives/UVSphere.h index 8e88ef15b..4f65d09c9 100644 --- a/src/Magnum/Primitives/UVSphere.h +++ b/src/Magnum/Primitives/UVSphere.h @@ -59,6 +59,9 @@ enum class UVSphereTextureCoords: UnsignedByte { Sphere with radius @cpp 1.0f @ce. Indexed @ref MeshPrimitive::Triangles with normals and optional 2D texture coordinates. If texture coordinates are generated, vertices of one segment are duplicated for texture wrapping. + +@image html primitives-uvspheresolid.png + @see @ref icosphereSolid() */ MAGNUM_PRIMITIVES_EXPORT Trade::MeshData3D uvSphereSolid(UnsignedInt rings, UnsignedInt segments, UVSphereTextureCoords textureCoords = UVSphereTextureCoords::DontGenerate); @@ -71,6 +74,9 @@ MAGNUM_PRIMITIVES_EXPORT Trade::MeshData3D uvSphereSolid(UnsignedInt rings, Unsi @cpp 4 @ce and multiple of @cpp 4 @ce. Sphere with radius @cpp 1.0f @ce. Indexed @ref MeshPrimitive::Lines. + +@image html primitives-uvspherewireframe.png + @see @ref icosphereSolid() */ MAGNUM_PRIMITIVES_EXPORT Trade::MeshData3D uvSphereWireframe(UnsignedInt rings, UnsignedInt segments);