WIP: FBX: Fix #84111: AssertionError importing shapekeys #104910
@ -1931,7 +1931,10 @@ def blen_read_shapes(fbx_tmpl, fbx_data, objects, me, scene):
|
|||||||
# will be clamped, and we'll print a warning message to the console.
|
# will be clamped, and we'll print a warning message to the console.
|
||||||
shape_key_values_in_range = True
|
shape_key_values_in_range = True
|
||||||
bc_uuid_to_keyblocks = {}
|
bc_uuid_to_keyblocks = {}
|
||||||
for bc_uuid, fbx_sdata, fbx_bcdata in fbx_data:
|
for k, v in fbx_data.items():
|
||||||
|
bc_uuid = k[0]
|
||||||
|
fbx_sdata, fbx_bcdata = v
|
||||||
|
|
||||||
elem_name_utf8 = elem_name_ensure_class(fbx_sdata, b'Geometry')
|
elem_name_utf8 = elem_name_ensure_class(fbx_sdata, b'Geometry')
|
||||||
indices = elem_prop_first(elem_find_first(fbx_sdata, b'Indexes'))
|
indices = elem_prop_first(elem_find_first(fbx_sdata, b'Indexes'))
|
||||||
dvcos = elem_prop_first(elem_find_first(fbx_sdata, b'Vertices'))
|
dvcos = elem_prop_first(elem_find_first(fbx_sdata, b'Vertices'))
|
||||||
@ -1961,6 +1964,14 @@ def blen_read_shapes(fbx_tmpl, fbx_data, objects, me, scene):
|
|||||||
if len(vgweights) == 1 and nbr_indices > 1:
|
if len(vgweights) == 1 and nbr_indices > 1:
|
||||||
vgweights = np.full_like(indices, vgweights[0], dtype=vgweights.dtype)
|
vgweights = np.full_like(indices, vgweights[0], dtype=vgweights.dtype)
|
||||||
|
|
||||||
|
# Special case for trimmed weights with trailing zeroes
|
||||||
|
if len(vgweights) != nbr_indices:
|
||||||
|
# Pad with zeros
|
||||||
|
new_vgweights = np.zeros_like(indices, dtype=vgweights.dtype)
|
||||||
|
n = min(len(vgweights), nbr_indices)
|
||||||
|
new_vgweights[:n] = vgweights[:n]
|
||||||
|
vgweights = new_vgweights
|
||||||
|
|
||||||
assert(len(vgweights) == nbr_indices == len(dvcos))
|
assert(len(vgweights) == nbr_indices == len(dvcos))
|
||||||
|
|
||||||
# To add shape keys to the mesh, an Object using the mesh is needed.
|
# To add shape keys to the mesh, an Object using the mesh is needed.
|
||||||
@ -3506,11 +3517,12 @@ def load(operator, context, filepath="",
|
|||||||
node = fbx_helper_nodes[o_uuid]
|
node = fbx_helper_nodes[o_uuid]
|
||||||
if node:
|
if node:
|
||||||
objects.append(node)
|
objects.append(node)
|
||||||
shapes_list = []
|
shapes = {}
|
||||||
mesh_to_shapes[bl_mdata] = (objects, shapes_list)
|
mesh_to_shapes[bl_mdata] = (objects, shapes)
|
||||||
else:
|
else:
|
||||||
shapes_list = mesh_to_shapes[bl_mdata][1]
|
shapes = mesh_to_shapes[bl_mdata][1]
|
||||||
shapes_list.append((bc_uuid, fbx_sdata, fbx_bcdata))
|
# Dict to avoid duplicates
|
||||||
|
shapes[(bc_uuid, id(fbx_sdata), id(fbx_bcdata))] = (fbx_sdata, fbx_bcdata)
|
||||||
# BlendShape deformers are only here to connect BlendShapeChannels to meshes, nothing else to do.
|
# BlendShape deformers are only here to connect BlendShapeChannels to meshes, nothing else to do.
|
||||||
|
|
||||||
# Iterate through each mesh and create its shape keys
|
# Iterate through each mesh and create its shape keys
|
||||||
|
Loading…
Reference in New Issue
Block a user