L7l : plafond WallT masque dans les lieux exterieurs (ERR-036, mesure confirmee)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
edujiro5972 2026-10-01 23:38:12 +02:00
parent 026bddf554
commit 2c9fd48d40
4 changed files with 115 additions and 1 deletions

View file

@ -886,3 +886,12 @@ suit l'échelle : 4,08 m en intérieur mais **20 cm au-dessus du sol en extérie
| CHG | Date | Lot | Fichiers | Raison | Retour arrière |
|---|---|---|---|---|---|
| CHG-056 | 2026-10-01 | L7l | `Source/LifePlay/LPSessionLogSubsystem.h/.cpp` : option `-LPDumpEvery=N` (relevé périodique) | confirmer l'hypothèse du plafond par une mesure en extérieur (`LifePlay_releve_L7l.bat`) | `git checkout L7j2-apres -- Source` |
Mesure L7l (2026-10-01, `L7l_releve3_20261001.log`, relevé toutes les 5 s) : lieu extérieur « rue » (échelle racine
3,5 ; 18 ; **0,01**) : sol à −114,5, pieds du joueur à −112 (capsule −24,2, demi-hauteur 88) : posés ;
`WallT` visible, Z relatif 2 040 → **−94,6 en monde, 18 cm au-dessus des pieds** : hypothèse confirmée. En intérieur
(café, police, échelle 0,2) : `WallT` à +293, pieds à −100 : correct (capture utilisateur sans défaut).
| CHG | Date | Lot | Fichiers | Raison | Retour arrière |
|---|---|---|---|---|---|
| CHG-057 | 2026-10-01 | L7l | `Source/LifePlay/LPOutdoorRoomSubsystem.h/.cpp` (nouveau sous-système) | masquer le plafond `WallT` de `GI.Room` tant que l'échelle Z de sa racine est < 0,05 (lieux extérieurs), le rendre visible quand la pièce redevient intérieure (seulement s'il l'a masqué) ; aucun Blueprint ni asset modifié ; build `LifePlay_Build_5.5_L7cdj` | supprimer les 2 fichiers (`git checkout fa3d98e -- Source`) |

View file

@ -40,5 +40,5 @@
| ERR-033 | Certaines actions demandent deux clics pour démarrer | retour utilisateur 2026-09-30 | — | moyenne (ergonomie) | L6d | **non reproduit** depuis le build L6e (constat utilisateur 2026-09-30) ; aucune modification ciblée — coïncide avec CX-B09 (marges des boutons), sans lien démontré ; sous surveillance, à rouvrir s'il réapparaît |
| ERR-034 | La barre de temps est décalée vers la droite | retour utilisateur 2026-09-30 | — | faible (visuel) | L6e | **corrigé (CHG-033, CX-B09)** — cause : marge par défaut des `UButton` passée de 2 px (UE4 `FCoreStyle`) à 12 px horizontaux (UE5 `FUMGCoreStyle`) ; 5 boutons × 20 px = 100 px de débordement ; **validé en jeu le 2026-09-30** (build L6e, confirmé par l'utilisateur) |
| ERR-035 | 6 nœuds `GetRandomPointInNavigableRadius` dépréciés (R-04 : `Person` 3, `Room` 2, `AI` 1) | `LogBlueprint` | 6 (compilation), 3 (cuisson) | faible (dette) | L7b | **corrigé (CHG-037, CX-B11)**, retiré à tort (CHG-038), réappliqué (CHG-039) : compilation et cuisson 0 avertissement ; **validé en jeu le 2026-09-30** (build L7b) |
| ERR-036 | En extérieur (ex. `forest___vin01.lpworld`), personnages et objets (bois du feu de camp) enfoncés sous la surface du sol ; ils traversent la matière | retour utilisateur 2026-09-30 (capture) | — | faible (visuel) | L7l | **préexistant en 4.27** (confirmé par l'utilisateur), présent aussi en V1/L7a : hors périmètre de la migration ; amélioration possible si souhaitée |
| ERR-036 | En extérieur (ex. `forest___vin01.lpworld`), personnages et objets (bois du feu de camp) enfoncés sous la surface du sol ; ils traversent la matière | retour utilisateur 2026-09-30 (capture) | — | faible (visuel) | L7l | **préexistant en 4.27** (confirmé par l'utilisateur), présent aussi en V1/L7a : hors périmètre de la migration ; cause mesurée (CHG-057) : plafond `WallT` à 18 cm du sol en extérieur (échelle Z 0,01), qui masque pieds et pieds des meubles ; correctif CHG-057 (plafond masqué en extérieur), **test en jeu en attente** |
| ERR-037 | Quick dress (menu Action) laisse souvent le personnage principal nu | retour utilisateur 2026-10-01 | — | moyenne (visible) | — | **préexistant en 4.27** (confirmé par l'utilisateur le 2026-10-01 : même comportement au travail) : au travail seuls les vêtements « Formal » sont acceptés ; sans bas ni chaussures formels dans l'inventaire, seul le haut est mis. Hors périmètre |

View file

@ -0,0 +1,69 @@
// Portage UE 5.5 - voir LPOutdoorRoomSubsystem.h
#include "LPOutdoorRoomSubsystem.h"
#include "Components/SceneComponent.h"
#include "Engine/GameInstance.h"
#include "GameFramework/Actor.h"
#include "LifePlay.h"
#include "UObject/UnrealType.h"
namespace
{
// Interieurs : 0,2 a 0,4 ; exterieurs : 0,01. Le seuil laisse une marge des deux cotes.
constexpr double OutdoorScaleZ = 0.05;
const FName RoomPropertyName(TEXT("Room"));
const FName CeilingPropertyName(TEXT("WallT"));
template <typename T>
T* GetObjectProperty(const UObject* Container, FName Name)
{
const FObjectPropertyBase* Prop = Container ? CastField<FObjectPropertyBase>(Container->GetClass()->FindPropertyByName(Name)) : nullptr;
return Prop ? Cast<T>(Prop->GetObjectPropertyValue_InContainer(Container)) : nullptr;
}
}
void ULPOutdoorRoomSubsystem::Initialize(FSubsystemCollectionBase& Collection)
{
Super::Initialize(Collection);
TickHandle = FTSTicker::GetCoreTicker().AddTicker(FTickerDelegate::CreateUObject(this, &ULPOutdoorRoomSubsystem::Tick));
}
void ULPOutdoorRoomSubsystem::Deinitialize()
{
FTSTicker::GetCoreTicker().RemoveTicker(TickHandle);
Super::Deinitialize();
}
bool ULPOutdoorRoomSubsystem::Tick(float DeltaTime)
{
const AActor* Room = GetObjectProperty<AActor>(GetGameInstance(), RoomPropertyName);
USceneComponent* Root = IsValid(Room) ? Room->GetRootComponent() : nullptr;
USceneComponent* Ceiling = IsValid(Room) ? GetObjectProperty<USceneComponent>(Room, CeilingPropertyName) : nullptr;
// Plafond masque precedemment mais qui n'est plus celui de la piece courante : le rendre.
if (HiddenCeiling.IsValid() && HiddenCeiling.Get() != Ceiling)
{
HiddenCeiling->SetHiddenInGame(false);
HiddenCeiling.Reset();
}
if (!Root || !Ceiling)
{
return true;
}
const bool bOutdoor = Root->GetRelativeScale3D().Z < OutdoorScaleZ;
if (bOutdoor && !Ceiling->bHiddenInGame)
{
Ceiling->SetHiddenInGame(true);
HiddenCeiling = Ceiling;
UE_LOG(LogLifePlay, Log, TEXT("Piece exterieure (echelle Z %.3f) : plafond WallT masque"), Root->GetRelativeScale3D().Z);
}
else if (!bOutdoor && HiddenCeiling.Get() == Ceiling)
{
Ceiling->SetHiddenInGame(false);
HiddenCeiling.Reset();
UE_LOG(LogLifePlay, Log, TEXT("Piece interieure (echelle Z %.3f) : plafond WallT rendu visible"), Root->GetRelativeScale3D().Z);
}
return true;
}

View file

@ -0,0 +1,36 @@
// Portage UE 5.5 - lot L7l (ERR-036, amelioration : defaut deja present en 4.27).
//
// Chaque lieu est construit par l'acteur Room (GI.Room) dont la racine prend l'echelle Z de la ligne 1 du
// .lpworld : 0,2 a 0,4 en interieur, 0,01 pour les 7 lieux exterieurs. Le plafond WallT (Z relatif 2040,
// sans collision) suit cette echelle : en exterieur il se trouve a ~20 cm au-dessus du sol et, vu de la
// camera, devient un "sol blanc" qui cache les pieds et le bas des meubles (releve L7l_releve3).
//
// Ce sous-systeme masque WallT tant que l'echelle Z de la racine de Room est inferieure au seuil, et le
// rend de nouveau visible des que la piece redevient interieure (seulement s'il l'a lui-meme masque).
// Aucun Blueprint ni asset n'est modifie ; sans Room ou sans WallT, il ne fait rien.
#pragma once
#include "CoreMinimal.h"
#include "Containers/Ticker.h"
#include "Subsystems/GameInstanceSubsystem.h"
#include "LPOutdoorRoomSubsystem.generated.h"
class USceneComponent;
UCLASS()
class LIFEPLAY_API ULPOutdoorRoomSubsystem : public UGameInstanceSubsystem
{
GENERATED_BODY()
public:
virtual void Initialize(FSubsystemCollectionBase& Collection) override;
virtual void Deinitialize() override;
private:
bool Tick(float DeltaTime);
FTSTicker::FDelegateHandle TickHandle;
/** Plafond masque par ce sous-systeme (a rendre visible quand la piece redevient interieure). */
TWeakObjectPtr<USceneComponent> HiddenCeiling;
};