feat(hero): facade rework — inscription, medallions, motto band, banner lettering #39

Merged
zwitschi merged 93 commits from hero-facade-0.3.0 into main 2026-11-10 15:37:40 +01:00
79 changed files with 138 additions and 76 deletions
Showing only changes of commit 0f059a5c93 - Show all commits

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.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -313,6 +313,25 @@ void AGigLineVehicle::Tick(float DeltaSeconds)
}
}
// If the Chaos vehicle never came into existence (no wheels), its movement component has no
// valid state to drive, and continuing to tick it writes whatever is in that empty state back
// onto the actor - which is the only explanation that fits a still body and a moving actor.
if (!bMoverStopped && SettleElapsed > 2.5f)
{
bMoverStopped = true;
if (const UChaosWheeledVehicleMovementComponent* WheelComp =
Cast<UChaosWheeledVehicleMovementComponent>(GetVehicleMovementComponent()))
{
UE_LOG(LogTemp, Warning,
TEXT("GigLine vehicle: stopping the mover - wheels=%d at Z %.0f"),
WheelComp->Wheels.Num(), GetActorLocation().Z);
}
if (UMovementComponent* Mover = GetVehicleMovementComponent())
{
Mover->SetComponentTickEnabled(false);
}
}
// One-shot diagnostic: why zero wheels. Wheels are built in CreateVehicle(), which runs only
// when the physics state produced a vehicle, so the useful facts are whether the mesh is
// simulating and whether it carries a physics asset at all.
@@ -349,6 +368,36 @@ void AGigLineVehicle::Tick(float DeltaSeconds)
Vel.X, Vel.Y, Vel.Z, Angular.X, Angular.Y, Angular.Z, Body->GetMass(),
Body->IsSimulatingPhysics() ? 1 : 0, Body->IsAnySimulatingPhysics() ? 1 : 0);
}
if (Body && Body->GetSkeletalMeshAsset())
{
// Do the wheel setups name bones the mesh actually has? If not, CreateVehicle()
// bails before it ever builds a wheel.
TArray<FName> Bones;
Body->GetBoneNames(Bones);
FString BoneList;
for (int32 i = 0; i < Bones.Num() && i < 20; ++i)
{
BoneList += Bones[i].ToString() + TEXT(" ");
}
FString SetupList;
if (const UChaosWheeledVehicleMovementComponent* WheelComp =
Cast<UChaosWheeledVehicleMovementComponent>(GetVehicleMovementComponent()))
{
for (const FChaosWheelSetup& S : WheelComp->WheelSetups)
{
SetupList += S.BoneName.ToString() + TEXT(" ");
}
}
UE_LOG(LogTemp, Warning, TEXT("GigLine vehicle bones: %d [%s] | setups [%s]"),
Bones.Num(), *BoneList, *SetupList);
if (const UMovementComponent* Mover = GetVehicleMovementComponent())
{
UE_LOG(LogTemp, Warning,
TEXT("GigLine vehicle mover: updated=%s ticking=%d"),
Mover->UpdatedComponent ? *Mover->UpdatedComponent->GetName() : TEXT("none"),
Mover->IsComponentTickEnabled() ? 1 : 0);
}
}
{
const USkeletalMesh* Asset = Body ? Body->GetSkeletalMeshAsset() : nullptr;
UE_LOG(LogTemp, Warning, TEXT("GigLine vehicle mesh asset: %s"),
@@ -83,5 +83,6 @@ private:
float SettleElapsed = 0.f;
bool bMassSet = false;
bool bMoverStopped = false;
bool bSettleReported = false;
};
+12
View File
@@ -32,6 +32,18 @@ GigLine vehicle diag: mesh=1 simulating=1 physasset=yes setups=4 wheels=0
- **Gravity** - `global_gravity_z = 0.0` and the character falls normally, so the world pulls down.
- **Mass** - the 1500 kg override applies (logged), and the body still does not rise.
### Measured after the transform finding
```
bones: 6 [VehicleRig root Wheel_FL Wheel_FR Wheel_RL Wheel_RR]
setups: [Wheel_FL Wheel_FR Wheel_RL Wheel_RR] -> names match, suspect 3 is gone
mover: updated=VehicleMesh ticking=1
stop: mover tick disabled at 2.5 s (Z 2001); at 3.0 s the actor is still at Z 2258
terrain: CTF_USE_COMPLEX_AS_SIMPLE, 0 box elements -> no invisible lid to be ejected from
```
So the wheel bones match, the terrain has no proxy lid, and stopping the mover did not stop the climb - meaning either the stop does not take effect (something else re-enables or writes the transform every frame) or a second writer exists.
### Suspects, in order
1. **Component hierarchy**: a pawn whose root is the mesh while the physics state belongs to another component behaves exactly like this - correct box, correct mass, near-zero velocity, moving actor, 1 cm bounds.