26template <
typename Gr
idVisitor>
28 GridVisitor &visitor);
36template <
typename Gr
idVisitor>
38 GridVisitor &visitor);
46template <
typename Gr
idVisitor>
48 GridVisitor &visitor);
57template <
typename Gr
idVisitor>
59 GridVisitor &visitor);
69template <
typename Gr
idVisitor>
71 GridVisitor &visitor) {
77 int stepX = (x1 > x0) ? 1 : (x1 < x0) ? -1 : 0;
78 int stepY = (y1 > y0) ? 1 : (y1 < y0) ? -1 : 0;
80 float dx =
end.x - start.
x;
81 float dy =
end.y - start.
y;
98 visitor.visit(currentX, currentY);
113 if (currentX != x1 || currentY != y1) {
114 visitor.visit(x1, y1);
124template <
typename Gr
idVisitor>
126 GridVisitor &visitor) {
127 const i16 FP_SHIFT = 8;
128 const i16
FP_ONE = 1 << FP_SHIFT;
132 i16 startX_fp =
static_cast<i16
>(start.
x *
FP_ONE);
133 i16 startY_fp =
static_cast<i16
>(start.
y *
FP_ONE);
134 i16 endX_fp =
static_cast<i16
>(
end.x *
FP_ONE);
135 i16 endY_fp =
static_cast<i16
>(
end.y *
FP_ONE);
137 i16 x0 = startX_fp >> FP_SHIFT;
138 i16 y0 = startY_fp >> FP_SHIFT;
139 i16 x1 = endX_fp >> FP_SHIFT;
140 i16 y1 = endY_fp >> FP_SHIFT;
142 i16 stepX = (x1 > x0) ? 1 : (x1 < x0) ? -1 : 0;
143 i16 stepY = (y1 > y0) ? 1 : (y1 < y0) ? -1 : 0;
145 i16 deltaX_fp = endX_fp - startX_fp;
146 i16 deltaY_fp = endY_fp - startY_fp;
150 (deltaX_fp != 0) ?
static_cast<u16
>(
154 (deltaY_fp != 0) ?
static_cast<u16
>(
158 i16 nextX_fp = (stepX > 0) ? ((x0 + 1) << FP_SHIFT) : (x0 << FP_SHIFT);
159 i16 nextY_fp = (stepY > 0) ? ((y0 + 1) << FP_SHIFT) : (y0 << FP_SHIFT);
165 fl::abs(i32(nextX_fp - startX_fp)) * absDeltaX_fp >> FP_SHIFT)
170 fl::abs(i32(nextY_fp - startY_fp)) * absDeltaY_fp >> FP_SHIFT)
173 const u16 maxT_fp =
FP_ONE;
179 visitor.visit(currentX, currentY);
181 u16 t_fp = (tMaxX_fp < tMaxY_fp) ? tMaxX_fp : tMaxY_fp;
185 if (tMaxX_fp < tMaxY_fp) {
186 tMaxX_fp += absDeltaX_fp;
189 tMaxY_fp += absDeltaY_fp;
195 if (currentX != x1 || currentY != y1) {
196 visitor.visit(x1, y1);
206template <
typename Gr
idVisitor>
208 GridVisitor &visitor) {
209 const i32 FP_SHIFT = 8;
210 const i32
FP_ONE = 1 << FP_SHIFT;
214 i32 startX_fp =
static_cast<i32
>(start.
x *
FP_ONE);
215 i32 startY_fp =
static_cast<i32
>(start.
y *
FP_ONE);
216 i32 endX_fp =
static_cast<i32
>(
end.x *
FP_ONE);
217 i32 endY_fp =
static_cast<i32
>(
end.y *
FP_ONE);
219 i32 x0 = startX_fp >> FP_SHIFT;
220 i32 y0 = startY_fp >> FP_SHIFT;
221 i32 x1 = endX_fp >> FP_SHIFT;
222 i32 y1 = endY_fp >> FP_SHIFT;
224 i32 stepX = (x1 > x0) ? 1 : (x1 < x0) ? -1 : 0;
225 i32 stepY = (y1 > y0) ? 1 : (y1 < y0) ? -1 : 0;
227 i32 deltaX_fp = endX_fp - startX_fp;
228 i32 deltaY_fp = endY_fp - startY_fp;
232 (deltaX_fp != 0) ?
static_cast<u32
>(
236 (deltaY_fp != 0) ?
static_cast<u32
>(
240 i32 nextX_fp = (stepX > 0) ? ((x0 + 1) << FP_SHIFT) : (x0 << FP_SHIFT);
241 i32 nextY_fp = (stepY > 0) ? ((y0 + 1) << FP_SHIFT) : (y0 << FP_SHIFT);
247 fl::abs(
fl::i64(nextX_fp - startX_fp)) * absDeltaX_fp >> FP_SHIFT)
252 fl::abs(
fl::i64(nextY_fp - startY_fp)) * absDeltaY_fp >> FP_SHIFT)
255 const u32 maxT_fp =
FP_ONE;
261 visitor.visit(currentX, currentY);
263 u32 t_fp = (tMaxX_fp < tMaxY_fp) ? tMaxX_fp : tMaxY_fp;
267 if (tMaxX_fp < tMaxY_fp) {
268 tMaxX_fp += absDeltaX_fp;
271 tMaxY_fp += absDeltaY_fp;
276 if (currentX != x1 || currentY != y1) {
277 visitor.visit(x1, y1);
281template <
typename Gr
idVisitor>
283 GridVisitor &visitor) {
286 float maxRange =
fl::max(dx, dy);
301 if (maxRange < 256.0f) {
FL_DISABLE_WARNING_PUSH U constexpr common_type_t< T, U > min(T a, U b) FL_NOEXCEPT
void traverseGridSegmentFloat(const vec2f &start, const vec2f &end, GridVisitor &visitor)
Traverse a grid segment using floating point arithmetic.
constexpr common_type_t< T, U > max(T a, U b) FL_NOEXCEPT
constexpr T * end(T(&array)[N]) FL_NOEXCEPT
constexpr enable_if< is_fixed_point< T >::value, T >::type floor(T x) FL_NOEXCEPT
static constexpr i32 FP_ONE
void traverseGridSegment16(const vec2f &start, const vec2f &end, GridVisitor &visitor)
Traverse a grid segment using fixed-point 8.8 arithmetic.
void traverseGridSegment(const vec2f &start, const vec2f &end, GridVisitor &visitor)
Traverse a grid segment by selecting the cells that are crossed.
void traverseGridSegment32(const vec2f &start, const vec2f &end, GridVisitor &visitor)
constexpr enable_if< is_fixed_point< T >::value, T >::type abs(T x) FL_NOEXCEPT
Base definition for an LED controller.
static constexpr T max() FL_NOEXCEPT