1
0
mirror of https://github.com/godotengine/godot.git synced 2025-11-07 12:30:27 +00:00

Merge pull request #75612 from lawnjelly/fix_skele2d_bounds2

[3.x] Fix Polygon2D skinned bounds (for culling)
This commit is contained in:
Rémi Verschelde
2023-04-25 16:24:59 +02:00
10 changed files with 269 additions and 55 deletions

View File

@@ -943,6 +943,38 @@ void VisualServerCanvas::canvas_item_set_z_as_relative_to_parent(RID p_item, boo
canvas_item->z_relative = p_enable;
}
Rect2 VisualServerCanvas::_debug_canvas_item_get_rect(RID p_item) {
Item *canvas_item = canvas_item_owner.getornull(p_item);
ERR_FAIL_COND_V(!canvas_item, Rect2());
return canvas_item->get_rect();
}
void VisualServerCanvas::canvas_item_set_skeleton_relative_xform(RID p_item, Transform2D p_relative_xform) {
Item *canvas_item = canvas_item_owner.getornull(p_item);
ERR_FAIL_COND(!canvas_item);
if (!canvas_item->skinning_data) {
canvas_item->skinning_data = memnew(Item::SkinningData);
}
canvas_item->skinning_data->skeleton_relative_xform = p_relative_xform;
canvas_item->skinning_data->skeleton_relative_xform_inv = p_relative_xform.affine_inverse();
// Set any Polygon2Ds pre-calced bone bounds to dirty.
for (int n = 0; n < canvas_item->commands.size(); n++) {
Item::Command *c = canvas_item->commands[n];
if (c->type == Item::Command::TYPE_POLYGON) {
Item::CommandPolygon *polygon = static_cast<Item::CommandPolygon *>(c);
// Make sure skinning data is present.
if (!polygon->skinning_data) {
polygon->skinning_data = memnew(Item::CommandPolygon::SkinningData);
}
polygon->skinning_data->dirty = true;
}
}
}
void VisualServerCanvas::canvas_item_attach_skeleton(RID p_item, RID p_skeleton) {
Item *canvas_item = canvas_item_owner.getornull(p_item);
ERR_FAIL_COND(!canvas_item);