コード例 #1
0
def __gather_materials(blender_primitive, export_settings):
    if not blender_primitive['material']:
        # TODO: fix 'extract_promitives' so that the value of 'material' is None and not empty string
        return None
    material = bpy.data.materials[blender_primitive['material']]
    return gltf2_blender_gather_materials.gather_material(
        material, export_settings)
コード例 #2
0
def __gather_materials(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)
def __gather_materials(blender_primitive, 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
    material = bpy.data.materials[blender_primitive['material']]
    material_double_sided = not material.use_backface_culling
    return gltf2_blender_gather_materials.gather_material(
        material, material_double_sided, export_settings)
 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)
コード例 #5
0
def gather_material_property(export_settings, blender_object, target,
                             property_name, property_definition, hubs_config):
    blender_material = getattr(target, property_name)

    if blender_material:
        material = gltf2_blender_gather_materials.gather_material(
            blender_material, export_settings)
        return material
    else:
        return None
コード例 #6
0
def gather_material_property(export_settings, blender_object, target, property_name, property_definition, hubs_config):
    blender_material = getattr(target, property_name)

    if blender_material:
        double_sided = not blender_material.use_backface_culling
        material = gltf2_blender_gather_materials.gather_material(
            blender_material, double_sided, export_settings)
        return material
    else:
        return None
コード例 #7
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
コード例 #8
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']
        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
コード例 #9
0
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
コード例 #10
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
コード例 #11
0
def __gather_materials(blender_scene, export_settings):
    materials = []

    for _blender_object in blender_scene.objects:
        blender_object = _blender_object.proxy if _blender_object.proxy else _blender_object

        # Check if this object is exclude from view layer
        node = gltf2_blender_gather_nodes.gather_node(
                blender_object,
                blender_object.library.name if blender_object.library else None,
                blender_scene, None, export_settings)
        if node is None:
            continue

        for slot in blender_object.material_slots:
            # Check if this slot as assigned material
            if slot.material is None:
                continue

            double_sided = not slot.material.use_backface_culling
            materials.append(gltf2_blender_gather_materials.gather_material(slot.material, double_sided, export_settings))

    return materials
コード例 #12
0
def __gather_materials(blender_primitive, export_settings):
    material = bpy.data.materials[blender_primitive['material']]
    return gltf2_blender_gather_materials.gather_material(
        material, export_settings)
コード例 #13
0
def patched_gather_extensions(blender_object, export_settings):
    extensions = original_gather_extensions(blender_object, export_settings)

    component_list = blender_object.hubs_component_list
    hubs_config = export_settings['hubs_config']
    registered_hubs_components = export_settings['registered_hubs_components']

    if component_list.items:
        extension_name = hubs_config["gltfExtensionName"]
        component_data = {}

        for component_item in component_list.items:
            component_name = component_item.name
            component_data[component_name] = {}
            component_definition = hubs_config['components'][component_name]
            component_class = registered_hubs_components[component_name]
            component_class_name = component_class.__name__
            component = getattr(blender_object, component_class_name)

            for property_name, property_definition in component_definition[
                    'properties'].items():
                property_type = property_definition['type']

                if property_type == 'collections':
                    filtered_collection_names = []

                    collection_prefix_regex = None

                    if 'collectionPrefix' in property_definition:
                        collection_prefix = property_definition[
                            'collectionPrefix']
                        collection_prefix_regex = re.compile(r'^' +
                                                             collection_prefix)

                    for collection in blender_object.users_collection:
                        if collection_prefix_regex and collection_prefix_regex.match(
                                collection.name):
                            new_name = collection_prefix_regex.sub(
                                "", collection.name)
                            filtered_collection_names.append(new_name)
                        elif not collection_prefix_regex:
                            filtered_collection_names.append(collection.name)

                    component_data[component_name][
                        property_name] = filtered_collection_names
                elif property_type == 'array':
                    array_type = property_definition['arrayType']
                    value = []
                    arr = getattr(component, property_name)

                    if array_type == 'material':
                        for item in arr:
                            blender_material = item.value
                            double_sided = not blender_material.use_backface_culling
                            material = gltf2_blender_gather_materials.gather_material(
                                blender_material, double_sided,
                                export_settings)
                            value.append(material)
                    else:
                        for item in arr:
                            value.append(__to_json_compatible(item.value))

                    component_data[component_name][property_name] = value
                else:
                    component_data[component_name][
                        property_name] = __to_json_compatible(
                            getattr(component, property_name))

        if extensions is None:
            extensions = {}

        extensions[extension_name] = gltf2_io_extensions.Extension(
            name=extension_name, extension=component_data, required=False)

    return extensions if extensions else None