# Import the retail frontage trim (6800 Lee Drug, 6806–6820) into Unreal. # # blender -b --factory-startup --python Tools/retail_frontage_build.py -- \ # --out /tmp/gigline/retail --report /tmp/gigline/retail-report.json # /Engine/Binaries/Linux/UnrealEditor-Cmd -run=pythonscript \ # -script=/Tools/ue_import_retail_detail.py -nullrhi -unattended -nopause -stdout # # Two meshes arrive, one per building, each already at its world position in the # project frame (the FBX carries the offset), so staging spawns at the origin. # Destination: /Game/Hollywood/Frontage/ — same folder as the block frontage # so the demo builder stages them together. # # Result file: /tmp/gigline/retail-import.txt import glob import os import unreal SRC = "/tmp/gigline/retail" DEST = "/Game/Hollywood/Frontage" RESULT = "/tmp/gigline/retail-import.txt" lines = [] def log(msg): lines.append(str(msg)) unreal.log(str(msg)) def import_fbx(path, name): task = unreal.AssetImportTask() task.filename = path task.destination_path = DEST task.destination_name = name task.automated = True task.save = True task.replace_existing = True ui = unreal.FbxImportUI() ui.import_mesh = True ui.import_materials = True ui.import_textures = False ui.import_as_skeletal = False smd = ui.static_mesh_import_data smd.import_uniform_scale = 1.0 smd.combine_meshes = True smd.convert_scene_unit = False smd.force_front_x_axis = False smd.normal_import_method = unreal.FBXNormalImportMethod.FBXNIM_IMPORT_NORMALS task.options = ui unreal.AssetToolsHelpers.get_asset_tools().import_asset_tasks([task]) mesh = unreal.EditorAssetLibrary.load_asset(f"{DEST}/{name}") if mesh is None: log(f"MISSING after import: {DEST}/{name}") return None # Trim is decoration on a solid the player already collides with: no collision # of its own, otherwise the cornice and mullions become snag points. try: body = mesh.get_editor_property("body_setup") body.set_editor_property("collision_trace_flag", unreal.CollisionTraceFlag.CTF_USE_COMPLEX_AS_SIMPLE) mesh.set_editor_property("body_setup", body) except Exception as exc: # noqa: BLE001 log(f"{name}: collision flag not set ({exc!r})") box = mesh.get_bounding_box() mn, mx = box.min, box.max log(f"{name:22} X {mn.x:8.0f}..{mx.x:8.0f} Y {mn.y:7.0f}..{mx.y:7.0f} " f"Z {mn.z:5.0f}..{mx.z:5.0f} slots {len(mesh.get_editor_property('static_materials'))}") return mesh def main(): files = sorted(glob.glob(os.path.join(SRC, "*.fbx"))) if not files: log(f"no FBX in {SRC}; run Tools/retail_frontage_build.py first") return for path in files: import_fbx(path, os.path.splitext(os.path.basename(path))[0]) unreal.EditorLoadingAndSavingUtils.save_dirty_packages(True, True) try: main() except Exception as exc: # noqa: BLE001 import traceback log(f"FAILED: {type(exc).__name__}: {exc}") log(traceback.format_exc()) with open(RESULT, "w") as f: f.write("\n".join(lines) + "\n")