@@ -731,58 +731,49 @@ void ImDrawList::PrimQuadUV(const ImVec2& a, const ImVec2& b, const ImVec2& c, c
731
731
#define IM_POLYLINE_IDX_16_BIT 0
732
732
#else
733
733
#define IM_POLYLINE_IDX_16_BIT 1
734
- # endif
735
-
736
- // Macros that declare, load and save write pointers as local variables
737
- #if 1 // FIXME-NEWPOLYLINE: choose local or shared write pointers
738
- #define IM_POLYLINE_PRIM_VTX_WRITE vtx_write
739
- #define IM_POLYLINE_PRIM_IDX_WRITE idx_write
740
- #define IM_POLYLINE_PRIM_IDX_BASE idx_base
741
-
742
- #define IM_POLYLINE_PRIM_MAKE_LOCAL () ImDrawVert* IM_POLYLINE_PRIM_VTX_WRITE = this ->_VtxWritePtr; ImDrawIdx* IM_POLYLINE_PRIM_IDX_WRITE = this ->_IdxWritePtr; unsigned int IM_POLYLINE_PRIM_IDX_BASE = this ->_VtxCurrentIdx
743
- #define IM_POLYLINE_PRIM_LOAD_LOCAL () IM_POLYLINE_PRIM_VTX_WRITE = this ->_VtxWritePtr; IM_POLYLINE_PRIM_IDX_WRITE = this ->_IdxWritePtr; IM_POLYLINE_PRIM_IDX_BASE = this ->_VtxCurrentIdx
744
- #define IM_POLYLINE_PRIM_SAVE_LOCAL () this ->_VtxWritePtr = IM_POLYLINE_PRIM_VTX_WRITE; this ->_IdxWritePtr = IM_POLYLINE_PRIM_IDX_WRITE; this ->_VtxCurrentIdx = IM_POLYLINE_PRIM_IDX_BASE
745
- #else
746
- #define IM_POLYLINE_PRIM_VTX_WRITE this->_VtxWritePtr
747
- #define IM_POLYLINE_PRIM_IDX_WRITE this->_IdxWritePtr
748
- #define IM_POLYLINE_PRIM_IDX_BASE this->_VtxCurrentIdx
749
-
750
- #define IM_POLYLINE_PRIM_MAKE_LOCAL() (void)0
751
- #define IM_POLYLINE_PRIM_LOAD_LOCAL() (void)0
752
- #define IM_POLYLINE_PRIM_SAVE_LOCAL() (void)0
753
734
#endif
754
735
755
736
// Macros that commit, split and handle vertex offset overflow
756
- #define IM_POLYLINE_PRIM_RESERVE (IDX_COUNT, VTX_COUNT ) this ->PrimReserve ((IDX_COUNT) + IM_POLYLINE_PRIM_EXTRA_IDX_COUNT, VTX_COUNT); IM_POLYLINE_PRIM_MAKE_LOCAL()
737
+ #define IM_POLYLINE_PRIM_RESERVE (IDX_COUNT, VTX_COUNT ) \
738
+ this ->PrimReserve ((IDX_COUNT) + IM_POLYLINE_PRIM_EXTRA_IDX_COUNT, VTX_COUNT); \
739
+ ImDrawVert* vtx_write = this ->_VtxWritePtr; \
740
+ ImDrawIdx* idx_write = this ->_IdxWritePtr; \
741
+ unsigned int idx_base = this ->_VtxCurrentIdx;
742
+
757
743
#define IM_POLYLINE_PRIM_COMMIT () \
758
- IM_POLYLINE_PRIM_SAVE_LOCAL (); \
744
+ this ->_VtxWritePtr = vtx_write; this ->_IdxWritePtr = idx_write; this ->_VtxCurrentIdx = idx_base; \
759
745
const int unused_vtx_count = (int )((this ->VtxBuffer.Data + this ->VtxBuffer.Size ) - this ->_VtxWritePtr); \
760
746
const int unused_idx_count = (int )((this ->IdxBuffer.Data + this ->IdxBuffer.Size ) - this ->_IdxWritePtr); \
761
747
this ->PrimUnreserve (unused_idx_count, unused_vtx_count)
762
748
763
- #define IM_POLYLINE_PRIM_SPLT () IM_POLYLINE_PRIM_COMMIT(); this ->PrimReserve (unused_idx_count, unused_vtx_count); IM_POLYLINE_PRIM_LOAD_LOCAL()
749
+ #define IM_POLYLINE_PRIM_SPLT () \
750
+ IM_POLYLINE_PRIM_COMMIT (); \
751
+ this ->PrimReserve (unused_idx_count, unused_vtx_count); \
752
+ vtx_write = this ->_VtxWritePtr; \
753
+ idx_write = this ->_IdxWritePtr; \
754
+ idx_base = this ->_VtxCurrentIdx;
764
755
765
756
#define IM_POLYLINE_VTX_COMMIT (N ) \
766
757
{ \
767
- IM_ASSERT_PARANOID ((IM_POLYLINE_PRIM_VTX_WRITE + (N)) <= (this ->VtxBuffer .Data + this ->VtxBuffer .Size ) && " IM_POLYLINE_VTX_COMMIT: VtxWritePtr moved out of bounds!" ); \
768
- IM_POLYLINE_PRIM_VTX_WRITE += N; \
769
- IM_POLYLINE_PRIM_IDX_BASE += N; \
758
+ IM_ASSERT_PARANOID ((idx_base + (N)) <= (this ->VtxBuffer .Data + this ->VtxBuffer .Size ) && " IM_POLYLINE_VTX_COMMIT: VtxWritePtr moved out of bounds!" ); \
759
+ vtx_write += N; \
760
+ idx_base += N; \
770
761
}
771
762
772
763
#if IM_POLYLINE_IDX_16_BIT
773
- #define IM_POLYLINE_PRIM_HANDLE_VTX_OFFSET_OVERFLOW (NEXT_BATCH_VTX_COUNT ) if (sizeof (ImDrawIdx) == 2 && ((IM_POLYLINE_PRIM_IDX_BASE) + (NEXT_BATCH_VTX_COUNT) >= (1 << 16 )) && (Flags & ImDrawListFlags_AllowVtxOffset)) IM_UNLIKELY { IM_POLYLINE_PRIM_SPLT (); }
764
+ #define IM_POLYLINE_PRIM_HANDLE_VTX_OFFSET_OVERFLOW (NEXT_BATCH_VTX_COUNT ) if (sizeof (ImDrawIdx) == 2 && (idx_base + (NEXT_BATCH_VTX_COUNT) >= (1 << 16 )) && (Flags & ImDrawListFlags_AllowVtxOffset)) IM_UNLIKELY { IM_POLYLINE_PRIM_SPLT (); }
774
765
#else
775
766
#define IM_POLYLINE_PRIM_HANDLE_VTX_OFFSET_OVERFLOW (NEXT_BATCH_VTX_COUNT ) (void )0
776
767
#endif
777
768
778
769
// Macros for filling vertices
779
770
#define IM_POLYLINE_VERTEX (N, X, Y, UV, C ) \
780
771
{ \
781
- IM_ASSERT_PARANOID ((IM_POLYLINE_PRIM_VTX_WRITE + (N)) < (this ->VtxBuffer .Data + this ->VtxBuffer .Size ) && " IM_POLYLINE_VERTEX: Writing outside of allocated buffer!" ); \
782
- IM_POLYLINE_PRIM_VTX_WRITE [N].pos .x = X; \
783
- IM_POLYLINE_PRIM_VTX_WRITE [N].pos .y = Y; \
784
- IM_POLYLINE_PRIM_VTX_WRITE [N].uv = UV; \
785
- IM_POLYLINE_PRIM_VTX_WRITE [N].col = C; \
772
+ IM_ASSERT_PARANOID ((vtx_write + (N)) < (this ->VtxBuffer .Data + this ->VtxBuffer .Size ) && " IM_POLYLINE_VERTEX: Writing outside of allocated buffer!" ); \
773
+ vtx_write [N].pos .x = X; \
774
+ vtx_write [N].pos .y = Y; \
775
+ vtx_write [N].uv = UV; \
776
+ vtx_write [N].col = C; \
786
777
}
787
778
788
779
// Macros for filling indices
@@ -811,7 +802,7 @@ IM_STATIC_ASSERT(2 * sizeof(ImDrawIdx) == sizeof(ImU64)); // assumption: ImU64 m
811
802
I[(N) * 3 + 2] = (ImDrawIdx)(Z + C)
812
803
#endif
813
804
814
- #define IM_POLYLINE_TRIANGLE (N, A, B, C ) (void )(N); IM_POLYLINE_TRIANGLE_EX(IM_POLYLINE_PRIM_IDX_WRITE , N, IM_POLYLINE_PRIM_IDX_BASE , A, B, C)
805
+ #define IM_POLYLINE_TRIANGLE (N, A, B, C ) (void )(N); IM_POLYLINE_TRIANGLE_EX(idx_write , N, idx_base , A, B, C)
815
806
816
807
// Extra indices to allocate for primitives
817
808
#ifndef IM_POLYLINE_PRIM_EXTRA_IDX_COUNT
@@ -1020,17 +1011,17 @@ void ImDrawList::_PolylineThinAntiAliased(const ImDrawListPolyline& polyline)
1020
1011
const float d_x = n0.x * t; \
1021
1012
const float d_y = n0.y * t; \
1022
1013
\
1023
- IM_POLYLINE_PRIM_VTX_WRITE [0 ].pos .x -= d_y; IM_POLYLINE_PRIM_VTX_WRITE [0 ].pos .y += d_x; \
1024
- IM_POLYLINE_PRIM_VTX_WRITE [1 ].pos .x += d_y; IM_POLYLINE_PRIM_VTX_WRITE [1 ].pos .y -= d_x; \
1025
- IM_POLYLINE_PRIM_VTX_WRITE [2 ].pos .x -= d_y; IM_POLYLINE_PRIM_VTX_WRITE [2 ].pos .y += d_x; \
1014
+ vtx_write [0 ].pos .x -= d_y; vtx_write [0 ].pos .y += d_x; \
1015
+ vtx_write [1 ].pos .x += d_y; vtx_write [1 ].pos .y -= d_x; \
1016
+ vtx_write [2 ].pos .x -= d_y; vtx_write [2 ].pos .y += d_x; \
1026
1017
} \
1027
1018
else IM_UNLIKELY \
1028
1019
{ \
1029
1020
const float d_x = n0.x * half_thickness * scale; \
1030
1021
const float d_y = n0.y * half_thickness * scale; \
1031
1022
\
1032
- IM_POLYLINE_PRIM_VTX_WRITE [0 ].pos .x -= d_y; IM_POLYLINE_PRIM_VTX_WRITE [0 ].pos .y += d_x; \
1033
- IM_POLYLINE_PRIM_VTX_WRITE [2 ].pos .x -= d_y; IM_POLYLINE_PRIM_VTX_WRITE [2 ].pos .y += d_x; \
1023
+ vtx_write [0 ].pos .x -= d_y; vtx_write [0 ].pos .y += d_x; \
1024
+ vtx_write [2 ].pos .x -= d_y; vtx_write [2 ].pos .y += d_x; \
1034
1025
} \
1035
1026
\
1036
1027
IM_POLYLINE_TRIANGLE_BEGIN (3 ); \
@@ -1367,10 +1358,10 @@ void ImDrawList::_PolylineThinAntiAliased(const ImDrawListPolyline& polyline)
1367
1358
//
1368
1359
// 1 join triangles
1369
1360
//
1370
- IM_POLYLINE_PRIM_VTX_WRITE [6 ].pos .x -= n1.y * polyline.fringe_width ;
1371
- IM_POLYLINE_PRIM_VTX_WRITE [6 ].pos .y += n1.x * polyline.fringe_width ;
1372
- IM_POLYLINE_PRIM_VTX_WRITE [8 ].pos .x -= n1.y * polyline.fringe_width ;
1373
- IM_POLYLINE_PRIM_VTX_WRITE [8 ].pos .y += n1.x * polyline.fringe_width ;
1361
+ vtx_write [6 ].pos .x -= n1.y * polyline.fringe_width ;
1362
+ vtx_write [6 ].pos .y += n1.x * polyline.fringe_width ;
1363
+ vtx_write [8 ].pos .x -= n1.y * polyline.fringe_width ;
1364
+ vtx_write [8 ].pos .y += n1.x * polyline.fringe_width ;
1374
1365
1375
1366
IM_POLYLINE_TRIANGLE_BEGIN (3 );
1376
1367
IM_POLYLINE_TRIANGLE (0 , 6 , 8 , 7 );
@@ -1399,9 +1390,9 @@ void ImDrawList::_PolylineThinAntiAliased(const ImDrawListPolyline& polyline)
1399
1390
{
1400
1391
ImDrawVert* vtx_start = this ->VtxBuffer .Data + vtx_start_idx;
1401
1392
1402
- vtx_start[0 ].pos = IM_POLYLINE_PRIM_VTX_WRITE [0 ].pos ;
1403
- vtx_start[1 ].pos = IM_POLYLINE_PRIM_VTX_WRITE [1 ].pos ;
1404
- vtx_start[2 ].pos = IM_POLYLINE_PRIM_VTX_WRITE [2 ].pos ;
1393
+ vtx_start[0 ].pos = vtx_write [0 ].pos ;
1394
+ vtx_start[1 ].pos = vtx_write [1 ].pos ;
1395
+ vtx_start[2 ].pos = vtx_write [2 ].pos ;
1405
1396
}
1406
1397
else IM_UNLIKELY
1407
1398
{
@@ -1466,10 +1457,10 @@ void ImDrawList::_PolylineThickAntiAliased(const ImDrawListPolyline& polyline)
1466
1457
const float d_x = n0.x * t; \
1467
1458
const float d_y = n0.y * t; \
1468
1459
\
1469
- IM_POLYLINE_PRIM_VTX_WRITE [0 ].pos .x -= d_y; IM_POLYLINE_PRIM_VTX_WRITE [0 ].pos .y += d_x; \
1470
- IM_POLYLINE_PRIM_VTX_WRITE [1 ].pos .x += d_y; IM_POLYLINE_PRIM_VTX_WRITE [1 ].pos .y -= d_x; \
1471
- IM_POLYLINE_PRIM_VTX_WRITE [2 ].pos .x += d_y; IM_POLYLINE_PRIM_VTX_WRITE [2 ].pos .y -= d_x; \
1472
- IM_POLYLINE_PRIM_VTX_WRITE [3 ].pos .x -= d_y; IM_POLYLINE_PRIM_VTX_WRITE [3 ].pos .y += d_x; \
1460
+ vtx_write [0 ].pos .x -= d_y; vtx_write [0 ].pos .y += d_x; \
1461
+ vtx_write [1 ].pos .x += d_y; vtx_write [1 ].pos .y -= d_x; \
1462
+ vtx_write [2 ].pos .x += d_y; vtx_write [2 ].pos .y -= d_x; \
1463
+ vtx_write [3 ].pos .x -= d_y; vtx_write [3 ].pos .y += d_x; \
1473
1464
} \
1474
1465
else \
1475
1466
{ \
@@ -1478,10 +1469,10 @@ void ImDrawList::_PolylineThickAntiAliased(const ImDrawListPolyline& polyline)
1478
1469
const float d_outer_x = n0.x * half_fringe_thickness * scale; \
1479
1470
const float d_outer_y = n0.y * half_fringe_thickness * scale; \
1480
1471
\
1481
- IM_POLYLINE_PRIM_VTX_WRITE [0 ].pos .x -= d_outer_y; IM_POLYLINE_PRIM_VTX_WRITE [0 ].pos .y += d_outer_x; \
1482
- IM_POLYLINE_PRIM_VTX_WRITE [1 ].pos .x -= d_inner_y; IM_POLYLINE_PRIM_VTX_WRITE [1 ].pos .y += d_inner_x; \
1483
- IM_POLYLINE_PRIM_VTX_WRITE [2 ].pos .x -= d_inner_y; IM_POLYLINE_PRIM_VTX_WRITE [2 ].pos .y += d_inner_x; \
1484
- IM_POLYLINE_PRIM_VTX_WRITE [3 ].pos .x -= d_outer_y; IM_POLYLINE_PRIM_VTX_WRITE [3 ].pos .y += d_outer_x; \
1472
+ vtx_write [0 ].pos .x -= d_outer_y; vtx_write [0 ].pos .y += d_outer_x; \
1473
+ vtx_write [1 ].pos .x -= d_inner_y; vtx_write [1 ].pos .y += d_inner_x; \
1474
+ vtx_write [2 ].pos .x -= d_inner_y; vtx_write [2 ].pos .y += d_inner_x; \
1475
+ vtx_write [3 ].pos .x -= d_outer_y; vtx_write [3 ].pos .y += d_outer_x; \
1485
1476
} \
1486
1477
\
1487
1478
IM_POLYLINE_TRIANGLE_BEGIN (6 ); \
@@ -2085,10 +2076,10 @@ void ImDrawList::_PolylineThickAntiAliased(const ImDrawListPolyline& polyline)
2085
2076
{
2086
2077
ImDrawVert* vtx_start = this ->VtxBuffer .Data + vtx_start_idx;
2087
2078
2088
- vtx_start[0 ].pos = IM_POLYLINE_PRIM_VTX_WRITE [0 ].pos ;
2089
- vtx_start[1 ].pos = IM_POLYLINE_PRIM_VTX_WRITE [1 ].pos ;
2090
- vtx_start[2 ].pos = IM_POLYLINE_PRIM_VTX_WRITE [2 ].pos ;
2091
- vtx_start[3 ].pos = IM_POLYLINE_PRIM_VTX_WRITE [3 ].pos ;
2079
+ vtx_start[0 ].pos = vtx_write [0 ].pos ;
2080
+ vtx_start[1 ].pos = vtx_write [1 ].pos ;
2081
+ vtx_start[2 ].pos = vtx_write [2 ].pos ;
2082
+ vtx_start[3 ].pos = vtx_write [3 ].pos ;
2092
2083
}
2093
2084
else IM_UNLIKELY
2094
2085
{
@@ -2142,8 +2133,8 @@ void ImDrawList::_PolylineAliased(const ImDrawListPolyline& polyline)
2142
2133
const float d_x = n0.x * half_thickness * scale; \
2143
2134
const float d_y = n0.y * half_thickness * scale; \
2144
2135
\
2145
- IM_POLYLINE_PRIM_VTX_WRITE [0 ].pos .x -= d_y; IM_POLYLINE_PRIM_VTX_WRITE [0 ].pos .y += d_x; \
2146
- IM_POLYLINE_PRIM_VTX_WRITE [1 ].pos .x -= d_y; IM_POLYLINE_PRIM_VTX_WRITE [1 ].pos .y += d_x; \
2136
+ vtx_write [0 ].pos .x -= d_y; vtx_write [0 ].pos .y += d_x; \
2137
+ vtx_write [1 ].pos .x -= d_y; vtx_write [1 ].pos .y += d_x; \
2147
2138
} \
2148
2139
else if (polyline.cap == ImDrawFlags_CapRound) IM_UNLIKELY \
2149
2140
{ \
@@ -2555,8 +2546,8 @@ void ImDrawList::_PolylineAliased(const ImDrawListPolyline& polyline)
2555
2546
{
2556
2547
ImDrawVert* vtx_start = this ->VtxBuffer .Data + vtx_start_idx;
2557
2548
2558
- vtx_start[0 ].pos = IM_POLYLINE_PRIM_VTX_WRITE [0 ].pos ;
2559
- vtx_start[1 ].pos = IM_POLYLINE_PRIM_VTX_WRITE [1 ].pos ;
2549
+ vtx_start[0 ].pos = vtx_write [0 ].pos ;
2550
+ vtx_start[1 ].pos = vtx_write [1 ].pos ;
2560
2551
}
2561
2552
else IM_UNLIKELY
2562
2553
{
@@ -3656,7 +3647,7 @@ void ImDrawList::_RectRounded(const ImVec2& a, const ImVec2& b, ImU32 col, floa
3656
3647
uv, path_colors[j]); \
3657
3648
} \
3658
3649
\
3659
- IM_POLYLINE_PRIM_VTX_WRITE += path_count; \
3650
+ vtx_write += path_count; \
3660
3651
} \
3661
3652
\
3662
3653
path_size += arc_size; \
@@ -3668,7 +3659,7 @@ void ImDrawList::_RectRounded(const ImVec2& a, const ImVec2& b, ImU32 col, floa
3668
3659
IM_POLYLINE_VERTEX (j, X X_SIGN path_offsets[j].x , Y Y_SIGN path_offsets[j].y , uv, path_colors[j]); \
3669
3660
} \
3670
3661
\
3671
- IM_POLYLINE_PRIM_VTX_WRITE += path_count; \
3662
+ vtx_write += path_count; \
3672
3663
++path_size; \
3673
3664
}
3674
3665
@@ -3691,13 +3682,11 @@ void ImDrawList::_RectRounded(const ImVec2& a, const ImVec2& b, ImU32 col, floa
3691
3682
}
3692
3683
IM_POLYLINE_TRIANGLE_END (path_size * strip_count * 2 * 3 );
3693
3684
3694
- IM_POLYLINE_PRIM_IDX_BASE += vtx_count;
3685
+ idx_base += vtx_count;
3695
3686
3696
3687
for (int j = 0 ; j < (path_count - 1 ) * 6 ; j++)
3697
- {
3698
- if (IM_POLYLINE_PRIM_IDX_WRITE[-j - 1 ] >= IM_POLYLINE_PRIM_IDX_BASE)
3699
- IM_POLYLINE_PRIM_IDX_WRITE[-j - 1 ] -= (ImDrawIdx)vtx_count;
3700
- }
3688
+ if (idx_write[-j - 1 ] >= idx_base)
3689
+ idx_write[-j - 1 ] -= (ImDrawIdx)vtx_count;
3701
3690
3702
3691
IM_POLYLINE_PRIM_COMMIT ();
3703
3692
}
0 commit comments