Skip to content

File CollisionAnimationPreviewScene.cpp

File List > CollisionEditor > Private > Viewport > CollisionAnimationPreviewScene.cpp

Go to the documentation of this file

#include "Viewport/CollisionAnimationPreviewScene.h"
#include "Components/SkeletalMeshComponent.h"
#include "Data/CollisionData.h"
#include "CollisionDataEditorToolkit.h"
#include "DrawDebugHelpers.h"
#include "Battle/Objects/PlayerObject.h"

FCollisionAnimationPreviewScene::FCollisionAnimationPreviewScene(ConstructionValues CVS, const TSharedRef<FCollisionDataEditorToolkit>& EditorToolkit)
    : FAdvancedPreviewScene(CVS), EditorPtr(EditorToolkit)
{
    // Disable the default floor to customize the scene
    SetFloorVisibility(true, true);

    // Setup events or additional components if necessary
}

FCollisionAnimationPreviewScene::~FCollisionAnimationPreviewScene()
{
    // Cleanup or unregister anything necessary
}

void FCollisionAnimationPreviewScene::Tick(float InDeltaTime)
{
    FAdvancedPreviewScene::Tick(InDeltaTime);

    // Update animations and Collisiones as needed
    UpdateMeshAndAnimation(InDeltaTime);
    UpdateCollisionView();
}

APlayerObject* FCollisionAnimationPreviewScene::SetPlayerObject(const UClass* Class)
{
    if (PreviewPlayerObject) PreviewPlayerObject->Destroy();

    const auto PlayerObject = GetWorld()->SpawnActor<APlayerObject>(const_cast<UClass*>(Class));
    PreviewPlayerObject = PlayerObject;
    PreviewPlayerObject->InitPlayer();
    PreviewPlayerObject->SetDefaultComponentVisibility();

    TArray<USkeletalMeshComponent*> SkeletalMeshComponents;
    PreviewPlayerObject->GetComponents(USkeletalMeshComponent::StaticClass(), SkeletalMeshComponents);
    for (auto* Component : SkeletalMeshComponents)
    {
        // TODO: Uncomment if it crashes again
        // if (Component->GetSkeletalMeshAsset() && Component->GetNumBones() > 0)
        // {
        //     Component->InitAnim(true);
        //     Component->SetUpdateAnimationInEditor(true);
        // }
        Component->InitAnim(true);
        Component->SetUpdateAnimationInEditor(true);
    }

    return PreviewPlayerObject;
}

void FCollisionAnimationPreviewScene::SetupScene(UCollisionData* CollisionData)
{
    CurrentCollisionData = CollisionData;
}

void FCollisionAnimationPreviewScene::UpdateMeshAndAnimation(float DeltaTime)
{
    if (!PreviewPlayerObject) return;
    PreviewPlayerObject->EditorUpdate();

    TArray<USkeletalMeshComponent*> SkeletalMeshComponents;
    PreviewPlayerObject->GetComponents(USkeletalMeshComponent::StaticClass(), SkeletalMeshComponents);
    for (auto* Component : SkeletalMeshComponents)
    {
        if (Component->GetSkeletalMeshAsset() && Component->GetNumBones() > 0)
        {
            Component->TickComponent(DeltaTime, ELevelTick::LEVELTICK_ViewportsOnly, nullptr);
        }
    }
}

void FCollisionAnimationPreviewScene::DrawCollisionData()
{
    PreviewPlayerObject->CollisionView();
}

void FCollisionAnimationPreviewScene::UpdateCollisionView()
{
    if (!CurrentCollisionData || !PreviewPlayerObject) // || !PreviewComponent)
      return;

  //Clear Debug Draw Debug Lines
  FlushPersistentDebugLines(GetWorld());

  // Get Cel name and call DrawCollisionData
  DrawCollisionData();
}