#pragma once #include "Hover_Tooltip.h" #include "Plottable.h" #include "../axis/Axis.h" #include "../renderable/Render_Partition.h" #include #include #include namespace renderive { struct Waterfall_Properties : Hover_Tooltip_Properties { Range frequency_range{0.0, 10.0}; Range power_range{0.0, 10.0}; Nonnegative_Count frequency_bin_count; Render_Partition_Mode partition_mode{Render_Partition_Mode::Automatic}; Positive_Count partition_count; bool visible_range_only{true}; Image_Interpolation_Mode interpolation_mode = Image_Interpolation_Mode::Nearest; Color_Map color_map; }; namespace detail { class LIB_DECL Waterfall_Control : public Plottable_State, public Event_Handler, public ::Render_Frame_Completion { public: Waterfall_Control(::Scene_Base& scene, const Waterfall_Properties& properties, std::shared_ptr frequency_axis, std::shared_ptr time_axis); ~Waterfall_Control() override; void append_row(int tick, std::span values); void append_row(int tick, std::pmr::vector&& values); void append_row(Time_Of_Day time, std::span values); void append_row(Time_Of_Day time, std::pmr::vector&& values); template void append_row(int tick, const Values& values) { append_row(tick, std::span(values.data(), values.size())); } template void append_row(Time_Of_Day time, const Values& values) { append_row(time, std::span(values.data(), values.size())); } [[nodiscard]] std::size_t row_count() const; [[nodiscard]] std::size_t stored_point_count() const; [[nodiscard]] std::size_t rendered_cell_count() const; void handle_event(const Event& event) override; protected: void prepare_frame(const Prepare_Render_Context& context) override; void paint(Painter& painter, const Paint_Render_Context& context) override; void build_prepare_graph(Renderable_Graph_Builder& builder) override; void build_paint_graph(Renderable_Graph_Builder& builder) override; private: struct Impl; std::unique_ptr impl_; void prepare_render_frame(const Render_State_View& state, int graph_partition_count); void paint_render_frame(Painter& painter, const Render_State_View& state); void render_frame_completed(std::uint64_t target_interval_ns) noexcept override; void render_partition(int partition_index); void publish() override; }; } using Waterfall = detail::Attach_Plottable; }