Moving Projection from sprite arguments to sprite_data and changing source of sprite_data from field to provider
This commit is contained in:
parent
e1154fdf0a
commit
be82c26b01
@ -3,6 +3,7 @@
|
||||
#include <QTimer>
|
||||
#include <bgtu/computer_graphics_lab_work/renderer_api/color.hpp>
|
||||
#include <bgtu/computer_graphics_lab_work/utilities/default_renderer_linear.hpp>
|
||||
#include <bgtu/computer_graphics_lab_work/qt_utilities/separate_threaded_renderer.hpp>
|
||||
#include <bgtu/computer_graphics_lab_work/qt_utilities/renderer_widget.hpp>
|
||||
#include <bgtu/computer_graphics_lab_work/qt_utilities/owned_qimage.hpp>
|
||||
|
||||
@ -37,10 +38,10 @@ int main(int argc, char **argv) {
|
||||
|
||||
o oo{&frames};
|
||||
|
||||
BGTU::ComputerGraphicsLabWork::QtUtilities::SeparateThreadedDefaultRendererLinear<void> renderer{};
|
||||
BGTU::ComputerGraphicsLabWork::QtUtilities::SeparateThreadedDefaultRendererLinear<int> renderer{};
|
||||
QObject::connect(&renderer, &BGTU::ComputerGraphicsLabWork::QtUtilities::_SeparateThreadedRenderer_Signals::frame_rendered, &oo, &o::hit);
|
||||
renderer.set_background(BGTU::ComputerGraphicsLabWork::RendererApi::Color{0, 0, 0});
|
||||
BGTU::ComputerGraphicsLabWork::QtUtilities::RendererWidget<void> canvas{&renderer, &w};
|
||||
BGTU::ComputerGraphicsLabWork::QtUtilities::RendererWidget<int> canvas{&renderer, &w};
|
||||
w.setCentralWidget(&canvas);
|
||||
w.show();
|
||||
|
||||
|
@ -14,7 +14,7 @@
|
||||
|
||||
namespace BGTU::ComputerGraphicsLabWork::QtUtilities {
|
||||
template<class sprite_data_t, class renderer_context_t>
|
||||
using _SeparateThreadedRenderer_RenderProcedureType = void (renderer_context_t::*)(RendererApi::VoxelDrawer::visible_pixel_coordinate_fast_t, RendererApi::VoxelDrawer::visible_pixel_coordinate_fast_t, RendererApi::VoxelDrawer::Exporter *, RendererApi::Color, RendererApi::Projection const *, RendererApi::Sprite<sprite_data_t> *const *, std::size_t, sprite_data_t const *);
|
||||
using _SeparateThreadedRenderer_RenderProcedureType = void (renderer_context_t::*)(RendererApi::VoxelDrawer::visible_pixel_coordinate_fast_t, RendererApi::VoxelDrawer::visible_pixel_coordinate_fast_t, RendererApi::VoxelDrawer::Exporter *, RendererApi::Color, RendererApi::Sprite<sprite_data_t> *const *, std::size_t, sprite_data_t const *);
|
||||
|
||||
template<class sprite_data_t, class renderer_context_t, _SeparateThreadedRenderer_RenderProcedureType<sprite_data_t, renderer_context_t>>
|
||||
class SeparateThreadedRenderer;
|
||||
|
@ -14,6 +14,8 @@
|
||||
#include "owned_qimage.hpp"
|
||||
#include "_separate_threaded_renderer.hpp"
|
||||
|
||||
#define has_BGTU_ComputerGraphicsLabWork_QtUtilities_SeparateThreadedRenderer
|
||||
|
||||
namespace BGTU::ComputerGraphicsLabWork::QtUtilities {
|
||||
template<class sprite_data_t, class renderer_context_t, _SeparateThreadedRenderer_RenderProcedureType<sprite_data_t, renderer_context_t> renderer_procedure>
|
||||
class SeparateThreadedRenderer : public _SeparateThreadedRenderer_Signals {
|
||||
@ -22,10 +24,9 @@ namespace BGTU::ComputerGraphicsLabWork::QtUtilities {
|
||||
public:
|
||||
RendererApi::Sprite<sprite_data_t> *const *sprites;
|
||||
std::size_t sprites_count;
|
||||
sprite_data_t const *sprite_data;
|
||||
RendererApi::Sprite<sprite_data_t>::SpriteDataProvider *sprite_data_provider;
|
||||
std::uint_fast64_t ms_per_frame;
|
||||
RendererApi::VoxelDrawer::visible_pixel_coordinate_fast_t width, height;
|
||||
RendererApi::Projection *projection;
|
||||
RendererApi::Color bg;
|
||||
};
|
||||
|
||||
@ -77,9 +78,7 @@ namespace BGTU::ComputerGraphicsLabWork::QtUtilities {
|
||||
|
||||
void set_sprites(RendererApi::Sprite<sprite_data_t> *const *sprites, std::size_t sprites_count);
|
||||
|
||||
void set_sprite_data(sprite_data_t const *data);
|
||||
|
||||
void set_sprites_and_data(RendererApi::Sprite<sprite_data_t> *const *sprites, std::size_t sprites_count, sprite_data_t const *data);
|
||||
void set_sprite_data_provider(RendererApi::Sprite<sprite_data_t>::SpriteDataProvider *provider);
|
||||
|
||||
void set_background(RendererApi::Color) final;
|
||||
|
||||
@ -98,11 +97,10 @@ namespace BGTU::ComputerGraphicsLabWork::QtUtilities {
|
||||
next_data{
|
||||
.sprites = nullptr,
|
||||
.sprites_count = 0,
|
||||
.sprite_data = nullptr,
|
||||
.sprite_data_provider = nullptr,
|
||||
.ms_per_frame = 1000 / 60,
|
||||
.width = 0,
|
||||
.height = 0,
|
||||
.projection = nullptr
|
||||
} {
|
||||
this->thread->start();
|
||||
}
|
||||
@ -133,24 +131,13 @@ namespace BGTU::ComputerGraphicsLabWork::QtUtilities {
|
||||
}
|
||||
|
||||
template<class sprite_data_t, class renderer_context_t, _SeparateThreadedRenderer_RenderProcedureType<sprite_data_t, renderer_context_t> renderer_procedure>
|
||||
void SeparateThreadedRenderer<sprite_data_t, renderer_context_t, renderer_procedure>::set_sprite_data(sprite_data_t const *sprite_data) {
|
||||
void SeparateThreadedRenderer<sprite_data_t, renderer_context_t, renderer_procedure>::set_sprite_data_provider(RendererApi::Sprite<sprite_data_t>::SpriteDataProvider *provider) {
|
||||
this->sync.lock();
|
||||
const_cast<data_t *>(&this->next_data)->sprite_data = sprite_data;
|
||||
const_cast<data_t *>(&this->next_data)->sprite_data_provider = provider;
|
||||
this->thread->force_redraw();
|
||||
this->sync.unlock();
|
||||
}
|
||||
|
||||
template<class sprite_data_t, class renderer_context_t, _SeparateThreadedRenderer_RenderProcedureType<sprite_data_t, renderer_context_t> renderer_procedure>
|
||||
void SeparateThreadedRenderer<sprite_data_t, renderer_context_t, renderer_procedure>::set_sprites_and_data(RendererApi::Sprite<sprite_data_t> *const *sprites, std::size_t sprites_count, sprite_data_t const *sprite_data) {
|
||||
this->sync.lock();
|
||||
const_cast<data_t *>(&this->next_data)->sprites = sprites;
|
||||
const_cast<data_t *>(&this->next_data)->sprites_count = sprites_count;
|
||||
const_cast<data_t *>(&this->next_data)->sprite_data = sprite_data;
|
||||
this->thread->force_redraw();
|
||||
this->sync.unlock();
|
||||
}
|
||||
|
||||
|
||||
template<class sprite_data_t, class renderer_context_t, _SeparateThreadedRenderer_RenderProcedureType<sprite_data_t, renderer_context_t> renderer_procedure>
|
||||
void SeparateThreadedRenderer<sprite_data_t, renderer_context_t, renderer_procedure>::set_background(RendererApi::Color c) {
|
||||
this->sync.lock();
|
||||
@ -191,13 +178,24 @@ namespace BGTU::ComputerGraphicsLabWork::QtUtilities {
|
||||
}
|
||||
} img{cached.width, cached.height};
|
||||
|
||||
union {
|
||||
sprite_data_t data;
|
||||
bool nothing;
|
||||
} sprite_data_storage;
|
||||
sprite_data_t const *sprite_data;
|
||||
if (cached.sprite_data_provider != nullptr) {
|
||||
sprite_data_storage.data = cached.sprite_data_provider->get_sprite_data();
|
||||
sprite_data = &(sprite_data_storage.data);
|
||||
} else {
|
||||
sprite_data = nullptr;
|
||||
}
|
||||
|
||||
(this->owner->renderer_context->*renderer_procedure)(
|
||||
cached.width, cached.height,
|
||||
&img,
|
||||
cached.bg,
|
||||
cached.projection,
|
||||
cached.sprites, cached.sprites_count,
|
||||
cached.sprite_data
|
||||
sprite_data
|
||||
);
|
||||
emit this->owner->frame_rendered(new OwnedQImage{img.pixels_argb, img.w, img.h, QImage::Format_RGB32, img.owners, OwnedQImage::DelegateBuffers});
|
||||
auto elapsed = timer.elapsed();
|
||||
@ -215,4 +213,13 @@ namespace BGTU::ComputerGraphicsLabWork::QtUtilities {
|
||||
this->thread->requestInterruption();
|
||||
this->thread->wait();
|
||||
}
|
||||
|
||||
|
||||
template<class sprite_data_t>
|
||||
class SeparateThreadedDefaultRendererLinear : public SeparateThreadedRenderer<sprite_data_t, Utilities::DefaultVoxelDrawerCache, &Utilities::DefaultVoxelDrawerCache::render<sprite_data_t>> {
|
||||
private:
|
||||
Utilities::DefaultVoxelDrawerCache context;
|
||||
public:
|
||||
explicit SeparateThreadedDefaultRendererLinear(QObject *owner = nullptr) : SeparateThreadedRenderer<sprite_data_t, Utilities::DefaultVoxelDrawerCache, &Utilities::DefaultVoxelDrawerCache::render<sprite_data_t>>{&this->context, owner} {};
|
||||
};
|
||||
}
|
@ -12,6 +12,11 @@ namespace BGTU::ComputerGraphicsLabWork::RendererApi {
|
||||
template<class data_t>
|
||||
class Sprite : public SpriteMetadata {
|
||||
public:
|
||||
virtual void draw(VoxelDrawer *frame, Projection const *projection, data_t const *data) const = 0;
|
||||
virtual void draw(VoxelDrawer *frame, data_t const *data) const = 0;
|
||||
|
||||
class SpriteDataProvider {
|
||||
public:
|
||||
virtual data_t get_sprite_data() = 0;
|
||||
};
|
||||
};
|
||||
}
|
@ -15,8 +15,7 @@
|
||||
|
||||
class QObject;
|
||||
|
||||
namespace BGTU::ComputerGraphicsLabWork {
|
||||
namespace Utilities {
|
||||
namespace BGTU::ComputerGraphicsLabWork::Utilities {
|
||||
class DefaultVoxelDrawerCache {
|
||||
private:
|
||||
class ZElement {
|
||||
@ -150,7 +149,6 @@ namespace BGTU::ComputerGraphicsLabWork {
|
||||
RendererApi::VoxelDrawer::visible_pixel_coordinate_fast_t h,
|
||||
RendererApi::VoxelDrawer::Exporter *frame,
|
||||
RendererApi::Color bg,
|
||||
RendererApi::Projection const *projection,
|
||||
RendererApi::Sprite<sprite_data_t> *const *sprites,
|
||||
std::size_t sprites_count,
|
||||
sprite_data_t const *sprite_data
|
||||
@ -180,7 +178,6 @@ namespace BGTU::ComputerGraphicsLabWork {
|
||||
RendererApi::VoxelDrawer::visible_pixel_coordinate_fast_t h,
|
||||
RendererApi::VoxelDrawer::Exporter *frame,
|
||||
RendererApi::Color bg,
|
||||
RendererApi::Projection const *projection,
|
||||
RendererApi::Sprite<sprite_data_t> *const *sprites,
|
||||
std::size_t sprites_count,
|
||||
sprite_data_t const *sprite_data
|
||||
@ -202,7 +199,7 @@ namespace BGTU::ComputerGraphicsLabWork {
|
||||
|
||||
for (; sprites_count-- > 0; sprites++) {
|
||||
painter.current_artist = *sprites;
|
||||
(*sprites)->draw(&painter, projection, sprite_data);
|
||||
(*sprites)->draw(&painter, sprite_data);
|
||||
}
|
||||
|
||||
std::uint_fast16_t y = 0;
|
||||
@ -224,19 +221,4 @@ namespace BGTU::ComputerGraphicsLabWork {
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
namespace QtUtilities {
|
||||
template<class sprite_data_t, class renderer_context_t, void (renderer_context_t::*renderer_procedure)(RendererApi::VoxelDrawer::visible_pixel_coordinate_fast_t, RendererApi::VoxelDrawer::visible_pixel_coordinate_fast_t, RendererApi::VoxelDrawer::Exporter *, RendererApi::Color, RendererApi::Projection const *, RendererApi::Sprite<sprite_data_t> *const *, std::size_t, sprite_data_t const *)>
|
||||
class SeparateThreadedRenderer;
|
||||
|
||||
|
||||
template<class sprite_data_t>
|
||||
class SeparateThreadedDefaultRendererLinear : public SeparateThreadedRenderer<sprite_data_t, Utilities::DefaultVoxelDrawerCache, &Utilities::DefaultVoxelDrawerCache::render<sprite_data_t>> {
|
||||
private:
|
||||
Utilities::DefaultVoxelDrawerCache context;
|
||||
public:
|
||||
explicit SeparateThreadedDefaultRendererLinear(QObject *owner = nullptr) : SeparateThreadedRenderer<sprite_data_t, Utilities::DefaultVoxelDrawerCache, &Utilities::DefaultVoxelDrawerCache::render<sprite_data_t>>{&this->context, owner} {};
|
||||
};
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user