diff options
Diffstat (limited to 'io_scene_gltf2/blender/imp/gltf2_blender_mesh.py')
-rwxr-xr-x | io_scene_gltf2/blender/imp/gltf2_blender_mesh.py | 56 |
1 files changed, 50 insertions, 6 deletions
diff --git a/io_scene_gltf2/blender/imp/gltf2_blender_mesh.py b/io_scene_gltf2/blender/imp/gltf2_blender_mesh.py index a3c1bd34..b886dd25 100755 --- a/io_scene_gltf2/blender/imp/gltf2_blender_mesh.py +++ b/io_scene_gltf2/blender/imp/gltf2_blender_mesh.py @@ -11,6 +11,7 @@ from .gltf2_blender_material import BlenderMaterial from ...io.com.gltf2_io_debug import print_console from .gltf2_io_draco_compression_extension import decode_primitive from io_scene_gltf2.io.imp.gltf2_io_user_extensions import import_user_extensions +from ..com.gltf2_blender_ui import gltf2_KHR_materials_variants_primitive, gltf2_KHR_materials_variants_variant, gltf2_KHR_materials_variants_default_material class BlenderMesh(): @@ -343,12 +344,19 @@ def do_primitives(gltf, mesh_idx, skin_idx, mesh, ob): # ---- # Assign materials to faces has_materials = any(prim.material is not None for prim in pymesh.primitives) + # Even if no primitive have material, we need to create slots if some primitives have some variant + if has_materials is False: + has_materials = any(prim.extensions is not None and 'KHR_materials_variants' in prim.extensions.keys() for prim in pymesh.primitives) + + has_variant = prim.extensions is not None and 'KHR_materials_variants' in prim.extensions.keys() \ + and 'mappings' in prim.extensions['KHR_materials_variants'].keys() + if has_materials: material_indices = np.empty(num_faces, dtype=np.uint32) empty_material_slot_index = None f = 0 - for prim in pymesh.primitives: + for idx_prim, prim in enumerate(pymesh.primitives): if prim.material is not None: # Get the material pymaterial = gltf.data.materials[prim.material] @@ -358,19 +366,55 @@ def do_primitives(gltf, mesh_idx, skin_idx, mesh, ob): material_name = pymaterial.blender_material[vertex_color] # Put material in slot (if not there) - if material_name not in mesh.materials: + if not has_variant: + if material_name not in mesh.materials: + mesh.materials.append(bpy.data.materials[material_name]) + material_index = mesh.materials.find(material_name) + else: + # In case of variant, do not merge slots mesh.materials.append(bpy.data.materials[material_name]) - material_index = mesh.materials.find(material_name) + material_index = len(mesh.materials) - 1 else: - if empty_material_slot_index is None: + if not has_variant: + if empty_material_slot_index is None: + mesh.materials.append(None) + empty_material_slot_index = len(mesh.materials) - 1 + material_index = empty_material_slot_index + else: + # In case of variant, do not merge slots mesh.materials.append(None) - empty_material_slot_index = len(mesh.materials) - 1 - material_index = empty_material_slot_index + material_index = len(mesh.materials) - 1 material_indices[f:f + prim.num_faces].fill(material_index) f += prim.num_faces + # Manage variants + if has_variant: + + # Store default material + default_mat = mesh.gltf2_variant_default_materials.add() + default_mat.material_slot_index = material_index + default_mat.default_material = bpy.data.materials[material_name] if prim.material is not None else None + + for mapping in prim.extensions['KHR_materials_variants']['mappings']: + # Store, for each variant, the material link to this primitive + + variant_primitive = mesh.gltf2_variant_mesh_data.add() + variant_primitive.material_slot_index = material_index + if 'material' not in mapping.keys(): + # Default material + variant_primitive.material = None + else: + vertex_color = 'COLOR_0' if 'COLOR_0' in prim.attributes else None + if str(mapping['material']) + str(vertex_color) not in gltf.variant_mapping.keys(): + BlenderMaterial.create(gltf, mapping['material'], vertex_color) + variant_primitive.material = gltf.variant_mapping[str(mapping['material']) + str(vertex_color)] + + for variant in mapping['variants']: + vari = variant_primitive.variants.add() + vari.variant.variant_idx = variant + mesh.polygons.foreach_set('material_index', material_indices) # ---- |