@@ -1213,7 +1213,7 @@ void ImDrawListSplitter::ClearFreeMemory()
1213
1213
1214
1214
void ImDrawListSplitter::Split (ImDrawList* draw_list, int channels_count)
1215
1215
{
1216
- IM_ASSERT (_Current == 0 && _Count = = 1 );
1216
+ IM_ASSERT (_Current == 0 && _Count < = 1 );
1217
1217
int old_channels_count = _Channels.Size ;
1218
1218
if (old_channels_count < channels_count)
1219
1219
_Channels.resize (channels_count);
@@ -1244,6 +1244,11 @@ void ImDrawListSplitter::Split(ImDrawList* draw_list, int channels_count)
1244
1244
}
1245
1245
}
1246
1246
1247
+ static inline bool CanMergeDrawCommands (ImDrawCmd* a, ImDrawCmd* b)
1248
+ {
1249
+ return memcmp (&a->ClipRect , &b->ClipRect , sizeof (a->ClipRect )) == 0 && a->TextureId == b->TextureId && !a->UserCallback && !b->UserCallback ;
1250
+ }
1251
+
1247
1252
void ImDrawListSplitter::Merge (ImDrawList* draw_list)
1248
1253
{
1249
1254
// Note that we never use or rely on channels.Size because it is merely a buffer that we never shrink back to 0 to keep all sub-buffers ready for use.
@@ -1257,12 +1262,21 @@ void ImDrawListSplitter::Merge(ImDrawList* draw_list)
1257
1262
// Calculate our final buffer sizes. Also fix the incorrect IdxOffset values in each command.
1258
1263
int new_cmd_buffer_count = 0 ;
1259
1264
int new_idx_buffer_count = 0 ;
1260
- int idx_offset = (draw_list->CmdBuffer .Size != 0 ) ? (draw_list->CmdBuffer .back ().IdxOffset + draw_list->CmdBuffer .back ().ElemCount ) : 0 ;
1265
+ ImDrawCmd* last_cmd = (_Count > 0 && _Channels[0 ].CmdBuffer .Size > 0 ) ? &_Channels[0 ].CmdBuffer .back () : NULL ;
1266
+ int idx_offset = last_cmd ? last_cmd->IdxOffset + last_cmd->ElemCount : 0 ;
1261
1267
for (int i = 1 ; i < _Count; i++)
1262
1268
{
1263
1269
ImDrawChannel& ch = _Channels[i];
1264
1270
if (ch.CmdBuffer .Size && ch.CmdBuffer .back ().ElemCount == 0 )
1265
1271
ch.CmdBuffer .pop_back ();
1272
+ else if (ch.CmdBuffer .Size > 0 && last_cmd != NULL && CanMergeDrawCommands (last_cmd, &ch.CmdBuffer [0 ]))
1273
+ {
1274
+ // Merge previous channel last draw command with current channel first draw command if matching.
1275
+ last_cmd->ElemCount += ch.CmdBuffer [0 ].ElemCount ;
1276
+ ch.CmdBuffer .erase (ch.CmdBuffer .Data );
1277
+ }
1278
+ if (ch.CmdBuffer .Size > 0 )
1279
+ last_cmd = &ch.CmdBuffer .back ();
1266
1280
new_cmd_buffer_count += ch.CmdBuffer .Size ;
1267
1281
new_idx_buffer_count += ch.IdxBuffer .Size ;
1268
1282
for (int cmd_n = 0 ; cmd_n < ch.CmdBuffer .Size ; cmd_n++)
0 commit comments