3#include <tess/core/lattice.h>
4#include <tess/core/shape.h>
10namespace tess::movement {
13enum class CornerRule : std::uint8_t {
19enum class StepPolicyIdentity : std::uint32_t {
21 DiagonalRequireBothClear = 0x44474243,
22 DiagonalRequireOneClear = 0x44474f43,
27 static constexpr StepPolicyIdentity identity = StepPolicyIdentity::Default;
28 static constexpr std::uint32_t cost_scale = 1;
29 static constexpr std::uint32_t maximum_step_multiplier = 1;
33template <CornerRule Rule = CornerRule::RequireBothClear>
35 static constexpr CornerRule corner_rule = Rule;
36 static constexpr StepPolicyIdentity identity =
37 Rule == CornerRule::RequireBothClear
38 ? StepPolicyIdentity::DiagonalRequireBothClear
39 : StepPolicyIdentity::DiagonalRequireOneClear;
43 static constexpr std::uint32_t cost_scale = 128;
44 static constexpr std::uint32_t diagonal_step_multiplier = 181;
45 static constexpr std::uint32_t maximum_step_multiplier =
46 diagonal_step_multiplier;
50template <CornerRule Rule>
52 Rule == CornerRule::RequireBothClear || Rule == CornerRule::RequireOneClear;
56template <
typename Policy>
57struct is_diagonal_steps : std::false_type {};
59template <CornerRule Rule>
60struct is_diagonal_steps<
DiagonalSteps<Rule>> : std::true_type {
61 static constexpr CornerRule corner_rule = Rule;
64template <
typename Shape>
65inline constexpr auto effective_axis_count =
66 static_cast<unsigned>(ShapeTraits<Shape>::size.x != 1) +
67 static_cast<unsigned>(ShapeTraits<Shape>::size.y != 1) +
68 static_cast<unsigned>(ShapeTraits<Shape>::size.z != 1);
70template <
typename Class,
typename =
void>
71struct step_policy_of_impl {
75template <
typename Class>
76struct step_policy_of_impl<Class, std::void_t<typename Class::step_policy>> {
77 using type =
typename Class::step_policy;
83template <
typename Policy>
85 { Policy::identity } -> std::convertible_to<StepPolicyIdentity>;
86 { Policy::cost_scale } -> std::convertible_to<std::uint32_t>;
87} && Policy::cost_scale > 0;
90template <
typename Policy,
typename Shape>
93 (std::is_same_v<Policy, DefaultSteps> ||
94 (detail::is_diagonal_steps<Policy>::value &&
96 std::is_same_v<typename ShapeTraits<Shape>::lattice_type,
98 detail::effective_axis_count<Shape> == 2));
101template <
typename Class>
102using step_policy_of =
typename detail::step_policy_of_impl<Class>::type;
105template <
typename Policy>
106inline constexpr StepPolicyIdentity step_policy_identity = Policy::identity;
109template <
typename Class>
110inline constexpr StepPolicyIdentity step_policy_identity_of =
111 step_policy_identity<step_policy_of<Class>>;
Definition step_policy.h:91
Definition step_policy.h:84
Definition step_policy.h:51
Definition step_policy.h:26
Definition step_policy.h:34