Add Auto Projector Generator

This commit is contained in:
Sch 2023-10-30 16:35:50 +08:00
parent 538e0a5ead
commit 3f0df00dce
6 changed files with 215 additions and 63 deletions

View File

@ -7,49 +7,85 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Engine", "Engine", "{233774
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Games", "Games", "{DE1F8B53-6C02-3C13-9101-A7C8D96F3FF6}"
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "UE5", "Intermediate\ProjectFiles\UE5.vcxproj", "{6EE39883-7339-3FB6-AD82-931FB137D37F}"
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Cut5", "Intermediate\ProjectFiles\Cut5.vcxproj", "{B95E7D0E-DB45-3765-9058-E00EBBC4B157}"
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Cut5", "Intermediate\ProjectFiles\Cut5.vcxproj", "{AF5A253A-0F37-38CE-8998-45CA936C112B}"
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "UE5", "Intermediate\ProjectFiles\UE5.vcxproj", "{C48D0E9D-C862-3EA3-96A7-752EE9D06362}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Visualizers", "Visualizers", "{1CCEC849-CC72-4C59-8C36-2F7C38706D4C}"
ProjectSection(SolutionItems) = preProject
D:\UE\UE_5.2\Engine\Extras\VisualStudioDebugging\Unreal.natvis = D:\UE\UE_5.2\Engine\Extras\VisualStudioDebugging\Unreal.natvis
..\..\Software\UE_5.2\Engine\Extras\VisualStudioDebugging\Unreal.natvis = ..\..\Software\UE_5.2\Engine\Extras\VisualStudioDebugging\Unreal.natvis
EndProjectSection
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
DebugGame Editor|Android = DebugGame Editor|Android
DebugGame Editor|IOS = DebugGame Editor|IOS
DebugGame Editor|Win64 = DebugGame Editor|Win64
DebugGame|Android = DebugGame|Android
DebugGame|IOS = DebugGame|IOS
DebugGame|Win64 = DebugGame|Win64
Development Editor|Android = Development Editor|Android
Development Editor|IOS = Development Editor|IOS
Development Editor|Win64 = Development Editor|Win64
Development|Android = Development|Android
Development|IOS = Development|IOS
Development|Win64 = Development|Win64
Shipping|Android = Shipping|Android
Shipping|IOS = Shipping|IOS
Shipping|Win64 = Shipping|Win64
EndGlobalSection
# UnrealVS Section
GlobalSection(ddbf523f-7eb6-4887-bd51-85a714ff87eb) = preSolution
AvailablePlatforms=Win64
AvailablePlatforms=Win64;IOS;Android
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{6EE39883-7339-3FB6-AD82-931FB137D37F}.DebugGame Editor|Win64.ActiveCfg = BuiltWithUnrealBuildTool|Win64
{6EE39883-7339-3FB6-AD82-931FB137D37F}.DebugGame|Win64.ActiveCfg = BuiltWithUnrealBuildTool|Win64
{6EE39883-7339-3FB6-AD82-931FB137D37F}.Development Editor|Win64.ActiveCfg = BuiltWithUnrealBuildTool|Win64
{6EE39883-7339-3FB6-AD82-931FB137D37F}.Development|Win64.ActiveCfg = BuiltWithUnrealBuildTool|Win64
{6EE39883-7339-3FB6-AD82-931FB137D37F}.Shipping|Win64.ActiveCfg = BuiltWithUnrealBuildTool|Win64
{AF5A253A-0F37-38CE-8998-45CA936C112B}.DebugGame Editor|Win64.ActiveCfg = DebugGame_Editor|x64
{AF5A253A-0F37-38CE-8998-45CA936C112B}.DebugGame Editor|Win64.Build.0 = DebugGame_Editor|x64
{AF5A253A-0F37-38CE-8998-45CA936C112B}.DebugGame|Win64.ActiveCfg = DebugGame|x64
{AF5A253A-0F37-38CE-8998-45CA936C112B}.DebugGame|Win64.Build.0 = DebugGame|x64
{AF5A253A-0F37-38CE-8998-45CA936C112B}.Development Editor|Win64.ActiveCfg = Development_Editor|x64
{AF5A253A-0F37-38CE-8998-45CA936C112B}.Development Editor|Win64.Build.0 = Development_Editor|x64
{AF5A253A-0F37-38CE-8998-45CA936C112B}.Development|Win64.ActiveCfg = Development|x64
{AF5A253A-0F37-38CE-8998-45CA936C112B}.Development|Win64.Build.0 = Development|x64
{AF5A253A-0F37-38CE-8998-45CA936C112B}.Shipping|Win64.ActiveCfg = Shipping|x64
{AF5A253A-0F37-38CE-8998-45CA936C112B}.Shipping|Win64.Build.0 = Shipping|x64
{B95E7D0E-DB45-3765-9058-E00EBBC4B157}.DebugGame Editor|Android.ActiveCfg = Invalid|x64
{B95E7D0E-DB45-3765-9058-E00EBBC4B157}.DebugGame Editor|IOS.ActiveCfg = Invalid|x64
{B95E7D0E-DB45-3765-9058-E00EBBC4B157}.DebugGame Editor|Win64.ActiveCfg = DebugGame_Editor|x64
{B95E7D0E-DB45-3765-9058-E00EBBC4B157}.DebugGame Editor|Win64.Build.0 = DebugGame_Editor|x64
{B95E7D0E-DB45-3765-9058-E00EBBC4B157}.DebugGame|Android.ActiveCfg = Android_DebugGame|Win64
{B95E7D0E-DB45-3765-9058-E00EBBC4B157}.DebugGame|Android.Build.0 = Android_DebugGame|Win64
{B95E7D0E-DB45-3765-9058-E00EBBC4B157}.DebugGame|IOS.ActiveCfg = IOS_DebugGame|Win64
{B95E7D0E-DB45-3765-9058-E00EBBC4B157}.DebugGame|IOS.Build.0 = IOS_DebugGame|Win64
{B95E7D0E-DB45-3765-9058-E00EBBC4B157}.DebugGame|Win64.ActiveCfg = DebugGame|x64
{B95E7D0E-DB45-3765-9058-E00EBBC4B157}.DebugGame|Win64.Build.0 = DebugGame|x64
{B95E7D0E-DB45-3765-9058-E00EBBC4B157}.Development Editor|Android.ActiveCfg = Invalid|x64
{B95E7D0E-DB45-3765-9058-E00EBBC4B157}.Development Editor|IOS.ActiveCfg = Invalid|x64
{B95E7D0E-DB45-3765-9058-E00EBBC4B157}.Development Editor|Win64.ActiveCfg = Development_Editor|x64
{B95E7D0E-DB45-3765-9058-E00EBBC4B157}.Development Editor|Win64.Build.0 = Development_Editor|x64
{B95E7D0E-DB45-3765-9058-E00EBBC4B157}.Development|Android.ActiveCfg = Android_Development|Win64
{B95E7D0E-DB45-3765-9058-E00EBBC4B157}.Development|Android.Build.0 = Android_Development|Win64
{B95E7D0E-DB45-3765-9058-E00EBBC4B157}.Development|IOS.ActiveCfg = IOS_Development|Win64
{B95E7D0E-DB45-3765-9058-E00EBBC4B157}.Development|IOS.Build.0 = IOS_Development|Win64
{B95E7D0E-DB45-3765-9058-E00EBBC4B157}.Development|Win64.ActiveCfg = Development|x64
{B95E7D0E-DB45-3765-9058-E00EBBC4B157}.Development|Win64.Build.0 = Development|x64
{B95E7D0E-DB45-3765-9058-E00EBBC4B157}.Shipping|Android.ActiveCfg = Android_Shipping|Win64
{B95E7D0E-DB45-3765-9058-E00EBBC4B157}.Shipping|Android.Build.0 = Android_Shipping|Win64
{B95E7D0E-DB45-3765-9058-E00EBBC4B157}.Shipping|IOS.ActiveCfg = IOS_Shipping|Win64
{B95E7D0E-DB45-3765-9058-E00EBBC4B157}.Shipping|IOS.Build.0 = IOS_Shipping|Win64
{B95E7D0E-DB45-3765-9058-E00EBBC4B157}.Shipping|Win64.ActiveCfg = Shipping|x64
{B95E7D0E-DB45-3765-9058-E00EBBC4B157}.Shipping|Win64.Build.0 = Shipping|x64
{C48D0E9D-C862-3EA3-96A7-752EE9D06362}.DebugGame Editor|Android.ActiveCfg = BuiltWithUnrealBuildTool|Win64
{C48D0E9D-C862-3EA3-96A7-752EE9D06362}.DebugGame Editor|IOS.ActiveCfg = BuiltWithUnrealBuildTool|Win64
{C48D0E9D-C862-3EA3-96A7-752EE9D06362}.DebugGame Editor|Win64.ActiveCfg = BuiltWithUnrealBuildTool|Win64
{C48D0E9D-C862-3EA3-96A7-752EE9D06362}.DebugGame|Android.ActiveCfg = BuiltWithUnrealBuildTool|Win64
{C48D0E9D-C862-3EA3-96A7-752EE9D06362}.DebugGame|IOS.ActiveCfg = BuiltWithUnrealBuildTool|Win64
{C48D0E9D-C862-3EA3-96A7-752EE9D06362}.DebugGame|Win64.ActiveCfg = BuiltWithUnrealBuildTool|Win64
{C48D0E9D-C862-3EA3-96A7-752EE9D06362}.Development Editor|Android.ActiveCfg = BuiltWithUnrealBuildTool|Win64
{C48D0E9D-C862-3EA3-96A7-752EE9D06362}.Development Editor|IOS.ActiveCfg = BuiltWithUnrealBuildTool|Win64
{C48D0E9D-C862-3EA3-96A7-752EE9D06362}.Development Editor|Win64.ActiveCfg = BuiltWithUnrealBuildTool|Win64
{C48D0E9D-C862-3EA3-96A7-752EE9D06362}.Development|Android.ActiveCfg = BuiltWithUnrealBuildTool|Win64
{C48D0E9D-C862-3EA3-96A7-752EE9D06362}.Development|IOS.ActiveCfg = BuiltWithUnrealBuildTool|Win64
{C48D0E9D-C862-3EA3-96A7-752EE9D06362}.Development|Win64.ActiveCfg = BuiltWithUnrealBuildTool|Win64
{C48D0E9D-C862-3EA3-96A7-752EE9D06362}.Shipping|Android.ActiveCfg = BuiltWithUnrealBuildTool|Win64
{C48D0E9D-C862-3EA3-96A7-752EE9D06362}.Shipping|IOS.ActiveCfg = BuiltWithUnrealBuildTool|Win64
{C48D0E9D-C862-3EA3-96A7-752EE9D06362}.Shipping|Win64.ActiveCfg = BuiltWithUnrealBuildTool|Win64
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(NestedProjects) = preSolution
{6EE39883-7339-3FB6-AD82-931FB137D37F} = {233774A8-CC9D-3FA9-86D1-90573E92B704}
{AF5A253A-0F37-38CE-8998-45CA936C112B} = {DE1F8B53-6C02-3C13-9101-A7C8D96F3FF6}
{C48D0E9D-C862-3EA3-96A7-752EE9D06362} = {233774A8-CC9D-3FA9-86D1-90573E92B704}
{B95E7D0E-DB45-3765-9058-E00EBBC4B157} = {DE1F8B53-6C02-3C13-9101-A7C8D96F3FF6}
EndGlobalSection
EndGlobal

View File

@ -234,7 +234,7 @@ uint32 FVideoThread::Run()
}
else
{
FPlatformProcess::Sleep(0.1f);
FPlatformProcess::Sleep(0.01f);
}
}
return 0;

View File

@ -670,6 +670,20 @@ void FFFMPEGUtils::GenerateProjectorEvent(const FClipData* ClipData)
SCutTimeline* Timeline = FGlobalData::MainWidgetInterface->GetSelf()->GetCutTimeline();
FTrackData* ProjectorTrackData = Timeline->GetTrackDataByType(ETrackType::ProjectorTrack);
for (int32 i = ProjectorTrackData->ClipData.Num() - 1; i > 0; i--)
{
if (ProjectorTrackData->ClipData[i].ClipStartFrame >= ClipData->ClipStartFrame
|| ProjectorTrackData->ClipData[i].ClipEndFrame <= ClipData->ClipEndFrame)
{
ProjectorTrackData->ClipData.RemoveAt(i);
}
}
struct ProjectorClipInfo{ int32 Frame; bool bStart; };
TArray<ProjectorClipInfo> ClipInfos;
if (ClipData->ClipType == ETrackType::VideoTrack
&& ClipData->ResourcePropertyDataPtr)
{
@ -679,11 +693,13 @@ void FFFMPEGUtils::GenerateProjectorEvent(const FClipData* ClipData)
return;
AVPacket* Packet = av_packet_alloc();
AVFrame* Frame = av_frame_alloc();
while (1)
{
AVPacket* Packet = av_packet_alloc();
AVFrame* Frame = av_frame_alloc();
int32 Response = -1;
if (av_read_frame(Info.Context, Packet) < 0)
{
@ -693,18 +709,21 @@ void FFFMPEGUtils::GenerateProjectorEvent(const FClipData* ClipData)
}
}
if (int32 Response = avcodec_send_packet(Info.VideoCodecContext, Packet) < 0)
if ((Response = avcodec_send_packet(Info.VideoCodecContext, Packet)) < 0)
{
check(false);
};
if (int32 Response = avcodec_receive_frame(Info.VideoCodecContext, Frame) >= 0)
if ((Response = avcodec_receive_frame(Info.VideoCodecContext, Frame)) >= 0)
{
if (Frame->width == 0 || Frame->height == 0)
continue;
double RealTime = Frame->pts * av_q2d(Info.Context->streams[Info.VideoStream]->time_base);
int32 CurrentFrame = RealTime * FGlobalData::GlobalFPS;
SwsContext* SwsConvert =
sws_getContext(Frame->width, Frame->height, Info.VideoCodecContext->pix_fmt,
128, 72, AV_PIX_FMT_RGBA, SWS_BICUBIC, nullptr, nullptr, nullptr);
128, 72, AV_PIX_FMT_RGBA, SWS_BILINEAR, nullptr, nullptr, nullptr);
uint8* RawData = new uint8[128 * 72 * 4];
uint8* Dest[4] = {RawData, nullptr, nullptr, nullptr};
@ -713,27 +732,95 @@ void FFFMPEGUtils::GenerateProjectorEvent(const FClipData* ClipData)
sws_scale(SwsConvert, Frame->data, Frame->linesize, 0, Frame->height, Dest, DestStride);
sws_freeContext(SwsConvert);
float RawDataFloat = RawData[0];
int32 GrayCount = 0;
for (int32 i = 0; i < 128 * 72; i++)
{
float Gray = RawData[i * 4 + 0] * 0.299 + RawData[i * 4 + 1] * 0.587 + RawData[i * 4 + 2] * 0.114;
uint8 Gray = RawData[i * 4] * 0.299 + RawData[i * 4 + 1] * 0.587 + RawData[i * 4 + 2] * 0.114;
if (Gray < 10)
{
GrayCount++;
}
}
float AvgGray = GrayCount / (128 * 72.0f);
if (AvgGray > 0.988)
{
ClipInfos.Add({CurrentFrame, true});
}
else
{
ClipInfos.Add({CurrentFrame, false});
}
av_packet_free(&Packet);
av_frame_free(&Frame);
continue;
}
if (Response == AVERROR(EAGAIN))
{
continue;
}
av_packet_free(&Packet);
av_frame_free(&Frame);
break;
}
const int32 MaxFrame = av_rescale_q(Info.Context->streams[Info.VideoStream]->duration, Info.Context->streams[Info.VideoStream]->time_base, AVRational{1, AV_TIME_BASE}) / AV_TIME_BASE * FGlobalData::GlobalFPS;
if (ClipInfos.Num() == 0)
{
return;
}
int32 StartFrame = 0;
int32 CurrentClipIndex = 0;
bool CurrentProjectorStart = ClipInfos[0].bStart;
for (int32 i = 0; i < ClipInfos.Num(); i++)
{
if (i + 1 >= ClipInfos.Num())
{
CurrentProjectorStart = !ClipInfos[CurrentClipIndex].bStart;
FClipData NewClipData;
NewClipData.ClipGuid = FGuid::NewGuid();
NewClipData.BindTrackGuid = ProjectorTrackData->DeviceTrack.Guid;
NewClipData.ClipType = ETrackType::ProjectorTrack;
NewClipData.PresetType = CurrentProjectorStart ? EPresetType::EnableProjector : EPresetType::DisableProjector;
NewClipData.ClipStartFrame = StartFrame + ClipData->ClipStartFrame;
NewClipData.ClipEndFrame = ClipData->ClipEndFrame;
ProjectorTrackData->ClipData.Add(NewClipData);
break;
}
if (StartFrame == 0)
{
StartFrame = ClipInfos[i].Frame;
CurrentClipIndex = i;
}
if (CurrentProjectorStart == ClipInfos[i].bStart)
{
continue;
}
else
{
CurrentProjectorStart = !CurrentProjectorStart;
FClipData NewClipData;
NewClipData.ClipGuid = FGuid::NewGuid();
NewClipData.BindTrackGuid = ProjectorTrackData->DeviceTrack.Guid;
NewClipData.ClipType = ETrackType::ProjectorTrack;
NewClipData.PresetType = CurrentProjectorStart ? EPresetType::EnableProjector : EPresetType::DisableProjector;
NewClipData.ClipStartFrame = StartFrame + ClipData->ClipStartFrame;
NewClipData.ClipEndFrame = ClipInfos[i].Frame + ClipData->ClipStartFrame;
ProjectorTrackData->ClipData.Add(NewClipData);
StartFrame = 0;
continue;;
}
}
Timeline->RenderGroup();
}
}

View File

@ -4,6 +4,7 @@
#include "FFMPEGUtils.h"
#include "FFMPEGUtils.h"
#include "Cut5/Widgets/DefineGlobal.h"
#include "Cut5/Widgets/MicroWidgets/SProcessing.h"
#include "Kismet/KismetStringLibrary.h"
extern "C" {
@ -1029,6 +1030,27 @@ void FUtils::AddTips(TSharedPtr<SWidget> Widget)
GEngine->GameViewport->AddViewportWidgetContent(Widget.ToSharedRef());
}
void FUtils::StartProcessing(const FString& Name, float MaxPercent)
{
SAssignNew(ProcessingWidget, SProcessing).MaxPercent(MaxPercent);
}
void FUtils::UpdateProcessing(float Percent)
{
if (ProcessingWidget.IsValid())
{
StaticCastSharedPtr<SProcessing>(ProcessingWidget)->CurrentPercent = Percent;
}
}
void FUtils::EndProcessing()
{
if (ProcessingWidget.IsValid())
{
GEngine->GameViewport->RemoveViewportWidgetContent(ProcessingWidget.ToSharedRef());
}
}
FSaveModifier::FSaveModifier(const FString& FullSavedPath)
{

View File

@ -96,6 +96,13 @@ public:
static void AddTips(TSharedPtr<SWidget> Widget);
static void StartProcessing(const FString& Name, float MaxPercent);
static void UpdateProcessing(float Percent);
static void EndProcessing();
inline static TSharedPtr<SWidget> ProcessingWidget;
};
template <typename T, typename U>

View File

@ -122,30 +122,30 @@ void DragDropOperator::CloseCursorDecorator()
void DragDropOperator::OnUpdateVideoTrack(const FClipData& VideoClipData)
{
SCutTimeline* Timeline = SavedMainInterface->GetCutTimeline();
FTrackData* ProjectorTrack = Timeline->GetTrackDataByType(ETrackType::ProjectorTrack);
if (true)
{
ProjectorTrack->ClipData.Empty();
FClipData NewClipData;
NewClipData.ClipStartFrame = VideoClipData.ClipStartFrame;
NewClipData.ClipEndFrame = VideoClipData.ClipEndFrame;
NewClipData.ClipGuid = FGuid::NewGuid();
NewClipData.ClipType = ETrackType::ProjectorTrack;
NewClipData.PresetType = EPresetType::EnableProjector;
NewClipData.BindTrackGuid = ProjectorTrack->DeviceTrack.Guid;
FPresetsCustomData CustomPresetData;
CustomPresetData.PresetCustomType = FPresetsCustomData::EPresetCustomType::None;
NewClipData.PresetsCustomData = CustomPresetData;
ProjectorTrack->ClipData.Add(NewClipData);
Timeline->RenderGroup();
}
// SCutTimeline* Timeline = SavedMainInterface->GetCutTimeline();
// FTrackData* ProjectorTrack = Timeline->GetTrackDataByType(ETrackType::ProjectorTrack);
//
// if (true)
// {
// ProjectorTrack->ClipData.Empty();
// FClipData NewClipData;
// NewClipData.ClipStartFrame = VideoClipData.ClipStartFrame;
// NewClipData.ClipEndFrame = VideoClipData.ClipEndFrame;
// NewClipData.ClipGuid = FGuid::NewGuid();
// NewClipData.ClipType = ETrackType::ProjectorTrack;
// NewClipData.PresetType = EPresetType::EnableProjector;
// NewClipData.BindTrackGuid = ProjectorTrack->DeviceTrack.Guid;
//
// FPresetsCustomData CustomPresetData;
// CustomPresetData.PresetCustomType = FPresetsCustomData::EPresetCustomType::None;
//
// NewClipData.PresetsCustomData = CustomPresetData;
//
//
//
// ProjectorTrack->ClipData.Add(NewClipData);
// Timeline->RenderGroup();
// }
}
void DragDropOperator::OnUpdateProjectorTrack(const FClipData& ProjectorClipData)