LOD Recipe: Python scripting
The Simplygon Unreal Engine plugin has a Blueprint library of functions which gives you the possibility to run Simplygon processes using scripts. This guide will showcase a few examples on how to use these.
TIP
The plugin provides a helper script with python functions for doing Simplygon processing related tasks. You can find it under Content → Python → simplygon_examples.py.
Basic LOD Recipe usage
A simple script creating a new LOD Recipe, assigns a few meshes to it, builds the LOD Recipe for each mesh and then saves everything.
python
# Get Simplygon Blueprint Library
SBL = unreal.SimplygonBlueprintLibrary
# Create a LOD Recipe in the /Game/LODRecipes folder
lr_small_props = unreal.AssetToolsHelpers.get_asset_tools().create_asset(
asset_name="LR_SmallProps",
package_path="/Game/LODRecipes",
asset_class=unreal.LODRecipe,
factory=unreal.LODRecipeFactory(),
)
# Set number of LODs
lr_small_props.set_editor_property("num_lo_ds", 3)
# Get the LOD pipelines
pipelines = lr_small_props.get_editor_property("per_lod_pipeline_settings")
# Create LOD 1 pipeline: Reduction with an 88% triangle ratio reduction target
reduction_pipeline = unreal.ReductionPipeline()
reduction_pipeline_settings = reduction_pipeline.get_editor_property("settings")
reduction_settings = reduction_pipeline_settings.get_editor_property(
"reduction_settings"
)
reduction_settings.set_editor_property("reduction_target_triangle_ratio", 0.88)
pipelines[1] = reduction_pipeline
# Create LOD 2 pipeline: Remeshing with a screen size of 100px
remeshing_pipeline = unreal.RemeshingPipeline()
remeshing_pipeline_settings = remeshing_pipeline.get_editor_property("settings")
remeshing_settings = remeshing_pipeline_settings.get_editor_property(
"remeshing_settings"
)
remeshing_settings.set_editor_property("on_screen_size", 100)
pipelines[2] = remeshing_pipeline
# Load the meshes you want to link with the recipe, assign them and build
asset_paths = ["/Game/Stone001", "/Game/Stone002", "/Game/Stone003"] # Example paths
for asset_path in asset_paths:
asset = unreal.load_asset(asset_path)
SBL.assign_recipe_to_asset(lr_small_props, asset)
SBL.build_lod_recipe(asset)
# Save all dirty packages (LOD Recipe and assets)
unreal.EditorLoadingAndSavingUtils.save_dirty_packages(True, True)
Build LOD Recipes
The following script showcases a few different ways to build LODs for your meshes that have a LOD Recipe assigned.
python
# Get Simplygon Blueprint Library
SBL = unreal.SimplygonBlueprintLibrary
# Build LODs for all meshes in the project that have a LOD Recipe assigned
SBL.build_all_lod_recipes()
# Filtered build versions, given an array of LOD Recipes it'll build
# all static or skeletal meshes assigned to them depending on what function
# you use.
lod_recipes = [] # Array of all LOD Recipes you want to include
SBL.build_lod_recipes_only_for_static_meshes(lod_recipes)
SBL.build_lod_recipes_only_for_skeletal_meshes(lod_recipes)
# Build a single mesh that have a LOD Recipe assigned
asset_path = "/Game/Bench001" # Example path
asset = unreal.load_asset(asset_path)
SBL.build_lod_recipe(asset)
Assign LOD Recipe to all meshes in a folder
Following is an example script of how to assign a LOD Recipe to all meshes in a folder.
python
# Get Simplygon Blueprint Library
SBL = unreal.SimplygonBlueprintLibrary
# Load LOD Recipe
lod_recipe_path = "/Game/LR_LargeProps" # Example path
lod_recipe_asset = unreal.load_asset(lod_recipe_path)
# Retrieve all the assets in the chosen folder
package_path = "/Game/FolderName" # Example path
recursive = True # Whether subfolders should be included or not
asset_registry = unreal.AssetRegistryHelpers.get_asset_registry()
assets_list = asset_registry.get_assets_by_path(package_path, recursive)
# Filter the assets and only get static and/or skeletal meshes
assign_all_static_meshes = True
assign_all_skeletal_meshes = True
is_engine_package = lambda a : a.asset_class_path.package_name == "/Script/Engine"
is_asset_type = lambda a, name : is_engine_package(a) and a.asset_class_path.asset_name==name
meshes = []
if assign_all_static_meshes:
meshes.extend([x for x in assets_list if is_asset_type(x, "StaticMesh")])
if assign_all_skeletal_meshes:
meshes.extend([x for x in assets_list if is_asset_type(x, "SkeletalMesh")])
# Assign the LOD Recipe to the assets
for mesh in meshes:
SBL.assign_recipe_to_asset(lod_recipe_asset, mesh.get_asset())
# Save the assets afterwards
unreal.EditorLoadingAndSavingUtils.save_dirty_packages(True, True)