Upload Group Name Text

This commit is contained in:
Sch 2023-07-10 16:47:15 +08:00
parent 62544e52d2
commit 1412d82a87
20 changed files with 390 additions and 26 deletions

BIN
Resources/PlayerLight.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 669 B

View File

@ -3,6 +3,7 @@
#pragma once #pragma once
#include "CoreMinimal.h" #include "CoreMinimal.h"
#include "Cut5/Widgets/DefineGlobal.h"
#include "Engine/Texture2D.h" #include "Engine/Texture2D.h"
#include "UObject/Interface.h" #include "UObject/Interface.h"
#include "CutMainWidgetInterface.generated.h" #include "CutMainWidgetInterface.generated.h"
@ -26,5 +27,9 @@ public:
virtual void OnUpdateVideo(FGuid UUID, UTexture2D* Texture) {}; virtual void OnUpdateVideo(FGuid UUID, UTexture2D* Texture) {};
virtual void OnUpdateLightArray(const TArray<FColor>& LightArray) {}; virtual void OnUpdateLightArray(const TArray<FColor>& LightArray) {};
virtual void OnUpdatePlayers(TSharedPtr<class IWidgetInterface> TrackBody, FColor PlayerColor) {};
virtual void OnAddNewTrack(ETrackType Type) {};
virtual FString GetGroupName(TSharedPtr<class IWidgetInterface> WidgetInterface) { return FString(); };
}; };

View File

@ -39,11 +39,18 @@ TArray<TArray<FColor>> FOpencvUtils::GetVideoFrameLightArray(FString VideoPath,
TArray<FColor> LightArray; TArray<FColor> LightArray;
VideoCapture.retrieve(Array); VideoCapture.retrieve(Array);
cv::resize(Array, Array, cv::Size(X, Y)); cv::resize(Array, Array, cv::Size(X, Y));
for (int32 i = 0; i < Array.cols * Array.rows; i++) uint8* RGBAData = new uint8[Array.cols * Array.rows * 4];
for (int i = 0; i < Array.cols * Array.rows; i++)
{ {
LightArray.Add(FColor(Array.data[i * 3 + 0], Array.data[i * 3 + 1], Array.data[i * 3 + 2], 255)); RGBAData[i * 4 + 0] = Array.data[i * 3 + 2];
RGBAData[i * 4 + 1] = Array.data[i * 3 + 1];
RGBAData[i * 4 + 2] = Array.data[i * 3 + 0];
RGBAData[i * 4 + 3] = 255;
LightArray.Add(FColor(RGBAData[i * 4 + 0], RGBAData[i * 4 + 1], RGBAData[i * 4 + 2], RGBAData[i * 4 + 3]));
} }
delete[] RGBAData;
Colors.Add(LightArray); Colors.Add(LightArray);
} }
if (Array.empty()) if (Array.empty())
{ {
@ -53,3 +60,28 @@ TArray<TArray<FColor>> FOpencvUtils::GetVideoFrameLightArray(FString VideoPath,
VideoCapture.release(); VideoCapture.release();
return Colors; return Colors;
} }
TArray<FColor> FOpencvUtils::GetVideoSingleLightColor(FString VideoPath)
{
cv::VideoCapture VideoCapture;
VideoCapture.open(TCHAR_TO_UTF8(*VideoPath));
TArray<FColor> LightArray;
while (VideoCapture.isOpened())
{
cv::Mat Array;
if (VideoCapture.grab())
{
VideoCapture.retrieve(Array);
cv::resize(Array, Array, cv::Size(1, 1));
LightArray.Add(FColor(Array.data[2], Array.data[0], Array.data[1], 255));
}
if (Array.empty())
{
break;
}
}
VideoCapture.release();
return LightArray;
}

View File

@ -7,5 +7,6 @@ class FOpencvUtils
public: public:
static int32 GetVideoFrameCount(FString VideoPath); static int32 GetVideoFrameCount(FString VideoPath);
static TArray<TArray<FColor>> GetVideoFrameLightArray(FString VideoPath, int32 X, int32 Y); static TArray<TArray<FColor>> GetVideoFrameLightArray(FString VideoPath, int32 X, int32 Y);
static TArray<FColor> GetVideoSingleLightColor(FString VideoPath);
}; };

View File

@ -94,6 +94,10 @@ struct CUT5_API FClipData
TArray<TArray<FColor>> LightArrayData; TArray<TArray<FColor>> LightArrayData;
// Player
FString PlayerName;
TArray<FColor> PlayerLightData;
}; };
struct CUT5_API FTimelinePropertyData struct CUT5_API FTimelinePropertyData

View File

@ -0,0 +1,79 @@
// Fill out your copyright notice in the Description page of Project Settings.
#include "SClickEditableText.h"
#include <Cut5/Utils/Utils.h>
#include "SlateOptMacros.h"
#include "Widgets/Input/SEditableText.h"
BEGIN_SLATE_FUNCTION_BUILD_OPTIMIZATION
void SClickEditableText::Construct(const FArguments& InArgs)
{
TextPtr = InArgs._InitTextPtr;
OnEdited = InArgs._OnEdited;
ChildSlot
[
SNew(SVerticalBox)
+ SVerticalBox::Slot()
.HAlign(HAlign_Fill)
.VAlign(VAlign_Fill)
[
SAssignNew(Overlay, SOverlay)
+ SOverlay::Slot()
.HAlign(HAlign_Fill)
.VAlign(VAlign_Fill)
[
SNew(SBorder)
.OnMouseDoubleClick_Lambda([this](const FGeometry& MyGeometry, const FPointerEvent& MouseEvent)
{
CreateEditableBox();
return FReply::Handled();
})
]
+ SOverlay::Slot()
.HAlign(HAlign_Center)
.VAlign(VAlign_Center)
[
SAssignNew(TextBlock, STextBlock)
.Visibility(EVisibility::HitTestInvisible)
.Justification(ETextJustify::Center)
.Text(FText::FromString(*TextPtr))
]
]
];
}
void SClickEditableText::CreateEditableBox()
{
TextBlock->SetText(FText());
EditableText = SNew(SEditableText)
.OnTextCommitted_Lambda([this](const FText& InText, ETextCommit::Type InCommitType)
{
FString Text = InText.ToString();
if (Text.IsEmpty())
{
TextBlock->SetText(FText::FromString(*TextPtr));
return;
}
TextBlock->SetText(FText::FromString(FUtils::MakeStringUpright(InText.ToString())));
Overlay->RemoveSlot(EditableText.ToSharedRef());
if (!OnEdited.ExecuteIfBound(InText.ToString(), *TextPtr))
{
check(false)
};
*TextPtr = InText.ToString();
});
Overlay->AddSlot()
.HAlign(HAlign_Fill)
.VAlign(VAlign_Fill)
[
EditableText.ToSharedRef()
];
}
END_SLATE_FUNCTION_BUILD_OPTIMIZATION

View File

@ -0,0 +1,33 @@
// Fill out your copyright notice in the Description page of Project Settings.
#pragma once
#include "CoreMinimal.h"
#include "Widgets/SCompoundWidget.h"
#include "Widgets/Input/SEditableText.h"
/**
*
*/
class CUT5_API SClickEditableText : public SCompoundWidget
{
public:
DECLARE_DELEGATE_TwoParams(FOnEdited, FString, FString)
SLATE_BEGIN_ARGS(SClickEditableText)
{
}
SLATE_ARGUMENT(FString*, InitTextPtr)
SLATE_EVENT(FOnEdited, OnEdited)
SLATE_END_ARGS()
/** Constructs this widget with InArgs */
void Construct(const FArguments& InArgs);
TSharedPtr<STextBlock> TextBlock;
TSharedPtr<SOverlay> Overlay;
TSharedPtr<SEditableText> EditableText;
FOnEdited OnEdited;
FString* TextPtr;
void CreateEditableBox();
};

View File

@ -7,7 +7,10 @@
#include "SCustomInputPanel.h" #include "SCustomInputPanel.h"
#include "SCutTimeline.h" #include "SCutTimeline.h"
#include "SlateOptMacros.h" #include "SlateOptMacros.h"
#include "SPlayerLight.h"
#include "STimelinePropertyPanel.h" #include "STimelinePropertyPanel.h"
#include "STrackBody.h"
#include "STrackHead.h"
#include "Widgets/Layout/SConstraintCanvas.h" #include "Widgets/Layout/SConstraintCanvas.h"
#include "Widgets/Layout/SScaleBox.h" #include "Widgets/Layout/SScaleBox.h"
#include "Widgets/Views/STreeView.h" #include "Widgets/Views/STreeView.h"
@ -74,9 +77,17 @@ void SCutMainWindow::Construct(const FArguments& InArgs)
[ [
SNew(SVerticalBox) SNew(SVerticalBox)
+ SVerticalBox::Slot() + SVerticalBox::Slot()
[
SAssignNew(PlayerGroupsPanel1, SHorizontalBox)
]
+ SVerticalBox::Slot()
[ [
LightArrayPanel.ToSharedRef() LightArrayPanel.ToSharedRef()
] ]
+ SVerticalBox::Slot()
[
SAssignNew(PlayerGroupsPanel2, SHorizontalBox)
]
] ]
+ SHorizontalBox::Slot() + SHorizontalBox::Slot()
.HAlign(HAlign_Fill) .HAlign(HAlign_Fill)
@ -103,6 +114,28 @@ void SCutMainWindow::Construct(const FArguments& InArgs)
} }
void SCutMainWindow::Render()
{
PlayerGroupsPanel1->ClearChildren();
PlayerGroupsPanel2->ClearChildren();
PlayerLightsSlateInstances.Empty();
bool bSingle = false;
for (FSingleTrackGroupInstance& TrackGroupInstance : CutTimeline->TrackGroupInstances)
{
if (StaticCastSharedPtr<STrackHead>(TrackGroupInstance.Head)->TrackData.TrackType == ETrackType::PlayerTrack)
{
TSharedPtr<SPlayerLight> PlayerLight = SNew(SPlayerLight).Name(TrackGroupInstance.GroupName);
(bSingle ? PlayerGroupsPanel1 : PlayerGroupsPanel2)->AddSlot()
[
PlayerLight.ToSharedRef()
];
bSingle = !bSingle;
PlayerLightsSlateInstances.Add(PlayerLight);
}
}
}
FReply SCutMainWindow::OnDragOver(const FGeometry& MyGeometry, const FDragDropEvent& DragDropEvent) FReply SCutMainWindow::OnDragOver(const FGeometry& MyGeometry, const FDragDropEvent& DragDropEvent)
{ {
const FTrackClipDragOperation& ClipDragOperation = static_cast<FTrackClipDragOperation&>(DragDropEvent.GetOperation().ToSharedRef().Get()); const FTrackClipDragOperation& ClipDragOperation = static_cast<FTrackClipDragOperation&>(DragDropEvent.GetOperation().ToSharedRef().Get());
@ -142,5 +175,49 @@ void SCutMainWindow::OnUpdateLightArray(const TArray<FColor>& LightArray)
LightArrayPanel->LightGridColors = LightArray; LightArrayPanel->LightGridColors = LightArray;
} }
void SCutMainWindow::OnUpdatePlayers(TSharedPtr<class IWidgetInterface> TrackBody, FColor PlayerColor)
{
ICutMainWidgetInterface::OnUpdatePlayers(TrackBody, PlayerColor);
for (int32 i = 0; i < PlayerLightsSlateInstances.Num(); i++)
{
const FString PlayerLightName = StaticCastSharedPtr<STrackBody>(TrackBody)->TrackHead->TrackData.TrackName;
if (PlayerLightName == TEXT("玩家"))
{
PlayerLightsSlateInstances[i]->SetColor(PlayerColor);
break;
}
}
}
void SCutMainWindow::OnAddNewTrack(ETrackType Type)
{
ICutMainWidgetInterface::OnAddNewTrack(Type);
switch (Type)
{
case ETrackType::PlayerTrack:
{
Render();
}
break;
default:
break;
}
}
FString SCutMainWindow::GetGroupName(TSharedPtr<IWidgetInterface> WidgetInterface)
{
for (FSingleTrackGroupInstance& Instance : CutTimeline->TrackGroupInstances)
{
if (Instance.IsThis(WidgetInterface))
{
return Instance.GroupName;
}
}
return "";
}
END_SLATE_FUNCTION_BUILD_OPTIMIZATION END_SLATE_FUNCTION_BUILD_OPTIMIZATION

View File

@ -6,6 +6,7 @@
#include "SCurtainPanel.h" #include "SCurtainPanel.h"
#include "SCutTimeline.h" #include "SCutTimeline.h"
#include "SLightArrayPanel.h" #include "SLightArrayPanel.h"
#include "SPlayerLight.h"
#include "SVideoPlayer.h" #include "SVideoPlayer.h"
#include "Cut5/Interface/CutMainWidgetInterface.h" #include "Cut5/Interface/CutMainWidgetInterface.h"
#include "Widgets/SCompoundWidget.h" #include "Widgets/SCompoundWidget.h"
@ -29,6 +30,12 @@ public:
TSharedPtr<SLightArrayPanel> LightArrayPanel; TSharedPtr<SLightArrayPanel> LightArrayPanel;
TSharedPtr<SVideoPlayer> VideoPlayer; TSharedPtr<SVideoPlayer> VideoPlayer;
TSharedPtr<SCurtainPanel> CurtainPanel; TSharedPtr<SCurtainPanel> CurtainPanel;
TSharedPtr<SHorizontalBox> PlayerGroupsPanel1;
TSharedPtr<SHorizontalBox> PlayerGroupsPanel2;
TArray<TSharedPtr<SPlayerLight>> PlayerLightsSlateInstances;
void Render();
virtual FReply OnDragOver(const FGeometry& MyGeometry, const FDragDropEvent& DragDropEvent) override; virtual FReply OnDragOver(const FGeometry& MyGeometry, const FDragDropEvent& DragDropEvent) override;
virtual FReply OnDrop(const FGeometry& MyGeometry, const FDragDropEvent& DragDropEvent) override; virtual FReply OnDrop(const FGeometry& MyGeometry, const FDragDropEvent& DragDropEvent) override;
@ -36,5 +43,7 @@ public:
virtual void OnUpdateVideo(FGuid UUID, UTexture2D* Texture) override; virtual void OnUpdateVideo(FGuid UUID, UTexture2D* Texture) override;
virtual void OnUpdateLightArray(const TArray<FColor>& LightArray) override; virtual void OnUpdateLightArray(const TArray<FColor>& LightArray) override;
virtual void OnUpdatePlayers(TSharedPtr<class IWidgetInterface> TrackBody, FColor PlayerColor) override;
virtual void OnAddNewTrack(ETrackType Type) override;
virtual FString GetGroupName(TSharedPtr<IWidgetInterface> WidgetInterface) override;
}; };

View File

@ -7,6 +7,7 @@
#include "STimelineTick.h" #include "STimelineTick.h"
#include "STrackBody.h" #include "STrackBody.h"
#include "Cut5/Utils/Utils.h" #include "Cut5/Utils/Utils.h"
#include "MicroWidgets/SClickEditableText.h"
#include "Widgets/Input/SButton.h" #include "Widgets/Input/SButton.h"
#include "Widgets/Input/SSlider.h" #include "Widgets/Input/SSlider.h"
#include "Widgets/Layout/SScrollBox.h" #include "Widgets/Layout/SScrollBox.h"
@ -244,12 +245,25 @@ void SCutTimeline::Tick(const FGeometry& AllottedGeometry, const double InCurren
} }
} }
TSharedPtr<SWidget> FSingleTrackGroupInstance::GetHead() bool FSingleTrackGroupInstance::IsThis(TSharedPtr<IWidgetInterface> WidgetInterface) const
{
if (StaticCastSharedPtr<STrackHead>(WidgetInterface))
{
return true;
}
else if (StaticCastSharedPtr<STrackBody>(WidgetInterface))
{
return true;
}
return false;
}
TSharedPtr<SWidget> FSingleTrackGroupInstance::GetHead() const
{ {
return StaticCastSharedPtr<STrackHead>(Head); return StaticCastSharedPtr<STrackHead>(Head);
} }
TSharedPtr<SWidget> FSingleTrackGroupInstance::GetBody() TSharedPtr<SWidget> FSingleTrackGroupInstance::GetBody() const
{ {
return StaticCastSharedPtr<STrackBody>(Body); return StaticCastSharedPtr<STrackBody>(Body);
} }
@ -282,6 +296,8 @@ void SCutTimeline::AddNewTrackToGroup(FString GroupName, FTrackData TrackData)
} }
AddNewTrack(TrackData, 0, GroupName); AddNewTrack(TrackData, 0, GroupName);
RenderGroup(); RenderGroup();
MainWidgetInterface->OnAddNewTrack(TrackData.TrackType);
} }
void SCutTimeline::SetAutoPlay(bool bStart) void SCutTimeline::SetAutoPlay(bool bStart)
@ -289,6 +305,26 @@ void SCutTimeline::SetAutoPlay(bool bStart)
AutoPlaying = bStart; AutoPlaying = bStart;
} }
void SCutTimeline::OnGroupNameEdited(FString NewText, FString OldText)
{
for (FSingleTrackGroupInstance& SingleTrackGroupInstance : TrackGroupInstances)
{
if (SingleTrackGroupInstance.GroupName == OldText)
{
SingleTrackGroupInstance.GroupName = NewText;
if (TSharedPtr<STrackHead> Head = StaticCastSharedPtr<STrackHead>(SingleTrackGroupInstance.Head))
{
if (Head->TrackData.TrackType == ETrackType::PlayerTrack)
{
Head->TrackData.TrackName = NewText;
}
}
}
}
}
void SCutTimeline::RenderGroup() void SCutTimeline::RenderGroup()
{ {
TrackGroupScrollBox->ClearChildren(); TrackGroupScrollBox->ClearChildren();
@ -305,9 +341,8 @@ void SCutTimeline::RenderGroup()
.VAlign(VAlign_Fill) .VAlign(VAlign_Fill)
.HeightOverride(FGlobalData::DefaultTrackHeight * TrackGroups[i].TrackDataArray.Num()) .HeightOverride(FGlobalData::DefaultTrackHeight * TrackGroups[i].TrackDataArray.Num())
[ [
SNew(STextBlock) SNew(SClickEditableText).InitTextPtr(&TrackGroups[i].GroupName)
.Text(FText::FromString(FUtils::MakeStringUpright(TrackGroups[i].GroupName))) .OnEdited_Raw(this, &SCutTimeline::OnGroupNameEdited)
.Justification(ETextJustify::Center)
] ]
]; ];

View File

@ -28,14 +28,15 @@ struct FTrackGroup
struct FSingleTrackGroupInstance struct FSingleTrackGroupInstance
{ {
FSingleTrackGroupInstance(const TSharedPtr<IWidgetInterface> Head, const TSharedPtr<IWidgetInterface> Body, const FString& GroupName) FSingleTrackGroupInstance(const TSharedPtr<IWidgetInterface> Head, const TSharedPtr<IWidgetInterface> Body, FString GroupName)
{ {
this->Head = Head; this->Head = Head;
this->Body = Body; this->Body = Body;
this->GroupName = GroupName; this->GroupName = GroupName;
} }
TSharedPtr<SWidget> GetHead(); bool IsThis(TSharedPtr<IWidgetInterface> WidgetInterface) const;
TSharedPtr<SWidget> GetBody(); TSharedPtr<SWidget> GetHead() const;
TSharedPtr<SWidget> GetBody() const;
FString GroupName; FString GroupName;
TSharedPtr<IWidgetInterface> Head; TSharedPtr<IWidgetInterface> Head;
TSharedPtr<IWidgetInterface> Body; TSharedPtr<IWidgetInterface> Body;
@ -62,6 +63,7 @@ public:
void SetAutoPlay(bool bStart); void SetAutoPlay(bool bStart);
bool AutoPlaying = false; bool AutoPlaying = false;
void OnGroupNameEdited(FString NewText, FString OldText);
void RenderGroup(); void RenderGroup();
ICutMainWidgetInterface* MainWidgetInterface; ICutMainWidgetInterface* MainWidgetInterface;

View File

@ -19,8 +19,7 @@ void SLightArrayPanel::Construct(const FArguments& InArgs)
SNew(SScaleBox) SNew(SScaleBox)
[ [
SNew(SBox) SNew(SBox)
.WidthOverride(600)
.HeightOverride(480)
.HAlign(HAlign_Fill) .HAlign(HAlign_Fill)
.VAlign(VAlign_Fill) .VAlign(VAlign_Fill)
[ [
@ -65,6 +64,7 @@ int32 SLightArrayPanel::OnPaint(const FPaintArgs& Args, const FGeometry& Allotte
const FSlateRect& MyCullingRect, FSlateWindowElementList& OutDrawElements, int32 LayerId, const FSlateRect& MyCullingRect, FSlateWindowElementList& OutDrawElements, int32 LayerId,
const FWidgetStyle& InWidgetStyle, bool bParentEnabled) const const FWidgetStyle& InWidgetStyle, bool bParentEnabled) const
{ {
for (int32 i = 0; i < FGlobalData::LightArrayX; i++) for (int32 i = 0; i < FGlobalData::LightArrayX; i++)
{ {
for (int32 j = 0; j < FGlobalData::LightArrayY; j++) for (int32 j = 0; j < FGlobalData::LightArrayY; j++)
@ -73,10 +73,10 @@ int32 SLightArrayPanel::OnPaint(const FPaintArgs& Args, const FGeometry& Allotte
FSlateDrawElement::MakeBox( FSlateDrawElement::MakeBox(
OutDrawElements, OutDrawElements,
LayerId, LayerId,
AllottedGeometry.ToPaintGeometry(FVector2D(600.0 / FGlobalData::LightArrayX - 1.2, 400.0 / FGlobalData::LightArrayY - 1.2), FSlateLayoutTransform(FVector2D(i * 600.0 / FGlobalData::LightArrayX, j * 400.0 / FGlobalData::LightArrayY))), AllottedGeometry.ToPaintGeometry(FVector2D(GetCachedGeometry().GetLocalSize().X / FGlobalData::LightArrayX - 1.2, GetCachedGeometry().GetLocalSize().X * 0.6666 / FGlobalData::LightArrayY - 1.2), FSlateLayoutTransform(FVector2D(i * GetCachedGeometry().GetLocalSize().X / FGlobalData::LightArrayX, j * GetCachedGeometry().GetLocalSize().X * 0.6666 / FGlobalData::LightArrayY))),
&Brush, &Brush,
ESlateDrawEffect::None, ESlateDrawEffect::None,
LightGridColors[i * FGlobalData::LightArrayY + j]); LightGridColors[j * FGlobalData::LightArrayX + i]);
} }
} }

View File

@ -0,0 +1,32 @@
// Fill out your copyright notice in the Description page of Project Settings.
#include "SPlayerLight.h"
#include "SlateOptMacros.h"
#include "Widgets/Layout/SScaleBox.h"
BEGIN_SLATE_FUNCTION_BUILD_OPTIMIZATION
void SPlayerLight::Construct(const FArguments& InArgs)
{
Name = InArgs._Name;
FSlateDynamicImageBrush* SlateDynamicImageBrush = new FSlateDynamicImageBrush(*(FPaths::ProjectDir() + "/Resources/" + "PlayerLight.png"), FVector2D(128, 128));
ChildSlot
[
SNew(SScaleBox)
[
SAssignNew(PlayerLightImage, SImage)
.Image(SlateDynamicImageBrush)
]
];
}
void SPlayerLight::SetColor(FColor Color)
{
PlayerLightImage->SetColorAndOpacity(FLinearColor(Color));
}
END_SLATE_FUNCTION_BUILD_OPTIMIZATION

View File

@ -0,0 +1,26 @@
// Fill out your copyright notice in the Description page of Project Settings.
#pragma once
#include "CoreMinimal.h"
#include "Widgets/SCompoundWidget.h"
/**
*
*/
class CUT5_API SPlayerLight : public SCompoundWidget
{
public:
SLATE_BEGIN_ARGS(SPlayerLight)
{
}
SLATE_ARGUMENT(FString, Name)
SLATE_END_ARGS()
/** Constructs this widget with InArgs */
void Construct(const FArguments& InArgs);
void SetColor(FColor Color);
TSharedPtr<SImage> PlayerLightImage;
FString Name;
};

View File

@ -4,6 +4,7 @@
#include "STimelineClip.h" #include "STimelineClip.h"
#include "SlateOptMacros.h" #include "SlateOptMacros.h"
#include "Cut5/WidgetInterface.h"
#include "Engine/Engine.h" #include "Engine/Engine.h"
#include "Engine/Texture2D.h" #include "Engine/Texture2D.h"
@ -37,6 +38,7 @@ void STimelineClip::Construct(const FArguments& InArgs)
{ {
ClipData = InArgs._InClipData; ClipData = InArgs._InClipData;
MainWidgetInterface = InArgs._MainWidgetInterface; MainWidgetInterface = InArgs._MainWidgetInterface;
Body = InArgs._Body;
SetRenderTransform(FSlateRenderTransform(FVector2D(FMath::TruncToInt(ClipData->ClipStartTime / FGlobalData::DefaultTimeTickSpace) * FGlobalData::DefaultTimeTickSpace, 0))); SetRenderTransform(FSlateRenderTransform(FVector2D(FMath::TruncToInt(ClipData->ClipStartTime / FGlobalData::DefaultTimeTickSpace) * FGlobalData::DefaultTimeTickSpace, 0)));
ChildSlot ChildSlot
[ [
@ -127,7 +129,17 @@ void STimelineClip::Seek(int32 Frame)
} }
break; break;
} }
case ETrackType::PlayerTrack:
{
const int32 Offset = Frame - (ClipData->ClipStartTime / FGlobalData::DefaultTimeTickSpace);
const int32 SeekMovieFrame = ClipData->VideoStartFrame + Offset;
if (SeekMovieFrame < ClipData->PlayerLightData.Num())
{
MainWidgetInterface->OnUpdatePlayers(Body, ClipData->PlayerLightData[SeekMovieFrame]);
}
break;
}
break;
default: default:
break; break;
} }

View File

@ -24,6 +24,7 @@ public:
} }
SLATE_ARGUMENT(FClipData*, InClipData) SLATE_ARGUMENT(FClipData*, InClipData)
SLATE_ARGUMENT(ICutMainWidgetInterface*, MainWidgetInterface) SLATE_ARGUMENT(ICutMainWidgetInterface*, MainWidgetInterface)
SLATE_ARGUMENT(TSharedPtr<IWidgetInterface>, Body)
SLATE_END_ARGS() SLATE_END_ARGS()
FReply OnBorderMouseButtonDown(const FGeometry& Geometry, const FPointerEvent& PointerEvent); FReply OnBorderMouseButtonDown(const FGeometry& Geometry, const FPointerEvent& PointerEvent);
@ -36,7 +37,7 @@ public:
void UpdatePosition(double StartTime); void UpdatePosition(double StartTime);
void UpdateLength(double X); void UpdateLength(double X);
virtual FReply OnMouseMove(const FGeometry& MyGeometry, const FPointerEvent& MouseEvent) override; virtual FReply OnMouseMove(const FGeometry& MyGeometry, const FPointerEvent& MouseEvent) override;
TSharedPtr<IWidgetInterface> Body;
int32 LastSeekFrame = 0; int32 LastSeekFrame = 0;
}; };

View File

@ -14,8 +14,8 @@ void STimelineProperty::Construct(const FArguments& InArgs)
ChildSlot ChildSlot
[ [
SNew(SBox) SNew(SBox)
.WidthOverride(128) .WidthOverride(80)
.HeightOverride(128) .HeightOverride(80)
.Padding(10, 10, 10, 10) .Padding(10, 10, 10, 10)
[ [
SNew(SOverlay) SNew(SOverlay)

View File

@ -34,13 +34,21 @@ void STimelinePropertyPanel::Construct(const FArguments& InArgs)
.Text(FText::FromString(TEXT("角色组"))) .Text(FText::FromString(TEXT("角色组")))
] ]
+ SOverlay::Slot() + SOverlay::Slot()
.HAlign(HAlign_Right) .HAlign(HAlign_Fill)
.VAlign(VAlign_Bottom) .VAlign(VAlign_Fill)
[ [
SNew(SButton) SNew(SButton)
.OnClicked_Lambda([]() .OnClicked_Lambda([this]()
{ {
if (MainWindow->CutTimeline->TrackGroups.FindByPredicate([](const FTrackGroup& TrackGroup)
{
return TrackGroup.GroupName == TEXT("未命名");
}))
{
return FReply::Handled();
}
const FTrackData PlayerData(TEXT("玩家"), ETrackType::PlayerTrack);
MainWindow->CutTimeline->AddNewTrackToGroup(TEXT("未命名"), PlayerData);
return FReply::Handled(); return FReply::Handled();
}) })
] ]

View File

@ -51,7 +51,7 @@ void STrackBody::CallRender()
TrackHead->CutTimeline->UpdateTimelineLength(); TrackHead->CutTimeline->UpdateTimelineLength();
} }
TSharedPtr<STimelineClip> TimelineClip; TSharedPtr<STimelineClip> TimelineClip;
TimelineClip = SNew(STimelineClip).InClipData(&TempClipData).MainWidgetInterface(MainWidgetInterface); TimelineClip = SNew(STimelineClip).InClipData(&TempClipData).MainWidgetInterface(MainWidgetInterface).Body(SharedThis(this));
Overlay->AddSlot() Overlay->AddSlot()
.HAlign(HAlign_Left) .HAlign(HAlign_Left)
@ -75,7 +75,8 @@ FReply STrackBody::OnDrop(const FGeometry& MyGeometry, const FDragDropEvent& Dra
const FTrackClipDragOperation& ClipDragOperation = static_cast<FTrackClipDragOperation&>(DragDropEvent.GetOperation().ToSharedRef().Get()); const FTrackClipDragOperation& ClipDragOperation = static_cast<FTrackClipDragOperation&>(DragDropEvent.GetOperation().ToSharedRef().Get());
if (ClipDragOperation.TimelinePropertyData.Type != TrackHead->TrackData.TrackType) if (ClipDragOperation.TimelinePropertyData.Type != TrackHead->TrackData.TrackType)
{ {
if (ClipDragOperation.TimelinePropertyData.Type == ETrackType::VideoTrack && TrackHead->TrackData.TrackType == ETrackType::LightArrayTrack) if ((ClipDragOperation.TimelinePropertyData.Type == ETrackType::VideoTrack && TrackHead->TrackData.TrackType == ETrackType::LightArrayTrack)
|| (ClipDragOperation.TimelinePropertyData.Type == ETrackType::VideoTrack && TrackHead->TrackData.TrackType == ETrackType::PlayerTrack))
{ {
} }
else else
@ -92,6 +93,7 @@ FReply STrackBody::OnDrop(const FGeometry& MyGeometry, const FDragDropEvent& Dra
NewClipData.ClipColors.Add(FLinearColor(1, 1, 1, 1)); NewClipData.ClipColors.Add(FLinearColor(1, 1, 1, 1));
if (ClipDragOperation.TimelinePropertyData.Type == ETrackType::VideoTrack) if (ClipDragOperation.TimelinePropertyData.Type == ETrackType::VideoTrack)
{ {
// 如果拖拽物是视频,那么对不同轨道进行不同和操作
NewClipData.MoviePath = ClipDragOperation.TimelinePropertyData.MoviePath; NewClipData.MoviePath = ClipDragOperation.TimelinePropertyData.MoviePath;
NewClipData.ClipEndTime = NewClipData.ClipStartTime + ClipDragOperation.TimelinePropertyData.MovieFrameLength * FGlobalData::DefaultTimeTickSpace; NewClipData.ClipEndTime = NewClipData.ClipStartTime + ClipDragOperation.TimelinePropertyData.MovieFrameLength * FGlobalData::DefaultTimeTickSpace;
NewClipData.VideoCapture = ClipDragOperation.VideoCapture; NewClipData.VideoCapture = ClipDragOperation.VideoCapture;
@ -100,6 +102,12 @@ FReply STrackBody::OnDrop(const FGeometry& MyGeometry, const FDragDropEvent& Dra
NewClipData.ClipType = ETrackType::LightArrayTrack; NewClipData.ClipType = ETrackType::LightArrayTrack;
NewClipData.LightArrayData = FOpencvUtils::GetVideoFrameLightArray(ClipDragOperation.TimelinePropertyData.MoviePath, FGlobalData::LightArrayX, FGlobalData::LightArrayY); NewClipData.LightArrayData = FOpencvUtils::GetVideoFrameLightArray(ClipDragOperation.TimelinePropertyData.MoviePath, FGlobalData::LightArrayX, FGlobalData::LightArrayY);
} }
if (TrackHead->TrackData.TrackType == ETrackType::PlayerTrack)
{
NewClipData.ClipType = ETrackType::PlayerTrack;
NewClipData.PlayerName = MainWidgetInterface->GetGroupName(SharedThis(this));
NewClipData.PlayerLightData = FOpencvUtils::GetVideoSingleLightColor(ClipDragOperation.TimelinePropertyData.MoviePath);
}
} }
else if (ClipDragOperation.TimelinePropertyData.Type == ETrackType::LightArrayTrack) else if (ClipDragOperation.TimelinePropertyData.Type == ETrackType::LightArrayTrack)
{ {

BIN
Test.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 347 KiB