|
@@ -202,12 +202,12 @@ def extra_vertex_groups(mesh, patterns_string):
|
|
# Skip bone weights:
|
|
# Skip bone weights:
|
|
vgroup_name = vgroup.name
|
|
vgroup_name = vgroup.name
|
|
if armature:
|
|
if armature:
|
|
- is_bone_weight=False
|
|
|
|
|
|
+ is_bone_weight = False
|
|
for bone in armature.pose.bones:
|
|
for bone in armature.pose.bones:
|
|
if bone.name == vgroup_name:
|
|
if bone.name == vgroup_name:
|
|
- is_bone_weight=True
|
|
|
|
|
|
+ is_bone_weight = True
|
|
break
|
|
break
|
|
- if (is_bone_weight):
|
|
|
|
|
|
+ if is_bone_weight:
|
|
continue
|
|
continue
|
|
|
|
|
|
if pattern_re is None:
|
|
if pattern_re is None:
|
|
@@ -218,12 +218,12 @@ def extra_vertex_groups(mesh, patterns_string):
|
|
pattern_re = '^(?:' + '|'.join(
|
|
pattern_re = '^(?:' + '|'.join(
|
|
map(lambda entry:
|
|
map(lambda entry:
|
|
'.*?'.join(map(re.escape, entry.strip().split('*'))),
|
|
'.*?'.join(map(re.escape, entry.strip().split('*'))),
|
|
- patterns_string.split(',')) ) + ')$'
|
|
|
|
|
|
+ patterns_string.split(','))) + ')$'
|
|
|
|
|
|
if not re.match(pattern_re, vgroup_name):
|
|
if not re.match(pattern_re, vgroup_name):
|
|
continue
|
|
continue
|
|
|
|
|
|
- extra_vgroups.append( (vgroup_name, vgroup_index) )
|
|
|
|
|
|
+ extra_vgroups.append((vgroup_name, vgroup_index))
|
|
return extra_vgroups
|
|
return extra_vgroups
|
|
|
|
|
|
|
|
|
|
@@ -237,14 +237,14 @@ def vertex_group_data(mesh, index):
|
|
:param index:
|
|
:param index:
|
|
|
|
|
|
"""
|
|
"""
|
|
- data = []
|
|
|
|
|
|
+ group_data = []
|
|
for vertex in mesh.vertices:
|
|
for vertex in mesh.vertices:
|
|
weight = None
|
|
weight = None
|
|
for group in vertex.groups:
|
|
for group in vertex.groups:
|
|
if group.group == index:
|
|
if group.group == index:
|
|
weight = group.weight
|
|
weight = group.weight
|
|
- data.append(weight or 0.0)
|
|
|
|
- return data
|
|
|
|
|
|
+ group_data.append(weight or 0.0)
|
|
|
|
+ return group_data
|
|
|
|
|
|
|
|
|
|
@_mesh
|
|
@_mesh
|
|
@@ -257,7 +257,7 @@ def buffer_vertex_group_data(mesh, index):
|
|
:param index:
|
|
:param index:
|
|
|
|
|
|
"""
|
|
"""
|
|
- data = []
|
|
|
|
|
|
+ group_data = []
|
|
for face in mesh.tessfaces:
|
|
for face in mesh.tessfaces:
|
|
for vertex_index in face.vertices:
|
|
for vertex_index in face.vertices:
|
|
vertex = mesh.vertices[vertex_index]
|
|
vertex = mesh.vertices[vertex_index]
|
|
@@ -265,23 +265,23 @@ def buffer_vertex_group_data(mesh, index):
|
|
for group in vertex.groups:
|
|
for group in vertex.groups:
|
|
if group.group == index:
|
|
if group.group == index:
|
|
weight = group.weight
|
|
weight = group.weight
|
|
- data.append(weight or 0.0)
|
|
|
|
- return data
|
|
|
|
|
|
+ group_data.append(weight or 0.0)
|
|
|
|
+ return group_data
|
|
|
|
|
|
|
|
|
|
@_mesh
|
|
@_mesh
|
|
-def faces(mesh, options, materials=None):
|
|
|
|
|
|
+def faces(mesh, options, material_list=None):
|
|
"""
|
|
"""
|
|
|
|
|
|
:param mesh:
|
|
:param mesh:
|
|
:param options:
|
|
:param options:
|
|
- :param materials: (Default value = None)
|
|
|
|
|
|
+ :param material_list: (Default value = None)
|
|
|
|
|
|
"""
|
|
"""
|
|
logger.debug("mesh.faces(%s, %s, materials=%s)",
|
|
logger.debug("mesh.faces(%s, %s, materials=%s)",
|
|
mesh, options, materials)
|
|
mesh, options, materials)
|
|
|
|
|
|
- materials = materials or []
|
|
|
|
|
|
+ material_list = material_list or []
|
|
vertex_uv = len(mesh.uv_textures) > 0
|
|
vertex_uv = len(mesh.uv_textures) > 0
|
|
has_colors = len(mesh.vertex_colors) > 0
|
|
has_colors = len(mesh.vertex_colors) > 0
|
|
logger.info("Has UVs = %s", vertex_uv)
|
|
logger.info("Has UVs = %s", vertex_uv)
|
|
@@ -296,7 +296,7 @@ def faces(mesh, options, materials=None):
|
|
logger.debug("Materials enabled = %s", opt_materials)
|
|
logger.debug("Materials enabled = %s", opt_materials)
|
|
logger.debug("Normals enabled = %s", opt_normals)
|
|
logger.debug("Normals enabled = %s", opt_normals)
|
|
|
|
|
|
- uv_layers = _uvs(mesh) if opt_uvs else None
|
|
|
|
|
|
+ uv_indices = _uvs(mesh)[1] if opt_uvs else None
|
|
vertex_normals = _normals(mesh) if opt_normals else None
|
|
vertex_normals = _normals(mesh) if opt_normals else None
|
|
vertex_colours = vertex_colors(mesh) if opt_colours else None
|
|
vertex_colours = vertex_colors(mesh) if opt_colours else None
|
|
|
|
|
|
@@ -338,7 +338,7 @@ def faces(mesh, options, materials=None):
|
|
face_data.extend([v for v in face.vertices])
|
|
face_data.extend([v for v in face.vertices])
|
|
|
|
|
|
if mask[constants.MATERIALS]:
|
|
if mask[constants.MATERIALS]:
|
|
- for mat_index, mat in enumerate(materials):
|
|
|
|
|
|
+ for mat_index, mat in enumerate(material_list):
|
|
if mat[constants.DBG_INDEX] == face.material_index:
|
|
if mat[constants.DBG_INDEX] == face.material_index:
|
|
face_data.append(mat_index)
|
|
face_data.append(mat_index)
|
|
break
|
|
break
|
|
@@ -347,15 +347,14 @@ def faces(mesh, options, materials=None):
|
|
"for face %d" % face.index)
|
|
"for face %d" % face.index)
|
|
raise exceptions.MaterialError(error)
|
|
raise exceptions.MaterialError(error)
|
|
|
|
|
|
- # @TODO: this needs the same optimization as what
|
|
|
|
- # was done for colours and normals
|
|
|
|
- if uv_layers:
|
|
|
|
- for index, uv_layer in enumerate(uv_layers):
|
|
|
|
|
|
+ if uv_indices:
|
|
|
|
+ for index, uv_layer in enumerate(uv_indices):
|
|
layer = mesh.tessface_uv_textures[index]
|
|
layer = mesh.tessface_uv_textures[index]
|
|
|
|
|
|
for uv_data in layer.data[face.index].uv:
|
|
for uv_data in layer.data[face.index].uv:
|
|
uv_tuple = (uv_data[0], uv_data[1])
|
|
uv_tuple = (uv_data[0], uv_data[1])
|
|
- face_data.append(uv_layer.index(uv_tuple))
|
|
|
|
|
|
+ uv_index = uv_layer[str(uv_tuple)]
|
|
|
|
+ face_data.append(uv_index)
|
|
mask[constants.UVS] = True
|
|
mask[constants.UVS] = True
|
|
|
|
|
|
if vertex_normals:
|
|
if vertex_normals:
|
|
@@ -639,7 +638,7 @@ def uvs(mesh):
|
|
"""
|
|
"""
|
|
logger.debug("mesh.uvs(%s)", mesh)
|
|
logger.debug("mesh.uvs(%s)", mesh)
|
|
uvs_ = []
|
|
uvs_ = []
|
|
- for layer in _uvs(mesh):
|
|
|
|
|
|
+ for layer in _uvs(mesh)[0]:
|
|
uvs_.append([])
|
|
uvs_.append([])
|
|
logger.info("Parsing UV layer %d", len(uvs_))
|
|
logger.info("Parsing UV layer %d", len(uvs_))
|
|
for pair in layer:
|
|
for pair in layer:
|
|
@@ -850,20 +849,29 @@ def _uvs(mesh):
|
|
"""
|
|
"""
|
|
|
|
|
|
:param mesh:
|
|
:param mesh:
|
|
|
|
+ :rtype: [[], ...], [{}, ...]
|
|
|
|
|
|
"""
|
|
"""
|
|
uv_layers = []
|
|
uv_layers = []
|
|
|
|
+ uv_indices = []
|
|
|
|
|
|
for layer in mesh.uv_layers:
|
|
for layer in mesh.uv_layers:
|
|
uv_layers.append([])
|
|
uv_layers.append([])
|
|
|
|
+ uv_indices.append({})
|
|
|
|
+ index = 0
|
|
|
|
|
|
for uv_data in layer.data:
|
|
for uv_data in layer.data:
|
|
uv_tuple = (uv_data.uv[0], uv_data.uv[1])
|
|
uv_tuple = (uv_data.uv[0], uv_data.uv[1])
|
|
|
|
+ uv_key = str(uv_tuple)
|
|
|
|
|
|
- if uv_tuple not in uv_layers[-1]:
|
|
|
|
|
|
+ try:
|
|
|
|
+ uv_indices[-1][uv_key]
|
|
|
|
+ except KeyError:
|
|
|
|
+ uv_indices[-1][uv_key] = index
|
|
uv_layers[-1].append(uv_tuple)
|
|
uv_layers[-1].append(uv_tuple)
|
|
|
|
+ index += 1
|
|
|
|
|
|
- return uv_layers
|
|
|
|
|
|
+ return uv_layers, uv_indices
|
|
|
|
|
|
|
|
|
|
def _armature(mesh):
|
|
def _armature(mesh):
|