Jelajahi Sumber

Merge pull request #41315 from clayjohn/Polygon2D-crash

Check arrays before generating Polygon2D AABBs
Rémi Verschelde 5 tahun lalu
induk
melakukan
a10ae31c0f
1 mengubah file dengan 30 tambahan dan 27 penghapusan
  1. 30 27
      servers/visual/rasterizer.h

+ 30 - 27
servers/visual/rasterizer.h

@@ -971,6 +971,7 @@ public:
 						}
 
 						if (skeleton != RID()) {
+
 							// calculate bone AABBs
 							int bone_count = RasterizerStorage::base_singleton->skeleton_get_bone_count(skeleton);
 
@@ -981,39 +982,41 @@ public:
 							for (int j = 0; j < bone_count; j++) {
 								bptr[j].size = Vector2(-1, -1); //negative means unused
 							}
-
-							for (int j = 0; j < l; j++) {
-								Point2 p = pp[j];
-								for (int k = 0; k < 4; k++) {
-									int idx = polygon->bones[j * 4 + k];
-									float w = polygon->weights[j * 4 + k];
-									if (w == 0)
-										continue;
-
-									if (bptr[idx].size.x < 0) {
-										//first
-										bptr[idx] = Rect2(p, Vector2(0.00001, 0.00001));
-									} else {
-										bptr[idx].expand_to(p);
+							if (l && polygon->bones.size() == l * 4 && polygon->weights.size() == polygon->bones.size()) {
+
+								for (int j = 0; j < l; j++) {
+									Point2 p = pp[j];
+									for (int k = 0; k < 4; k++) {
+										int idx = polygon->bones[j * 4 + k];
+										float w = polygon->weights[j * 4 + k];
+										if (w == 0)
+											continue;
+
+										if (bptr[idx].size.x < 0) {
+											//first
+											bptr[idx] = Rect2(p, Vector2(0.00001, 0.00001));
+										} else {
+											bptr[idx].expand_to(p);
+										}
 									}
 								}
-							}
 
-							Rect2 aabb;
-							bool first_bone = true;
-							for (int j = 0; j < bone_count; j++) {
-								Transform2D mtx = RasterizerStorage::base_singleton->skeleton_bone_get_transform_2d(skeleton, j);
-								Rect2 baabb = mtx.xform(bone_aabbs[j]);
+								Rect2 aabb;
+								bool first_bone = true;
+								for (int j = 0; j < bone_count; j++) {
+									Transform2D mtx = RasterizerStorage::base_singleton->skeleton_bone_get_transform_2d(skeleton, j);
+									Rect2 baabb = mtx.xform(bone_aabbs[j]);
 
-								if (first_bone) {
-									aabb = baabb;
-									first_bone = false;
-								} else {
-									aabb = aabb.merge(baabb);
+									if (first_bone) {
+										aabb = baabb;
+										first_bone = false;
+									} else {
+										aabb = aabb.merge(baabb);
+									}
 								}
-							}
 
-							r = r.merge(aabb);
+								r = r.merge(aabb);
+							}
 						}
 
 					} break;