Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender-addons.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'io_scene_gltf2/blender/exp/gltf2_blender_extract.py')
-rwxr-xr-xio_scene_gltf2/blender/exp/gltf2_blender_extract.py43
1 files changed, 32 insertions, 11 deletions
diff --git a/io_scene_gltf2/blender/exp/gltf2_blender_extract.py b/io_scene_gltf2/blender/exp/gltf2_blender_extract.py
index d4f34126..93947acb 100755
--- a/io_scene_gltf2/blender/exp/gltf2_blender_extract.py
+++ b/io_scene_gltf2/blender/exp/gltf2_blender_extract.py
@@ -39,6 +39,18 @@ def extract_primitives(blender_mesh, uuid_for_skined_data, blender_vertex_groups
if export_settings[gltf2_blender_export_keys.COLORS]:
color_max = len(blender_mesh.vertex_colors)
+ colors_attributes = []
+ rendered_color_idx = blender_mesh.attributes.render_color_index
+
+ if color_max > 0:
+ colors_attributes.append(rendered_color_idx)
+ # Then find other ones
+ colors_attributes.extend([
+ i for i in range(len(blender_mesh.color_attributes)) if i != rendered_color_idx \
+ and blender_mesh.vertex_colors.find(blender_mesh.color_attributes[i].name) != -1
+ ])
+
+
armature = None
skin = None
if blender_vertex_groups and export_settings[gltf2_blender_export_keys.SKINS]:
@@ -110,7 +122,7 @@ def extract_primitives(blender_mesh, uuid_for_skined_data, blender_vertex_groups
dot_fields += [('tx', np.float32), ('ty', np.float32), ('tz', np.float32), ('tw', np.float32)]
for uv_i in range(tex_coord_max):
dot_fields += [('uv%dx' % uv_i, np.float32), ('uv%dy' % uv_i, np.float32)]
- for col_i in range(color_max):
+ for col_i, _ in enumerate(colors_attributes):
dot_fields += [
('color%dr' % col_i, np.float32),
('color%dg' % col_i, np.float32),
@@ -163,8 +175,12 @@ def extract_primitives(blender_mesh, uuid_for_skined_data, blender_vertex_groups
dots['uv%dy' % uv_i] = uvs[:, 1]
del uvs
- for col_i in range(color_max):
- colors = __get_colors(blender_mesh, col_i)
+ colors_types = []
+ for col_i, blender_col_i in enumerate(colors_attributes):
+ colors, colors_type, domain = __get_colors(blender_mesh, col_i, blender_col_i)
+ if domain == "POINT":
+ colors = colors[dots['vertex_index']]
+ colors_types.append(colors_type)
dots['color%dr' % col_i] = colors[:, 0]
dots['color%dg' % col_i] = colors[:, 1]
dots['color%db' % col_i] = colors[:, 2]
@@ -251,13 +267,16 @@ def extract_primitives(blender_mesh, uuid_for_skined_data, blender_vertex_groups
uvs[:, 1] = prim_dots['uv%dy' % tex_coord_i]
attributes['TEXCOORD_%d' % tex_coord_i] = uvs
- for color_i in range(color_max):
+ for color_i, _ in enumerate(colors_attributes):
colors = np.empty((len(prim_dots), 4), dtype=np.float32)
colors[:, 0] = prim_dots['color%dr' % color_i]
colors[:, 1] = prim_dots['color%dg' % color_i]
colors[:, 2] = prim_dots['color%db' % color_i]
colors[:, 3] = prim_dots['color%da' % color_i]
- attributes['COLOR_%d' % color_i] = colors
+ attributes['COLOR_%d' % color_i] = {}
+ attributes['COLOR_%d' % color_i]["data"] = colors
+
+ attributes['COLOR_%d' % color_i]["norm"] = colors_types[color_i] == "BYTE_COLOR"
if skin:
joints = [[] for _ in range(num_joint_sets)]
@@ -525,13 +544,15 @@ def __get_uvs(blender_mesh, uv_i):
return uvs
-def __get_colors(blender_mesh, color_i):
- colors = np.empty(len(blender_mesh.loops) * 4, dtype=np.float32)
- layer = blender_mesh.vertex_colors[color_i]
- blender_mesh.color_attributes[layer.name].data.foreach_get('color', colors)
- colors = colors.reshape(len(blender_mesh.loops), 4)
+def __get_colors(blender_mesh, color_i, blender_color_i):
+ if blender_mesh.color_attributes[blender_color_i].domain == "POINT":
+ colors = np.empty(len(blender_mesh.vertices) * 4, dtype=np.float32) #POINT
+ else:
+ colors = np.empty(len(blender_mesh.loops) * 4, dtype=np.float32) #CORNER
+ blender_mesh.color_attributes[blender_color_i].data.foreach_get('color', colors)
+ colors = colors.reshape(-1, 4)
# colors are already linear, no need to switch color space
- return colors
+ return colors, blender_mesh.color_attributes[blender_color_i].data_type, blender_mesh.color_attributes[blender_color_i].domain
def __get_bone_data(blender_mesh, skin, blender_vertex_groups):