From 2afa47843c01709af266ddce39f70d06f3d26b60 Mon Sep 17 00:00:00 2001 From: ShamikOfficial Date: Sun, 6 Sep 2026 14:40:46 -0700 Subject: [PATCH] Fix Poly3DCollection ragged padding overflow warnings. Initialize padded vertex storage with NaN instead of empty so unused entries cannot overflow during projection before invalid masking. Co-authored-by: Cursor --- lib/mpl_toolkits/mplot3d/art3d.py | 3 ++- lib/mpl_toolkits/mplot3d/tests/test_art3d.py | 16 ++++++++++++++++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/lib/mpl_toolkits/mplot3d/art3d.py b/lib/mpl_toolkits/mplot3d/art3d.py index b0d7312bff3d..7b81106aff6d 100644 --- a/lib/mpl_toolkits/mplot3d/art3d.py +++ b/lib/mpl_toolkits/mplot3d/art3d.py @@ -1360,7 +1360,8 @@ def _get_vector(self, segments3d): num_faces = len(segments3d) num_verts = np.fromiter(map(len, segments3d), dtype=np.intp) max_verts = num_verts.max(initial=0) - segments = np.empty((num_faces, max_verts, 3)) + # Pad with NaN so unused entries cannot overflow during projection (#32272). + segments = np.full((num_faces, max_verts, 3), np.nan) for i, face in enumerate(segments3d): segments[i, :len(face)] = face self._faces = segments diff --git a/lib/mpl_toolkits/mplot3d/tests/test_art3d.py b/lib/mpl_toolkits/mplot3d/tests/test_art3d.py index aca943f9e0c0..970635a6f7b5 100644 --- a/lib/mpl_toolkits/mplot3d/tests/test_art3d.py +++ b/lib/mpl_toolkits/mplot3d/tests/test_art3d.py @@ -117,3 +117,19 @@ def test_generate_normals(): ax = fig.add_subplot(projection='3d') ax.add_collection3d(shape) plt.draw() + + +def test_poly3dcollection_ragged_padding_no_overflow(): + # Ragged faces pad to a rectangular array. Padding must not overflow when + # projected before _invalid_vertices is applied. See #32272. + square = np.zeros((4, 3)) + triangle = np.zeros((3, 3)) + collection = Poly3DCollection([square, triangle]) + assert np.all(np.isnan(collection._faces[collection._invalid_vertices])) + + fig = plt.figure() + ax = fig.add_subplot(projection="3d") + ax.add_collection(collection, autolim=False) + ax.set(xlim=(0, 1), ylim=(0, 1), zlim=(0, 1)) + with np.errstate(over="raise"): + fig.canvas.draw()