仍有bug

This commit is contained in:
2026-08-17 15:24:28 +08:00
parent e793c6a278
commit 5e976b27dd
39 changed files with 1059 additions and 6658 deletions
@@ -28,8 +28,6 @@ struct Afterglow_Prepare_Buffer {
}
struct Afterglow::Impl
: Base::next_Impl<Impl>, ::Render_Frame_Completion {
static_assert(inheritance::Inherits_Chain_Parent<
Impl, Base::next_Impl<Impl>>);
Impl(renderive_Owner<Frequency_Axis> frequency,
renderive_Owner<Axis> power) : frequency_axis(std::move(frequency)),
power_axis(std::move(power)) {}
@@ -9,8 +9,7 @@
#include <deque>
#include <numbers>
#include <optional>
namespace renderive {
namespace detail {
namespace renderive::detail {
namespace {
struct Timed_Point {
PointF point;
@@ -20,8 +19,6 @@ using Constellation_History = Plottable_History_Real_Time_Data<Timed_Point, std:
}
struct Constellation_Diagram::Impl
: Base::next_Impl<Impl> {
static_assert(inheritance::Inherits_Chain_Parent<
Impl, Base::next_Impl<Impl>>);
struct Prepare_Buffer {
std::vector<PointF> anchors;
std::vector<PointF> points;
@@ -64,9 +61,9 @@ Constellation_Diagram::Observer Constellation_Diagram::capture_observation() con
void Constellation_Diagram::fit_square_to_axes() {
const auto state = Renderable::state<State>();
const double side = std::max(state.i_range.size(), state.q_range.size());
d_func<Impl>().i_axis->set < &Axis_Properties::coordinates > (
d_func<Impl>().i_axis->set<&Axis_Properties::coordinates>(
Range{state.i_range.center() - side * 0.5, state.i_range.center() + side * 0.5});
d_func<Impl>().q_axis->set < &Axis_Properties::coordinates > (
d_func<Impl>().q_axis->set<&Axis_Properties::coordinates>(
Range{state.q_range.center() + side * 0.5, state.q_range.center() - side * 0.5});
}
void Constellation_Diagram::Impl::prepare_frame(
@@ -108,4 +105,3 @@ void Constellation_Diagram::Impl::paint(Painter& painter,
Brush{state.point_color, Brush_Style::Solid});
}
}
}
@@ -7,15 +7,12 @@
#include <deque>
#include <optional>
#include <vector>
namespace renderive {
namespace detail {
namespace renderive::detail {
namespace {
using Frequency_Trace_History = Plottable_History_Real_Time_Data<std::pair<int, double>, std::deque<std::pair<int, double>>>;
}
struct Frequency_Trace::Impl
: Base::next_Impl<Impl> {
static_assert(inheritance::Inherits_Chain_Parent<
Impl, Base::next_Impl<Impl>>);
struct Prepare_Buffer {
std::vector<PointF> points;
};
@@ -78,4 +75,3 @@ void Frequency_Trace::Impl::paint(Painter& painter,
control.render_state<State>(view).pen);
}
}
}
@@ -7,8 +7,7 @@
#include <cmath>
#include <sstream>
#include <optional>
namespace renderive {
namespace detail {
namespace renderive::detail {
namespace {
struct Selection_Interaction {
bool selecting{};
@@ -24,8 +23,6 @@ struct Selection_Rectangle_Overlay::Impl
: Base::next_Impl<Impl>,
Renderable_Event_Handler {
using Observer = Selection_Rectangle_Overlay::Observer;
static_assert(inheritance::Inherits_Chain_Parent<
Impl, Base::next_Impl<Impl>>);
struct Prepared_Region {
RectF pixels;
std::string label;
@@ -175,4 +172,3 @@ void Selection_Rectangle_Overlay::Impl::paint(
state.selection_brush);
}
}
}
@@ -7,8 +7,7 @@
#include <cmath>
#include <deque>
#include <optional>
namespace renderive {
namespace detail {
namespace renderive::detail {
namespace {
using Sweep_Spectrum_History = Plottable_History_Real_Time_Data<std::vector<double>, std::deque<std::vector<double>>>;
std::vector<double> flatten(const std::deque<std::vector<double>>& blocks) {
@@ -20,8 +19,6 @@ std::vector<double> flatten(const std::deque<std::vector<double>>& blocks) {
struct Sweep_Spectrum::Impl
: Base::next_Impl<Impl> {
using Observer = Sweep_Spectrum::Observer;
static_assert(inheritance::Inherits_Chain_Parent<
Impl, Base::next_Impl<Impl>>);
friend struct Sweep_Spectrum::Observer;
struct Prepare_Buffer {
std::vector<PointF> points;
@@ -117,4 +114,3 @@ void Sweep_Spectrum::Impl::paint(Painter& painter,
state.current_frequency_pen);
}
}
}
@@ -63,8 +63,6 @@ struct Waterfall::Impl
Renderable_Event_Handler,
::Render_Frame_Completion {
using Observer = Waterfall::Observer;
static_assert(inheritance::Inherits_Chain_Parent<
Impl, Base::next_Impl<Impl>>);
Impl(renderive_Owner<Frequency_Axis> frequency,
renderive_Owner<Time_Axis> time) : frequency_axis(std::move(frequency)), time_axis(std::move(time)) {}
renderive_Owner<Frequency_Axis> frequency_axis;
+1 -2
View File
@@ -31,8 +31,7 @@ struct LIB_DECL Waterfall : Renderable<Waterfall> {
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;
Image_Interpolation_Mode interpolation_mode = Image_Interpolation_Mode::Nearest;
Color_Map color_map;
};
struct Observer : next_Observer<Observer> {
+1 -1
View File
@@ -14,7 +14,7 @@ struct Blend2D_Color_Cache final : ::Color_Cache {
[[nodiscard]] Size size() const noexcept;
[[nodiscard]] Image_View view() const noexcept;
private:
friend class Painter;
friend struct Painter;
BLImage image_;
};
struct Painter {
@@ -11,7 +11,7 @@
namespace renderive {
class Abs_Axis;
namespace detail {
class Paint_Overlay;
struct Paint_Overlay;
template <class Renderable_Type, class Axis_Type> requires std::derived_from<Renderable_Type, Renderable> && std::derived_from<Axis_Type, Abs_Axis>
void attach_renderable_dependency(::Scene_2D_Base::Attach_Builder& builder, const renderive_Owner<Renderable_Type>& renderable, const renderive_Owner<Axis_Type>& axis) {
if (!axis) return;
@@ -41,12 +41,12 @@ struct Renderable_Builder {
Renderable_Builder(Properties properties, Validator validator, ::Scene_2D_Base::Attach_Builder* attach_builder = nullptr) : properties(std::move(properties)), validator(std::move(validator)), attach_builder_(attach_builder) {}
template <auto Member, Property_Member_Assignable<Properties, Member> Value>
Self& set(Value&& value) {
properties.*Member = std::forward < Value > (value);
properties.*Member = std::forward<Value>(value);
return *this;
}
template <Property_Configurator<Properties> Configure>
Self& configure(Configure&& configure) {
std::invoke(std::forward < Configure > (configure), properties);
std::invoke(std::forward<Configure>(configure), properties);
return *this;
}
const Properties& properties_value() const noexcept {
@@ -51,6 +51,10 @@ struct detail::Render_Scene_2D::Impl
std::shared_ptr<const Frame_Control_Strategy_Base> frame_control_strategy() const override {
return frame_control->runtime();
}
void replace_frame_control_strategy(
std::shared_ptr<Frame_Control_Strategy_Base> strategy) override {
frame_control->replace(std::move(strategy));
}
std::shared_ptr<Color_Cache> make_renderable_color_cache() override {
std::pmr::polymorphic_allocator<detail::Blend2D_Color_Cache>
allocator(&memory_resource());
+5 -2
View File
@@ -88,21 +88,24 @@ protected:
using Editor_Base::Editor_Base;
};
public:
struct State : Base::template next_State<State> {
struct State_Fields {
Size viewport;
Color background = Color::black();
};
struct State : Base::template next_State<State>, State_Fields {
[[nodiscard]] bool operator==(const State& other) const {
return viewport == other.viewport &&
background == other.background;
}
};
struct Observer : Base::template next_Observer<Observer> {
struct Observer_Fields {
State state;
std::size_t renderable_count{};
double frequency_hz{};
std::uint64_t next_refresh_interval_ns{};
bool view_active{};
};
struct Observer : Base::template next_Observer<Observer>, Observer_Fields {};
[[nodiscard]] ::renderive_Owner<::renderive::Renderable> root_renderable() const;
void dispatch_event(const Event& event);
[[nodiscard]] auto render_frame(bool force = false) -> Expected<Plot_Render_Status, Plot_Render_Frame_Error>;
@@ -31,5 +31,21 @@ TEST(RenderScene2DIntegration, FrameImageMatchesConfiguredViewport) {
});
}
TEST(RenderScene2DIntegration, FrameStrategyIsReplacedInsideRenderableEdit) {
Render_Scene_2D::State state;
state.viewport = {48, 27};
auto scene = Render_Scene_2D::Builder{state}.build(
std::make_shared<Low_Latency_Render_Scene_2D_Strategy>());
const auto operation = scene->edit_renderables(
[](Scene_2D_Base::Renderable_Editor& editor) {
editor.replace_frame_control_strategy(
std::make_shared<Manual_Render_Scene_2D_Strategy>());
});
ASSERT_EQ(operation.wait(), Scene_Edit_Error::none);
EXPECT_NE(std::dynamic_pointer_cast<Manual_Render_Scene_2D_Strategy>(
scene->frame_control_strategy()),
nullptr);
}
} // namespace
} // namespace renderive