84 lines
3.2 KiB
C++
84 lines
3.2 KiB
C++
#pragma once
|
|
#include <cstdint>
|
|
#include <QTime>
|
|
#include "../Renderable.h"
|
|
namespace YSG {
|
|
void LIB_DECL start_render_scheduler();
|
|
class Render_Scheduler;
|
|
struct PlotPrivate;
|
|
class Performance_Shower;
|
|
class LIB_DECL Plot : public QWidget {
|
|
Q_OBJECT
|
|
public:
|
|
bool use_performance_shower();
|
|
void set_use_performance_shower(bool use);
|
|
virtual void init() {
|
|
init_layer();
|
|
}
|
|
void render();
|
|
QColor background_color();
|
|
bool first_resize = true, first_prepare_data = true;
|
|
void set_background_color(const QColor& color) const;
|
|
Plot_Buffer_Acquire_Mode paint_buffer_acquire_mode() const;
|
|
void set_paint_buffer_acquire_mode(Plot_Buffer_Acquire_Mode mode);
|
|
Plot_Buffer_Acquire_Mode render_able_buffer_acquire_mode() const;
|
|
void set_render_able_buffer_acquire_mode(Plot_Buffer_Acquire_Mode mode);
|
|
Plot_Render_Schedule_Mode render_schedule_mode() const;
|
|
void set_render_schedule_mode(Plot_Render_Schedule_Mode mode);
|
|
double render_check_fps() const;
|
|
void set_render_check_fps(double fps);
|
|
double max_render_fps() const;
|
|
void set_max_render_fps(double fps);
|
|
void mark_render_state_dirty();
|
|
void request_render(Render_Request_Source source = Render_Request_Source::Dirty);
|
|
struct Layer {
|
|
QString layer_name;
|
|
QVector<Renderable*> renderable_list;
|
|
};
|
|
QString object_name;
|
|
QList<Layer*> layer_list;
|
|
QString default_layer_name;
|
|
virtual void init_layer() {
|
|
auto addLayer = [this](QString&& name) {
|
|
auto layer = new Layer;
|
|
layer->layer_name = name;
|
|
layer_list.append(layer);
|
|
mLayerMap[name] = layer;
|
|
};
|
|
addLayer("background");
|
|
addLayer("plottable");
|
|
addLayer("axis");
|
|
addLayer("legend");
|
|
default_layer_name = "plottable";
|
|
}
|
|
bool is_rendering();
|
|
void start_render(int refreshTimesPreSecond);
|
|
void start_render() const;
|
|
void pause_render() const;
|
|
Plot();
|
|
~Plot() override;
|
|
PlotPrivate* d{};
|
|
private:
|
|
QHash<QString, Layer*> mLayerMap;
|
|
bool event(QEvent* event) final;
|
|
void paintEvent(QPaintEvent* event) final;
|
|
void schedule_render_timer();
|
|
bool submit_render_once();
|
|
void on_render_request(Render_Request_Source source);
|
|
bool submit_render_with_fps_limit();
|
|
void schedule_max_fps_submit(std::uint64_t targetNs);
|
|
bool has_submit_candidate(Render_Request_Source source, std::uint64_t nowNs);
|
|
bool render_able_ready_for_submit(Renderable* able, Render_Request_Source source, std::uint64_t nowNs, bool independent);
|
|
void mark_render_able_submitted(Renderable* able, std::uint64_t nowNs);
|
|
void finish_render();
|
|
void request_update(const QRegion& region);
|
|
void render_color(Renderable::Color_Buffer* color, QSize size, QColor background, std::uint64_t version);
|
|
void mark_independent_render_dirty(Renderable* able, Render_Request_Source source = Render_Request_Source::Dirty);
|
|
void submit_independent_render(Renderable* able, Render_Request_Source source);
|
|
void render_independent_color(Renderable* able, Pixel_Buffer_Slot* pixel, QSize size, std::uint64_t version);
|
|
void finish_independent_render(Renderable* able);
|
|
friend class Render_Scheduler;
|
|
friend struct Renderable;
|
|
};
|
|
}
|