def gather_primitives(blender_mesh: bpy.types.Mesh,
                      vertex_groups: Optional[bpy.types.VertexGroups],
                      modifiers: Optional[bpy.types.ObjectModifiers],
                      export_settings) -> List[gltf2_io.MeshPrimitive]:
    """
    Extract the mesh primitives from a blender object

    :return: a list of glTF2 primitives
    """
    primitives = []
    blender_primitives = gltf2_blender_extract.extract_primitives(
        None, blender_mesh, vertex_groups, modifiers, export_settings)

    for internal_primitive in blender_primitives:
        if bpy.app.version < (2, 80, 0):

            def __gather_materials_279(blender_primitive, blender_mesh,
                                       modifiers, export_settings):
                if not blender_primitive['material']:
                    # TODO: fix 'extract_primitives' so that the value of 'material' is None and not empty string
                    return None
                mesh_double_sided = blender_mesh.show_double_sided
                material = bpy.data.materials[blender_primitive['material']]
                return gltf2_blender_gather_materials.gather_material(
                    material, mesh_double_sided, export_settings)

            primitive = gltf2_io.MeshPrimitive(
                attributes=__gather_attributes(internal_primitive,
                                               blender_mesh, modifiers,
                                               export_settings),
                extensions=None,
                extras=None,
                indices=__gather_indices(internal_primitive, blender_mesh,
                                         modifiers, export_settings),
                material=__gather_materials_279(internal_primitive,
                                                blender_mesh, modifiers,
                                                export_settings),
                mode=None,
                targets=__gather_targets(internal_primitive, blender_mesh,
                                         modifiers, export_settings))
        else:
            primitive = gltf2_io.MeshPrimitive(
                attributes=__gather_attributes(internal_primitive,
                                               blender_mesh, modifiers,
                                               export_settings),
                extensions=None,
                extras=None,
                indices=__gather_indices(internal_primitive, blender_mesh,
                                         modifiers, export_settings),
                material=__gather_materials(internal_primitive, modifiers,
                                            export_settings),
                mode=None,
                targets=__gather_targets(internal_primitive, blender_mesh,
                                         modifiers, export_settings))
        primitives.append(primitive)

    return primitives
def gather_primitives(blender_object, export_settings):
    """
    Extract the mesh primitives from a blender object
    :param blender_object: the mesh object
    :param export_settings:
    :return: a list of glTF2 primitives
    """
    primitives = []
    blender_mesh = blender_object.data
    blender_vertex_groups = blender_object.vertex_groups
    blender_primitives = gltf2_blender_extract.extract_primitives(
        None, blender_mesh, blender_vertex_groups, export_settings)

    for internal_primitive in blender_primitives:

        primitive = gltf2_io.MeshPrimitive(
            attributes=__gather_attributes(internal_primitive,
                                           export_settings),
            extensions=None,
            extras=None,
            indices=__gather_indices(internal_primitive, export_settings),
            material=__gather_materials(internal_primitive, export_settings),
            mode=None,
            targets=__gather_targets(internal_primitive, blender_object,
                                     export_settings))
        primitives.append(primitive)

    return primitives
def gather_primitives(blender_mesh: bpy.types.Mesh,
                      vertex_groups: Optional[bpy.types.VertexGroups],
                      modifiers: Optional[bpy.types.ObjectModifiers],
                      export_settings) -> List[gltf2_io.MeshPrimitive]:
    """
    Extract the mesh primitives from a blender object

    :return: a list of glTF2 primitives
    """
    primitives = []
    blender_primitives = gltf2_blender_extract.extract_primitives(
        None, blender_mesh, vertex_groups, modifiers, export_settings)

    for internal_primitive in blender_primitives:

        primitive = gltf2_io.MeshPrimitive(
            attributes=__gather_attributes(internal_primitive, blender_mesh,
                                           modifiers, export_settings),
            extensions=None,
            extras=None,
            indices=__gather_indices(internal_primitive, blender_mesh,
                                     modifiers, export_settings),
            material=__gather_materials(internal_primitive, blender_mesh,
                                        modifiers, export_settings),
            mode=None,
            targets=__gather_targets(internal_primitive, blender_mesh,
                                     modifiers, export_settings))
        primitives.append(primitive)

    return primitives
示例#4
0
def gather_primitives(blender_mesh: bpy.types.Mesh, uuid_for_skined_data,
                      vertex_groups: Optional[bpy.types.VertexGroups],
                      modifiers: Optional[bpy.types.ObjectModifiers],
                      materials: Tuple[bpy.types.Material],
                      export_settings) -> List[gltf2_io.MeshPrimitive]:
    """
    Extract the mesh primitives from a blender object

    :return: a list of glTF2 primitives
    """
    primitives = []

    # retrieve active render UVMap
    active_uvmap_idx = 0
    for i in range(len(blender_mesh.uv_layers)):
        if blender_mesh.uv_layers[i].active_render is True:
            active_uvmap_idx = i
            break

    blender_primitives = __gather_cache_primitives(blender_mesh,
                                                   uuid_for_skined_data,
                                                   vertex_groups, modifiers,
                                                   export_settings)

    for internal_primitive in blender_primitives:
        material_idx = internal_primitive['material']
        material = None

        if export_settings[
                'gltf_materials'] == "EXPORT" and material_idx is not None:
            blender_material = None
            mat = None
            if materials:
                i = material_idx if material_idx < len(materials) else -1
                mat = materials[i]
            if mat is not None:
                material = gltf2_blender_gather_materials.gather_material(
                    mat, active_uvmap_idx, export_settings)

        primitive = gltf2_io.MeshPrimitive(
            attributes=internal_primitive['attributes'],
            extensions=None,
            extras=None,
            indices=internal_primitive['indices'],
            material=material,
            mode=internal_primitive['mode'],
            targets=internal_primitive['targets'])
        primitives.append(primitive)

    return primitives
def gather_primitives(
        blender_mesh: bpy.types.Mesh,
        library: Optional[str],
        blender_object: Optional[bpy.types.Object],
        vertex_groups: Optional[bpy.types.VertexGroups],
        modifiers: Optional[bpy.types.ObjectModifiers],
        material_names: Tuple[str],
        export_settings
        ) -> List[gltf2_io.MeshPrimitive]:
    """
    Extract the mesh primitives from a blender object

    :return: a list of glTF2 primitives
    """
    primitives = []

    blender_primitives = __gather_cache_primitives(blender_mesh, library, blender_object,
        vertex_groups, modifiers, export_settings)

    for internal_primitive in blender_primitives:
        material_idx = internal_primitive['material']
        material = None

        if export_settings['gltf_materials'] == "EXPORT" and material_idx is not None:
            blender_material = None
            if material_names:
                i = material_idx if material_idx < len(material_names) else -1
                material_name = material_names[i]
                if material_name is not None:
                    blender_material = bpy.data.materials[material_name]
            if blender_material is not None:
                material = gltf2_blender_gather_materials.gather_material(
                    blender_material,
                    export_settings,
                )

        primitive = gltf2_io.MeshPrimitive(
            attributes=internal_primitive['attributes'],
            extensions=None,
            extras=None,
            indices=internal_primitive['indices'],
            material=material,
            mode=internal_primitive['mode'],
            targets=internal_primitive['targets']
        )
        primitives.append(primitive)

    return primitives
def gather_primitives(
        blender_mesh: bpy.types.Mesh,
        vertex_groups: Optional[bpy.types.VertexGroups],
        modifiers: Optional[bpy.types.ObjectModifiers],
        material_names: Tuple[str],
        export_settings
        ) -> List[gltf2_io.MeshPrimitive]:
    """
    Extract the mesh primitives from a blender object

    :return: a list of glTF2 primitives
    """
    primitives = []

    blender_primitives = __gather_cache_primitives(blender_mesh,
        vertex_groups, modifiers, export_settings)

    for internal_primitive in blender_primitives:
        material_idx = internal_primitive['material']
        double_sided = False
        material = None
        try:
            blender_material = bpy.data.materials[material_names[material_idx]]
            if bpy.app.version < (2, 80, 0):
                double_sided = blender_mesh.show_double_sided
            else:
                double_sided = not blender_material.use_backface_culling
            material = gltf2_blender_gather_materials.gather_material(blender_material,
                                                                  double_sided,
                                                                  export_settings)
        except IndexError:
            # no material at that index
            pass


        primitive = gltf2_io.MeshPrimitive(
            attributes=internal_primitive['attributes'],
            extensions=None,
            extras=None,
            indices=internal_primitive['indices'],
            material=material,
            mode=None,
            targets=internal_primitive['targets']
        )
        primitives.append(primitive)

    return primitives
示例#7
0
def gather_primitives(blender_mesh: bpy.types.Mesh, library: Optional[str],
                      blender_object: Optional[bpy.types.Object],
                      vertex_groups: Optional[bpy.types.VertexGroups],
                      modifiers: Optional[bpy.types.ObjectModifiers],
                      material_names: Tuple[str],
                      export_settings) -> List[gltf2_io.MeshPrimitive]:
    """
    Extract the mesh primitives from a blender object

    :return: a list of glTF2 primitives
    """
    primitives = []

    blender_primitives = __gather_cache_primitives(blender_mesh, library,
                                                   blender_object,
                                                   vertex_groups, modifiers,
                                                   export_settings)

    for internal_primitive in blender_primitives:
        material_idx = internal_primitive['material']
        double_sided = False
        material = None
        try:
            blender_material = bpy.data.materials[material_names[material_idx]]
            double_sided = not blender_material.use_backface_culling
            material = gltf2_blender_gather_materials.gather_material(
                blender_material, double_sided, export_settings)
            # NOTE: gather_material may invalidate blender_mesh (see #932),
            # so make sure not to access blender_mesh again after this point
        except IndexError:
            # no material at that index
            pass

        primitive = gltf2_io.MeshPrimitive(
            attributes=internal_primitive['attributes'],
            extensions=None,
            extras=None,
            indices=internal_primitive['indices'],
            material=material,
            mode=None,
            targets=internal_primitive['targets'])
        primitives.append(primitive)

    return primitives