コード例 #1
0
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
コード例 #2
0
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
コード例 #3
0
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
コード例 #4
0
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
コード例 #5
0
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
コード例 #6
0
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
コード例 #7
0
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
コード例 #8
0
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
コード例 #9
0
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
コード例 #10
0
def __gather_mesh(blender_object, export_settings):
    return gltf2_blender_gather_mesh.gather_mesh(blender_object,
                                                 export_settings)
コード例 #11
0
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