"""Small opaque PBR materials, generated without external assets.""" import unreal from .paths import GENERATED, slug def color(name, rgb=(0.15, 0.5, 0.8), roughness=0.55, metallic=0.0): path = f"{GENERATED}/Materials/M_{slug(name)}" material = unreal.load_asset(path) if material is None: material = unreal.AssetToolsHelpers.get_asset_tools().create_asset( "M_" + name, GENERATED + "/Materials", unreal.Material, unreal.MaterialFactoryNew()) if not isinstance(material, unreal.Material): raise TypeError(f"{path} nie jest materialem.") lib = unreal.MaterialEditingLibrary lib.delete_all_material_expressions(material) base = lib.create_material_expression(material, unreal.MaterialExpressionConstant3Vector, -300, 0) base.set_editor_property("constant", unreal.LinearColor(*rgb, 1.0)) lib.connect_material_property(base, "", unreal.MaterialProperty.MP_BASE_COLOR) for offset, value, prop in [(160, roughness, unreal.MaterialProperty.MP_ROUGHNESS), (280, metallic, unreal.MaterialProperty.MP_METALLIC)]: node = lib.create_material_expression(material, unreal.MaterialExpressionConstant, -300, offset) node.set_editor_property("r", float(value)) lib.connect_material_property(node, "", prop) lib.recompile_material(material) unreal.EditorAssetLibrary.save_loaded_asset(material) return material def assign(actor, material, slot=0): component = actor.get_component_by_class(unreal.StaticMeshComponent) if component is None: raise TypeError("Material mozna przypisac do aktora ze StaticMeshComponent.") component.set_material(slot, material)