summaryrefslogtreecommitdiffstats
path: root/scene/2d/polygon_2d.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'scene/2d/polygon_2d.cpp')
-rw-r--r--scene/2d/polygon_2d.cpp30
1 files changed, 29 insertions, 1 deletions
diff --git a/scene/2d/polygon_2d.cpp b/scene/2d/polygon_2d.cpp
index bda7b495e1..ee186de5f1 100644
--- a/scene/2d/polygon_2d.cpp
+++ b/scene/2d/polygon_2d.cpp
@@ -101,7 +101,12 @@ void Polygon2D::_skeleton_bone_setup_changed() {
}
void Polygon2D::_notification(int p_what) {
+ if (p_what == NOTIFICATION_TRANSFORM_CHANGED && !Engine::get_singleton()->is_editor_hint()) {
+ return; // Mesh recreation for NOTIFICATION_TRANSFORM_CHANGED is only needed in editor.
+ }
+
switch (p_what) {
+ case NOTIFICATION_TRANSFORM_CHANGED:
case NOTIFICATION_DRAW: {
if (polygon.size() < 3) {
return;
@@ -364,7 +369,30 @@ void Polygon2D::_notification(int p_what) {
arr[RS::ARRAY_INDEX] = index_array;
- RS::get_singleton()->mesh_add_surface_from_arrays(mesh, RS::PRIMITIVE_TRIANGLES, arr, Array(), Dictionary(), RS::ARRAY_FLAG_USE_2D_VERTICES);
+ RS::SurfaceData sd;
+
+ if (skeleton_node) {
+ // Compute transform between mesh and skeleton for runtime AABB compute.
+ const Transform2D mesh_transform = get_global_transform();
+ const Transform2D skeleton_transform = skeleton_node->get_global_transform();
+ const Transform2D mesh_to_sk2d = mesh_transform * skeleton_transform.affine_inverse();
+
+ // Convert 2d transform to 3d.
+ sd.mesh_to_skeleton_xform.basis.rows[0][0] = mesh_to_sk2d.columns[0][0];
+ sd.mesh_to_skeleton_xform.basis.rows[0][1] = mesh_to_sk2d.columns[0][1];
+ sd.mesh_to_skeleton_xform.origin.x = mesh_to_sk2d.get_origin().x;
+
+ sd.mesh_to_skeleton_xform.basis.rows[1][0] = mesh_to_sk2d.columns[1][0];
+ sd.mesh_to_skeleton_xform.basis.rows[1][1] = mesh_to_sk2d.columns[1][1];
+ sd.mesh_to_skeleton_xform.origin.y = mesh_to_sk2d.get_origin().y;
+ }
+
+ Error err = RS::get_singleton()->mesh_create_surface_data_from_arrays(&sd, RS::PRIMITIVE_TRIANGLES, arr, Array(), Dictionary(), RS::ARRAY_FLAG_USE_2D_VERTICES);
+ if (err != OK) {
+ return;
+ }
+
+ RS::get_singleton()->mesh_add_surface(mesh, sd);
RS::get_singleton()->canvas_item_add_mesh(get_canvas_item(), mesh, Transform2D(), Color(1, 1, 1), texture.is_valid() ? texture->get_rid() : RID());
}