Files
Renderive/Core/primitive/Marker.h
T
2026-08-02 03:43:39 +08:00

95 lines
3.0 KiB
C++

#pragma once
#include <cstdint>
#include <memory_resource>
#include <span>
#include <utility>
#include <vector>
#include "../architecture/Renderable.h"
#include "../Axis/Abs_Axis.h"
#include "../base/Geometry.h"
#include "../base/Memory.h"
#include "../base/Style.h"
namespace renderive {
struct Marker_Private;
/// @brief 标记绘制模式。
enum class Marker_Mode : std::uint8_t {
/// @brief 点标记。
Point,
/// @brief 垂直线标记。
Domain_Line,
/// @brief 水平线标记。
Value_Line,
/// @brief 十字光标标记。
Crosshair
};
/// @brief 单标记构造属性。
struct Marker_Prop {
std::weak_ptr<Abs_Axis> domain_axis{};
std::weak_ptr<Abs_Axis> value_axis{};
PointF position{};
double radius = 2.0;
Pen pen = Pen{Color::white()};
Brush brush = Brush{};
Marker_Mode mode = Marker_Mode::Point;
};
/// @brief 批量标记项。
struct Marker_Item {
PointF position{};
double radius = 2.0;
Pen pen = Pen{Color::white()};
Brush brush = Brush{};
Marker_Mode mode = Marker_Mode::Point;
};
/// @brief 按坐标轴绘制点、线或十字标记的图元。
class LIB_DECL Marker : public Renderable {
public:
/// @brief 绑定 X 轴。
PROP(std::shared_ptr<Abs_Axis>, domain_axis)
/// @brief 绑定 Y 轴。
PROP(std::shared_ptr<Abs_Axis>, value_axis)
/// @brief 单标记坐标位置。
PROP(PointF, position)
/// @brief 点标记半径。
PROP(double, radius)
/// @brief 标记画笔。
PROP(Pen, pen)
/// @brief 点标记填充刷。
PROP(Brush, brush)
/// @brief 标记绘制模式。
PROP(Marker_Mode, mode)
/// @brief 写入批量标记项。
void update_items(std::span<const Marker_Item> items);
/// @brief 移动写入批量标记项。
void update_items(std::pmr::vector<Marker_Item>&& items);
/// @brief 写入容器中的批量标记项。
template <typename Items>
void update_items(const Items& items) {
update_items(std::span<const Marker_Item>(items.data(), items.size()));
}
struct Builder;
/// @brief 创建标记图元。
Marker();
private:
Marker_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 Marker::Builder : Marker_Prop {
PROP_B(std::shared_ptr<Renderable>, parent)
PROP_B(std::shared_ptr<Abs_Axis>, domain_axis)
PROP_B(std::shared_ptr<Abs_Axis>, value_axis)
PROP_B(PointF, position)
PROP_B(double, radius)
PROP_B(Pen, pen)
PROP_B(Brush, brush)
PROP_B(Marker_Mode, mode)
/// @brief 创建标记构造器。
Builder(std::shared_ptr<Renderable> parent, std::shared_ptr<Abs_Axis> domain_axis, std::shared_ptr<Abs_Axis> value_axis);
/// @brief 构建并返回标记对象。
std::shared_ptr<Marker> build();
std::shared_ptr<Renderable> parent{};
};
} // namespace renderive