From a0e8b8b7875ba1eb883a714344d6fbace6259b4f Mon Sep 17 00:00:00 2001 From: Robert Guetzkow Date: Mon, 23 Nov 2020 13:32:38 +0100 Subject: Fix T82830: Handle limit for vertex color and uv layers in importer Blender has a limit for both vertex color layers and UV layers. The functions `bpy.types.Mesh.vertex_colors.new()` and `bpy.types.Mesh.uv_layers.new()` will return `None` once the limit is reached. The FBX importer and glTF importer didn't handle this case before and attempted to access the `data`, which failed. This patch adds the missing checks. In case no vertex colors or uv map can be created, the assignment of colors or uv coordinates is skipped. Reviewed By: mont29, julien Differential Revision: https://developer.blender.org/D9613 --- io_scene_fbx/import_fbx.py | 6 ++++++ io_scene_gltf2/blender/imp/gltf2_blender_mesh.py | 10 ++++++++++ 2 files changed, 16 insertions(+) diff --git a/io_scene_fbx/import_fbx.py b/io_scene_fbx/import_fbx.py index 319c4972..ec16b6d1 100644 --- a/io_scene_fbx/import_fbx.py +++ b/io_scene_fbx/import_fbx.py @@ -1079,6 +1079,12 @@ def blen_read_geom_layer_color(fbx_obj, mesh): # Always init our new layers with full white opaque color. color_lay = mesh.vertex_colors.new(name=fbx_layer_name, do_init=False) + + if color_lay is None: + print("Failed to add {%r %r} vertex color layer to %r (probably too many of them?)" + "" % (layer_id, fbx_layer_name, mesh.name)) + continue + blen_data = color_lay.data # some valid files omit this data diff --git a/io_scene_gltf2/blender/imp/gltf2_blender_mesh.py b/io_scene_gltf2/blender/imp/gltf2_blender_mesh.py index 09ec325b..0311c3b0 100755 --- a/io_scene_gltf2/blender/imp/gltf2_blender_mesh.py +++ b/io_scene_gltf2/blender/imp/gltf2_blender_mesh.py @@ -275,12 +275,22 @@ def do_primitives(gltf, mesh_idx, skin_idx, mesh, ob): for uv_i in range(num_uvs): name = 'UVMap' if uv_i == 0 else 'UVMap.%03d' % uv_i layer = mesh.uv_layers.new(name=name) + + if layer is None: + print("WARNING: UV map is ignored because the maximum number of UV layers has been reached.") + break + layer.data.foreach_set('uv', squish(loop_uvs[uv_i])) for col_i in range(num_cols): name = 'Col' if col_i == 0 else 'Col.%03d' % col_i layer = mesh.vertex_colors.new(name=name) + if layer is None: + print("WARNING: Vertex colors are ignored because the maximum number of vertex color layers has been " + "reached.") + break + layer.data.foreach_set('color', squish(loop_cols[col_i])) # Skinning -- cgit v1.2.3