Source code for blenderproc.python.loader.TextureLoader

"""Loads a texture based on a path. This is not the same as a material!"""

import glob
import os
import warnings
from typing import List

import bpy

from blenderproc.python.utility.Utility import resolve_path


[docs] def load_texture(path: str, colorspace: str = "sRGB") -> List[bpy.types.Texture]: """ Loads images and creates image textures. Depending on the form of the provided path: 1. Loads an image, creates an image texture, and assigns the loaded image to the texture, when a path to an image is provided. 2. Load images and for each creates a texture, and assigns an image to this texture, if a path to a folder with images is provided. NOTE: Same image file can be loaded once to avoid unnecessary overhead. If you really need the same image in different colorspaces, then have a copy per desired colorspace and load them in different instances of this Loader. :param path: The path to the folder with assets/to the asset. :param colorspace: Colorspace type to assign to loaded assets. Available: ['Filmic Log', 'Linear', 'Linear ACES', 'Non-Color', 'Raw', 'sRGB', 'XYZ']. :return: The list of created textures. """ path = resolve_path(path) image_paths = _TextureLoader.resolve_paths(path) textures = _TextureLoader.load_and_create(image_paths, colorspace) return textures
[docs] class _TextureLoader:
[docs] @staticmethod def resolve_paths(path: str) -> list: """ Resolves absolute paths to assets in the provided folder, or to an asset if an appropriate path is provided. :param path: Path to folder containing assets or path to an asset. Type: string. :return: List of absolute paths to assets. Type: list. """ image_paths = [] if os.path.exists(path): if os.path.isdir(path): image_paths = glob.glob(os.path.join(path, "*")) else: image_paths.append(path) else: raise RuntimeError(f"Invalid path: {path}") return image_paths
[docs] @staticmethod def load_and_create(image_paths: list, colorspace: str) -> List[bpy.types.Texture]: """ Loads an image, creates an image texture and assigns an image to this texture per each provided path. :param image_paths: List of absolute paths to assets. Type: list. :param colorspace: Colorspace type of the assets. Type: string. :return: Created textures. Type: list. """ existing = [image.filepath for image in bpy.data.images] textures = [] for image_path in image_paths: if image_path not in existing: loaded_image = bpy.data.images.load(filepath=image_path) existing.append(image_path) loaded_image.colorspace_settings.name = colorspace texture_name = f"ct_{loaded_image.name}" tex = bpy.data.textures.new(name=texture_name, type="IMAGE") tex.image = loaded_image tex.use_nodes = True tex.type = "IMAGE" textures.append(tex) else: warnings.warn(f"Image {image_path} has been already loaded and a corresponding texture was created. " f"Following the save behaviour of reducing the overhead, it is skipped. So, if you " f"really need to load the same image again (for example, in a different or in the " f"same colorspace), use the copy of the file.") return textures