qa wip: collide site meshes, spawn cap above grade (still investigating fall-through)

- ue_import_site.py: auto_generate_collision=True so FBX static meshes get
  real collision geometry (they imported with none -> complex-as-simple had
  nothing to use, player fell through).
- ue_build_demo_map.py: PlayerStart cap raised to Z300 so the capsule feet
  start above the ~Z99-138 terrain surface there (an embedded spawn point is
  rejected -> 'NO PLAYERSTART with positive rating' -> origin fallback).
- Re-imported site meshes + rebuilt DemoMap with the above.

KNOWN-UNRESOLVED: packaged plain launch still spawns the capsule around
Z-123 and falls; downward trace finds no geometry. Map assets are all present
in the pak and referenced; runtime collision behavior needs a visual/interactive
check (headless commandlet traces are unreliable). Investigate on this branch;
do not merge to main.
This commit is contained in:
zwitschi committed 2026-11-08 10:33:40 +01:00
1 parent 1cc487b916
commit eb199ccce6
9 files changed
+20 -11

No files matched your search

Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
+7 -4
View File
@@ -372,11 +372,14 @@ def build():
# sidewalk is at Y -1912..-1053 and the SOUTH sidewalk at Y +718..+1447.
# The hero facade is on the SOUTH side at Y +1307. Stand on the north
# sidewalk and face south (+Y, yaw 90) across the road at it.
# Z 200 is clear air so the capsule settles onto the pavement instead of
# spawning embedded or below grade (the fall-through QA finding).
spawn(unreal.PlayerStart, unreal.Vector(-13336.0, -1700.0, 200.0), "Demo_PlayerStart",
# Z: the terrain here is ~Z 99-138. The capsule half-height is 87.5 cm, so
# feet must start ABOVE the surface or the point is embedded and UE rejects
# the PlayerStart ("NO PLAYERSTART with positive rating"), dropping the pawn
# at the world origin to fall through. Cap feet ~80 cm above grade: centre
# ~138+80+87 = 305, so Z 300 lets it drop cleanly and gravity settles it.
spawn(unreal.PlayerStart, unreal.Vector(-13336.0, -1700.0, 300.0), "Demo_PlayerStart",
unreal.Rotator(pitch=0.0, yaw=90.0, roll=0.0))
log("staged: Demo_PlayerStart on the north sidewalk facing south (+Y)")
log("staged: Demo_PlayerStart on the north sidewalk (cap above grade), facing south (+Y)")
# A lockable LFS .umap checks out read-only, which makes save_map silently
# return False — chmod u+w first or the staged actors never persist.
+6
View File
@@ -50,6 +50,12 @@ def import_fbx(path, name, collision="complex"):
smd.convert_scene_unit = False
smd.force_front_x_axis = False
smd.normal_import_method = unreal.FBXNormalImportMethod.FBXNIM_IMPORT_NORMALS
# Generate collision at import. A default FBX static-mesh import creates NO
# collision primitives, so CTF_USE_COMPLEX_AS_SIMPLE later has nothing to use
# and the player falls through the walkable surfaces (observed at runtime:
# ground trace under the spawn hits nothing). auto_generate_collision bakes
# collision geometry into the mesh so the walkable plane actually blocks.
smd.auto_generate_collision = True
task.options = ui
unreal.AssetToolsHelpers.get_asset_tools().import_asset_tasks([task])