diff --git a/programs/lab5/CMakeLists.txt b/programs/lab5/CMakeLists.txt index 6ffdf65..1a5fcb1 100644 --- a/programs/lab5/CMakeLists.txt +++ b/programs/lab5/CMakeLists.txt @@ -5,6 +5,7 @@ add_executable( src/sprite_data.hpp src/model.cpp src/triangle.hpp + src/sort.hpp ) target_link_libraries(lab5 PRIVATE Qt5::Core Qt5::Widgets renderer_api utilities qt_utilities) \ No newline at end of file diff --git a/programs/lab5/src/main.cpp b/programs/lab5/src/main.cpp index a49c247..476958d 100644 --- a/programs/lab5/src/main.cpp +++ b/programs/lab5/src/main.cpp @@ -14,6 +14,7 @@ #include <bgtu/computer_graphics_lab_work/qt_utilities/renderer_widget.hpp> #include <bgtu/computer_graphics_lab_work/qt_utilities/keyboard_catcher_widget.hpp> #include "sprite_data.hpp" +#include "sort.hpp" #include "model.hpp" namespace BGTU::ComputerGraphicsLabWork::Impl { @@ -40,11 +41,12 @@ namespace BGTU::ComputerGraphicsLabWork::Impl { QObject::connect(&kbd, &QtUtilities::KeyboardCatcherWidget::key_pressed_PageUp, &sprites_data_custom, &SpriteData::Provider::inc_scale); QObject::connect(&kbd, &QtUtilities::KeyboardCatcherWidget::key_pressed_P, &sprites_data_custom, &SpriteData::Provider::switch_projection); + SortSprite sprites_sort{sprites, sprites_count}; + SortSprite *sprites_sort_arr[1] = {&sprites_sort}; - - QtUtilities::SeparateThreadedDefaultRendererLinear<SpriteData> renderer_custom{}; + QtUtilities::SeparateThreadedDefaultRendererLinear<SpriteData> renderer_custom{}; renderer_custom.set_sprite_data_provider(&sprites_data_custom); - renderer_custom.set_sprites(reinterpret_cast<RendererApi::Sprite <SpriteData, Utilities::DefaultVoxelDrawerCache::VoxelPainterImpl> *const *>(sprites), sprites_count); + renderer_custom.set_sprites(reinterpret_cast<RendererApi::Sprite<SpriteData, Utilities::DefaultVoxelDrawerCache::VoxelPainterImpl> *const *>(sprites_sort_arr), 1); renderer_custom.set_background(BGTU::ComputerGraphicsLabWork::RendererApi::Color{0, 0, 0}); diff --git a/programs/lab5/src/sort.hpp b/programs/lab5/src/sort.hpp new file mode 100644 index 0000000..3cbad21 --- /dev/null +++ b/programs/lab5/src/sort.hpp @@ -0,0 +1,42 @@ +#pragma once + +#include <algorithm> + +#include <bgtu/computer_graphics_lab_work/renderer_api/point.hpp> +#include <bgtu/computer_graphics_lab_work/renderer_api/sprite.hpp> +#include <bgtu/computer_graphics_lab_work/utilities/matrix.hpp> +#include <bgtu/computer_graphics_lab_work/utilities/shader.hpp> +#include <bgtu/computer_graphics_lab_work/utilities/shapes/triangle.hpp> + +#include "triangle.hpp" + + +namespace BGTU::ComputerGraphicsLabWork::Impl { + class SortSprite : public RendererApi::Sprite<SpriteData> { + private: + Triangle const *const *triangles; + std::size_t triangles_count; + public: + SortSprite( + Triangle const *const *triangles, + std::size_t triangles_count + + ) : triangles{triangles}, triangles_count{triangles_count} {} + + void draw(BGTU::ComputerGraphicsLabWork::RendererApi::VirtualVoxelPainter *frame, SpriteData const *data) const override { + auto indices = new std::size_t[this->triangles_count]; + for (std::size_t i = this->triangles_count; i-- > 0;) { + indices[i] = i; + } + + std::sort(indices, indices + this->triangles_count, [this](std::size_t l, std::size_t r) -> bool { + return (this->triangles[l]->triangle_p0.z + this->triangles[l]->triangle_p1.z + this->triangles[l]->triangle_p2.z) / 3 > (this->triangles[r]->triangle_p0.z + this->triangles[r]->triangle_p1.z + this->triangles[r]->triangle_p2.z) / 3; + }); + + for (std::size_t i = 0; i < this->triangles_count; i++) { + this->triangles[indices[i]]->draw(frame, data); + } + delete[] indices; + } + }; +} \ No newline at end of file