You've already forked godot
mirror of
https://github.com/godotengine/godot.git
synced 2025-11-07 12:30:27 +00:00
Fix Polygon2D skinned bounds (for culling)
The bound Rect2 was previously incorrect because bone transforms need to be applied to verts in bone space, rather than local space. This was previously resulting in skinned Polygon2Ds being incorrectly culled.
This commit is contained in:
@@ -917,6 +917,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);
|
||||
|
||||
Reference in New Issue
Block a user