35 lines
1.7 KiB
Python
35 lines
1.7 KiB
Python
"""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)
|