From 1263aac944e3becc6b87ca8569b40f62df6228c1 Mon Sep 17 00:00:00 2001 From: Andrew Golovashevich Date: Mon, 10 Mar 2025 18:14:11 +0300 Subject: [PATCH] Triangles sorting --- programs/lab5/CMakeLists.txt | 1 + programs/lab5/src/main.cpp | 8 ++++--- programs/lab5/src/sort.hpp | 42 ++++++++++++++++++++++++++++++++++++ 3 files changed, 48 insertions(+), 3 deletions(-) create mode 100644 programs/lab5/src/sort.hpp 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 #include #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 renderer_custom{}; + QtUtilities::SeparateThreadedDefaultRendererLinear renderer_custom{}; renderer_custom.set_sprite_data_provider(&sprites_data_custom); - renderer_custom.set_sprites(reinterpret_cast *const *>(sprites), sprites_count); + renderer_custom.set_sprites(reinterpret_cast *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 + +#include +#include +#include +#include +#include + +#include "triangle.hpp" + + +namespace BGTU::ComputerGraphicsLabWork::Impl { + class SortSprite : public RendererApi::Sprite { + 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