"""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