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
This commit is contained in:
parent
f3a8b264d1
commit
a0e8b8b787
Notes:
blender-bot
2023-02-14 18:45:40 +01:00
Referenced by issue #82830, FBX Import: Can't import FBX file. AttributeError:'NoneType' object has no attribute 'data'
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue