diff options
Diffstat (limited to 'io_scene_gltf2/blender/exp/gltf2_blender_gather_primitives.py')
-rwxr-xr-x | io_scene_gltf2/blender/exp/gltf2_blender_gather_primitives.py | 56 |
1 files changed, 55 insertions, 1 deletions
diff --git a/io_scene_gltf2/blender/exp/gltf2_blender_gather_primitives.py b/io_scene_gltf2/blender/exp/gltf2_blender_gather_primitives.py index 367c30f5..b2ffb6b3 100755 --- a/io_scene_gltf2/blender/exp/gltf2_blender_gather_primitives.py +++ b/io_scene_gltf2/blender/exp/gltf2_blender_gather_primitives.py @@ -12,10 +12,12 @@ from io_scene_gltf2.blender.exp import gltf2_blender_extract from io_scene_gltf2.blender.exp import gltf2_blender_gather_accessors from io_scene_gltf2.blender.exp import gltf2_blender_gather_primitive_attributes from io_scene_gltf2.blender.exp import gltf2_blender_gather_materials +from io_scene_gltf2.blender.exp import gltf2_blender_gather_materials_variants from io_scene_gltf2.io.com import gltf2_io from io_scene_gltf2.io.exp import gltf2_io_binary_data from io_scene_gltf2.io.com import gltf2_io_constants +from io_scene_gltf2.io.com import gltf2_io_extensions from io_scene_gltf2.io.com.gltf2_io_debug import print_console @@ -86,7 +88,7 @@ def gather_primitives( primitive = gltf2_io.MeshPrimitive( attributes=internal_primitive['attributes'], - extensions=None, + extensions=__gather_extensions(blender_mesh, material_idx, active_uvmap_idx, export_settings), extras=None, indices=internal_primitive['indices'], material=material, @@ -214,3 +216,55 @@ def __gather_targets(blender_primitive, blender_mesh, modifiers, export_settings morph_index += 1 return targets return None + +def __gather_extensions(blender_mesh, + material_idx: int, + active_uvmap_idx, + export_settings): + extensions = {} + + if bpy.context.preferences.addons['io_scene_gltf2'].preferences.KHR_materials_variants_ui is False: + return None + + if bpy.data.scenes[0].get('gltf2_KHR_materials_variants_variants') is None: + return None + if len(bpy.data.scenes[0]['gltf2_KHR_materials_variants_variants']) == 0: + return None + + # Material idx is the slot idx. Retrieve associated variant, if any + mapping = [] + for i in [v for v in blender_mesh.gltf2_variant_mesh_data if v.material_slot_index == material_idx]: + variants = [] + for idx, v in enumerate(i.variants): + if v.variant.variant_idx in [o.variant.variant_idx for o in i.variants[:idx]]: + # Avoid duplicates + continue + vari = gltf2_blender_gather_materials_variants.gather_variant(v.variant.variant_idx, export_settings) + if vari is not None: + variant_extension = gltf2_io_extensions.ChildOfRootExtension( + name="KHR_materials_variants", + path=["variants"], + extension=vari + ) + variants.append(variant_extension) + if len(variants) > 0: + if i.material: + mat = gltf2_blender_gather_materials.gather_material( + i.material, + active_uvmap_idx, + export_settings + ) + else: + # empty slot + mat = None + mapping.append({'material': mat, 'variants': variants}) + + if len(mapping) > 0: + extensions["KHR_materials_variants"] = gltf2_io_extensions.Extension( + name="KHR_materials_variants", + extension={ + "mappings": mapping + } + ) + + return extensions if extensions else None |