LifePlay-Revival/Source/LifePlayEditorTools/LPAnimChecks.h
edujiro5972 04b053554f Sandbox addon : brancher le jeu sur LifePlay-Sandbox (plugin LPSandbox).
Charge le plugin via AdditionalPluginDirectories, conserve ShowCouple et les commandlets anim côté jeu, et documente les lots S0–S8 (CHG-212 à CHG-220).

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-06 21:10:53 +02:00

60 lines
2.3 KiB
C++

// Lot AP4 (Docs/Migration/20_Chaine_Animations.md, section 4) : controles independants de la formule.
//
// Calcules image par image sur le clip converti, compares au mouvement source mis a l'echelle : un defaut deja
// present dans le clip source n'est pas impute a la conversion. Aucun rendu.
// sol : pied ou orteil plus bas que dans la source (cm, au-dela de la source) ;
// glissement : pied qui bouge alors que le pied source est pose (cm par image) ;
// genou : genou en hyperextension, derriere la ligne hanche-cheville, au-dela de la source (cm) ;
// flexion : ecart d'angle de flexion du coude et du genou avec la source (degres) ;
// saut : rotation d'un os d'une image a l'autre au-dela de celle de la source (degres) ;
// penetration : main, poignet ou coude dans les capsules du tronc de l'actif physique du corps (cm).
#pragma once
#include "CoreMinimal.h"
#include "LPPoseMeasure.h"
class USkeletalMesh;
struct FLPCheckCapsule
{
int32 Bone = INDEX_NONE;
// Dans l'espace de l'os : centre, axe (unitaire), demi-longueur du segment, rayon.
FVector Center = FVector::ZeroVector;
FVector Axis = FVector::UpVector;
float HalfLength = 0.f;
float Radius = 0.f;
};
struct FLPClipChecks
{
FString Clip;
int32 Frames = 0;
float Floor = 0.f;
FString FloorBone;
float Slide = 0.f;
FString SlideBone;
float KneeBack = 0.f;
FString KneeBone;
float FlexGap = 0.f;
FString FlexJoint;
float Jump = 0.f;
FString JumpBone;
float Penetration = 0.f;
FString PenetrationBone;
FString Error;
};
namespace LPAnimChecks
{
// Capsules du tronc (bassin, colonne, poitrine) de l'actif physique du maillage du corps.
TArray<FLPCheckCapsule> TrunkCapsules(const USkeletalMesh* Mesh, const FLPPose& BodyT);
// Auto-test du calcul de penetration : l'articulation de l'os porteur de chaque capsule (extremite du segment),
// sur le corps en pose T, doit etre a une profondeur egale au rayon. Rend l'ecart maximal (cm) ; -1 sans capsule.
float SelfTest(const TArray<FLPCheckCapsule>& Trunk, const FLPPose& BodyT);
// Controle un clip converti (BodyPath) contre son clip source (RefPath), a chaque image du clip converti.
FLPClipChecks CheckClip(const FString& RefPath, const FString& BodyPath, const FLPPose& RefT, const FLPPose& BodyT,
const TArray<FLPCheckCapsule>& Trunk);
}