#pragma once #include "../architecture/Renderable.h" #include "../Axis/Abs_Axis.h" #include "../base/Style.h" #include namespace renderive { struct Grid_Private; /// @brief 网格线生成方式。 enum class Grid_Line_Mode : std::uint8_t { /// @brief 使用坐标轴刻度生成网格。 Axis_Tick, /// @brief 使用固定分段数生成网格。 Range_Division }; /// @brief 网格构造属性。 struct Grid_Prop { std::weak_ptr domain_axis{}; std::weak_ptr value_axis{}; bool domain_grid = true; bool value_grid = true; bool sub_grid = false; Grid_Line_Mode line_mode = Grid_Line_Mode::Axis_Tick; Range domain_range{}; Range value_range{}; int domain_divisions = 4; int value_divisions = 4; Pen domain_pen = Pen{Color{255, 255, 255, 40}}; Pen value_pen = Pen{Color{255, 255, 255, 40}}; Pen sub_pen = Pen{Color{255, 255, 255, 20}}; }; /// @brief 在两个坐标轴之间绘制网格线的图元。 class LIB_DECL Grid : public Renderable { public: /// @brief 绑定 X 轴。 PROP(std::shared_ptr, domain_axis) /// @brief 绑定 Y 轴。 PROP(std::shared_ptr, value_axis) /// @brief 是否绘制 X 轴方向网格。 PROP(bool, domain_grid) /// @brief 是否绘制 Y 轴方向网格。 PROP(bool, value_grid) /// @brief 是否绘制子网格。 PROP(bool, sub_grid) /// @brief 网格线生成方式。 PROP(Grid_Line_Mode, line_mode) /// @brief X 轴网格范围;为空时使用轴当前范围。 PROP(Range, domain_range) /// @brief Y 轴网格范围;为空时使用轴当前范围。 PROP(Range, value_range) /// @brief Range_Division 模式下 X 方向分段数。 PROP(int, domain_divisions) /// @brief Range_Division 模式下 Y 方向分段数。 PROP(int, value_divisions) /// @brief X 方向主网格画笔。 PROP(Pen, domain_pen) /// @brief Y 方向主网格画笔。 PROP(Pen, value_pen) /// @brief 子网格画笔。 PROP(Pen, sub_pen) struct Builder; /// @brief 创建网格图元。 Grid(); private: Grid_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 Grid::Builder : Grid_Prop { PROP_B(std::shared_ptr, parent) PROP_B(std::shared_ptr, domain_axis) PROP_B(std::shared_ptr, value_axis) PROP_B(bool, domain_grid) PROP_B(bool, value_grid) PROP_B(bool, sub_grid) PROP_B(Grid_Line_Mode, line_mode) PROP_B(Range, domain_range) PROP_B(Range, value_range) PROP_B(int, domain_divisions) PROP_B(int, value_divisions) PROP_B(Pen, domain_pen) PROP_B(Pen, value_pen) PROP_B(Pen, sub_pen) /// @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