Two defects from the 0.2.0 review, both fixed and both measured. - Fingers splayed because the bind is an A-pose hand. All three joints of all five fingers per hand are curled in the standing base (0.28/0.34/0.22 rad), with the curl axis probed on the rig first. The front shot now shows relaxed hands. - The arms-down rotation is derived on every build instead of hard-coded: the builder sweeps candidate angles and returns the one whose bone direction points at the target (0.60 rad, direction dot 1.000 this build). The old 0.55 was a hand-swept constant. - Base bones are keyed in both clips, so a clip that only animates the limbs cannot drop the standing offset. Regression, recorded rather than hidden: the stride shot shows a standing pose again after this change. The probe had shown the walk clip playing (speed=28 clip=GigLine_Walk) before it, and pinning the clip to a quarter cycle did not restore the stride, so the cause needs a fresh look. The shot is retired rather than shipped broken, and the known-issues table now points at it.
89 lines
2.9 KiB
C++
89 lines
2.9 KiB
C++
#pragma once
|
|
|
|
#include "CoreMinimal.h"
|
|
#include "GameFramework/Actor.h"
|
|
#include "GigLineShotActor.generated.h"
|
|
|
|
/**
|
|
* Dev-only helper for the visual-review screenshot pipeline.
|
|
*
|
|
* Placed in the review map by Tools/ue_build_review_map.py. In -game mode it
|
|
* walks a fixed list of camera setups, sets the view target to a spawned
|
|
* CameraActor for each, requests a screenshot via FScreenshotRequest, and
|
|
* quits the game when all shots are written. Lives in test content only;
|
|
* the shipped game never references this map.
|
|
*/
|
|
UCLASS()
|
|
class GIGLINE_API AGigLineShotActor : public AActor
|
|
{
|
|
GENERATED_BODY()
|
|
|
|
public:
|
|
AGigLineShotActor();
|
|
|
|
virtual void BeginPlay() override;
|
|
virtual void Tick(float DeltaSeconds) override;
|
|
|
|
/** World-space locations for each shot camera. */
|
|
UPROPERTY(EditAnywhere, BlueprintReadWrite)
|
|
TArray<FVector> ShotLocations;
|
|
|
|
/** Rotations for each shot camera (same index as ShotLocations). */
|
|
UPROPERTY(EditAnywhere, BlueprintReadWrite)
|
|
TArray<FRotator> ShotRotations;
|
|
|
|
/** File name fragment for each shot (same index as ShotLocations). */
|
|
UPROPERTY(EditAnywhere, BlueprintReadWrite)
|
|
TArray<FString> ShotNames;
|
|
|
|
/**
|
|
* Optional per-shot field of view (degrees), same index as ShotLocations.
|
|
* Zero or missing entries keep the engine default (90 deg). Elevation shots
|
|
* taken from across the street need a long lens: a level camera 45 m out with
|
|
* the default FOV leaves the building small in frame, and tilting it up to fill
|
|
* the frame is what breaks the verticals.
|
|
*/
|
|
UPROPERTY(EditAnywhere, BlueprintReadWrite)
|
|
TArray<float> ShotFieldOfView;
|
|
|
|
/** Seconds to let the view target settle before the capture. Resolution comes from the runner's -ResX/-ResY. */
|
|
UPROPERTY(EditAnywhere, BlueprintReadWrite)
|
|
float SettleSeconds = 0.35f;
|
|
|
|
/**
|
|
* Optional per-shot "follow the player" flag, same index as ShotLocations.
|
|
*
|
|
* A fixed camera cannot photograph a walking pawn: at 4.5 m/s it covers the
|
|
* distance between two captures, so three attempts framed it at a different
|
|
* distance each run and two missed it entirely. With this flag the camera is
|
|
* re-placed every frame at a fixed offset in the pawn's frame, which is what
|
|
* makes a stride shot deterministic.
|
|
*/
|
|
UPROPERTY(EditAnywhere, BlueprintReadWrite)
|
|
TArray<bool> ShotFollow;
|
|
|
|
/** Quit the game after the last shot (disable to keep the game open). */
|
|
UPROPERTY(EditAnywhere, BlueprintReadWrite)
|
|
bool bQuitWhenDone = true;
|
|
|
|
private:
|
|
void NextShot();
|
|
|
|
/** Re-places the active camera at the follow offset behind the player pawn. */
|
|
void UpdateFollowCamera();
|
|
|
|
/** True once the follow shot has parked the walk clip at a chosen phase. */
|
|
bool bFollowPhaseSet = false;
|
|
|
|
UPROPERTY()
|
|
TObjectPtr<class APlayerController> PlayerController;
|
|
|
|
UPROPERTY()
|
|
TObjectPtr<class ACameraActor> CurrentCamera;
|
|
|
|
int32 CurrentShot = 0;
|
|
float SettleCountdown = 0.f;
|
|
bool bWaitingForSettle = false;
|
|
bool bWaitingForScreenshot = false;
|
|
};
|