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
78 changed files with 114 additions and 78 deletions
Showing only changes of commit f29d9d7e49 - 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.
+36 -1
View File
@@ -3,6 +3,7 @@
#include "ChaosVehicleWheel.h"
#include "ChaosWheeledVehicleMovementComponent.h"
#include "Components/SkeletalMeshComponent.h"
#include "PhysicsEngine/BodySetup.h"
// From the Blender report (Art/blender/vehicle/report.json). Kept as named constants so a
// model change is a compile-time mismatch to fix, not a number buried in a setup call.
@@ -298,17 +299,51 @@ void AGigLineVehicle::Tick(float DeltaSeconds)
DriveStart = GetActorLocation();
}
// A real-car mass. Without it the physics asset's box takes its computed mass, and a light
// body under the vehicle solver is thrown around instead of settling - which is consistent
// with a pawn that launches itself and never creates its wheels.
if (!bMassSet && SettleElapsed > 0.5f)
{
if (USkeletalMeshComponent* Body = GetMesh())
{
Body->SetMassOverrideInKg(NAME_None, 1500.0f, true);
bMassSet = true;
UE_LOG(LogTemp, Warning, TEXT("GigLine vehicle: mass override 1500 kg, mass now %.0f"),
Body->GetMass());
}
}
// 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.
{
static bool bDiagnosed = false;
if (!bDiagnosed && SettleElapsed > 3.0f && FParse::Param(FCommandLine::Get(), TEXT("probes")))
if (!bDiagnosed && SettleElapsed > 1.5f && FParse::Param(FCommandLine::Get(), TEXT("probes")))
{
bDiagnosed = true;
USkeletalMeshComponent* Body = GetMesh();
const UChaosWheeledVehicleMovementComponent* Wheeled =
Cast<UChaosWheeledVehicleMovementComponent>(GetVehicleMovementComponent());
FString BoxInfo = TEXT("no-box");
if (Body && Body->GetBodySetup() && Body->GetBodySetup()->AggGeom.BoxElems.Num() > 0)
{
const FKBoxElem& Box = Body->GetBodySetup()->AggGeom.BoxElems[0];
BoxInfo = FString::Printf(TEXT("box %.0fx%.0fx%.0f centre %.0f,%.0f,%.0f"),
Box.X, Box.Y, Box.Z, Box.Center.X, Box.Center.Y, Box.Center.Z);
}
FString BoundsInfo = TEXT("no-bounds");
if (Body)
{
const FBoxSphereBounds B = Body->Bounds;
BoundsInfo = FString::Printf(TEXT("bounds origin %.0f,%.0f,%.0f extent %.0f,%.0f,%.0f"),
B.Origin.X, B.Origin.Y, B.Origin.Z, B.BoxExtent.X, B.BoxExtent.Y, B.BoxExtent.Z);
}
UE_LOG(LogTemp, Warning, TEXT("GigLine vehicle geometry: %s | %s"), *BoxInfo, *BoundsInfo);
{
const USkeletalMesh* Asset = Body ? Body->GetSkeletalMeshAsset() : nullptr;
UE_LOG(LogTemp, Warning, TEXT("GigLine vehicle mesh asset: %s"),
Asset ? *Asset->GetName() : TEXT("NONE"));
}
UE_LOG(LogTemp, Warning,
TEXT("GigLine vehicle diag: mesh=%d simulating=%d physasset=%s setups=%d wheels=%d "
"loc=%.0f,%.0f,%.0f"),
@@ -82,5 +82,6 @@ private:
FVector DriveStart = FVector::ZeroVector;
float SettleElapsed = 0.f;
bool bMassSet = false;
bool bSettleReported = false;
};