Files
Renderive/YSGraphic_Core/base/Plot.h
T
2026-07-23 18:11:07 +08:00

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