Merge pull request #109111 from lawnjelly/fix_multirect_cast

[3.x] `Batching` - Fix `MultiRect` casting to wrong type
This commit is contained in:
lawnjelly 2025-10-01 05:51:06 +01:00 committed by GitHub
commit e9af21fe1b
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -3209,20 +3209,13 @@ PREAMBLE(bool)::_sort_items_match(const BSortItem &p_a, const BSortItem &p_b) co
return false; return false;
} }
// tested outside function // Tested outside function.
// if (a->commands.size() != 1) // DEV_ASSERT(a->commands.size() == 1);
// return false;
const RasterizerCanvas::Item::Command &cb = *b->commands[0];
if ((cb.type != RasterizerCanvas::Item::Command::TYPE_RECT) && (cb.type != RasterizerCanvas::Item::Command::TYPE_MULTIRECT)) {
return false;
}
const RasterizerCanvas::Item::Command &ca = *a->commands[0]; const RasterizerCanvas::Item::Command &ca = *a->commands[0];
// tested outside function const RasterizerCanvas::Item::Command &cb = *b->commands[0];
// if (ca.type != Item::Command::TYPE_RECT)
// return false;
if ((ca.type == RasterizerCanvas::Item::Command::TYPE_RECT) && (cb.type == RasterizerCanvas::Item::Command::TYPE_RECT)) {
const RasterizerCanvas::Item::CommandRect *rect_a = static_cast<const RasterizerCanvas::Item::CommandRect *>(&ca); const RasterizerCanvas::Item::CommandRect *rect_a = static_cast<const RasterizerCanvas::Item::CommandRect *>(&ca);
const RasterizerCanvas::Item::CommandRect *rect_b = static_cast<const RasterizerCanvas::Item::CommandRect *>(&cb); const RasterizerCanvas::Item::CommandRect *rect_b = static_cast<const RasterizerCanvas::Item::CommandRect *>(&cb);
@ -3230,40 +3223,23 @@ PREAMBLE(bool)::_sort_items_match(const BSortItem &p_a, const BSortItem &p_b) co
return false; return false;
} }
/* ALTERNATIVE APPROACH NOT LIMITED TO RECTS return true;
const RasterizerCanvas::Item::Command &ca = *a->commands[0]; }
const RasterizerCanvas::Item::Command &cb = *b->commands[0];
if (ca.type != cb.type) if ((ca.type == RasterizerCanvas::Item::Command::TYPE_MULTIRECT) && (cb.type == RasterizerCanvas::Item::Command::TYPE_MULTIRECT)) {
return false; const RasterizerCanvas::Item::CommandMultiRect *rect_a = static_cast<const RasterizerCanvas::Item::CommandMultiRect *>(&ca);
const RasterizerCanvas::Item::CommandMultiRect *rect_b = static_cast<const RasterizerCanvas::Item::CommandMultiRect *>(&cb);
// do textures match? if (rect_a->texture != rect_b->texture) {
switch (ca.type)
{
default:
break;
case RasterizerCanvas::Item::Command::TYPE_RECT:
{
const RasterizerCanvas::Item::CommandRect *comm_a = static_cast<const RasterizerCanvas::Item::CommandRect *>(&ca);
const RasterizerCanvas::Item::CommandRect *comm_b = static_cast<const RasterizerCanvas::Item::CommandRect *>(&cb);
if (comm_a->texture != comm_b->texture)
return false; return false;
} }
break;
case RasterizerCanvas::Item::Command::TYPE_POLYGON:
{
const RasterizerCanvas::Item::CommandPolygon *comm_a = static_cast<const RasterizerCanvas::Item::CommandPolygon *>(&ca);
const RasterizerCanvas::Item::CommandPolygon *comm_b = static_cast<const RasterizerCanvas::Item::CommandPolygon *>(&cb);
if (comm_a->texture != comm_b->texture)
return false;
}
break;
}
*/
return true; return true;
} }
return false;
}
PREAMBLE(bool)::sort_items_from(int p_start) { PREAMBLE(bool)::sort_items_from(int p_start) {
#if defined(TOOLS_ENABLED) && defined(DEBUG_ENABLED) #if defined(TOOLS_ENABLED) && defined(DEBUG_ENABLED)
ERR_FAIL_COND_V((p_start + 1) >= bdata.sort_items.size(), false); ERR_FAIL_COND_V((p_start + 1) >= bdata.sort_items.size(), false);