#pragma once #include #include #include #include #include #include #include "../architecture/Renderable.h" #include "../Axis/Abs_Axis.h" #include "../base/Color.h" #include "../base/Geometry.h" #include "../base/Memory.h" #include "../base/Style.h" namespace renderive { struct Point_Set_Private; /// @brief 点集单点绘制形状。 enum class Point_Set_Shape : std::uint8_t { /// @brief 单像素点。 Pixel, /// @brief 圆点。 Circle, /// @brief 方点。 Square, /// @brief 十字点。 Cross }; /// @brief 点集构造属性。 struct Point_Set_Prop { std::weak_ptr domain_axis{}; std::weak_ptr value_axis{}; double size = 2.0; Pen pen = Pen(Color::white()); Brush brush = Brush(Color::white()); bool antialias = false; Point_Set_Shape shape = Point_Set_Shape::Pixel; }; /// @brief 按坐标轴绘制点集的图元。 class LIB_DECL Point_Set : public Renderable { public: /// @brief 写入点集坐标。 void update_points(std::span points); /// @brief 移动写入点集坐标。 void update_points(std::pmr::vector&& points); /// @brief 写入容器中的点集坐标。 template void update_points(const Points& points) { update_points(std::span(points.data(), points.size())); } /// @brief 用 writer 填充并写入点集坐标。 template void write_points(std::size_t count, Writer&& writer) { std::pmr::vector points(memory_resource(Memory_Domain::Point_Set)); points.resize(count); std::forward(writer)(std::span(points.data(), points.size())); update_points(std::move(points)); } /// @brief 写入带逐点颜色的点集。 void update_colored_points(std::span points, std::span colors); /// @brief 移动写入带逐点颜色的点集。 void update_colored_points(std::pmr::vector&& points, std::pmr::vector&& colors); /// @brief 写入容器中的带逐点颜色点集。 template void update_colored_points(const Points& points, const Colors& colors) { update_colored_points(std::span(points.data(), points.size()), std::span(colors.data(), colors.size())); } /// @brief 绑定 X 轴。 PROP(std::shared_ptr, domain_axis) /// @brief 绑定 Y 轴。 PROP(std::shared_ptr, value_axis) /// @brief 点尺寸。 PROP(double, size) /// @brief 点边框画笔。 PROP(Pen, pen) /// @brief 点填充刷。 PROP(Brush, brush) /// @brief 是否启用抗锯齿。 PROP(bool, antialias) /// @brief 点形状。 PROP(Point_Set_Shape, shape) struct Builder; /// @brief 创建点集图元。 Point_Set(); private: Point_Set_Private* d(); Render_Object_Owner create_render_data() override; Render_Object_Owner create_render_state() override; Render_Object_Owner create_input_data() override; }; /// @brief 点集构造器。 struct LIB_DECL Point_Set::Builder : Point_Set_Prop { PROP_B(std::shared_ptr, parent) PROP_B(std::shared_ptr, domain_axis) PROP_B(std::shared_ptr, value_axis) PROP_B(double, size) PROP_B(Pen, pen) PROP_B(Brush, brush) PROP_B(bool, antialias) PROP_B(Point_Set_Shape, shape) /// @brief 创建点集构造器。 Builder(std::shared_ptr parent, std::shared_ptr domain_axis, std::shared_ptr value_axis); /// @brief 构建并返回点集对象。 std::shared_ptr build(); std::shared_ptr parent{}; }; } // namespace renderive