Triangles sorting

This commit is contained in:
Andrew Golovashevich 2025-03-10 18:14:11 +03:00
parent 737cb2a23c
commit 1263aac944
3 changed files with 48 additions and 3 deletions

View File

@ -5,6 +5,7 @@ add_executable(
src/sprite_data.hpp src/sprite_data.hpp
src/model.cpp src/model.cpp
src/triangle.hpp src/triangle.hpp
src/sort.hpp
) )
target_link_libraries(lab5 PRIVATE Qt5::Core Qt5::Widgets renderer_api utilities qt_utilities) target_link_libraries(lab5 PRIVATE Qt5::Core Qt5::Widgets renderer_api utilities qt_utilities)

View File

@ -14,6 +14,7 @@
#include <bgtu/computer_graphics_lab_work/qt_utilities/renderer_widget.hpp> #include <bgtu/computer_graphics_lab_work/qt_utilities/renderer_widget.hpp>
#include <bgtu/computer_graphics_lab_work/qt_utilities/keyboard_catcher_widget.hpp> #include <bgtu/computer_graphics_lab_work/qt_utilities/keyboard_catcher_widget.hpp>
#include "sprite_data.hpp" #include "sprite_data.hpp"
#include "sort.hpp"
#include "model.hpp" #include "model.hpp"
namespace BGTU::ComputerGraphicsLabWork::Impl { 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_PageUp, &sprites_data_custom, &SpriteData::Provider::inc_scale);
QObject::connect(&kbd, &QtUtilities::KeyboardCatcherWidget::key_pressed_P, &sprites_data_custom, &SpriteData::Provider::switch_projection); 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_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}); renderer_custom.set_background(BGTU::ComputerGraphicsLabWork::RendererApi::Color{0, 0, 0});

View File

@ -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;
}
};
}