改名
This commit is contained in:
@@ -1,5 +1,5 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
#include "render_2D/scene/Plot_Scene.h"
|
#include "render_2D/scene/Render_Scene_2D.h"
|
||||||
#include <QPointer>
|
#include <QPointer>
|
||||||
#include <memory>
|
#include <memory>
|
||||||
class QWidget;
|
class QWidget;
|
||||||
|
|||||||
+2
-2
@@ -33,7 +33,7 @@ QColor to_qcolor(Color color) {
|
|||||||
} // namespace
|
} // namespace
|
||||||
|
|
||||||
Abs_Plot_Private::Abs_Plot_Private(bool continuous_rendering)
|
Abs_Plot_Private::Abs_Plot_Private(bool continuous_rendering)
|
||||||
: scene(std::make_unique<Plot_Scene>()), continuous(continuous_rendering) {}
|
: scene(std::make_unique<Render_Scene_2D>()), continuous(continuous_rendering) {}
|
||||||
|
|
||||||
Abs_Plot_Private::~Abs_Plot_Private() = default;
|
Abs_Plot_Private::~Abs_Plot_Private() = default;
|
||||||
|
|
||||||
@@ -76,7 +76,7 @@ void Abs_Plot::init() {
|
|||||||
d->scene->init();
|
d->scene->init();
|
||||||
}
|
}
|
||||||
|
|
||||||
Plot_Scene* Abs_Plot::scene() const {
|
Render_Scene_2D* Abs_Plot::scene() const {
|
||||||
return d ? d->scene.get() : nullptr;
|
return d ? d->scene.get() : nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -13,7 +13,7 @@ class LIB_DECL Abs_Plot : public QWidget {
|
|||||||
public:
|
public:
|
||||||
virtual void init();
|
virtual void init();
|
||||||
[[nodiscard]] QColor background_color() const;
|
[[nodiscard]] QColor background_color() const;
|
||||||
[[nodiscard]] Plot_Scene* scene() const;
|
[[nodiscard]] Render_Scene_2D* scene() const;
|
||||||
[[nodiscard]] renderive_Owner<Renderable> root_renderable() const;
|
[[nodiscard]] renderive_Owner<Renderable> root_renderable() const;
|
||||||
void set_background_color(const QColor& color);
|
void set_background_color(const QColor& color);
|
||||||
~Abs_Plot() override;
|
~Abs_Plot() override;
|
||||||
|
|||||||
+1
-1
@@ -19,7 +19,7 @@ struct Abs_Plot_Private {
|
|||||||
void paint_event(Abs_Plot* plot);
|
void paint_event(Abs_Plot* plot);
|
||||||
void draw_performance_overlay(Abs_Plot* plot, QPainter& painter);
|
void draw_performance_overlay(Abs_Plot* plot, QPainter& painter);
|
||||||
|
|
||||||
std::unique_ptr<Plot_Scene> scene;
|
std::unique_ptr<Render_Scene_2D> scene;
|
||||||
std::shared_ptr<Qt_Presentation_Sink> presentation_sink;
|
std::shared_ptr<Qt_Presentation_Sink> presentation_sink;
|
||||||
QTimer* timer{};
|
QTimer* timer{};
|
||||||
bool continuous{};
|
bool continuous{};
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
#include "base/Types.h"
|
#include "base/Types.h"
|
||||||
#include "event/Event.h"
|
#include "event/Event.h"
|
||||||
#include "renderable/Renderable.h"
|
#include "renderable/Renderable.h"
|
||||||
#include "scene/Plot_Scene.h"
|
#include "scene/Render_Scene_2D.h"
|
||||||
#include "axis/Axis.h"
|
#include "axis/Axis.h"
|
||||||
#include "plottable/Hover_Tooltip.h"
|
#include "plottable/Hover_Tooltip.h"
|
||||||
#include "plottable/Plottables.h"
|
#include "plottable/Plottables.h"
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
#include "../base/Types.h"
|
#include "../base/Types.h"
|
||||||
#include "../scene/Plot_Scene.h"
|
#include "../scene/Render_Scene_2D.h"
|
||||||
#include <cstdint>
|
#include <cstdint>
|
||||||
#include <memory>
|
#include <memory>
|
||||||
#include <string>
|
#include <string>
|
||||||
@@ -45,10 +45,10 @@ struct LIB_DECL Performance_Overlay {
|
|||||||
[[nodiscard]] bool enabled() const noexcept;
|
[[nodiscard]] bool enabled() const noexcept;
|
||||||
[[nodiscard]] std::shared_ptr<const Performance_Display_Snapshot> display_snapshot() const;
|
[[nodiscard]] std::shared_ptr<const Performance_Display_Snapshot> display_snapshot() const;
|
||||||
private:
|
private:
|
||||||
friend std::shared_ptr<Performance_Overlay> attach_performance_overlay(Plot_Scene&);
|
friend std::shared_ptr<Performance_Overlay> attach_performance_overlay(Render_Scene_2D&);
|
||||||
friend std::shared_ptr<Performance_Overlay> attach_performance_overlay(Plot_Scene&, const Performance_Overlay_Options&);
|
friend std::shared_ptr<Performance_Overlay> attach_performance_overlay(Render_Scene_2D&, const Performance_Overlay_Options&);
|
||||||
friend void set_performance_plot_name(Plot_Scene&, std::string);
|
friend void set_performance_plot_name(Render_Scene_2D&, std::string);
|
||||||
friend void set_performance_overlay_enabled(Plot_Scene&, bool);
|
friend void set_performance_overlay_enabled(Render_Scene_2D&, bool);
|
||||||
struct Impl;
|
struct Impl;
|
||||||
std::unique_ptr<Impl> impl_;
|
std::unique_ptr<Impl> impl_;
|
||||||
void set_enabled(bool enabled);
|
void set_enabled(bool enabled);
|
||||||
@@ -60,14 +60,14 @@ private:
|
|||||||
std::size_t renderable_count,
|
std::size_t renderable_count,
|
||||||
Size viewport);
|
Size viewport);
|
||||||
};
|
};
|
||||||
inline std::shared_ptr<Performance_Overlay> attach_performance_overlay(Plot_Scene& scene) {
|
inline std::shared_ptr<Performance_Overlay> attach_performance_overlay(Render_Scene_2D& scene) {
|
||||||
if (auto existing = scene.performance_overlay())
|
if (auto existing = scene.performance_overlay())
|
||||||
return existing;
|
return existing;
|
||||||
auto overlay = std::make_shared<Performance_Overlay>();
|
auto overlay = std::make_shared<Performance_Overlay>();
|
||||||
scene.set_performance_overlay(overlay);
|
scene.set_performance_overlay(overlay);
|
||||||
return overlay;
|
return overlay;
|
||||||
}
|
}
|
||||||
inline std::shared_ptr<Performance_Overlay> attach_performance_overlay(Plot_Scene& scene, const Performance_Overlay_Options& options) {
|
inline std::shared_ptr<Performance_Overlay> attach_performance_overlay(Render_Scene_2D& scene, const Performance_Overlay_Options& options) {
|
||||||
if (auto existing = scene.performance_overlay()) {
|
if (auto existing = scene.performance_overlay()) {
|
||||||
existing->set_options(options);
|
existing->set_options(options);
|
||||||
scene.request_redraw();
|
scene.request_redraw();
|
||||||
@@ -77,14 +77,14 @@ inline std::shared_ptr<Performance_Overlay> attach_performance_overlay(Plot_Scen
|
|||||||
scene.set_performance_overlay(overlay);
|
scene.set_performance_overlay(overlay);
|
||||||
return overlay;
|
return overlay;
|
||||||
}
|
}
|
||||||
inline void set_performance_plot_name(Plot_Scene& scene, std::string name) {
|
inline void set_performance_plot_name(Render_Scene_2D& scene, std::string name) {
|
||||||
auto overlay = scene.performance_overlay();
|
auto overlay = scene.performance_overlay();
|
||||||
if (!overlay)
|
if (!overlay)
|
||||||
overlay = attach_performance_overlay(scene);
|
overlay = attach_performance_overlay(scene);
|
||||||
overlay->set_plot_name(std::move(name));
|
overlay->set_plot_name(std::move(name));
|
||||||
scene.request_redraw();
|
scene.request_redraw();
|
||||||
}
|
}
|
||||||
inline void set_performance_overlay_enabled(Plot_Scene& scene, bool enabled) {
|
inline void set_performance_overlay_enabled(Render_Scene_2D& scene, bool enabled) {
|
||||||
auto overlay = scene.performance_overlay();
|
auto overlay = scene.performance_overlay();
|
||||||
if (!overlay && !enabled)
|
if (!overlay && !enabled)
|
||||||
return;
|
return;
|
||||||
|
|||||||
@@ -1,203 +0,0 @@
|
|||||||
#include <renderive/error/Error_Policy.hpp>
|
|
||||||
#include "Plot_Scene.h"
|
|
||||||
#include "detail/Plot_Scene_Model.hpp"
|
|
||||||
#include "../plottable/Performance_Overlay.h"
|
|
||||||
#include "../renderable/Renderable.h"
|
|
||||||
#include <renderive/scene/base/Scene_Base.hpp>
|
|
||||||
|
|
||||||
#include <stdexcept>
|
|
||||||
#include <variant>
|
|
||||||
|
|
||||||
namespace renderive::detail {
|
|
||||||
void record_performance_frame(Performance_Overlay& overlay, double duration_ms, const Low_Latency_Diagnostics& diagnostics, std::size_t renderable_count, Size viewport) {
|
|
||||||
overlay.record_frame(duration_ms, diagnostics, renderable_count, viewport);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
namespace renderive {
|
|
||||||
namespace {
|
|
||||||
using Manual_Plot_Scene = Plot_Scene_Model<detail::Manual_Frame_Control>;
|
|
||||||
using Low_Latency_Plot_Scene = Plot_Scene_Model<detail::Low_Latency_Frame_Control>;
|
|
||||||
using Playback_Plot_Scene = Plot_Scene_Model<detail::Playback_Frame_Control>;
|
|
||||||
}
|
|
||||||
|
|
||||||
struct Plot_Scene::Impl {
|
|
||||||
using Model = std::variant<std::unique_ptr<Manual_Plot_Scene>,
|
|
||||||
std::unique_ptr<Low_Latency_Plot_Scene>,
|
|
||||||
std::unique_ptr<Playback_Plot_Scene>>;
|
|
||||||
|
|
||||||
explicit Impl(Plot_Frame_Mode mode) : mode(mode), model(create(mode)) {}
|
|
||||||
|
|
||||||
template <class Operation>
|
|
||||||
decltype(auto) apply(Operation&& operation) {
|
|
||||||
return std::visit(
|
|
||||||
[&operation](auto& scene) -> decltype(auto) {
|
|
||||||
return operation(*scene);
|
|
||||||
},
|
|
||||||
model);
|
|
||||||
}
|
|
||||||
|
|
||||||
template <class Operation>
|
|
||||||
decltype(auto) apply(Operation&& operation) const {
|
|
||||||
return std::visit(
|
|
||||||
[&operation](const auto& scene) -> decltype(auto) {
|
|
||||||
return operation(*scene);
|
|
||||||
},
|
|
||||||
model);
|
|
||||||
}
|
|
||||||
|
|
||||||
static Model create(Plot_Frame_Mode mode) {
|
|
||||||
switch (mode) {
|
|
||||||
case Plot_Frame_Mode::Manual:
|
|
||||||
return std::make_unique<Manual_Plot_Scene>();
|
|
||||||
case Plot_Frame_Mode::Low_Latency:
|
|
||||||
return std::make_unique<Low_Latency_Plot_Scene>();
|
|
||||||
case Plot_Frame_Mode::Playback:
|
|
||||||
return std::make_unique<Playback_Plot_Scene>();
|
|
||||||
}
|
|
||||||
::renderive::error::unexpected<std::invalid_argument>("unknown Plot_Scene frame mode");
|
|
||||||
}
|
|
||||||
|
|
||||||
Plot_Frame_Mode mode;
|
|
||||||
Model model;
|
|
||||||
};
|
|
||||||
|
|
||||||
Plot_Scene::Plot_Scene(Plot_Scene_Options options)
|
|
||||||
: impl_(std::make_unique<Impl>(options.frame_mode)) {}
|
|
||||||
|
|
||||||
Plot_Scene::~Plot_Scene() = default;
|
|
||||||
|
|
||||||
void Plot_Scene::init() { impl_->apply([](auto& scene) { scene.init(); }); }
|
|
||||||
|
|
||||||
renderive_Owner<Renderable> Plot_Scene::root_renderable() const {
|
|
||||||
return impl_->apply([](const auto& scene) { return scene.root_renderable(); });
|
|
||||||
}
|
|
||||||
|
|
||||||
Scene_2D_Base::Attach_Builder Plot_Scene::attach_builder() {
|
|
||||||
return static_cast<Scene_2D_Base&>(render_scene()).attach_builder();
|
|
||||||
}
|
|
||||||
|
|
||||||
Scene_Base::Edit_Operation Plot_Scene::edit_renderables(Scene_2D_Base::Renderable_Edit edit) {
|
|
||||||
return static_cast<Scene_2D_Base&>(render_scene()).edit_renderables(std::move(edit));
|
|
||||||
}
|
|
||||||
|
|
||||||
Scene_Base& Plot_Scene::render_scene() noexcept {
|
|
||||||
return impl_->apply([](auto& scene) -> Scene_Base& { return scene; });
|
|
||||||
}
|
|
||||||
|
|
||||||
const Scene_Base& Plot_Scene::render_scene() const noexcept {
|
|
||||||
return impl_->apply([](const auto& scene) -> const Scene_Base& { return scene; });
|
|
||||||
}
|
|
||||||
|
|
||||||
void Plot_Scene::set_background_color(Color color) {
|
|
||||||
impl_->apply([color](auto& scene) { scene.set_background_color(color); });
|
|
||||||
}
|
|
||||||
|
|
||||||
Color Plot_Scene::background_color() const {
|
|
||||||
return impl_->apply([](const auto& scene) { return scene.background_color(); });
|
|
||||||
}
|
|
||||||
|
|
||||||
void Plot_Scene::set_viewport_size(Size size) {
|
|
||||||
impl_->apply([size](auto& scene) { scene.set_viewport_size(size); });
|
|
||||||
}
|
|
||||||
|
|
||||||
Size Plot_Scene::viewport_size() const {
|
|
||||||
return impl_->apply([](const auto& scene) { return scene.viewport_size(); });
|
|
||||||
}
|
|
||||||
|
|
||||||
void Plot_Scene::dispatch_event(const Event& event) {
|
|
||||||
impl_->apply([&event](auto& scene) { scene.dispatch_event(event); });
|
|
||||||
}
|
|
||||||
|
|
||||||
tl::expected<void, Plot_Prepare_Frame_Error> Plot_Scene::prepare_frame() {
|
|
||||||
return impl_->apply([](auto& scene) { return scene.prepare_frame(); });
|
|
||||||
}
|
|
||||||
|
|
||||||
tl::expected<void, Plot_Refresh_Manual_Frame_Error> Plot_Scene::refresh_manual_frame() {
|
|
||||||
return impl_->apply([](auto& scene) { return scene.refresh_manual_frame(); });
|
|
||||||
}
|
|
||||||
|
|
||||||
tl::expected<void, Plot_Render_Prepared_Frame_Error> Plot_Scene::render_prepared_frame() {
|
|
||||||
return impl_->apply([](auto& scene) { return scene.render_prepared_frame(); });
|
|
||||||
}
|
|
||||||
|
|
||||||
bool Plot_Scene::discard_pending_frame() {
|
|
||||||
return impl_->apply([](auto& scene) { return scene.discard_pending_frame(); });
|
|
||||||
}
|
|
||||||
|
|
||||||
tl::expected<Plot_Render_Status, Plot_Render_Frame_Error>
|
|
||||||
Plot_Scene::render_frame(bool force) {
|
|
||||||
return impl_->apply([force](auto& scene) { return scene.render_frame(force); });
|
|
||||||
}
|
|
||||||
|
|
||||||
void Plot_Scene::with_frame(const std::function<void(Image_View)>& consumer) {
|
|
||||||
impl_->apply([&consumer](auto& scene) { scene.with_frame(consumer); });
|
|
||||||
}
|
|
||||||
|
|
||||||
void Plot_Scene::activate_view() {
|
|
||||||
impl_->apply([](auto& scene) { scene.activate_view(); });
|
|
||||||
}
|
|
||||||
|
|
||||||
void Plot_Scene::deactivate_view() noexcept {
|
|
||||||
impl_->apply([](auto& scene) { scene.deactivate_view(); });
|
|
||||||
}
|
|
||||||
|
|
||||||
bool Plot_Scene::view_active() const noexcept {
|
|
||||||
return impl_->apply([](const auto& scene) { return scene.view_active(); });
|
|
||||||
}
|
|
||||||
|
|
||||||
void Plot_Scene::request_redraw() noexcept { render_scene().notify_model_dirty(); }
|
|
||||||
|
|
||||||
tl::expected<void, Plot_Set_Max_Render_Fps_Error>
|
|
||||||
Plot_Scene::set_max_render_fps(double fps) {
|
|
||||||
return impl_->apply([fps](auto& scene) { return scene.set_max_render_fps(fps); });
|
|
||||||
}
|
|
||||||
tl::expected<void, Plot_Clear_Max_Render_Fps_Error>
|
|
||||||
Plot_Scene::clear_max_render_fps() {
|
|
||||||
return impl_->apply([](auto& scene) { return scene.clear_max_render_fps(); });
|
|
||||||
}
|
|
||||||
|
|
||||||
double Plot_Scene::max_render_fps() const {
|
|
||||||
return impl_->apply([](const auto& scene) { return scene.max_render_fps(); });
|
|
||||||
}
|
|
||||||
|
|
||||||
tl::expected<void, Plot_Set_Consumer_Feedback_Error>
|
|
||||||
Plot_Scene::set_consumer_feedback(Frame_Consumer_Feedback feedback) {
|
|
||||||
return impl_->apply([feedback](auto& scene) { return scene.set_consumer_feedback(feedback); });
|
|
||||||
}
|
|
||||||
tl::expected<void, Plot_Clear_Consumer_Feedback_Error>
|
|
||||||
Plot_Scene::clear_consumer_feedback() {
|
|
||||||
return impl_->apply([](auto& scene) { return scene.clear_consumer_feedback(); });
|
|
||||||
}
|
|
||||||
|
|
||||||
Plot_Frame_Mode Plot_Scene::frame_mode() const noexcept { return impl_->mode; }
|
|
||||||
|
|
||||||
Plot_Frame_Status Plot_Scene::frame_status() const {
|
|
||||||
return impl_->apply([](const auto& scene) { return scene.frame_status(); });
|
|
||||||
}
|
|
||||||
|
|
||||||
Low_Latency_Diagnostics Plot_Scene::diagnostics() const {
|
|
||||||
return impl_->apply([](const auto& scene) { return scene.diagnostics(); });
|
|
||||||
}
|
|
||||||
|
|
||||||
Refresh_Control_Snapshot Plot_Scene::refresh_feedback_snapshot() const {
|
|
||||||
return impl_->apply(
|
|
||||||
[](const auto& scene) { return scene.refresh_feedback_snapshot(); });
|
|
||||||
}
|
|
||||||
|
|
||||||
void Plot_Scene::set_presentation_sink(std::weak_ptr<Presentation_Sink> sink) {
|
|
||||||
impl_->apply([&sink](auto& scene) { scene.set_presentation_sink(std::move(sink)); });
|
|
||||||
}
|
|
||||||
|
|
||||||
std::shared_ptr<Performance_Overlay> Plot_Scene::performance_overlay() const {
|
|
||||||
return impl_->apply([](const auto& scene) { return scene.performance_overlay(); });
|
|
||||||
}
|
|
||||||
|
|
||||||
void Plot_Scene::set_performance_overlay(
|
|
||||||
std::shared_ptr<Performance_Overlay> overlay) {
|
|
||||||
impl_->apply([&overlay](auto& scene) {
|
|
||||||
scene.set_performance_overlay(std::move(overlay));
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
} // namespace renderive
|
|
||||||
@@ -0,0 +1,222 @@
|
|||||||
|
#include <renderive/error/Error_Policy.hpp>
|
||||||
|
#include "Render_Scene_2D.h"
|
||||||
|
#include "detail/Plot_Scene_Model.hpp"
|
||||||
|
#include "../plottable/Performance_Overlay.h"
|
||||||
|
#include "../renderable/Renderable.h"
|
||||||
|
#include <renderive/scene/base/Scene_Base.hpp>
|
||||||
|
#include <stdexcept>
|
||||||
|
#include <variant>
|
||||||
|
namespace renderive::detail {
|
||||||
|
void record_performance_frame(Performance_Overlay& overlay, double duration_ms, const Low_Latency_Diagnostics& diagnostics, std::size_t renderable_count, Size viewport) {
|
||||||
|
overlay.record_frame(duration_ms, diagnostics, renderable_count, viewport);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
namespace renderive {
|
||||||
|
namespace {
|
||||||
|
using Manual_Plot_Scene = Plot_Scene_Model<detail::Manual_Frame_Control>;
|
||||||
|
using Low_Latency_Plot_Scene = Plot_Scene_Model<detail::Low_Latency_Frame_Control>;
|
||||||
|
using Playback_Plot_Scene = Plot_Scene_Model<detail::Playback_Frame_Control>;
|
||||||
|
}
|
||||||
|
struct Render_Scene_2D::Impl {
|
||||||
|
using Model = std::variant<std::unique_ptr<Manual_Plot_Scene>,
|
||||||
|
std::unique_ptr<Low_Latency_Plot_Scene>,
|
||||||
|
std::unique_ptr<Playback_Plot_Scene>>;
|
||||||
|
explicit Impl(Plot_Frame_Mode mode) : mode(mode), model(create(mode)) {}
|
||||||
|
template <class Operation>
|
||||||
|
decltype(auto) apply(Operation&& operation) {
|
||||||
|
return std::visit(
|
||||||
|
[&operation](auto& scene) -> decltype(auto) {
|
||||||
|
return operation(*scene);
|
||||||
|
},
|
||||||
|
model);
|
||||||
|
}
|
||||||
|
template <class Operation>
|
||||||
|
decltype(auto) apply(Operation&& operation) const {
|
||||||
|
return std::visit(
|
||||||
|
[&operation](const auto& scene) -> decltype(auto) {
|
||||||
|
return operation(*scene);
|
||||||
|
},
|
||||||
|
model);
|
||||||
|
}
|
||||||
|
static Model create(Plot_Frame_Mode mode) {
|
||||||
|
switch (mode) {
|
||||||
|
case Plot_Frame_Mode::Manual:
|
||||||
|
return std::make_unique<Manual_Plot_Scene>();
|
||||||
|
case Plot_Frame_Mode::Low_Latency:
|
||||||
|
return std::make_unique<Low_Latency_Plot_Scene>();
|
||||||
|
case Plot_Frame_Mode::Playback:
|
||||||
|
return std::make_unique<Playback_Plot_Scene>();
|
||||||
|
}
|
||||||
|
::renderive::error::unexpected<std::invalid_argument>("unknown Plot_Scene frame mode");
|
||||||
|
}
|
||||||
|
Plot_Frame_Mode mode;
|
||||||
|
Model model;
|
||||||
|
};
|
||||||
|
Render_Scene_2D::Render_Scene_2D(Plot_Scene_Options options)
|
||||||
|
: impl_(std::make_unique<Impl>(options.frame_mode)) {}
|
||||||
|
Render_Scene_2D::~Render_Scene_2D() = default;
|
||||||
|
void Render_Scene_2D::init() {
|
||||||
|
impl_->apply([](auto& scene) {
|
||||||
|
scene.init();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
renderive_Owner<Renderable> Render_Scene_2D::root_renderable() const {
|
||||||
|
return impl_->apply([](const auto& scene) {
|
||||||
|
return scene.root_renderable();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
Scene_2D_Base::Attach_Builder Render_Scene_2D::attach_builder() {
|
||||||
|
return static_cast<Scene_2D_Base&>(render_scene()).attach_builder();
|
||||||
|
}
|
||||||
|
Scene_Base::Edit_Operation Render_Scene_2D::edit_renderables(Scene_2D_Base::Renderable_Edit edit) {
|
||||||
|
return static_cast<Scene_2D_Base&>(render_scene()).edit_renderables(std::move(edit));
|
||||||
|
}
|
||||||
|
Scene_Base& Render_Scene_2D::render_scene() noexcept {
|
||||||
|
return impl_->apply([](auto& scene) -> Scene_Base& {
|
||||||
|
return scene;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
const Scene_Base& Render_Scene_2D::render_scene() const noexcept {
|
||||||
|
return impl_->apply([](const auto& scene) -> const Scene_Base& {
|
||||||
|
return scene;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
void Render_Scene_2D::set_background_color(Color color) {
|
||||||
|
impl_->apply([color](auto& scene) {
|
||||||
|
scene.set_background_color(color);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
Color Render_Scene_2D::background_color() const {
|
||||||
|
return impl_->apply([](const auto& scene) {
|
||||||
|
return scene.background_color();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
void Render_Scene_2D::set_viewport_size(Size size) {
|
||||||
|
impl_->apply([size](auto& scene) {
|
||||||
|
scene.set_viewport_size(size);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
Size Render_Scene_2D::viewport_size() const {
|
||||||
|
return impl_->apply([](const auto& scene) {
|
||||||
|
return scene.viewport_size();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
void Render_Scene_2D::dispatch_event(const Event& event) {
|
||||||
|
impl_->apply([&event](auto& scene) {
|
||||||
|
scene.dispatch_event(event);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
tl::expected<void, Plot_Prepare_Frame_Error> Render_Scene_2D::prepare_frame() {
|
||||||
|
return impl_->apply([](auto& scene) {
|
||||||
|
return scene.prepare_frame();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
tl::expected<void, Plot_Refresh_Manual_Frame_Error> Render_Scene_2D::refresh_manual_frame() {
|
||||||
|
return impl_->apply([](auto& scene) {
|
||||||
|
return scene.refresh_manual_frame();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
tl::expected<void, Plot_Render_Prepared_Frame_Error> Render_Scene_2D::render_prepared_frame() {
|
||||||
|
return impl_->apply([](auto& scene) {
|
||||||
|
return scene.render_prepared_frame();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
bool Render_Scene_2D::discard_pending_frame() {
|
||||||
|
return impl_->apply([](auto& scene) {
|
||||||
|
return scene.discard_pending_frame();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
tl::expected<Plot_Render_Status, Plot_Render_Frame_Error>
|
||||||
|
Render_Scene_2D::render_frame(bool force) {
|
||||||
|
return impl_->apply([force](auto& scene) {
|
||||||
|
return scene.render_frame(force);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
void Render_Scene_2D::with_frame(const std::function<void(Image_View)>& consumer) {
|
||||||
|
impl_->apply([&consumer](auto& scene) {
|
||||||
|
scene.with_frame(consumer);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
void Render_Scene_2D::activate_view() {
|
||||||
|
impl_->apply([](auto& scene) {
|
||||||
|
scene.activate_view();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
void Render_Scene_2D::deactivate_view() noexcept {
|
||||||
|
impl_->apply([](auto& scene) {
|
||||||
|
scene.deactivate_view();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
bool Render_Scene_2D::view_active() const noexcept {
|
||||||
|
return impl_->apply([](const auto& scene) {
|
||||||
|
return scene.view_active();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
void Render_Scene_2D::request_redraw() noexcept {
|
||||||
|
render_scene().notify_model_dirty();
|
||||||
|
}
|
||||||
|
tl::expected<void, Plot_Set_Max_Render_Fps_Error>
|
||||||
|
Render_Scene_2D::set_max_render_fps(double fps) {
|
||||||
|
return impl_->apply([fps](auto& scene) {
|
||||||
|
return scene.set_max_render_fps(fps);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
tl::expected<void, Plot_Clear_Max_Render_Fps_Error>
|
||||||
|
Render_Scene_2D::clear_max_render_fps() {
|
||||||
|
return impl_->apply([](auto& scene) {
|
||||||
|
return scene.clear_max_render_fps();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
double Render_Scene_2D::max_render_fps() const {
|
||||||
|
return impl_->apply([](const auto& scene) {
|
||||||
|
return scene.max_render_fps();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
tl::expected<void, Plot_Set_Consumer_Feedback_Error>
|
||||||
|
Render_Scene_2D::set_consumer_feedback(Frame_Consumer_Feedback feedback) {
|
||||||
|
return impl_->apply([feedback](auto& scene) {
|
||||||
|
return scene.set_consumer_feedback(feedback);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
tl::expected<void, Plot_Clear_Consumer_Feedback_Error>
|
||||||
|
Render_Scene_2D::clear_consumer_feedback() {
|
||||||
|
return impl_->apply([](auto& scene) {
|
||||||
|
return scene.clear_consumer_feedback();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
Plot_Frame_Mode Render_Scene_2D::frame_mode() const noexcept {
|
||||||
|
return impl_->mode;
|
||||||
|
}
|
||||||
|
Plot_Frame_Status Render_Scene_2D::frame_status() const {
|
||||||
|
return impl_->apply([](const auto& scene) {
|
||||||
|
return scene.frame_status();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
Low_Latency_Diagnostics Render_Scene_2D::diagnostics() const {
|
||||||
|
return impl_->apply([](const auto& scene) {
|
||||||
|
return scene.diagnostics();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
Refresh_Control_Snapshot Render_Scene_2D::refresh_feedback_snapshot() const {
|
||||||
|
return impl_->apply(
|
||||||
|
[](const auto& scene) {
|
||||||
|
return scene.refresh_feedback_snapshot();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
void Render_Scene_2D::set_presentation_sink(std::weak_ptr<Presentation_Sink> sink) {
|
||||||
|
impl_->apply([&sink](auto& scene) {
|
||||||
|
scene.set_presentation_sink(std::move(sink));
|
||||||
|
});
|
||||||
|
}
|
||||||
|
std::shared_ptr<Performance_Overlay> Render_Scene_2D::performance_overlay() const {
|
||||||
|
return impl_->apply([](const auto& scene) {
|
||||||
|
return scene.performance_overlay();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
void Render_Scene_2D::set_performance_overlay(
|
||||||
|
std::shared_ptr<Performance_Overlay> overlay) {
|
||||||
|
impl_->apply([&overlay](auto& scene) {
|
||||||
|
scene.set_performance_overlay(std::move(overlay));
|
||||||
|
});
|
||||||
|
}
|
||||||
|
} // namespace renderive
|
||||||
+7
-26
@@ -1,24 +1,17 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include "../base/Types.h"
|
#include "../base/Types.h"
|
||||||
#include "../event/Event.h"
|
#include "../event/Event.h"
|
||||||
#include "../renderable/Renderable.h"
|
#include "../renderable/Renderable.h"
|
||||||
#include "Plot_Frame_Status.h"
|
#include "Plot_Frame_Status.h"
|
||||||
|
|
||||||
#include <renderive/frame_control/Frame_Consumer_Feedback.hpp>
|
#include <renderive/frame_control/Frame_Consumer_Feedback.hpp>
|
||||||
#include <renderive/renderable/base/Renderive_Owner.hpp>
|
#include <renderive/renderable/base/Renderive_Owner.hpp>
|
||||||
#include <renderive/scene/base/Scene_Base.hpp>
|
#include <renderive/scene/base/Scene_Base.hpp>
|
||||||
|
|
||||||
#include <functional>
|
#include <functional>
|
||||||
#include <tl/expected.hpp>
|
#include <tl/expected.hpp>
|
||||||
#include <memory>
|
#include <memory>
|
||||||
|
|
||||||
class Scene_Base;
|
class Scene_Base;
|
||||||
|
|
||||||
namespace renderive {
|
namespace renderive {
|
||||||
|
|
||||||
struct Performance_Overlay;
|
struct Performance_Overlay;
|
||||||
|
|
||||||
struct Plot_Scene_Options {
|
struct Plot_Scene_Options {
|
||||||
Plot_Frame_Mode frame_mode{Plot_Frame_Mode::Low_Latency};
|
Plot_Frame_Mode frame_mode{Plot_Frame_Mode::Low_Latency};
|
||||||
};
|
};
|
||||||
@@ -66,35 +59,29 @@ enum class Plot_Set_Consumer_Feedback_Error : std::uint8_t {
|
|||||||
enum class Plot_Clear_Consumer_Feedback_Error : std::uint8_t {
|
enum class Plot_Clear_Consumer_Feedback_Error : std::uint8_t {
|
||||||
unsupported_frame_mode
|
unsupported_frame_mode
|
||||||
};
|
};
|
||||||
|
|
||||||
struct Presentation_Sink {
|
struct Presentation_Sink {
|
||||||
virtual ~Presentation_Sink() = default;
|
virtual ~Presentation_Sink() = default;
|
||||||
virtual void request_present(Rect dirty_rect) = 0;
|
virtual void request_present(Rect dirty_rect) = 0;
|
||||||
};
|
};
|
||||||
|
class LIB_DECL Render_Scene_2D final {
|
||||||
class LIB_DECL Plot_Scene final {
|
|
||||||
public:
|
public:
|
||||||
explicit Plot_Scene(Plot_Scene_Options options = {});
|
explicit Render_Scene_2D(Plot_Scene_Options options = {});
|
||||||
~Plot_Scene();
|
~Render_Scene_2D();
|
||||||
|
Render_Scene_2D(const Render_Scene_2D&) = delete;
|
||||||
Plot_Scene(const Plot_Scene&) = delete;
|
Render_Scene_2D& operator=(const Render_Scene_2D&) = delete;
|
||||||
Plot_Scene& operator=(const Plot_Scene&) = delete;
|
Render_Scene_2D(Render_Scene_2D&&) = delete;
|
||||||
Plot_Scene(Plot_Scene&&) = delete;
|
Render_Scene_2D& operator=(Render_Scene_2D&&) = delete;
|
||||||
Plot_Scene& operator=(Plot_Scene&&) = delete;
|
|
||||||
|
|
||||||
void init();
|
void init();
|
||||||
[[nodiscard]] ::renderive_Owner<Renderable> root_renderable() const;
|
[[nodiscard]] ::renderive_Owner<Renderable> root_renderable() const;
|
||||||
[[nodiscard]] Scene_2D_Base::Attach_Builder attach_builder();
|
[[nodiscard]] Scene_2D_Base::Attach_Builder attach_builder();
|
||||||
[[nodiscard]] Scene_Base::Edit_Operation edit_renderables(Scene_2D_Base::Renderable_Edit edit);
|
[[nodiscard]] Scene_Base::Edit_Operation edit_renderables(Scene_2D_Base::Renderable_Edit edit);
|
||||||
[[nodiscard]] Scene_Base& render_scene() noexcept;
|
[[nodiscard]] Scene_Base& render_scene() noexcept;
|
||||||
[[nodiscard]] const Scene_Base& render_scene() const noexcept;
|
[[nodiscard]] const Scene_Base& render_scene() const noexcept;
|
||||||
|
|
||||||
void set_background_color(Color color);
|
void set_background_color(Color color);
|
||||||
[[nodiscard]] Color background_color() const;
|
[[nodiscard]] Color background_color() const;
|
||||||
void set_viewport_size(Size size);
|
void set_viewport_size(Size size);
|
||||||
[[nodiscard]] Size viewport_size() const;
|
[[nodiscard]] Size viewport_size() const;
|
||||||
void dispatch_event(const Event& event);
|
void dispatch_event(const Event& event);
|
||||||
|
|
||||||
[[nodiscard]] tl::expected<void, Plot_Prepare_Frame_Error> prepare_frame();
|
[[nodiscard]] tl::expected<void, Plot_Prepare_Frame_Error> prepare_frame();
|
||||||
[[nodiscard]] tl::expected<void, Plot_Refresh_Manual_Frame_Error> refresh_manual_frame();
|
[[nodiscard]] tl::expected<void, Plot_Refresh_Manual_Frame_Error> refresh_manual_frame();
|
||||||
[[nodiscard]] tl::expected<void, Plot_Render_Prepared_Frame_Error> render_prepared_frame();
|
[[nodiscard]] tl::expected<void, Plot_Render_Prepared_Frame_Error> render_prepared_frame();
|
||||||
@@ -102,12 +89,10 @@ public:
|
|||||||
[[nodiscard]] tl::expected<Plot_Render_Status, Plot_Render_Frame_Error>
|
[[nodiscard]] tl::expected<Plot_Render_Status, Plot_Render_Frame_Error>
|
||||||
render_frame(bool force = false);
|
render_frame(bool force = false);
|
||||||
void with_frame(const std::function<void(Image_View)>& consumer);
|
void with_frame(const std::function<void(Image_View)>& consumer);
|
||||||
|
|
||||||
void activate_view();
|
void activate_view();
|
||||||
void deactivate_view() noexcept;
|
void deactivate_view() noexcept;
|
||||||
[[nodiscard]] bool view_active() const noexcept;
|
[[nodiscard]] bool view_active() const noexcept;
|
||||||
void request_redraw() noexcept;
|
void request_redraw() noexcept;
|
||||||
|
|
||||||
[[nodiscard]] tl::expected<void, Plot_Set_Max_Render_Fps_Error>
|
[[nodiscard]] tl::expected<void, Plot_Set_Max_Render_Fps_Error>
|
||||||
set_max_render_fps(double fps);
|
set_max_render_fps(double fps);
|
||||||
[[nodiscard]] tl::expected<void, Plot_Clear_Max_Render_Fps_Error> clear_max_render_fps();
|
[[nodiscard]] tl::expected<void, Plot_Clear_Max_Render_Fps_Error> clear_max_render_fps();
|
||||||
@@ -116,19 +101,15 @@ public:
|
|||||||
set_consumer_feedback(Frame_Consumer_Feedback feedback);
|
set_consumer_feedback(Frame_Consumer_Feedback feedback);
|
||||||
[[nodiscard]] tl::expected<void, Plot_Clear_Consumer_Feedback_Error>
|
[[nodiscard]] tl::expected<void, Plot_Clear_Consumer_Feedback_Error>
|
||||||
clear_consumer_feedback();
|
clear_consumer_feedback();
|
||||||
|
|
||||||
[[nodiscard]] Plot_Frame_Mode frame_mode() const noexcept;
|
[[nodiscard]] Plot_Frame_Mode frame_mode() const noexcept;
|
||||||
[[nodiscard]] Plot_Frame_Status frame_status() const;
|
[[nodiscard]] Plot_Frame_Status frame_status() const;
|
||||||
[[nodiscard]] Low_Latency_Diagnostics diagnostics() const;
|
[[nodiscard]] Low_Latency_Diagnostics diagnostics() const;
|
||||||
[[nodiscard]] Refresh_Control_Snapshot refresh_feedback_snapshot() const;
|
[[nodiscard]] Refresh_Control_Snapshot refresh_feedback_snapshot() const;
|
||||||
|
|
||||||
void set_presentation_sink(std::weak_ptr<Presentation_Sink> sink);
|
void set_presentation_sink(std::weak_ptr<Presentation_Sink> sink);
|
||||||
[[nodiscard]] std::shared_ptr<Performance_Overlay> performance_overlay() const;
|
[[nodiscard]] std::shared_ptr<Performance_Overlay> performance_overlay() const;
|
||||||
void set_performance_overlay(std::shared_ptr<Performance_Overlay> overlay);
|
void set_performance_overlay(std::shared_ptr<Performance_Overlay> overlay);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
struct Impl;
|
struct Impl;
|
||||||
std::unique_ptr<Impl> impl_;
|
std::unique_ptr<Impl> impl_;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace renderive
|
} // namespace renderive
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
#include <renderive/error/Error_Policy.hpp>
|
#include <renderive/error/Error_Policy.hpp>
|
||||||
#include "../Plot_Scene.h"
|
#include "../Render_Scene_2D.h"
|
||||||
#include "../../render/Blend2D_Cache.h"
|
#include "../../render/Blend2D_Cache.h"
|
||||||
#include <renderive/base/observer/Observer.hpp>
|
#include <renderive/base/observer/Observer.hpp>
|
||||||
#include <renderive/frame_control/Frame_Consumer_Feedback.hpp>
|
#include <renderive/frame_control/Frame_Consumer_Feedback.hpp>
|
||||||
|
|||||||
@@ -6,7 +6,7 @@
|
|||||||
namespace renderive {
|
namespace renderive {
|
||||||
namespace {
|
namespace {
|
||||||
TEST(Renderive_Core2_Frame_Pipeline, ManualLifecycleSeparatesPrepareRefreshAndRender) {
|
TEST(Renderive_Core2_Frame_Pipeline, ManualLifecycleSeparatesPrepareRefreshAndRender) {
|
||||||
Plot_Scene plot({.frame_mode = Plot_Frame_Mode::Manual});
|
Render_Scene_2D plot({.frame_mode = Plot_Frame_Mode::Manual});
|
||||||
plot.init();
|
plot.init();
|
||||||
plot.set_viewport_size({96, 54});
|
plot.set_viewport_size({96, 54});
|
||||||
ASSERT_TRUE(plot.prepare_frame());
|
ASSERT_TRUE(plot.prepare_frame());
|
||||||
@@ -35,7 +35,7 @@ TEST(Renderive_Core2_Frame_Pipeline, ManualLifecycleSeparatesPrepareRefreshAndRe
|
|||||||
EXPECT_EQ(plot.diagnostics().refresh.frame_count, 1u);
|
EXPECT_EQ(plot.diagnostics().refresh.frame_count, 1u);
|
||||||
}
|
}
|
||||||
TEST(Renderive_Core2_Frame_Pipeline, HighFrequencyLowLatencyLifecycleExposesKernelTiming) {
|
TEST(Renderive_Core2_Frame_Pipeline, HighFrequencyLowLatencyLifecycleExposesKernelTiming) {
|
||||||
Plot_Scene plot;
|
Render_Scene_2D plot;
|
||||||
plot.init();
|
plot.init();
|
||||||
plot.set_viewport_size({96, 54});
|
plot.set_viewport_size({96, 54});
|
||||||
EXPECT_TRUE(plot.set_max_render_fps(1'000'000'000.0));
|
EXPECT_TRUE(plot.set_max_render_fps(1'000'000'000.0));
|
||||||
@@ -68,7 +68,7 @@ TEST(Renderive_Core2_Frame_Pipeline, HighFrequencyLowLatencyLifecycleExposesKern
|
|||||||
EXPECT_EQ(refresh.next_refresh_interval_ns, snapshot.next_refresh_interval_ns);
|
EXPECT_EQ(refresh.next_refresh_interval_ns, snapshot.next_refresh_interval_ns);
|
||||||
}
|
}
|
||||||
TEST(Renderive_Core2_Frame_Pipeline, LowLatencyConsumerFeedbackFlowsThroughCore2IntoKernelScheduling) {
|
TEST(Renderive_Core2_Frame_Pipeline, LowLatencyConsumerFeedbackFlowsThroughCore2IntoKernelScheduling) {
|
||||||
Plot_Scene plot;
|
Render_Scene_2D plot;
|
||||||
plot.init();
|
plot.init();
|
||||||
plot.set_viewport_size({96, 54});
|
plot.set_viewport_size({96, 54});
|
||||||
EXPECT_TRUE(plot.set_max_render_fps(100.0));
|
EXPECT_TRUE(plot.set_max_render_fps(100.0));
|
||||||
@@ -89,7 +89,7 @@ TEST(Renderive_Core2_Frame_Pipeline, LowLatencyConsumerFeedbackFlowsThroughCore2
|
|||||||
EXPECT_EQ(plot.refresh_feedback_snapshot().next_refresh_interval_ns, 40'000'000u);
|
EXPECT_EQ(plot.refresh_feedback_snapshot().next_refresh_interval_ns, 40'000'000u);
|
||||||
}
|
}
|
||||||
TEST(Renderive_Core2_Frame_Pipeline, LowLatencyLimitsCanBeClearedIndependently) {
|
TEST(Renderive_Core2_Frame_Pipeline, LowLatencyLimitsCanBeClearedIndependently) {
|
||||||
Plot_Scene plot;
|
Render_Scene_2D plot;
|
||||||
plot.init();
|
plot.init();
|
||||||
plot.set_viewport_size({96, 54});
|
plot.set_viewport_size({96, 54});
|
||||||
EXPECT_TRUE(plot.set_max_render_fps(100.0));
|
EXPECT_TRUE(plot.set_max_render_fps(100.0));
|
||||||
@@ -107,7 +107,7 @@ TEST(Renderive_Core2_Frame_Pipeline, LowLatencyLimitsCanBeClearedIndependently)
|
|||||||
EXPECT_TRUE(snapshot.limit_state == "paint_limited" || snapshot.limit_state == "render_limited");
|
EXPECT_TRUE(snapshot.limit_state == "paint_limited" || snapshot.limit_state == "render_limited");
|
||||||
}
|
}
|
||||||
TEST(Renderive_Core2_Frame_Pipeline, LowLatencyReplacementRetiresOldFrameWithoutPhantomPendingFrame) {
|
TEST(Renderive_Core2_Frame_Pipeline, LowLatencyReplacementRetiresOldFrameWithoutPhantomPendingFrame) {
|
||||||
Plot_Scene plot;
|
Render_Scene_2D plot;
|
||||||
plot.init();
|
plot.init();
|
||||||
plot.set_viewport_size({64, 40});
|
plot.set_viewport_size({64, 40});
|
||||||
ASSERT_TRUE(plot.prepare_frame());
|
ASSERT_TRUE(plot.prepare_frame());
|
||||||
@@ -128,7 +128,7 @@ TEST(Renderive_Core2_Frame_Pipeline, LowLatencyReplacementRetiresOldFrameWithout
|
|||||||
EXPECT_EQ(snapshot.latest_sequence, 2u);
|
EXPECT_EQ(snapshot.latest_sequence, 2u);
|
||||||
}
|
}
|
||||||
TEST(Renderive_Core2_Frame_Pipeline, LowLatencyDiscardAndEmptyRenderRemainObservable) {
|
TEST(Renderive_Core2_Frame_Pipeline, LowLatencyDiscardAndEmptyRenderRemainObservable) {
|
||||||
Plot_Scene plot;
|
Render_Scene_2D plot;
|
||||||
plot.init();
|
plot.init();
|
||||||
plot.set_viewport_size({64, 40});
|
plot.set_viewport_size({64, 40});
|
||||||
ASSERT_TRUE(plot.prepare_frame());
|
ASSERT_TRUE(plot.prepare_frame());
|
||||||
@@ -151,7 +151,7 @@ TEST(Renderive_Core2_Frame_Pipeline, LowLatencyDiscardAndEmptyRenderRemainObserv
|
|||||||
EXPECT_EQ(snapshot.latest_sequence, 1u);
|
EXPECT_EQ(snapshot.latest_sequence, 1u);
|
||||||
}
|
}
|
||||||
TEST(Renderive_Core2_Frame_Pipeline, ManualDiscardAndFailedRefreshUpdateObserverState) {
|
TEST(Renderive_Core2_Frame_Pipeline, ManualDiscardAndFailedRefreshUpdateObserverState) {
|
||||||
Plot_Scene plot({.frame_mode = Plot_Frame_Mode::Manual});
|
Render_Scene_2D plot({.frame_mode = Plot_Frame_Mode::Manual});
|
||||||
plot.init();
|
plot.init();
|
||||||
plot.set_viewport_size({64, 40});
|
plot.set_viewport_size({64, 40});
|
||||||
ASSERT_TRUE(plot.prepare_frame());
|
ASSERT_TRUE(plot.prepare_frame());
|
||||||
@@ -175,7 +175,7 @@ TEST(Renderive_Core2_Frame_Pipeline, ManualDiscardAndFailedRefreshUpdateObserver
|
|||||||
EXPECT_EQ(snapshot.paint_duration_ns, last_paint_duration_ns);
|
EXPECT_EQ(snapshot.paint_duration_ns, last_paint_duration_ns);
|
||||||
}
|
}
|
||||||
TEST(Renderive_Core2_Frame_Pipeline, PlaybackPreservesQueueDepthAndEmptyAcquireFailure) {
|
TEST(Renderive_Core2_Frame_Pipeline, PlaybackPreservesQueueDepthAndEmptyAcquireFailure) {
|
||||||
Plot_Scene plot({.frame_mode = Plot_Frame_Mode::Playback});
|
Render_Scene_2D plot({.frame_mode = Plot_Frame_Mode::Playback});
|
||||||
plot.init();
|
plot.init();
|
||||||
plot.set_viewport_size({64, 40});
|
plot.set_viewport_size({64, 40});
|
||||||
ASSERT_TRUE(plot.prepare_frame());
|
ASSERT_TRUE(plot.prepare_frame());
|
||||||
@@ -207,7 +207,7 @@ TEST(Renderive_Core2_Frame_Pipeline, PlaybackPreservesQueueDepthAndEmptyAcquireF
|
|||||||
EXPECT_EQ(snapshot.queue_wait_ns, last_queue_wait_ns);
|
EXPECT_EQ(snapshot.queue_wait_ns, last_queue_wait_ns);
|
||||||
}
|
}
|
||||||
TEST(Renderive_Core2_Frame_Pipeline, PlaybackFullCyclePreservesPreviouslyQueuedFrames) {
|
TEST(Renderive_Core2_Frame_Pipeline, PlaybackFullCyclePreservesPreviouslyQueuedFrames) {
|
||||||
Plot_Scene plot({.frame_mode = Plot_Frame_Mode::Playback});
|
Render_Scene_2D plot({.frame_mode = Plot_Frame_Mode::Playback});
|
||||||
plot.init();
|
plot.init();
|
||||||
plot.set_viewport_size({96, 54});
|
plot.set_viewport_size({96, 54});
|
||||||
ASSERT_TRUE(plot.prepare_frame());
|
ASSERT_TRUE(plot.prepare_frame());
|
||||||
@@ -230,7 +230,7 @@ TEST(Renderive_Core2_Frame_Pipeline, PlaybackFullCyclePreservesPreviouslyQueuedF
|
|||||||
}
|
}
|
||||||
TEST(Renderive_Core2_Frame_Pipeline, EveryModeHonorsActiveDirtyAndForceRenderGates) {
|
TEST(Renderive_Core2_Frame_Pipeline, EveryModeHonorsActiveDirtyAndForceRenderGates) {
|
||||||
const auto verify = [](Plot_Frame_Mode mode) {
|
const auto verify = [](Plot_Frame_Mode mode) {
|
||||||
Plot_Scene scene({.frame_mode = mode});
|
Render_Scene_2D scene({.frame_mode = mode});
|
||||||
scene.init();
|
scene.init();
|
||||||
scene.set_viewport_size({80, 45});
|
scene.set_viewport_size({80, 45});
|
||||||
EXPECT_FALSE(scene.view_active());
|
EXPECT_FALSE(scene.view_active());
|
||||||
@@ -254,7 +254,7 @@ TEST(Renderive_Core2_Frame_Pipeline, EveryModeHonorsActiveDirtyAndForceRenderGat
|
|||||||
verify(Plot_Frame_Mode::Playback);
|
verify(Plot_Frame_Mode::Playback);
|
||||||
}
|
}
|
||||||
TEST(Renderive_Core2_Frame_Pipeline, FrequencyConfigurationRejectsInvalidValuesAndWrongModes) {
|
TEST(Renderive_Core2_Frame_Pipeline, FrequencyConfigurationRejectsInvalidValuesAndWrongModes) {
|
||||||
Plot_Scene low_latency;
|
Render_Scene_2D low_latency;
|
||||||
EXPECT_EQ(low_latency.set_max_render_fps(0.0).error(), Plot_Set_Max_Render_Fps_Error::invalid_fps);
|
EXPECT_EQ(low_latency.set_max_render_fps(0.0).error(), Plot_Set_Max_Render_Fps_Error::invalid_fps);
|
||||||
EXPECT_EQ(low_latency.set_max_render_fps(-1.0).error(), Plot_Set_Max_Render_Fps_Error::invalid_fps);
|
EXPECT_EQ(low_latency.set_max_render_fps(-1.0).error(), Plot_Set_Max_Render_Fps_Error::invalid_fps);
|
||||||
EXPECT_EQ(low_latency.set_max_render_fps(std::numeric_limits<double>::quiet_NaN()).error(),
|
EXPECT_EQ(low_latency.set_max_render_fps(std::numeric_limits<double>::quiet_NaN()).error(),
|
||||||
@@ -263,8 +263,8 @@ TEST(Renderive_Core2_Frame_Pipeline, FrequencyConfigurationRejectsInvalidValuesA
|
|||||||
Plot_Set_Max_Render_Fps_Error::invalid_fps);
|
Plot_Set_Max_Render_Fps_Error::invalid_fps);
|
||||||
EXPECT_TRUE(low_latency.set_max_render_fps(1'000.0));
|
EXPECT_TRUE(low_latency.set_max_render_fps(1'000.0));
|
||||||
EXPECT_DOUBLE_EQ(low_latency.max_render_fps(), 1'000.0);
|
EXPECT_DOUBLE_EQ(low_latency.max_render_fps(), 1'000.0);
|
||||||
Plot_Scene manual({.frame_mode = Plot_Frame_Mode::Manual});
|
Render_Scene_2D manual({.frame_mode = Plot_Frame_Mode::Manual});
|
||||||
Plot_Scene playback({.frame_mode = Plot_Frame_Mode::Playback});
|
Render_Scene_2D playback({.frame_mode = Plot_Frame_Mode::Playback});
|
||||||
EXPECT_EQ(manual.set_max_render_fps(60.0).error(), Plot_Set_Max_Render_Fps_Error::unsupported_frame_mode);
|
EXPECT_EQ(manual.set_max_render_fps(60.0).error(), Plot_Set_Max_Render_Fps_Error::unsupported_frame_mode);
|
||||||
EXPECT_EQ(playback.set_max_render_fps(60.0).error(), Plot_Set_Max_Render_Fps_Error::unsupported_frame_mode);
|
EXPECT_EQ(playback.set_max_render_fps(60.0).error(), Plot_Set_Max_Render_Fps_Error::unsupported_frame_mode);
|
||||||
const auto unsupported_refresh = playback.refresh_manual_frame();
|
const auto unsupported_refresh = playback.refresh_manual_frame();
|
||||||
|
|||||||
@@ -53,7 +53,7 @@ static_assert(!Legacy_Axis_Property_Api<Time_Axis>);
|
|||||||
static_assert(!Legacy_Time_Axis_Property_Api<Time_Axis>);
|
static_assert(!Legacy_Time_Axis_Property_Api<Time_Axis>);
|
||||||
|
|
||||||
TEST(Renderive_Core2, RootIdentityAndRefreshDiagnosticsComeFromKernelState) {
|
TEST(Renderive_Core2, RootIdentityAndRefreshDiagnosticsComeFromKernelState) {
|
||||||
Plot_Scene plot;
|
Render_Scene_2D plot;
|
||||||
plot.init();
|
plot.init();
|
||||||
const auto root = plot.root_renderable();
|
const auto root = plot.root_renderable();
|
||||||
ASSERT_TRUE(root);
|
ASSERT_TRUE(root);
|
||||||
@@ -157,7 +157,7 @@ TEST(Renderive_Core2, BicubicHeatmapUsesRealCubicResampling) {
|
|||||||
EXPECT_NE(bilinear, bicubic);
|
EXPECT_NE(bilinear, bicubic);
|
||||||
}
|
}
|
||||||
TEST(Renderive_Core2, KernelSceneRendersBusinessObjectsIntoBlend2DFrame) {
|
TEST(Renderive_Core2, KernelSceneRendersBusinessObjectsIntoBlend2DFrame) {
|
||||||
Plot_Scene plot;
|
Render_Scene_2D plot;
|
||||||
plot.init();
|
plot.init();
|
||||||
plot.set_viewport_size({320, 180});
|
plot.set_viewport_size({320, 180});
|
||||||
plot.activate_view();
|
plot.activate_view();
|
||||||
@@ -238,7 +238,7 @@ TEST(Renderive_Core2, KernelSceneRendersBusinessObjectsIntoBlend2DFrame) {
|
|||||||
EXPECT_NE(plot.render_frame().value(), Plot_Render_Status::rendered);
|
EXPECT_NE(plot.render_frame().value(), Plot_Render_Status::rendered);
|
||||||
}
|
}
|
||||||
TEST(Renderive_Core2, StandaloneRenderableBuilderJoinsSceneOnlyInsideRuntimeEditor) {
|
TEST(Renderive_Core2, StandaloneRenderableBuilderJoinsSceneOnlyInsideRuntimeEditor) {
|
||||||
Plot_Scene plot;
|
Render_Scene_2D plot;
|
||||||
plot.init();
|
plot.init();
|
||||||
const auto root = plot.root_renderable();
|
const auto root = plot.root_renderable();
|
||||||
const auto [frequency, power] = build_initial(plot, [&](auto& attach) {
|
const auto [frequency, power] = build_initial(plot, [&](auto& attach) {
|
||||||
@@ -274,7 +274,7 @@ TEST(Renderive_Core2, StandaloneRenderableBuilderJoinsSceneOnlyInsideRuntimeEdit
|
|||||||
}));
|
}));
|
||||||
}
|
}
|
||||||
TEST(Renderive_Core2, TimeAxisUsesOneFontStateAndFormatsConfiguredLabels) {
|
TEST(Renderive_Core2, TimeAxisUsesOneFontStateAndFormatsConfiguredLabels) {
|
||||||
Plot_Scene plot;
|
Render_Scene_2D plot;
|
||||||
plot.init();
|
plot.init();
|
||||||
const auto root = plot.root_renderable();
|
const auto root = plot.root_renderable();
|
||||||
auto axis = build_initial(plot, [&](auto& attach) {
|
auto axis = build_initial(plot, [&](auto& attach) {
|
||||||
@@ -292,7 +292,7 @@ TEST(Renderive_Core2, TimeAxisUsesOneFontStateAndFormatsConfiguredLabels) {
|
|||||||
EXPECT_EQ(axis->get<&Time_Axis::Properties::tick_label_spacing_px>(), 17);
|
EXPECT_EQ(axis->get<&Time_Axis::Properties::tick_label_spacing_px>(), 17);
|
||||||
}
|
}
|
||||||
TEST(Renderive_Core2, PerformanceOverlayConsumesKernelFrameDiagnostics) {
|
TEST(Renderive_Core2, PerformanceOverlayConsumesKernelFrameDiagnostics) {
|
||||||
Plot_Scene plot;
|
Render_Scene_2D plot;
|
||||||
plot.init();
|
plot.init();
|
||||||
plot.set_viewport_size({160, 90});
|
plot.set_viewport_size({160, 90});
|
||||||
plot.activate_view();
|
plot.activate_view();
|
||||||
@@ -313,7 +313,7 @@ TEST(Renderive_Core2, PerformanceOverlayConsumesKernelFrameDiagnostics) {
|
|||||||
EXPECT_DOUBLE_EQ(plot.max_render_fps(), 120.0);
|
EXPECT_DOUBLE_EQ(plot.max_render_fps(), 120.0);
|
||||||
}
|
}
|
||||||
TEST(Renderive_Core2, AllFrameControlModesUseKernelStrategiesAndExposeObservers) {
|
TEST(Renderive_Core2, AllFrameControlModesUseKernelStrategiesAndExposeObservers) {
|
||||||
Plot_Scene manual({.frame_mode = Plot_Frame_Mode::Manual});
|
Render_Scene_2D manual({.frame_mode = Plot_Frame_Mode::Manual});
|
||||||
manual.init();
|
manual.init();
|
||||||
manual.set_viewport_size({64, 40});
|
manual.set_viewport_size({64, 40});
|
||||||
EXPECT_EQ(manual.frame_mode(), Plot_Frame_Mode::Manual);
|
EXPECT_EQ(manual.frame_mode(), Plot_Frame_Mode::Manual);
|
||||||
@@ -326,7 +326,7 @@ TEST(Renderive_Core2, AllFrameControlModesUseKernelStrategiesAndExposeObservers)
|
|||||||
manual_observer = manual.frame_status();
|
manual_observer = manual.frame_status();
|
||||||
EXPECT_EQ(manual_observer.last_event, "rendered");
|
EXPECT_EQ(manual_observer.last_event, "rendered");
|
||||||
EXPECT_EQ(manual_observer.consumed_frame_count, 1u);
|
EXPECT_EQ(manual_observer.consumed_frame_count, 1u);
|
||||||
Plot_Scene low_latency;
|
Render_Scene_2D low_latency;
|
||||||
low_latency.init();
|
low_latency.init();
|
||||||
low_latency.set_viewport_size({64, 40});
|
low_latency.set_viewport_size({64, 40});
|
||||||
low_latency.activate_view();
|
low_latency.activate_view();
|
||||||
@@ -335,7 +335,7 @@ TEST(Renderive_Core2, AllFrameControlModesUseKernelStrategiesAndExposeObservers)
|
|||||||
EXPECT_EQ(low_latency.frame_mode(), Plot_Frame_Mode::Low_Latency);
|
EXPECT_EQ(low_latency.frame_mode(), Plot_Frame_Mode::Low_Latency);
|
||||||
EXPECT_EQ(low_observer.last_event, "lifecycle_completed");
|
EXPECT_EQ(low_observer.last_event, "lifecycle_completed");
|
||||||
EXPECT_EQ(low_observer.consumed_frame_count, 1u);
|
EXPECT_EQ(low_observer.consumed_frame_count, 1u);
|
||||||
Plot_Scene playback({.frame_mode = Plot_Frame_Mode::Playback});
|
Render_Scene_2D playback({.frame_mode = Plot_Frame_Mode::Playback});
|
||||||
playback.init();
|
playback.init();
|
||||||
playback.set_viewport_size({64, 40});
|
playback.set_viewport_size({64, 40});
|
||||||
ASSERT_TRUE(playback.prepare_frame());
|
ASSERT_TRUE(playback.prepare_frame());
|
||||||
@@ -352,7 +352,7 @@ TEST(Renderive_Core2, AllFrameControlModesUseKernelStrategiesAndExposeObservers)
|
|||||||
EXPECT_EQ(playback_observer.consumed_frame_count, 1u);
|
EXPECT_EQ(playback_observer.consumed_frame_count, 1u);
|
||||||
}
|
}
|
||||||
TEST(Renderive_Core2, RetainedAxisAndTimeAxisApisRoundTripWithoutWebAdapters) {
|
TEST(Renderive_Core2, RetainedAxisAndTimeAxisApisRoundTripWithoutWebAdapters) {
|
||||||
Plot_Scene plot;
|
Render_Scene_2D plot;
|
||||||
plot.init();
|
plot.init();
|
||||||
const auto root = plot.root_renderable();
|
const auto root = plot.root_renderable();
|
||||||
ASSERT_TRUE(root);
|
ASSERT_TRUE(root);
|
||||||
@@ -434,7 +434,7 @@ TEST(Renderive_Core2, RetainedAxisAndTimeAxisApisRoundTripWithoutWebAdapters) {
|
|||||||
EXPECT_EQ(time_axis->tick_label(first), "01:02:03.004");
|
EXPECT_EQ(time_axis->tick_label(first), "01:02:03.004");
|
||||||
}
|
}
|
||||||
TEST(Renderive_Core2, RetainedSpectrumApisRoundTripAndMarkersRemainObservable) {
|
TEST(Renderive_Core2, RetainedSpectrumApisRoundTripAndMarkersRemainObservable) {
|
||||||
Plot_Scene plot;
|
Render_Scene_2D plot;
|
||||||
plot.init();
|
plot.init();
|
||||||
plot.set_viewport_size({360, 240});
|
plot.set_viewport_size({360, 240});
|
||||||
plot.activate_view();
|
plot.activate_view();
|
||||||
@@ -523,7 +523,7 @@ TEST(Renderive_Core2, RetainedSpectrumApisRoundTripAndMarkersRemainObservable) {
|
|||||||
EXPECT_EQ(plot.render_frame(true).value(), Plot_Render_Status::rendered);
|
EXPECT_EQ(plot.render_frame(true).value(), Plot_Render_Status::rendered);
|
||||||
}
|
}
|
||||||
TEST(Renderive_Core2, RetainedHeatmapSweepAndTraceApisPreserveDataShapes) {
|
TEST(Renderive_Core2, RetainedHeatmapSweepAndTraceApisPreserveDataShapes) {
|
||||||
Plot_Scene plot;
|
Render_Scene_2D plot;
|
||||||
plot.init();
|
plot.init();
|
||||||
plot.set_viewport_size({420, 280});
|
plot.set_viewport_size({420, 280});
|
||||||
plot.activate_view();
|
plot.activate_view();
|
||||||
@@ -637,7 +637,7 @@ TEST(Renderive_Core2, RetainedHeatmapSweepAndTraceApisPreserveDataShapes) {
|
|||||||
EXPECT_EQ(plot.render_frame(true).value(), Plot_Render_Status::rendered);
|
EXPECT_EQ(plot.render_frame(true).value(), Plot_Render_Status::rendered);
|
||||||
}
|
}
|
||||||
TEST(Renderive_Core2, RetainedSelectionAndConstellationApisDriveInteractionAndLayout) {
|
TEST(Renderive_Core2, RetainedSelectionAndConstellationApisDriveInteractionAndLayout) {
|
||||||
Plot_Scene plot;
|
Render_Scene_2D plot;
|
||||||
plot.init();
|
plot.init();
|
||||||
plot.set_viewport_size({360, 260});
|
plot.set_viewport_size({360, 260});
|
||||||
plot.activate_view();
|
plot.activate_view();
|
||||||
@@ -716,7 +716,7 @@ TEST(Renderive_Core2, RetainedSelectionAndConstellationApisDriveInteractionAndLa
|
|||||||
EXPECT_EQ(plot.render_frame(true).value(), Plot_Render_Status::rendered);
|
EXPECT_EQ(plot.render_frame(true).value(), Plot_Render_Status::rendered);
|
||||||
}
|
}
|
||||||
TEST(Renderive_Core2, PlottablePropertiesPublishOnlyAtFrameBoundary) {
|
TEST(Renderive_Core2, PlottablePropertiesPublishOnlyAtFrameBoundary) {
|
||||||
Plot_Scene plot;
|
Render_Scene_2D plot;
|
||||||
plot.init();
|
plot.init();
|
||||||
const auto root = plot.root_renderable();
|
const auto root = plot.root_renderable();
|
||||||
const auto [frequency, power, spectrum] = build_initial(plot, [&](auto& attach) {
|
const auto [frequency, power, spectrum] = build_initial(plot, [&](auto& attach) {
|
||||||
@@ -746,7 +746,7 @@ TEST(Renderive_Core2, PlottablePropertiesPublishOnlyAtFrameBoundary) {
|
|||||||
ASSERT_TRUE(plot.render_prepared_frame());
|
ASSERT_TRUE(plot.render_prepared_frame());
|
||||||
}
|
}
|
||||||
TEST(Renderive_Core2, EveryStatefulRenderableOwnsItsStateObserver) {
|
TEST(Renderive_Core2, EveryStatefulRenderableOwnsItsStateObserver) {
|
||||||
Plot_Scene plot;
|
Render_Scene_2D plot;
|
||||||
plot.init();
|
plot.init();
|
||||||
const auto root = plot.root_renderable();
|
const auto root = plot.root_renderable();
|
||||||
const auto [frequency, power, spectrum] = build_initial(plot, [&](auto& attach) {
|
const auto [frequency, power, spectrum] = build_initial(plot, [&](auto& attach) {
|
||||||
@@ -797,7 +797,7 @@ TEST(Renderive_Core2, EveryStatefulRenderableOwnsItsStateObserver) {
|
|||||||
EXPECT_EQ(spectrum->observation().event, Renderable_Observer_Event::Published);
|
EXPECT_EQ(spectrum->observation().event, Renderable_Observer_Event::Published);
|
||||||
}
|
}
|
||||||
TEST(Renderive_Core2, PlottableDataUpdatesReachKernelRealTimeDataStrategy) {
|
TEST(Renderive_Core2, PlottableDataUpdatesReachKernelRealTimeDataStrategy) {
|
||||||
Plot_Scene plot;
|
Render_Scene_2D plot;
|
||||||
plot.init();
|
plot.init();
|
||||||
const auto root = plot.root_renderable();
|
const auto root = plot.root_renderable();
|
||||||
const auto [frequency, power, spectrum] = build_initial(plot, [&](auto& attach) {
|
const auto [frequency, power, spectrum] = build_initial(plot, [&](auto& attach) {
|
||||||
@@ -871,7 +871,7 @@ TEST(Renderive_Core2, AxisRasterLayoutCoversAxisSwapAndEveryReversal) {
|
|||||||
EXPECT_DOUBLE_EQ(points.back().y, 30.0);
|
EXPECT_DOUBLE_EQ(points.back().y, 30.0);
|
||||||
}
|
}
|
||||||
TEST(Renderive_Core2, PartitionedPlotsBuildPropertyDrivenRenderGraphs) {
|
TEST(Renderive_Core2, PartitionedPlotsBuildPropertyDrivenRenderGraphs) {
|
||||||
Plot_Scene plot;
|
Render_Scene_2D plot;
|
||||||
plot.init();
|
plot.init();
|
||||||
plot.set_viewport_size({320, 180});
|
plot.set_viewport_size({320, 180});
|
||||||
const auto root = plot.root_renderable();
|
const auto root = plot.root_renderable();
|
||||||
@@ -989,7 +989,7 @@ TEST(Renderive_Core2, AutomaticPartitioningSplitsOnlyForMeasuredBottlenecks) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
TEST(Renderive_Core2, DynamicWaterfallCaptureStressPreservesPlansSlotsAndExactSessions) {
|
TEST(Renderive_Core2, DynamicWaterfallCaptureStressPreservesPlansSlotsAndExactSessions) {
|
||||||
Plot_Scene plot;
|
Render_Scene_2D plot;
|
||||||
plot.init();
|
plot.init();
|
||||||
plot.set_viewport_size({640, 360});
|
plot.set_viewport_size({640, 360});
|
||||||
const auto root = plot.root_renderable();
|
const auto root = plot.root_renderable();
|
||||||
@@ -1053,7 +1053,7 @@ TEST(Renderive_Core2, DynamicWaterfallCaptureStressPreservesPlansSlotsAndExactSe
|
|||||||
}
|
}
|
||||||
|
|
||||||
TEST(Renderive_Core2, PaintOnlyStyleChangesPreservePrepareCache) {
|
TEST(Renderive_Core2, PaintOnlyStyleChangesPreservePrepareCache) {
|
||||||
Plot_Scene plot;
|
Render_Scene_2D plot;
|
||||||
plot.init();
|
plot.init();
|
||||||
plot.set_viewport_size({320, 180});
|
plot.set_viewport_size({320, 180});
|
||||||
const auto root = plot.root_renderable();
|
const auto root = plot.root_renderable();
|
||||||
@@ -1115,7 +1115,7 @@ TEST(Renderive_Core2, PaintOnlyStyleChangesPreservePrepareCache) {
|
|||||||
}));
|
}));
|
||||||
}
|
}
|
||||||
TEST(Renderive_Core2, PlottableAxesAreDataDependenciesAndPaintOverlays) {
|
TEST(Renderive_Core2, PlottableAxesAreDataDependenciesAndPaintOverlays) {
|
||||||
Plot_Scene plot;
|
Render_Scene_2D plot;
|
||||||
plot.init();
|
plot.init();
|
||||||
const auto root = plot.root_renderable();
|
const auto root = plot.root_renderable();
|
||||||
const auto [frequency, power, spectrum] = build_initial(plot, [&](auto& attach) {
|
const auto [frequency, power, spectrum] = build_initial(plot, [&](auto& attach) {
|
||||||
@@ -1156,7 +1156,7 @@ TEST(Renderive_Core2, PlottableAxesAreDataDependenciesAndPaintOverlays) {
|
|||||||
EXPECT_LT(spectrum_position, power_position);
|
EXPECT_LT(spectrum_position, power_position);
|
||||||
}
|
}
|
||||||
TEST(Renderive_Core2, InteractionOverlayPaintsAboveItsAxes) {
|
TEST(Renderive_Core2, InteractionOverlayPaintsAboveItsAxes) {
|
||||||
Plot_Scene plot;
|
Render_Scene_2D plot;
|
||||||
plot.init();
|
plot.init();
|
||||||
const auto root = plot.root_renderable();
|
const auto root = plot.root_renderable();
|
||||||
const auto [horizontal, vertical, selection] = build_initial(plot, [&](auto& attach) {
|
const auto [horizontal, vertical, selection] = build_initial(plot, [&](auto& attach) {
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
#include <renderive/error/Error_Policy.hpp>
|
#include <renderive/error/Error_Policy.hpp>
|
||||||
#include "Point_Scene.h"
|
#include "Render_Scene_3D.h"
|
||||||
#include "Scene_Context.hpp"
|
#include "Scene_Context.hpp"
|
||||||
|
|
||||||
#include "detail/Datoviz_Visual_Backend.h"
|
#include "detail/Datoviz_Visual_Backend.h"
|
||||||
@@ -609,7 +609,7 @@ std::unique_ptr<Scene_Model> make_scene_model(
|
|||||||
|
|
||||||
} // namespace
|
} // namespace
|
||||||
|
|
||||||
struct Point_Scene::Impl {
|
struct Render_Scene_3D::Impl {
|
||||||
explicit Impl(const Scene_Options& options,
|
explicit Impl(const Scene_Options& options,
|
||||||
std::shared_ptr<Point_Visual> visual)
|
std::shared_ptr<Point_Visual> visual)
|
||||||
: model(make_scene_model(options, std::move(visual))) {}
|
: model(make_scene_model(options, std::move(visual))) {}
|
||||||
@@ -617,7 +617,7 @@ struct Point_Scene::Impl {
|
|||||||
std::unique_ptr<Scene_Model> model;
|
std::unique_ptr<Scene_Model> model;
|
||||||
};
|
};
|
||||||
|
|
||||||
Point_Scene::Point_Scene(Scene_Options options,
|
Render_Scene_3D::Render_Scene_3D(Scene_Options options,
|
||||||
std::shared_ptr<Point_Visual> visual) {
|
std::shared_ptr<Point_Visual> visual) {
|
||||||
if (!valid(options.viewport))
|
if (!valid(options.viewport))
|
||||||
::renderive::error::unexpected<std::invalid_argument>("Point_Scene viewport must be nonempty");
|
::renderive::error::unexpected<std::invalid_argument>("Point_Scene viewport must be nonempty");
|
||||||
@@ -630,26 +630,26 @@ Point_Scene::Point_Scene(Scene_Options options,
|
|||||||
impl_ = std::make_unique<Impl>(options, std::move(visual));
|
impl_ = std::make_unique<Impl>(options, std::move(visual));
|
||||||
}
|
}
|
||||||
|
|
||||||
Point_Scene::~Point_Scene() = default;
|
Render_Scene_3D::~Render_Scene_3D() = default;
|
||||||
|
|
||||||
Scene_Control_Error Point_Scene::resize(Extent extent) {
|
Scene_Control_Error Render_Scene_3D::resize(Extent extent) {
|
||||||
if (!valid(extent))
|
if (!valid(extent))
|
||||||
return Scene_Control_Error::empty_viewport;
|
return Scene_Control_Error::empty_viewport;
|
||||||
impl_->model->resize(extent);
|
impl_->model->resize(extent);
|
||||||
return Scene_Control_Error::none;
|
return Scene_Control_Error::none;
|
||||||
}
|
}
|
||||||
Scene_Control_Error Point_Scene::set_clear_color(Clear_Color color) {
|
Scene_Control_Error Render_Scene_3D::set_clear_color(Clear_Color color) {
|
||||||
if (!valid(color))
|
if (!valid(color))
|
||||||
return Scene_Control_Error::invalid_clear_color;
|
return Scene_Control_Error::invalid_clear_color;
|
||||||
impl_->model->set_clear_color(color);
|
impl_->model->set_clear_color(color);
|
||||||
return Scene_Control_Error::none;
|
return Scene_Control_Error::none;
|
||||||
}
|
}
|
||||||
|
|
||||||
Scene_Control_Error Point_Scene::dispatch(const ::renderive::Event&) {
|
Scene_Control_Error Render_Scene_3D::dispatch(const ::renderive::Event&) {
|
||||||
return Scene_Control_Error::none;
|
return Scene_Control_Error::none;
|
||||||
}
|
}
|
||||||
|
|
||||||
Scene_Control_Error Point_Scene::dispatch_pointer(
|
Scene_Control_Error Render_Scene_3D::dispatch_pointer(
|
||||||
::renderive::Event_Type type, float x, float y,
|
::renderive::Event_Type type, float x, float y,
|
||||||
::renderive::Mouse_Button button, ::renderive::Mouse_Button_Mask,
|
::renderive::Mouse_Button button, ::renderive::Mouse_Button_Mask,
|
||||||
::renderive::Keyboard_Modifier modifiers) {
|
::renderive::Keyboard_Modifier modifiers) {
|
||||||
@@ -662,7 +662,7 @@ Scene_Control_Error Point_Scene::dispatch_pointer(
|
|||||||
return impl_->model->dispatch_pointer(type, x, y, button, modifiers);
|
return impl_->model->dispatch_pointer(type, x, y, button, modifiers);
|
||||||
}
|
}
|
||||||
|
|
||||||
Scene_Control_Error Point_Scene::dispatch_wheel(
|
Scene_Control_Error Render_Scene_3D::dispatch_wheel(
|
||||||
float x, float y, float pixel_delta_x, float pixel_delta_y,
|
float x, float y, float pixel_delta_x, float pixel_delta_y,
|
||||||
float angle_delta_x, float angle_delta_y,
|
float angle_delta_x, float angle_delta_y,
|
||||||
::renderive::Keyboard_Modifier modifiers) {
|
::renderive::Keyboard_Modifier modifiers) {
|
||||||
@@ -675,39 +675,39 @@ Scene_Control_Error Point_Scene::dispatch_wheel(
|
|||||||
datoviz_wheel_step(pixel_delta_y, angle_delta_y), modifiers);
|
datoviz_wheel_step(pixel_delta_y, angle_delta_y), modifiers);
|
||||||
}
|
}
|
||||||
|
|
||||||
Scene_Control_Error Point_Scene::dispatch(const ::renderive::Key_Event& event) {
|
Scene_Control_Error Render_Scene_3D::dispatch(const ::renderive::Key_Event& event) {
|
||||||
return impl_->model->dispatch_key(event);
|
return impl_->model->dispatch_key(event);
|
||||||
}
|
}
|
||||||
|
|
||||||
Frame_Request_Result Point_Scene::prepare_frame() { return impl_->model->prepare_frame(); }
|
Frame_Request_Result Render_Scene_3D::prepare_frame() { return impl_->model->prepare_frame(); }
|
||||||
Frame_Request_Result Point_Scene::refresh_manual_frame() {
|
Frame_Request_Result Render_Scene_3D::refresh_manual_frame() {
|
||||||
return impl_->model->refresh_manual_frame();
|
return impl_->model->refresh_manual_frame();
|
||||||
}
|
}
|
||||||
bool Point_Scene::discard_pending_frame() {
|
bool Render_Scene_3D::discard_pending_frame() {
|
||||||
return impl_->model->discard_pending_frame();
|
return impl_->model->discard_pending_frame();
|
||||||
}
|
}
|
||||||
Frame_Request_Result Point_Scene::render_prepared_frame() {
|
Frame_Request_Result Render_Scene_3D::render_prepared_frame() {
|
||||||
return impl_->model->render_prepared_frame();
|
return impl_->model->render_prepared_frame();
|
||||||
}
|
}
|
||||||
Frame_Request_Result Point_Scene::request_frame() { return impl_->model->request_frame(); }
|
Frame_Request_Result Render_Scene_3D::request_frame() { return impl_->model->request_frame(); }
|
||||||
|
|
||||||
std::shared_ptr<const Pixel_Frame> Point_Scene::latest_frame() const {
|
std::shared_ptr<const Pixel_Frame> Render_Scene_3D::latest_frame() const {
|
||||||
return impl_->model->latest_frame();
|
return impl_->model->latest_frame();
|
||||||
}
|
}
|
||||||
|
|
||||||
Frame_Status Point_Scene::frame_status() const {
|
Frame_Status Render_Scene_3D::frame_status() const {
|
||||||
return impl_->model->frame_status();
|
return impl_->model->frame_status();
|
||||||
}
|
}
|
||||||
|
|
||||||
Runtime_Statistics Point_Scene::runtime_statistics() const noexcept {
|
Runtime_Statistics Render_Scene_3D::runtime_statistics() const noexcept {
|
||||||
return impl_->model->runtime_statistics();
|
return impl_->model->runtime_statistics();
|
||||||
}
|
}
|
||||||
|
|
||||||
Scene_Base& Point_Scene::render_scene() noexcept {
|
Scene_Base& Render_Scene_3D::render_scene() noexcept {
|
||||||
return impl_->model->scene();
|
return impl_->model->scene();
|
||||||
}
|
}
|
||||||
|
|
||||||
const Scene_Base& Point_Scene::render_scene() const noexcept {
|
const Scene_Base& Render_Scene_3D::render_scene() const noexcept {
|
||||||
return impl_->model->scene();
|
return impl_->model->scene();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1,25 +1,20 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include "Point_Visual.h"
|
#include "Point_Visual.h"
|
||||||
|
|
||||||
#include <renderive/event/Event.hpp>
|
#include <renderive/event/Event.hpp>
|
||||||
|
|
||||||
#include <cstddef>
|
#include <cstddef>
|
||||||
#include <cstdint>
|
#include <cstdint>
|
||||||
#include <memory>
|
#include <memory>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
class Scene_Base;
|
class Scene_Base;
|
||||||
|
|
||||||
namespace renderive::render_3d {
|
namespace renderive::render_3d {
|
||||||
|
|
||||||
struct Extent {
|
struct Extent {
|
||||||
std::uint32_t width{};
|
std::uint32_t width{};
|
||||||
std::uint32_t height{};
|
std::uint32_t height{};
|
||||||
[[nodiscard]] constexpr bool empty() const noexcept { return width == 0 || height == 0; }
|
[[nodiscard]] constexpr bool empty() const noexcept {
|
||||||
|
return width == 0 || height == 0;
|
||||||
|
}
|
||||||
bool operator==(const Extent&) const = default;
|
bool operator==(const Extent&) const = default;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct Clear_Color {
|
struct Clear_Color {
|
||||||
float red{0.035F};
|
float red{0.035F};
|
||||||
float green{0.045F};
|
float green{0.045F};
|
||||||
@@ -45,13 +40,11 @@ enum class Frame_Request_Result : std::uint8_t {
|
|||||||
external_failure,
|
external_failure,
|
||||||
scene_shutting_down
|
scene_shutting_down
|
||||||
};
|
};
|
||||||
|
|
||||||
enum class Frame_Mode : std::uint8_t {
|
enum class Frame_Mode : std::uint8_t {
|
||||||
Manual,
|
Manual,
|
||||||
Low_Latency,
|
Low_Latency,
|
||||||
Playback,
|
Playback,
|
||||||
};
|
};
|
||||||
|
|
||||||
enum struct Visual_Family : std::uint8_t {
|
enum struct Visual_Family : std::uint8_t {
|
||||||
Point,
|
Point,
|
||||||
Splat,
|
Splat,
|
||||||
@@ -69,7 +62,6 @@ enum struct Visual_Family : std::uint8_t {
|
|||||||
Text,
|
Text,
|
||||||
Volume,
|
Volume,
|
||||||
};
|
};
|
||||||
|
|
||||||
struct Scene_Options {
|
struct Scene_Options {
|
||||||
Extent viewport{560, 320};
|
Extent viewport{560, 320};
|
||||||
Clear_Color clear_color;
|
Clear_Color clear_color;
|
||||||
@@ -79,13 +71,11 @@ struct Scene_Options {
|
|||||||
bool validation_enabled{};
|
bool validation_enabled{};
|
||||||
Visual_Family visual_family{Visual_Family::Point};
|
Visual_Family visual_family{Visual_Family::Point};
|
||||||
};
|
};
|
||||||
|
|
||||||
struct Pixel_Frame {
|
struct Pixel_Frame {
|
||||||
Extent extent;
|
Extent extent;
|
||||||
std::uint64_t sequence{};
|
std::uint64_t sequence{};
|
||||||
std::vector<std::byte> rgba8;
|
std::vector<std::byte> rgba8;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct Runtime_Admission_Statistics {
|
struct Runtime_Admission_Statistics {
|
||||||
std::size_t capacity{};
|
std::size_t capacity{};
|
||||||
std::size_t active{};
|
std::size_t active{};
|
||||||
@@ -95,14 +85,12 @@ struct Runtime_Admission_Statistics {
|
|||||||
std::uint64_t backpressure_count{};
|
std::uint64_t backpressure_count{};
|
||||||
std::uint64_t backpressure_wait_ns{};
|
std::uint64_t backpressure_wait_ns{};
|
||||||
};
|
};
|
||||||
|
|
||||||
struct Runtime_Statistics {
|
struct Runtime_Statistics {
|
||||||
Runtime_Admission_Statistics render_domain;
|
Runtime_Admission_Statistics render_domain;
|
||||||
Runtime_Admission_Statistics gpu_completion;
|
Runtime_Admission_Statistics gpu_completion;
|
||||||
std::uint64_t gpu_completion_fault_count{};
|
std::uint64_t gpu_completion_fault_count{};
|
||||||
std::uint64_t gpu_completion_abandoned_count{};
|
std::uint64_t gpu_completion_abandoned_count{};
|
||||||
};
|
};
|
||||||
|
|
||||||
struct Frame_Status {
|
struct Frame_Status {
|
||||||
Frame_Mode mode{Frame_Mode::Low_Latency};
|
Frame_Mode mode{Frame_Mode::Low_Latency};
|
||||||
double frequency_hz{};
|
double frequency_hz{};
|
||||||
@@ -114,22 +102,18 @@ struct Frame_Status {
|
|||||||
std::uint64_t latest_sequence{};
|
std::uint64_t latest_sequence{};
|
||||||
std::uint64_t next_refresh_interval_ns{};
|
std::uint64_t next_refresh_interval_ns{};
|
||||||
};
|
};
|
||||||
|
|
||||||
// Owns frame scheduling and the single Datoviz mutation/render domain.
|
// Owns frame scheduling and the single Datoviz mutation/render domain.
|
||||||
class Point_Scene final {
|
class Render_Scene_3D final {
|
||||||
public:
|
public:
|
||||||
Point_Scene(Scene_Options options, std::shared_ptr<Point_Visual> visual);
|
Render_Scene_3D(Scene_Options options, std::shared_ptr<Point_Visual> visual);
|
||||||
~Point_Scene();
|
~Render_Scene_3D();
|
||||||
|
Render_Scene_3D(const Render_Scene_3D&) = delete;
|
||||||
Point_Scene(const Point_Scene&) = delete;
|
Render_Scene_3D& operator=(const Render_Scene_3D&) = delete;
|
||||||
Point_Scene& operator=(const Point_Scene&) = delete;
|
Render_Scene_3D(Render_Scene_3D&&) = delete;
|
||||||
Point_Scene(Point_Scene&&) = delete;
|
Render_Scene_3D& operator=(Render_Scene_3D&&) = delete;
|
||||||
Point_Scene& operator=(Point_Scene&&) = delete;
|
|
||||||
|
|
||||||
[[nodiscard]] Scene_Control_Error resize(Extent extent);
|
[[nodiscard]] Scene_Control_Error resize(Extent extent);
|
||||||
[[nodiscard]] Scene_Control_Error set_clear_color(Clear_Color color);
|
[[nodiscard]] Scene_Control_Error set_clear_color(Clear_Color color);
|
||||||
[[nodiscard]] Scene_Control_Error dispatch(const ::renderive::Event& event);
|
[[nodiscard]] Scene_Control_Error dispatch(const ::renderive::Event& event);
|
||||||
|
|
||||||
template <::renderive::Event_Point Point_Type>
|
template <::renderive::Event_Point Point_Type>
|
||||||
[[nodiscard]] Scene_Control_Error dispatch(
|
[[nodiscard]] Scene_Control_Error dispatch(
|
||||||
const ::renderive::Basic_Pointer_Event<Point_Type>& event) {
|
const ::renderive::Basic_Pointer_Event<Point_Type>& event) {
|
||||||
@@ -137,7 +121,6 @@ public:
|
|||||||
static_cast<float>(event.position.y), event.button,
|
static_cast<float>(event.position.y), event.button,
|
||||||
event.buttons, event.modifiers);
|
event.buttons, event.modifiers);
|
||||||
}
|
}
|
||||||
|
|
||||||
template <::renderive::Event_Point Point_Type>
|
template <::renderive::Event_Point Point_Type>
|
||||||
[[nodiscard]] Scene_Control_Error dispatch(
|
[[nodiscard]] Scene_Control_Error dispatch(
|
||||||
const ::renderive::Basic_Wheel_Event<Point_Type>& event) {
|
const ::renderive::Basic_Wheel_Event<Point_Type>& event) {
|
||||||
@@ -148,34 +131,28 @@ public:
|
|||||||
static_cast<float>(event.angle_delta_x),
|
static_cast<float>(event.angle_delta_x),
|
||||||
static_cast<float>(event.angle_delta_y), event.modifiers);
|
static_cast<float>(event.angle_delta_y), event.modifiers);
|
||||||
}
|
}
|
||||||
|
|
||||||
[[nodiscard]] Scene_Control_Error dispatch(const ::renderive::Key_Event& event);
|
[[nodiscard]] Scene_Control_Error dispatch(const ::renderive::Key_Event& event);
|
||||||
|
|
||||||
// Frame strategy operations. request_frame() is the complete low-latency path.
|
// Frame strategy operations. request_frame() is the complete low-latency path.
|
||||||
[[nodiscard]] Frame_Request_Result prepare_frame();
|
[[nodiscard]] Frame_Request_Result prepare_frame();
|
||||||
[[nodiscard]] Frame_Request_Result refresh_manual_frame();
|
[[nodiscard]] Frame_Request_Result refresh_manual_frame();
|
||||||
[[nodiscard]] bool discard_pending_frame();
|
[[nodiscard]] bool discard_pending_frame();
|
||||||
[[nodiscard]] Frame_Request_Result render_prepared_frame();
|
[[nodiscard]] Frame_Request_Result render_prepared_frame();
|
||||||
[[nodiscard]] Frame_Request_Result request_frame();
|
[[nodiscard]] Frame_Request_Result request_frame();
|
||||||
|
|
||||||
[[nodiscard]] std::shared_ptr<const Pixel_Frame> latest_frame() const;
|
[[nodiscard]] std::shared_ptr<const Pixel_Frame> latest_frame() const;
|
||||||
[[nodiscard]] Frame_Status frame_status() const;
|
[[nodiscard]] Frame_Status frame_status() const;
|
||||||
[[nodiscard]] Runtime_Statistics runtime_statistics() const noexcept;
|
[[nodiscard]] Runtime_Statistics runtime_statistics() const noexcept;
|
||||||
[[nodiscard]] Scene_Base& render_scene() noexcept;
|
[[nodiscard]] Scene_Base& render_scene() noexcept;
|
||||||
[[nodiscard]] const Scene_Base& render_scene() const noexcept;
|
[[nodiscard]] const Scene_Base& render_scene() const noexcept;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
[[nodiscard]] Scene_Control_Error dispatch_pointer(::renderive::Event_Type type, float x, float y,
|
[[nodiscard]] Scene_Control_Error dispatch_pointer(::renderive::Event_Type type, float x, float y,
|
||||||
::renderive::Mouse_Button button,
|
::renderive::Mouse_Button button,
|
||||||
::renderive::Mouse_Button_Mask buttons,
|
::renderive::Mouse_Button_Mask buttons,
|
||||||
::renderive::Keyboard_Modifier modifiers);
|
::renderive::Keyboard_Modifier modifiers);
|
||||||
[[nodiscard]] Scene_Control_Error dispatch_wheel(float x, float y, float pixel_delta_x,
|
[[nodiscard]] Scene_Control_Error dispatch_wheel(float x, float y, float pixel_delta_x,
|
||||||
float pixel_delta_y, float angle_delta_x,
|
float pixel_delta_y, float angle_delta_x,
|
||||||
float angle_delta_y,
|
float angle_delta_y,
|
||||||
::renderive::Keyboard_Modifier modifiers);
|
::renderive::Keyboard_Modifier modifiers);
|
||||||
|
|
||||||
struct Impl;
|
struct Impl;
|
||||||
std::unique_ptr<Impl> impl_;
|
std::unique_ptr<Impl> impl_;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace renderive::render_3d
|
} // namespace renderive::render_3d
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include "render_3D/Point_Scene.h"
|
#include "render_3D/Render_Scene_3D.h"
|
||||||
|
|
||||||
#include <array>
|
#include <array>
|
||||||
#include <cstdint>
|
#include <cstdint>
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
#include "render_3D/Point_Scene.h"
|
#include "render_3D/Render_Scene_3D.h"
|
||||||
|
|
||||||
#include <renderive/scene/base/Scene_Base.hpp>
|
#include <renderive/scene/base/Scene_Base.hpp>
|
||||||
|
|
||||||
@@ -17,7 +17,7 @@ namespace {
|
|||||||
|
|
||||||
struct Test_Point_Scene {
|
struct Test_Point_Scene {
|
||||||
std::shared_ptr<Point_Visual> visual;
|
std::shared_ptr<Point_Visual> visual;
|
||||||
std::unique_ptr<Point_Scene> scene;
|
std::unique_ptr<Render_Scene_3D> scene;
|
||||||
};
|
};
|
||||||
|
|
||||||
Test_Point_Scene make_test_scene(Scene_Options options) {
|
Test_Point_Scene make_test_scene(Scene_Options options) {
|
||||||
@@ -31,7 +31,7 @@ Test_Point_Scene make_test_scene(Scene_Options options) {
|
|||||||
Point_State state;
|
Point_State state;
|
||||||
state.style = {{12, 16, 24, 255}, 2.0F, Point_Aspect::Outline};
|
state.style = {{12, 16, 24, 255}, 2.0F, Point_Aspect::Outline};
|
||||||
auto visual = Point_Visual::Builder{state}.build(std::move(points));
|
auto visual = Point_Visual::Builder{state}.build(std::move(points));
|
||||||
auto scene = std::make_unique<Point_Scene>(options, visual);
|
auto scene = std::make_unique<Render_Scene_3D>(options, visual);
|
||||||
return {std::move(visual), std::move(scene)};
|
return {std::move(visual), std::move(scene)};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
|
|
||||||
#include "Gallery_Enum.h"
|
#include "Gallery_Enum.h"
|
||||||
#include "common/Gallery_Performance_Types.h"
|
#include "common/Gallery_Performance_Types.h"
|
||||||
#include "render_2D/scene/Plot_Scene.h"
|
#include "render_2D/scene/Render_Scene_2D.h"
|
||||||
#include "render_2D/renderable/Renderable.h"
|
#include "render_2D/renderable/Renderable.h"
|
||||||
|
|
||||||
#include "adminive/adminive.hpp"
|
#include "adminive/adminive.hpp"
|
||||||
|
|||||||
@@ -87,13 +87,13 @@ void append_session_actions(Gallery_Frame_Mode frame_mode,
|
|||||||
std::vector<Action_Model>& result) {
|
std::vector<Action_Model>& result) {
|
||||||
switch (frame_mode) {
|
switch (frame_mode) {
|
||||||
case Gallery_Frame_Mode::Manual:
|
case Gallery_Frame_Mode::Manual:
|
||||||
append_gallery_actions<Gallery_Session_Control<Plot_Scene>>(result);
|
append_gallery_actions<Gallery_Session_Control<Render_Scene_2D>>(result);
|
||||||
return;
|
return;
|
||||||
case Gallery_Frame_Mode::Low_Latency:
|
case Gallery_Frame_Mode::Low_Latency:
|
||||||
append_gallery_actions<Gallery_Session_Control<Plot_Scene>>(result);
|
append_gallery_actions<Gallery_Session_Control<Render_Scene_2D>>(result);
|
||||||
return;
|
return;
|
||||||
case Gallery_Frame_Mode::Playback:
|
case Gallery_Frame_Mode::Playback:
|
||||||
append_gallery_actions<Gallery_Session_Control<Plot_Scene>>(result);
|
append_gallery_actions<Gallery_Session_Control<Render_Scene_2D>>(result);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
::renderive::error::unexpected<std::invalid_argument>("unknown gallery frame mode");
|
::renderive::error::unexpected<std::invalid_argument>("unknown gallery frame mode");
|
||||||
@@ -103,11 +103,11 @@ std::size_t session_control_count(std::string_view case_id, Gallery_Frame_Mode f
|
|||||||
return 0;
|
return 0;
|
||||||
switch (frame_mode) {
|
switch (frame_mode) {
|
||||||
case Gallery_Frame_Mode::Manual:
|
case Gallery_Frame_Mode::Manual:
|
||||||
return gallery_control_count<Gallery_Session_Control<Plot_Scene>>();
|
return gallery_control_count<Gallery_Session_Control<Render_Scene_2D>>();
|
||||||
case Gallery_Frame_Mode::Low_Latency:
|
case Gallery_Frame_Mode::Low_Latency:
|
||||||
return gallery_control_count<Gallery_Session_Control<Plot_Scene>>();
|
return gallery_control_count<Gallery_Session_Control<Render_Scene_2D>>();
|
||||||
case Gallery_Frame_Mode::Playback:
|
case Gallery_Frame_Mode::Playback:
|
||||||
return gallery_control_count<Gallery_Session_Control<Plot_Scene>>();
|
return gallery_control_count<Gallery_Session_Control<Render_Scene_2D>>();
|
||||||
}
|
}
|
||||||
::renderive::error::unexpected<std::invalid_argument>("unknown gallery frame mode");
|
::renderive::error::unexpected<std::invalid_argument>("unknown gallery frame mode");
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
#include "render_2D/plottable/Performance_Overlay.h"
|
#include "render_2D/plottable/Performance_Overlay.h"
|
||||||
#include "render_2D/renderable/Renderable.h"
|
#include "render_2D/renderable/Renderable.h"
|
||||||
#include "render_2D/scene/Plot_Scene.h"
|
#include "render_2D/scene/Render_Scene_2D.h"
|
||||||
#include <memory>
|
#include <memory>
|
||||||
#include <string>
|
#include <string>
|
||||||
namespace adminive {
|
namespace adminive {
|
||||||
|
|||||||
@@ -51,7 +51,7 @@ double gaussian(double x, double center, double width) {
|
|||||||
}
|
}
|
||||||
} // namespace
|
} // namespace
|
||||||
struct Web_Plot_Session::Impl {
|
struct Web_Plot_Session::Impl {
|
||||||
Plot_Scene plot;
|
Render_Scene_2D plot;
|
||||||
renderive_Owner<Frequency_Axis> spectrum_frequency_axis;
|
renderive_Owner<Frequency_Axis> spectrum_frequency_axis;
|
||||||
renderive_Owner<Axis> spectrum_power_axis;
|
renderive_Owner<Axis> spectrum_power_axis;
|
||||||
renderive_Owner<Frequency_Axis> waterfall_frequency_axis;
|
renderive_Owner<Frequency_Axis> waterfall_frequency_axis;
|
||||||
|
|||||||
@@ -218,7 +218,7 @@ public:
|
|||||||
}
|
}
|
||||||
attach_performance_overlay(plot_);
|
attach_performance_overlay(plot_);
|
||||||
apply_layout();
|
apply_layout();
|
||||||
session_control_ = std::make_unique<Gallery_Session_Control<Plot_Scene>>(
|
session_control_ = std::make_unique<Gallery_Session_Control<Render_Scene_2D>>(
|
||||||
plot_, *primary_, feedback_policy_);
|
plot_, *primary_, feedback_policy_);
|
||||||
register_controls();
|
register_controls();
|
||||||
set_performance_plot_name(plot_, case_id_ + "/" + gallery_enum_id(frame_mode_));
|
set_performance_plot_name(plot_, case_id_ + "/" + gallery_enum_id(frame_mode_));
|
||||||
@@ -1420,9 +1420,9 @@ private:
|
|||||||
std::string case_id_;
|
std::string case_id_;
|
||||||
Gallery_Frame_Mode frame_mode_ = Gallery_Frame_Mode::Low_Latency;
|
Gallery_Frame_Mode frame_mode_ = Gallery_Frame_Mode::Low_Latency;
|
||||||
bool automatic_low_latency_{};
|
bool automatic_low_latency_{};
|
||||||
Plot_Scene plot_;
|
Render_Scene_2D plot_;
|
||||||
Gallery_Feedback_Policy feedback_policy_;
|
Gallery_Feedback_Policy feedback_policy_;
|
||||||
std::unique_ptr<Gallery_Session_Control<Plot_Scene>> session_control_;
|
std::unique_ptr<Gallery_Session_Control<Render_Scene_2D>> session_control_;
|
||||||
Gallery_Controls controls_;
|
Gallery_Controls controls_;
|
||||||
std::chrono::steady_clock::time_point performance_started_;
|
std::chrono::steady_clock::time_point performance_started_;
|
||||||
std::chrono::steady_clock::time_point last_performance_log_;
|
std::chrono::steady_clock::time_point last_performance_log_;
|
||||||
|
|||||||
@@ -5,7 +5,7 @@
|
|||||||
#include "../Gallery_Enum.h"
|
#include "../Gallery_Enum.h"
|
||||||
#include "../common/Gallery_Scheduler_Adminive.h"
|
#include "../common/Gallery_Scheduler_Adminive.h"
|
||||||
#include "../common/Pixel_Frame.h"
|
#include "../common/Pixel_Frame.h"
|
||||||
#include <render_3D/Point_Scene.h>
|
#include <render_3D/Render_Scene_3D.h>
|
||||||
|
|
||||||
#include "adminive/adminive.hpp"
|
#include "adminive/adminive.hpp"
|
||||||
#include "adminive/adapters/nlohmann_json.hpp"
|
#include "adminive/adapters/nlohmann_json.hpp"
|
||||||
@@ -681,7 +681,7 @@ private:
|
|||||||
bool automatic_low_latency_{};
|
bool automatic_low_latency_{};
|
||||||
bool active_{true};
|
bool active_{true};
|
||||||
std::shared_ptr<Point_Visual> visual_;
|
std::shared_ptr<Point_Visual> visual_;
|
||||||
Point_Scene scene_;
|
Render_Scene_3D scene_;
|
||||||
Gallery_Client_Performance client_performance_;
|
Gallery_Client_Performance client_performance_;
|
||||||
float blue_offset_{};
|
float blue_offset_{};
|
||||||
float projection_scale_{1.0F};
|
float projection_scale_{1.0F};
|
||||||
|
|||||||
Reference in New Issue
Block a user