From e61542092e204e1baadcb38fe7535c08faa0e07b Mon Sep 17 00:00:00 2001 From: wyc <1104749580@qq.com> Date: Sat, 29 Aug 2026 00:38:34 +0800 Subject: [PATCH] =?UTF-8?q?=E6=94=B9=E7=BB=93=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mcp/core/runtime/Gallery_Plots_3D.cpp | 161 +++++++++----- render_3D/render_3D/base/Types.hpp | 3 - render_3D/render_3D/detail/Backend_Types.hpp | 16 -- render_3D/render_3D/scene/Render_Scene_3D.ipp | 9 +- .../render_3D/scene/Scene_Datoviz_State.hpp | 46 +++- .../scene/detail/Datoviz_Frame_Pipeline.ipp | 16 +- .../scene/detail/Datoviz_Frame_State.hpp | 1 - .../scene/detail/Datoviz_Frame_Target.ipp | 5 - .../scene/detail/Datoviz_Scene_Components.hpp | 77 ------- .../scene/detail/Datoviz_Scene_Resources.ipp | 3 +- .../scene/detail/Datoviz_Visual_Set.ipp | 35 ++- .../scene/detail/Datoviz_Visual_State.hpp | 2 +- render_3D/render_3D/visual/Basic_Visual.cpp | 6 + render_3D/render_3D/visual/Basic_Visual.hpp | 28 ++- render_3D/render_3D/visual/Basic_Visual.ipp | 204 ++++++++++-------- render_3D/render_3D/visual/Glyph_Visual.cpp | 7 + render_3D/render_3D/visual/Glyph_Visual.hpp | 33 ++- render_3D/render_3D/visual/Glyph_Visual.ipp | 9 + render_3D/render_3D/visual/Image_Visual.cpp | 7 + render_3D/render_3D/visual/Image_Visual.hpp | 43 ++-- render_3D/render_3D/visual/Image_Visual.ipp | 9 + render_3D/render_3D/visual/Labels_Visual.cpp | 7 + render_3D/render_3D/visual/Labels_Visual.hpp | 43 ++-- render_3D/render_3D/visual/Labels_Visual.ipp | 9 + render_3D/render_3D/visual/Marker_Visual.cpp | 7 + render_3D/render_3D/visual/Marker_Visual.hpp | 34 ++- render_3D/render_3D/visual/Marker_Visual.ipp | 9 + render_3D/render_3D/visual/Mesh_Visual.cpp | 7 + render_3D/render_3D/visual/Mesh_Visual.hpp | 33 ++- render_3D/render_3D/visual/Mesh_Visual.ipp | 9 + render_3D/render_3D/visual/Path_Visual.cpp | 7 + render_3D/render_3D/visual/Path_Visual.hpp | 33 ++- render_3D/render_3D/visual/Path_Visual.ipp | 9 + render_3D/render_3D/visual/Pixel_Visual.cpp | 7 + render_3D/render_3D/visual/Pixel_Visual.hpp | 33 ++- render_3D/render_3D/visual/Pixel_Visual.ipp | 9 + render_3D/render_3D/visual/Point_Visual.cpp | 7 + render_3D/render_3D/visual/Point_Visual.hpp | 43 ++-- render_3D/render_3D/visual/Point_Visual.ipp | 9 + .../render_3D/visual/Prepared_Visual.hpp | 14 +- .../render_3D/visual/Primitive_Visual.cpp | 7 + .../render_3D/visual/Primitive_Visual.hpp | 33 ++- .../render_3D/visual/Primitive_Visual.ipp | 9 + render_3D/render_3D/visual/Segment_Visual.cpp | 7 + render_3D/render_3D/visual/Segment_Visual.hpp | 33 ++- render_3D/render_3D/visual/Segment_Visual.ipp | 9 + render_3D/render_3D/visual/Sphere_Visual.cpp | 7 + render_3D/render_3D/visual/Sphere_Visual.hpp | 33 ++- render_3D/render_3D/visual/Sphere_Visual.ipp | 9 + render_3D/render_3D/visual/Splat_Visual.cpp | 7 + render_3D/render_3D/visual/Splat_Visual.hpp | 33 ++- render_3D/render_3D/visual/Splat_Visual.ipp | 9 + render_3D/render_3D/visual/Text_Visual.cpp | 7 + render_3D/render_3D/visual/Text_Visual.hpp | 34 ++- render_3D/render_3D/visual/Text_Visual.ipp | 9 + render_3D/render_3D/visual/Vector_Visual.cpp | 7 + render_3D/render_3D/visual/Vector_Visual.hpp | 33 ++- render_3D/render_3D/visual/Vector_Visual.ipp | 9 + render_3D/render_3D/visual/Visual_Spec.hpp | 14 -- render_3D/render_3D/visual/Volume_Visual.cpp | 7 + render_3D/render_3D/visual/Volume_Visual.hpp | 43 ++-- render_3D/render_3D/visual/Volume_Visual.ipp | 9 + render_3D/tests/Visual_Tests.cpp | 6 +- 63 files changed, 953 insertions(+), 470 deletions(-) delete mode 100644 render_3D/render_3D/scene/detail/Datoviz_Scene_Components.hpp create mode 100644 render_3D/render_3D/visual/Basic_Visual.cpp create mode 100644 render_3D/render_3D/visual/Glyph_Visual.cpp create mode 100644 render_3D/render_3D/visual/Image_Visual.cpp create mode 100644 render_3D/render_3D/visual/Labels_Visual.cpp create mode 100644 render_3D/render_3D/visual/Marker_Visual.cpp create mode 100644 render_3D/render_3D/visual/Mesh_Visual.cpp create mode 100644 render_3D/render_3D/visual/Path_Visual.cpp create mode 100644 render_3D/render_3D/visual/Pixel_Visual.cpp create mode 100644 render_3D/render_3D/visual/Point_Visual.cpp create mode 100644 render_3D/render_3D/visual/Primitive_Visual.cpp create mode 100644 render_3D/render_3D/visual/Segment_Visual.cpp create mode 100644 render_3D/render_3D/visual/Sphere_Visual.cpp create mode 100644 render_3D/render_3D/visual/Splat_Visual.cpp create mode 100644 render_3D/render_3D/visual/Text_Visual.cpp create mode 100644 render_3D/render_3D/visual/Vector_Visual.cpp delete mode 100644 render_3D/render_3D/visual/Visual_Spec.hpp create mode 100644 render_3D/render_3D/visual/Volume_Visual.cpp diff --git a/mcp/core/runtime/Gallery_Plots_3D.cpp b/mcp/core/runtime/Gallery_Plots_3D.cpp index fff59fd..344a13f 100644 --- a/mcp/core/runtime/Gallery_Plots_3D.cpp +++ b/mcp/core/runtime/Gallery_Plots_3D.cpp @@ -239,7 +239,8 @@ struct Random_Data_Generator { const auto sequence = request.sequence != 0 ? request.sequence : static_cast(request.time_milliseconds * 10.0); - auto items = visual.template read_prop().items; + auto items = visual.template current_buffer() + .items; for (std::size_t index = 0; index < items.size(); ++index) { auto& item = items[index]; if constexpr (requires { item.position; }) @@ -265,7 +266,8 @@ struct Random_Data_Generator { std::to_string(sequence % 10'000U); } } - visual.template set<&Prop::items>(std::move(items)); + visual.template pending_buffer().items = + std::move(items); } }; @@ -314,8 +316,7 @@ public: descriptors_.push_back(detail::make_renderable_descriptor("axes", "三维坐标轴", "axes", Axes_Adapter{*axes_})); if constexpr (std::same_as) { using Marker_Adapter = detail::Renderable_Adapter, - detail::Prop_Field < &Prop::transform, "transform", "World transform applied to the complete marker collection." >, + detail::Prop_Field < &Prop::transform, "transform", "World transform applied to the complete marker collection." >, detail::Prop_Field < &Prop::visible, "visible", "Whether markers participate in rendering." >, detail::Prop_Field < &Prop::depth_test, "depth_test", "Whether marker fragments use depth testing." >, detail::State_Field < Definition::Base_Tag, &State::item_count, "item_count", "Number of markers in the Scene." >, @@ -332,8 +333,7 @@ public: using Marker_Prop = Marker_Visual::Prop; using Marker_State = Marker_Visual::State; using Marker_Adapter = detail::Renderable_Adapter, - detail::Prop_Field < &Marker_Prop::visible, "visible", "Whether the spectrogram marker layer is visible." >, + detail::Prop_Field < &Marker_Prop::visible, "visible", "Whether the spectrogram marker layer is visible." >, detail::Prop_Field < &Marker_Prop::depth_test, "depth_test", "Whether markers may be occluded by the surface." >, detail::State_Field, detail::State_Field, @@ -391,8 +391,8 @@ public: } else { using Definition = typename Visual_Object::Attached_Object; - using Prop = typename Definition::Prop; - using Items = std::remove_cvref_t().items)>; + using Frame = typename Definition::Frame; + using Items = std::remove_cvref_t().items)>; try { std::mt19937_64 engine{input_count(input, "seed", 4'294'967'295ULL)}; Items generated; @@ -407,16 +407,16 @@ public: std::uniform_real_distribution distribution(minimum, maximum); generated.resize(count); for (auto& item : generated) item.value = distribution(engine); - visual_->template update_prop<&Prop::items>([&](auto props) { - auto& prop = props.template get(); - prop.field_width = static_cast(width); - prop.field_height = static_cast(height); - prop.field_depth = static_cast(depth); - }); + auto& frame = visual_->template pending_buffer< + typename Definition::Frame_Tag>(); + frame.field_width = static_cast(width); + frame.field_height = static_cast(height); + frame.field_depth = static_cast(depth); } else { count = input_count(input, "count", 5'000'000); - const auto& current = visual_->template read_prop().items; + const auto& current = visual_->template current_buffer< + typename Definition::Frame_Tag>().items; if (current.empty()) throw std::invalid_argument("visual has no item template"); const auto prototype = current.front(); Item_Randomizer randomize(input); @@ -427,7 +427,8 @@ public: generated.push_back(std::move(item)); } } - visual_->template set<&Definition::Prop::items>(std::move(generated)); + visual_->template pending_buffer() + .items = std::move(generated); return {{"success", true}, {"generated_count", count}}; } catch (const std::exception& error) { @@ -462,6 +463,14 @@ struct Scene_Components_3D { plot::Axis_Descriptor{{-1.0, 1.0}, plot::Axis_Scale::linear, "Z", "", 5, 2, true, true, true} }; }; +template +Build_Result initialize_visual_frame( + Build_Result result, typename Visual::Frame frame) { + if (result) + result.value()->template initialize_buffer( + std::move(frame)); + return result; +} template std::shared_ptr make_visual_plot(std::string label, @@ -712,7 +721,8 @@ struct Spectrogram_Data_Generator { parameters = next; auto mesh = spectrogram_mesh(parameters); const auto vertex_count = mesh.size(); - visual.template set<&Mesh_Visual::Prop::items>(std::move(mesh)); + visual.template pending_buffer().items = + std::move(mesh); plot::Axis_Descriptor time_axis{ {0.0, parameters.time_span_seconds}, plot::Axis_Scale::time, "Time", "s", 6, 1, true, true, true @@ -753,39 +763,52 @@ struct Spectrogram_Data_Generator { return; const double animation_seconds = request.time_milliseconds / 1000.0 * parameters.animation_speed; auto mesh = spectrogram_mesh(parameters, animation_seconds); - visual.template set<&Mesh_Visual::Prop::items>(std::move(mesh)); + visual.template pending_buffer().items = + std::move(mesh); if (!markers) return; - auto items = markers->template read_prop().items; + auto items = markers->template current_buffer().items; for (auto& marker : items) { const float time = std::clamp((marker.position.x + 1.0F) * 0.5F, 0.0F, 1.0F); const float frequency = std::clamp((marker.position.y + 1.0F) * 0.5F, 0.0F, 1.0F); marker.position.z = -1.0F + 2.0F * spectrogram_level( time, frequency, animation_seconds, parameters.ridge_count); } - markers->template set<&Marker_Visual::Prop::items>(std::move(items)); + markers->template pending_buffer().items = + std::move(items); } }; } std::shared_ptr make_datoviz_point_plot() { - return make_visual_plot("Point Visual", Point_Visual::Builder{} - .set(&Point_Visual::Prop::items, std::vector{{{-0.65F, -0.25F, 0.05F}, color(255, 91, 110), 28.0F}, {{0.0F, 0.58F, 0.25F}, color(82, 226, 190), 34.0F}, {{0.62F, -0.12F, -0.15F}, color(75, 145, 255), 30.0F}}).build()); + return make_visual_plot("Point Visual", + initialize_visual_frame( + Point_Visual::Builder{}.build(), + Point_Frame{{{{-0.65F, -0.25F, 0.05F}, color(255, 91, 110), 28.0F}, {{0.0F, 0.58F, 0.25F}, color(82, 226, 190), 34.0F}, {{0.62F, -0.12F, -0.15F}, color(75, 145, 255), 30.0F}}})); } std::shared_ptr make_datoviz_splat_plot() { - return make_visual_plot("Splat Visual", Splat_Visual::Builder{} - .set(&Splat_Visual::Prop::items, std::vector{{{-0.48F, 0.0F, 0.1F}, color(255, 98, 115, 210), {0.18F, 0.08F}, 0.45F}, {{0.28F, 0.15F, 0.0F}, color(66, 218, 188, 210), {0.12F, 0.22F}, -0.3F}, {{0.15F, -0.38F, 0.2F}, color(76, 132, 255, 210), {0.2F, 0.1F}, 0.9F}}).build()); + return make_visual_plot("Splat Visual", + initialize_visual_frame( + Splat_Visual::Builder{}.build(), + Splat_Frame{{{{-0.48F, 0.0F, 0.1F}, color(255, 98, 115, 210), {0.18F, 0.08F}, 0.45F}, {{0.28F, 0.15F, 0.0F}, color(66, 218, 188, 210), {0.12F, 0.22F}, -0.3F}, {{0.15F, -0.38F, 0.2F}, color(76, 132, 255, 210), {0.2F, 0.1F}, 0.9F}}})); } std::shared_ptr make_datoviz_pixel_plot() { std::vector pixels; for (int y = -8; y <= 8; ++y) for (int x = -12; x <= 12; ++x) pixels.push_back({{x / 13.0F, y / 9.0F, 0.12F * std::sin(x * .45F) * std::cos(y * .35F)}, color(static_cast(90 + 6 * (x + 12)), static_cast(100 + 8 * (y + 8)), 230), 5.0F}); - return make_visual_plot("Pixel Visual", Pixel_Visual::Builder{}.set(&Pixel_Visual::Prop::items, std::move(pixels)).build()); + return make_visual_plot("Pixel Visual", + initialize_visual_frame( + Pixel_Visual::Builder{}.build(), + Pixel_Frame{std::move(pixels)})); } std::shared_ptr make_datoviz_marker_plot() { - return make_visual_plot("Marker Visual", Marker_Visual::Builder{} - .set(&Marker_Visual::Prop::items, std::vector{{{-0.7F, 0.0F, 0.0F}, color(255, 93, 115), 34.0F, 0.0F, Marker_Shape::disc}, {{-0.35F, 0.25F, 0.1F}, color(91, 226, 193), 36.0F, 0.25F, Marker_Shape::square}, {{0.0F, -0.2F, 0.2F}, color(100, 158, 255), 38.0F, 0.5F, Marker_Shape::triangle}, {{0.35F, 0.25F, 0.1F}, color(250, 195, 92), 40.0F, 0.75F, Marker_Shape::diamond}, {{0.7F, 0.0F, 0.0F}, color(201, 132, 255), 42.0F, 1.0F, Marker_Shape::cross}}).build()); + return make_visual_plot("Marker Visual", + initialize_visual_frame( + Marker_Visual::Builder{}.build(), + Marker_Frame{{{{-0.7F, 0.0F, 0.0F}, color(255, 93, 115), 34.0F, 0.0F, Marker_Shape::disc}, {{-0.35F, 0.25F, 0.1F}, color(91, 226, 193), 36.0F, 0.25F, Marker_Shape::square}, {{0.0F, -0.2F, 0.2F}, color(100, 158, 255), 38.0F, 0.5F, Marker_Shape::triangle}, {{0.35F, 0.25F, 0.1F}, color(250, 195, 92), 40.0F, 0.75F, Marker_Shape::diamond}, {{0.7F, 0.0F, 0.0F}, color(201, 132, 255), 42.0F, 1.0F, Marker_Shape::cross}}})); } std::shared_ptr make_datoviz_sphere_plot() { - return make_visual_plot("Sphere Visual", Sphere_Visual::Builder{} - .set(&Sphere_Visual::Prop::items, std::vector{{{-0.48F, -0.2F, 0.0F}, color(255, 91, 110), 0.28F}, {{0.08F, 0.25F, 0.18F}, color(82, 226, 190), 0.36F}, {{0.55F, -0.18F, -0.12F}, color(75, 145, 255), 0.24F}}).build()); + return make_visual_plot("Sphere Visual", + initialize_visual_frame( + Sphere_Visual::Builder{}.build(), + Sphere_Frame{{{{-0.48F, -0.2F, 0.0F}, color(255, 91, 110), 0.28F}, {{0.08F, 0.25F, 0.18F}, color(82, 226, 190), 0.36F}, {{0.55F, -0.18F, -0.12F}, color(75, 145, 255), 0.24F}}})); } std::shared_ptr make_datoviz_segment_plot() { std::vector segments; @@ -793,24 +816,36 @@ std::shared_ptr make_datoviz_segment_plot() { const float angle = static_cast(index) * std::numbers::pi_v / 6.0F; segments.push_back({{0.0F, 0.0F, 0.0F}, {0.82F * std::cos(angle), 0.82F * std::sin(angle), 0.18F * std::sin(2 * angle)}, color(static_cast(80 + index * 13), static_cast(220 - index * 8), 240), 4.0F}); } - return make_visual_plot("Segment Visual", Segment_Visual::Builder{}.set(&Segment_Visual::Prop::items, std::move(segments)).build()); + return make_visual_plot("Segment Visual", + initialize_visual_frame( + Segment_Visual::Builder{}.build(), + Segment_Frame{std::move(segments)})); } std::shared_ptr make_datoviz_vector_plot() { - return make_visual_plot("Vector Visual", Vector_Visual::Builder{} - .set(&Vector_Visual::Prop::items, std::vector{{{-0.55F, -0.35F, 0.0F}, {0.55F, 0.2F, 0.25F}, color(255, 98, 115), 4.0F}, {{-0.1F, 0.0F, 0.0F}, {0.2F, 0.62F, 0.18F}, color(80, 225, 190), 5.0F}, {{0.35F, -0.25F, 0.0F}, {-0.12F, 0.25F, 0.65F}, color(78, 145, 255), 4.0F}}).build()); + return make_visual_plot("Vector Visual", + initialize_visual_frame( + Vector_Visual::Builder{}.build(), + Vector_Frame{{{{-0.55F, -0.35F, 0.0F}, {0.55F, 0.2F, 0.25F}, color(255, 98, 115), 4.0F}, {{-0.1F, 0.0F, 0.0F}, {0.2F, 0.62F, 0.18F}, color(80, 225, 190), 5.0F}, {{0.35F, -0.25F, 0.0F}, {-0.12F, 0.25F, 0.65F}, color(78, 145, 255), 4.0F}}})); } std::shared_ptr make_datoviz_primitive_plot() { - return make_visual_plot("Primitive Visual", Primitive_Visual::Builder{} - .set(&Primitive_Visual::Prop::items, std::vector{{{-0.72F, -0.55F, 0.0F}, color(255, 86, 110), {0, 0, 1}}, {{0.72F, -0.55F, 0.0F}, color(75, 145, 255), {0, 0, 1}}, {{0.0F, 0.72F, 0.25F}, color(82, 226, 190), {0, 0, 1}}}).build()); + return make_visual_plot("Primitive Visual", + initialize_visual_frame( + Primitive_Visual::Builder{}.build(), + Primitive_Frame{{{{-0.72F, -0.55F, 0.0F}, color(255, 86, 110), {0, 0, 1}}, {{0.72F, -0.55F, 0.0F}, color(75, 145, 255), {0, 0, 1}}, {{0.0F, 0.72F, 0.25F}, color(82, 226, 190), {0, 0, 1}}}})); } std::shared_ptr make_datoviz_mesh_plot() { const std::vector mesh{{{-0.65F, -0.55F, 0.0F}, color(255, 94, 112), {0, 0, 1}, {0, 0}}, {{0.65F, -0.55F, 0.0F}, color(75, 145, 255), {0, 0, 1}, {1, 0}}, {{0.65F, 0.55F, 0.0F}, color(82, 226, 190), {0, 0, 1}, {1, 1}}, {{-0.65F, -0.55F, 0.0F}, color(255, 94, 112), {0, 0, 1}, {0, 0}}, {{0.65F, 0.55F, 0.0F}, color(82, 226, 190), {0, 0, 1}, {1, 1}}, {{-0.65F, 0.55F, 0.0F}, color(244, 190, 86), {0, 0, 1}, {0, 1}}}; - return make_visual_plot("Mesh Visual", Mesh_Visual::Builder{}.set(&Mesh_Visual::Prop::items, mesh).build()); + return make_visual_plot("Mesh Visual", + initialize_visual_frame( + Mesh_Visual::Builder{}.build(), Mesh_Frame{mesh})); } std::shared_ptr make_datoviz_spectrogram_plot() { const Spectrogram_Parameters parameters; - auto marker_result = Marker_Visual::Builder{} - .set(&Marker_Visual::Prop::items, std::vector{ + auto marker_result = initialize_visual_frame( + Marker_Visual::Builder{} + .set(&Marker_Visual::Prop::depth_test, false) + .build(), + Marker_Frame{std::vector{ { {-0.35F, -0.18F, 0.72F}, color(255, 244, 170), 23.0F, 0.0F, Marker_Shape::diamond, false @@ -819,9 +854,7 @@ std::shared_ptr make_datoviz_spectrogram_plot() { {0.28F, 0.34F, 0.86F}, color(88, 236, 211), 21.0F, 0.0F, Marker_Shape::cross, false } - }) - .set(&Marker_Visual::Prop::depth_test, false) - .build(); + }}); if (!marker_result) throw std::logic_error("3D Spectrogram marker construction failed"); auto markers = std::move(marker_result).value(); Scene_Components_3D components; @@ -859,9 +892,9 @@ std::shared_ptr make_datoviz_spectrogram_plot() { }; return make_visual_plot( "3D Spectrogram", - Mesh_Visual::Builder{} - .set(&Mesh_Visual::Prop::items, spectrogram_mesh(parameters)) - .build(), + initialize_visual_frame( + Mesh_Visual::Builder{}.build(), + Mesh_Frame{spectrogram_mesh(parameters)}), std::move(components), Spectrogram_Data_Generator{parameters}, std::move(markers)); } std::shared_ptr make_datoviz_path_plot() { @@ -870,7 +903,10 @@ std::shared_ptr make_datoviz_path_plot() { const float t = static_cast(index) / 63.0F; path.push_back({{-0.9F + 1.8F * t, 0.48F * std::sin(t * 4.0F * std::numbers::pi_v), 0.25F * std::cos(t * 2.0F * std::numbers::pi_v)}, color(static_cast(70 + 170 * t), static_cast(220 - 80 * t), 245), 5.0F}); } - return make_visual_plot("Path Visual", Path_Visual::Builder{}.set(&Path_Visual::Prop::items, std::move(path)).build()); + return make_visual_plot("Path Visual", + initialize_visual_frame( + Path_Visual::Builder{}.build(), + Path_Frame{std::move(path)})); } std::shared_ptr make_datoviz_image_plot() { std::vector pixels(32U * 32U); @@ -878,10 +914,11 @@ std::shared_ptr make_datoviz_image_plot() { for (std::uint32_t x = 0; x < 32U; ++x) pixels[y * 32U + x] = (x / 8U + y / 8U) % 2U == 0U ? color(40, 235, 205) : color(18, 42, 72); - return make_visual_plot("Image Visual", Image_Visual::Builder{} - .set(&Image_Visual::Prop::field_width, 32U).set(&Image_Visual::Prop::field_height, 32U) - .set(&Image_Visual::Prop::field_pixels, std::move(pixels)) - .set(&Image_Visual::Prop::items, std::vector{{{0.0F, 0.0F, 0.0F}, {1.45F, 1.0F}, {0, 0, 1, 1}}}).build()); + return make_visual_plot("Image Visual", + initialize_visual_frame( + Image_Visual::Builder{}.build(), + Image_Frame{{{{0.0F, 0.0F, 0.0F}, {1.45F, 1.0F}, {0, 0, 1, 1}}}, + 32U, 32U, std::move(pixels)})); } std::shared_ptr make_datoviz_labels_plot() { std::vector labels(8U * 8U); @@ -889,24 +926,30 @@ std::shared_ptr make_datoviz_labels_plot() { for (std::uint32_t x = 0; x < 8U; ++x) labels[y * 8U + x] = static_cast( x / 4U + 2U * (y / 4U)); - return make_visual_plot("Labels Visual", Labels_Visual::Builder{} - .set(&Labels_Visual::Prop::field_width, 8U).set(&Labels_Visual::Prop::field_height, 8U) - .set(&Labels_Visual::Prop::field_labels, std::move(labels)) - .set(&Labels_Visual::Prop::items, std::vector