Triangles sorting
This commit is contained in:
parent
737cb2a23c
commit
1263aac944
@ -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)
|
@ -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});
|
||||||
|
|
||||||
|
|
||||||
|
42
programs/lab5/src/sort.hpp
Normal file
42
programs/lab5/src/sort.hpp
Normal 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;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user