def __gather_mesh(blender_object, export_settings): if blender_object.type != "MESH": return None # If not using vertex group, they are irrelevant for caching --> ensure that they do not trigger a cache miss vertex_groups = blender_object.vertex_groups modifiers = blender_object.modifiers if len(vertex_groups) == 0: vertex_groups = None if len(modifiers) == 0: modifiers = None if export_settings[gltf2_blender_export_keys.APPLY]: blender_mesh = blender_object.to_mesh(bpy.context.depsgraph, True) skip_filter = True else: blender_mesh = blender_object.data skip_filter = False result = gltf2_blender_gather_mesh.gather_mesh(blender_mesh, vertex_groups, modifiers, skip_filter, export_settings) if export_settings[gltf2_blender_export_keys.APPLY]: bpy.data.meshes.remove(blender_mesh) return result
def __gather_mesh(blender_object, export_settings): if blender_object.type != "MESH": return None # If not using vertex group, they are irrelevant for caching --> ensure that they do not trigger a cache miss vertex_groups = blender_object.vertex_groups modifiers = blender_object.modifiers if len(vertex_groups) == 0: vertex_groups = None if len(modifiers) == 0: modifiers = None if export_settings[gltf2_blender_export_keys.APPLY]: auto_smooth = blender_object.data.use_auto_smooth edge_split = None if auto_smooth: edge_split = blender_object.modifiers.new('Temporary_Auto_Smooth', 'EDGE_SPLIT') edge_split.split_angle = blender_object.data.auto_smooth_angle edge_split.use_edge_angle = not blender_object.data.has_custom_normals blender_object.data.use_auto_smooth = False bpy.context.view_layer.update() armature_modifiers = {} if export_settings[gltf2_blender_export_keys.SKINS]: # temprorary disable Armature modifiers if exporting skins for idx, modifier in enumerate(blender_object.modifiers): if modifier.type == 'ARMATURE': armature_modifiers[idx] = modifier.show_viewport modifier.show_viewport = False depsgraph = bpy.context.evaluated_depsgraph_get() blender_mesh_owner = blender_object.evaluated_get(depsgraph) blender_mesh = blender_mesh_owner.to_mesh() for prop in blender_object.data.keys(): blender_mesh[prop] = blender_object.data[prop] skip_filter = True if export_settings[gltf2_blender_export_keys.SKINS]: # restore Armature modifiers for idx, show_viewport in armature_modifiers.items(): blender_object.modifiers[idx].show_viewport = show_viewport if auto_smooth: blender_object.data.use_auto_smooth = True blender_object.modifiers.remove(edge_split) else: blender_mesh = blender_object.data skip_filter = False result = gltf2_blender_gather_mesh.gather_mesh(blender_mesh, vertex_groups, modifiers, skip_filter, export_settings) if export_settings[gltf2_blender_export_keys.APPLY]: blender_mesh_owner.to_mesh_clear() return result
def __gather_mesh(blender_object, export_settings): if blender_object.type == "MESH": # If not using vertex group, they are irrelevant for caching --> ensure that they do not trigger a cache miss vertex_groups = blender_object.vertex_groups if len(vertex_groups) == 0: vertex_groups = None return gltf2_blender_gather_mesh.gather_mesh(blender_object.data, vertex_groups, export_settings) else: return None
def __gather_mesh(blender_object, export_settings): if blender_object.type != "MESH": return None # If not using vertex group, they are irrelevant for caching --> ensure that they do not trigger a cache miss vertex_groups = blender_object.vertex_groups modifiers = blender_object.modifiers if len(vertex_groups) == 0: vertex_groups = None if len(modifiers) == 0: modifiers = None if export_settings[gltf2_blender_export_keys.APPLY]: auto_smooth = blender_object.data.use_auto_smooth if auto_smooth: blender_object = blender_object.copy() edge_split = blender_object.modifiers.new('Temporary_Auto_Smooth', 'EDGE_SPLIT') edge_split.split_angle = blender_object.data.auto_smooth_angle edge_split.use_edge_angle = not blender_object.data.has_custom_normals armature_modifiers = {} if export_settings[gltf2_blender_export_keys.SKINS]: # temprorary disable Armature modifiers if exporting skins for idx, modifier in enumerate(blender_object.modifiers): if modifier.type == 'ARMATURE': armature_modifiers[idx] = modifier.show_viewport modifier.show_viewport = False if bpy.app.version < (2, 80, 0): blender_mesh = blender_object.to_mesh(bpy.context.scene, True, 'PREVIEW') else: blender_mesh = blender_object.to_mesh(bpy.context.depsgraph, True) skip_filter = True if export_settings[gltf2_blender_export_keys.SKINS]: # restore Armature modifiers for idx, show_viewport in armature_modifiers.items(): blender_object.modifiers[idx].show_viewport = show_viewport if auto_smooth: bpy.data.objects.remove(blender_object) else: blender_mesh = blender_object.data skip_filter = False result = gltf2_blender_gather_mesh.gather_mesh(blender_mesh, vertex_groups, modifiers, skip_filter, export_settings) if export_settings[gltf2_blender_export_keys.APPLY]: bpy.data.meshes.remove(blender_mesh) return result
def __gather_mesh_from_nonmesh(blender_object, export_settings): """Handles curves, surfaces, text, etc.""" needs_to_mesh_clear = False try: # Convert to a mesh try: if export_settings[gltf2_blender_export_keys.APPLY]: depsgraph = bpy.context.evaluated_depsgraph_get() blender_mesh_owner = blender_object.evaluated_get(depsgraph) blender_mesh = blender_mesh_owner.to_mesh(preserve_all_data_layers=True, depsgraph=depsgraph) # TODO: do we need preserve_all_data_layers? else: blender_mesh_owner = blender_object blender_mesh = blender_mesh_owner.to_mesh() # In some cases (for example curve with single vertice), no blender_mesh is created (without crash) if blender_mesh is None: return None except Exception: return None needs_to_mesh_clear = True skip_filter = True materials = tuple([ms.material for ms in blender_object.material_slots if ms.material is not None]) vertex_groups = None modifiers = None blender_object_for_skined_data = None result = gltf2_blender_gather_mesh.gather_mesh(blender_mesh, blender_object_for_skined_data, vertex_groups, modifiers, skip_filter, materials, blender_object.data, export_settings) finally: if needs_to_mesh_clear: blender_mesh_owner.to_mesh_clear() return result
def __gather_mesh(blender_object, export_settings): if blender_object.type != "MESH": return None # If not using vertex group, they are irrelevant for caching --> ensure that they do not trigger a cache miss vertex_groups = blender_object.vertex_groups modifiers = blender_object.modifiers if len(vertex_groups) == 0: vertex_groups = None if len(modifiers) == 0: modifiers = None if export_settings[gltf2_blender_export_keys.APPLY]: auto_smooth = blender_object.data.use_auto_smooth if auto_smooth: blender_object = blender_object.copy() edge_split = blender_object.modifiers.new('Temporary_Auto_Smooth', 'EDGE_SPLIT') edge_split.split_angle = blender_object.data.auto_smooth_angle edge_split.use_edge_angle = not blender_object.data.has_custom_normals blender_mesh = blender_object.to_mesh(bpy.context.depsgraph, True) skip_filter = True if auto_smooth: bpy.data.objects.remove(blender_object) else: blender_mesh = blender_object.data skip_filter = False result = gltf2_blender_gather_mesh.gather_mesh(blender_mesh, vertex_groups, modifiers, skip_filter, export_settings) if export_settings[gltf2_blender_export_keys.APPLY]: bpy.data.meshes.remove(blender_mesh) return result
def __gather_mesh(blender_object, library, export_settings): if blender_object.type != "MESH": return None modifier_normal_types = ["NORMAL_EDIT", "WEIGHTED_NORMAL", "BEVEL"] # If not using vertex group, they are irrelevant for caching --> ensure that they do not trigger a cache miss vertex_groups = blender_object.vertex_groups modifiers = blender_object.modifiers if len(vertex_groups) == 0: vertex_groups = None if len(modifiers) == 0: modifiers = None if export_settings[gltf2_blender_export_keys.APPLY]: auto_smooth = blender_object.data.use_auto_smooth edge_split = None some_normals_modifier = any([ m in modifier_normal_types for m in [mod.type for mod in blender_object.modifiers] ]) if auto_smooth and not some_normals_modifier: edge_split = blender_object.modifiers.new('Temporary_Auto_Smooth', 'EDGE_SPLIT') edge_split.split_angle = blender_object.data.auto_smooth_angle edge_split.use_edge_angle = not blender_object.data.has_custom_normals blender_object.data.use_auto_smooth = some_normals_modifier bpy.context.view_layer.update() armature_modifiers = {} if export_settings[gltf2_blender_export_keys.SKINS]: # temporarily disable Armature modifiers if exporting skins for idx, modifier in enumerate(blender_object.modifiers): if modifier.type == 'ARMATURE': armature_modifiers[idx] = modifier.show_viewport modifier.show_viewport = False depsgraph = bpy.context.evaluated_depsgraph_get() blender_mesh_owner = blender_object.evaluated_get(depsgraph) blender_mesh = blender_mesh_owner.to_mesh( preserve_all_data_layers=True, depsgraph=depsgraph) for prop in blender_object.data.keys(): blender_mesh[prop] = blender_object.data[prop] skip_filter = True if export_settings[gltf2_blender_export_keys.SKINS]: # restore Armature modifiers for idx, show_viewport in armature_modifiers.items(): blender_object.modifiers[idx].show_viewport = show_viewport if auto_smooth and not some_normals_modifier: blender_object.data.use_auto_smooth = True blender_object.modifiers.remove(edge_split) else: blender_mesh = blender_object.data skip_filter = False # If no skin are exported, no need to have vertex group, this will create a cache miss if not export_settings[gltf2_blender_export_keys.SKINS]: vertex_groups = None modifiers = None else: # Check if there is an armature modidier if len([ mod for mod in blender_object.modifiers if mod.type == "ARMATURE" ]) == 0: vertex_groups = None # Not needed if no armature, avoid a cache miss modifiers = None material_names = tuple([ ms.material.name for ms in blender_object.material_slots if ms.material is not None ]) # retrieve armature # Because mesh data will be transforms to skeleton space, # we can't instantiate multiple object at different location, skined by same armature blender_object_for_skined_data = None if export_settings[gltf2_blender_export_keys.SKINS]: for idx, modifier in enumerate(blender_object.modifiers): if modifier.type == 'ARMATURE': blender_object_for_skined_data = blender_object result = gltf2_blender_gather_mesh.gather_mesh( blender_mesh, library, blender_object_for_skined_data, vertex_groups, modifiers, skip_filter, material_names, export_settings) if export_settings[gltf2_blender_export_keys.APPLY]: blender_mesh_owner.to_mesh_clear() return result
def __gather_mesh(blender_object, library, export_settings): if blender_object.type in ['CURVE', 'SURFACE', 'FONT']: return __gather_mesh_from_nonmesh(blender_object, library, export_settings) if blender_object.type != "MESH": return None # If not using vertex group, they are irrelevant for caching --> ensure that they do not trigger a cache miss vertex_groups = blender_object.vertex_groups modifiers = blender_object.modifiers if len(vertex_groups) == 0: vertex_groups = None if len(modifiers) == 0: modifiers = None if export_settings[gltf2_blender_export_keys.APPLY]: armature_modifiers = {} if export_settings[gltf2_blender_export_keys.SKINS]: # temporarily disable Armature modifiers if exporting skins for idx, modifier in enumerate(blender_object.modifiers): if modifier.type == 'ARMATURE': armature_modifiers[idx] = modifier.show_viewport modifier.show_viewport = False depsgraph = bpy.context.evaluated_depsgraph_get() blender_mesh_owner = blender_object.evaluated_get(depsgraph) blender_mesh = blender_mesh_owner.to_mesh(preserve_all_data_layers=True, depsgraph=depsgraph) for prop in blender_object.data.keys(): blender_mesh[prop] = blender_object.data[prop] skip_filter = True if export_settings[gltf2_blender_export_keys.SKINS]: # restore Armature modifiers for idx, show_viewport in armature_modifiers.items(): blender_object.modifiers[idx].show_viewport = show_viewport else: blender_mesh = blender_object.data skip_filter = False # If no skin are exported, no need to have vertex group, this will create a cache miss if not export_settings[gltf2_blender_export_keys.SKINS]: vertex_groups = None modifiers = None else: # Check if there is an armature modidier if len([mod for mod in blender_object.modifiers if mod.type == "ARMATURE"]) == 0: vertex_groups = None # Not needed if no armature, avoid a cache miss modifiers = None materials = tuple(ms.material for ms in blender_object.material_slots) material_names = tuple(None if mat is None else mat.name for mat in materials) # retrieve armature # Because mesh data will be transforms to skeleton space, # we can't instantiate multiple object at different location, skined by same armature blender_object_for_skined_data = None if export_settings[gltf2_blender_export_keys.SKINS]: for idx, modifier in enumerate(blender_object.modifiers): if modifier.type == 'ARMATURE': blender_object_for_skined_data = blender_object result = gltf2_blender_gather_mesh.gather_mesh(blender_mesh, library, blender_object_for_skined_data, vertex_groups, modifiers, skip_filter, material_names, export_settings) if export_settings[gltf2_blender_export_keys.APPLY]: blender_mesh_owner.to_mesh_clear() return result
def __gather_mesh(blender_object, export_settings): if blender_object.type != "MESH": return None modifier_normal_types = ["NORMAL_EDIT", "WEIGHTED_NORMAL"] # If not using vertex group, they are irrelevant for caching --> ensure that they do not trigger a cache miss vertex_groups = blender_object.vertex_groups modifiers = blender_object.modifiers if len(vertex_groups) == 0: vertex_groups = None if len(modifiers) == 0: modifiers = None if export_settings[gltf2_blender_export_keys.APPLY]: auto_smooth = blender_object.data.use_auto_smooth edge_split = None if auto_smooth: edge_split = blender_object.modifiers.new('Temporary_Auto_Smooth', 'EDGE_SPLIT') edge_split.split_angle = blender_object.data.auto_smooth_angle edge_split.use_edge_angle = not blender_object.data.has_custom_normals blender_object.data.use_auto_smooth = any([ m in modifier_normal_types for m in [mod.type for mod in blender_object.modifiers] ]) if bpy.app.version < (2, 80, 0): bpy.context.scene.update() else: bpy.context.view_layer.update() armature_modifiers = {} if export_settings[gltf2_blender_export_keys.SKINS]: # temporarily disable Armature modifiers if exporting skins for idx, modifier in enumerate(blender_object.modifiers): if modifier.type == 'ARMATURE': armature_modifiers[idx] = modifier.show_viewport modifier.show_viewport = False if bpy.app.version < (2, 80, 0): blender_mesh = blender_object.to_mesh(bpy.context.scene, True, 'PREVIEW') else: depsgraph = bpy.context.evaluated_depsgraph_get() blender_mesh_owner = blender_object.evaluated_get(depsgraph) blender_mesh = blender_mesh_owner.to_mesh( preserve_all_data_layers=True, depsgraph=depsgraph) for prop in blender_object.data.keys(): blender_mesh[prop] = blender_object.data[prop] skip_filter = True if export_settings[gltf2_blender_export_keys.SKINS]: # restore Armature modifiers for idx, show_viewport in armature_modifiers.items(): blender_object.modifiers[idx].show_viewport = show_viewport if auto_smooth: blender_object.data.use_auto_smooth = True blender_object.modifiers.remove(edge_split) else: blender_mesh = blender_object.data skip_filter = False material_names = tuple([ ms.material.name for ms in blender_object.material_slots if ms.material is not None ]) result = gltf2_blender_gather_mesh.gather_mesh(blender_mesh, vertex_groups, modifiers, skip_filter, material_names, export_settings) if export_settings[gltf2_blender_export_keys.APPLY]: if bpy.app.version < (2, 80, 0): bpy.data.meshes.remove(blender_mesh) else: blender_mesh_owner.to_mesh_clear() return result
def __gather_mesh(blender_object, export_settings): return gltf2_blender_gather_mesh.gather_mesh(blender_object, export_settings)
def __gather_mesh(vnode, blender_object, export_settings): if blender_object.type in ['CURVE', 'SURFACE', 'FONT']: return __gather_mesh_from_nonmesh(blender_object, export_settings) if blender_object.type != "MESH": return None # For duplis instancer, when show is off -> export as empty if vnode.force_as_empty is True: return None # Be sure that object is valid (no NaN for example) blender_object.data.validate() # If not using vertex group, they are irrelevant for caching --> ensure that they do not trigger a cache miss vertex_groups = blender_object.vertex_groups modifiers = blender_object.modifiers if len(vertex_groups) == 0: vertex_groups = None if len(modifiers) == 0: modifiers = None if export_settings[gltf2_blender_export_keys.APPLY]: if modifiers is None: # If no modifier, use original mesh, it will instance all shared mesh in a single glTF mesh blender_mesh = blender_object.data skip_filter = False else: armature_modifiers = {} if export_settings[gltf2_blender_export_keys.SKINS]: # temporarily disable Armature modifiers if exporting skins for idx, modifier in enumerate(blender_object.modifiers): if modifier.type == 'ARMATURE': armature_modifiers[idx] = modifier.show_viewport modifier.show_viewport = False depsgraph = bpy.context.evaluated_depsgraph_get() blender_mesh_owner = blender_object.evaluated_get(depsgraph) blender_mesh = blender_mesh_owner.to_mesh( preserve_all_data_layers=True, depsgraph=depsgraph) for prop in blender_object.data.keys(): blender_mesh[prop] = blender_object.data[prop] skip_filter = True if export_settings[gltf2_blender_export_keys.SKINS]: # restore Armature modifiers for idx, show_viewport in armature_modifiers.items(): blender_object.modifiers[idx].show_viewport = show_viewport else: blender_mesh = blender_object.data skip_filter = False # If no skin are exported, no need to have vertex group, this will create a cache miss if not export_settings[gltf2_blender_export_keys.SKINS]: vertex_groups = None modifiers = None else: # Check if there is an armature modidier if len([ mod for mod in blender_object.modifiers if mod.type == "ARMATURE" ]) == 0: vertex_groups = None # Not needed if no armature, avoid a cache miss modifiers = None materials = tuple(ms.material for ms in blender_object.material_slots) # retrieve armature # Because mesh data will be transforms to skeleton space, # we can't instantiate multiple object at different location, skined by same armature uuid_for_skined_data = None if export_settings[gltf2_blender_export_keys.SKINS]: for idx, modifier in enumerate(blender_object.modifiers): if modifier.type == 'ARMATURE': uuid_for_skined_data = vnode.uuid result = gltf2_blender_gather_mesh.gather_mesh(blender_mesh, uuid_for_skined_data, vertex_groups, modifiers, skip_filter, materials, None, export_settings) if export_settings[ gltf2_blender_export_keys.APPLY] and modifiers is not None: blender_mesh_owner.to_mesh_clear() return result