Files
Renderive/Core/primitive/Grid.h
T
2026-08-01 20:09:45 +08:00

92 lines
3.1 KiB
C++

#pragma once
#include "../architecture/Renderable.h"
#include "../Axis/Abs_Axis.h"
#include "../base/Style.h"
#include <cstdint>
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<Abs_Axis> domain_axis{};
std::weak_ptr<Abs_Axis> 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<Abs_Axis>, domain_axis)
/// @brief 绑定 Y 轴。
PROP(std::shared_ptr<Abs_Axis>, 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<Renderable>, parent)
PROP_B(std::shared_ptr<Abs_Axis>, domain_axis)
PROP_B(std::shared_ptr<Abs_Axis>, 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<Renderable> parent, std::shared_ptr<Abs_Axis> domain_axis, std::shared_ptr<Abs_Axis> value_axis);
/// @brief 构建并返回网格对象。
std::shared_ptr<Grid> build();
std::shared_ptr<Renderable> parent{};
};
} // namespace renderive