做个时间轴

This commit is contained in:
Sch 2023-07-03 05:02:36 +08:00
commit 3487c05e38
38 changed files with 1469 additions and 0 deletions

6
.gitignore vendored Normal file
View File

@ -0,0 +1,6 @@
.idea
Platforms
Saved
Intermediate
.vs
Binaries

13
.vsconfig Normal file
View File

@ -0,0 +1,13 @@
{
"version": "1.0",
"components": [
"Microsoft.Net.Component.4.6.2.TargetingPack",
"Microsoft.VisualStudio.Component.VC.14.34.17.4.x86.x64",
"Microsoft.VisualStudio.Component.VC.Tools.x86.x64",
"Microsoft.VisualStudio.Component.Windows10SDK",
"Microsoft.VisualStudio.Workload.CoreEditor",
"Microsoft.VisualStudio.Workload.ManagedDesktop",
"Microsoft.VisualStudio.Workload.NativeDesktop",
"Microsoft.VisualStudio.Workload.NativeGame"
]
}

0
Config/DefaultEditor.ini Normal file
View File

207
Config/DefaultEngine.ini Normal file
View File

@ -0,0 +1,207 @@
[/Script/EngineSettings.GameMapsSettings]
GameDefaultMap=/Game/MainMap.MainMap
EditorStartupMap=/Game/MainMap.MainMap
[/Script/WindowsTargetPlatform.WindowsTargetSettings]
DefaultGraphicsRHI=DefaultGraphicsRHI_DX12
-D3D12TargetedShaderFormats=PCD3D_SM5
+D3D12TargetedShaderFormats=PCD3D_SM6
-D3D11TargetedShaderFormats=PCD3D_SM5
+D3D11TargetedShaderFormats=PCD3D_SM5
Compiler=Default
AudioSampleRate=48000
AudioCallbackBufferFrameSize=1024
AudioNumBuffersToEnqueue=1
AudioMaxChannels=0
AudioNumSourceWorkers=4
SpatializationPlugin=
SourceDataOverridePlugin=
ReverbPlugin=
OcclusionPlugin=
CompressionOverrides=(bOverrideCompressionTimes=False,DurationThreshold=5.000000,MaxNumRandomBranches=0,SoundCueQualityIndex=0)
CacheSizeKB=65536
MaxChunkSizeOverrideKB=0
bResampleForDevice=False
MaxSampleRate=48000.000000
HighSampleRate=32000.000000
MedSampleRate=24000.000000
LowSampleRate=12000.000000
MinSampleRate=8000.000000
CompressionQualityModifier=1.000000
AutoStreamingThreshold=0.000000
SoundCueCookQualityIndex=-1
[/Script/HardwareTargeting.HardwareTargetingSettings]
TargetedHardwareClass=Desktop
AppliedTargetedHardwareClass=Desktop
DefaultGraphicsPerformance=Scalable
AppliedDefaultGraphicsPerformance=Scalable
[/Script/Engine.RendererSettings]
r.Mobile.ShadingPath=0
r.Mobile.SupportGPUScene=False
r.Mobile.AntiAliasing=1
r.Mobile.FloatPrecisionMode=0
r.Mobile.AllowDitheredLODTransition=False
r.Mobile.VirtualTextures=False
r.DiscardUnusedQuality=False
r.Shaders.CompressionFormat=2
r.AllowOcclusionQueries=True
r.MinScreenRadiusForLights=0.030000
r.MinScreenRadiusForDepthPrepass=0.030000
r.MinScreenRadiusForCSMDepth=0.010000
r.PrecomputedVisibilityWarning=False
r.TextureStreaming=True
Compat.UseDXT5NormalMaps=False
r.VirtualTextures=False
r.VT.EnableAutoImport=True
r.VirtualTexturedLightmaps=False
r.VT.AnisotropicFiltering=False
bEnableVirtualTextureOpacityMask=False
r.VT.TileSize=128
r.VT.TileBorderSize=4
r.vt.FeedbackFactor=16
WorkingColorSpaceChoice=sRGB
RedChromaticityCoordinate=(X=0.640000,Y=0.330000)
GreenChromaticityCoordinate=(X=0.300000,Y=0.600000)
BlueChromaticityCoordinate=(X=0.150000,Y=0.060000)
WhiteChromaticityCoordinate=(X=0.312700,Y=0.329000)
r.ClearCoatNormal=False
r.DynamicGlobalIlluminationMethod=0
r.ReflectionMethod=0
r.ReflectionCaptureResolution=128
r.ReflectionEnvironmentLightmapMixBasedOnRoughness=True
r.Lumen.HardwareRayTracing=False
r.Lumen.HardwareRayTracing.LightingMode=0
r.Lumen.TranslucencyReflections.FrontLayer.EnableForProject=False
r.Lumen.TraceMeshSDFs=0
r.Shadow.Virtual.Enable=1
r.RayTracing=False
r.RayTracing.Shadows=False
r.RayTracing.Skylight=False
r.RayTracing.UseTextureLod=False
r.PathTracing=True
r.GenerateMeshDistanceFields=True
r.DistanceFields.DefaultVoxelDensity=0.200000
r.Nanite.ProjectEnabled=True
r.AllowStaticLighting=True
r.NormalMapsForStaticLighting=False
r.ForwardShading=False
r.VertexFoggingForOpaque=True
r.SeparateTranslucency=True
r.TranslucentSortPolicy=0
TranslucentSortAxis=(X=0.000000,Y=-1.000000,Z=0.000000)
vr.VRS.HMDFixedFoveationLevel=0
vr.VRS.HMDFixedFoveationDynamic=False
r.CustomDepth=1
r.CustomDepthTemporalAAJitter=True
r.PostProcessing.PropagateAlpha=0
r.DefaultFeature.Bloom=True
r.DefaultFeature.AmbientOcclusion=True
r.DefaultFeature.AmbientOcclusionStaticFraction=True
r.DefaultFeature.AutoExposure=False
r.DefaultFeature.AutoExposure.Method=0
r.DefaultFeature.AutoExposure.Bias=1.000000
r.DefaultFeature.AutoExposure.ExtendDefaultLuminanceRange=True
r.DefaultFeature.MotionBlur=False
r.DefaultFeature.LensFlare=False
r.TemporalAA.Upsampling=True
r.AntiAliasingMethod=0
r.MSAACount=4
r.DefaultFeature.LightUnits=1
r.DefaultBackBufferPixelFormat=4
r.Shadow.UnbuiltPreviewInGame=True
r.StencilForLODDither=False
r.EarlyZPass=3
r.EarlyZPassOnlyMaterialMasking=False
r.Shadow.CSMCaching=False
r.DBuffer=True
r.ClearSceneMethod=1
r.VelocityOutputPass=1
r.Velocity.EnableVertexDeformation=2
r.SelectiveBasePassOutputs=False
bDefaultParticleCutouts=False
fx.GPUSimulationTextureSizeX=1024
fx.GPUSimulationTextureSizeY=1024
r.AllowGlobalClipPlane=False
r.GBufferFormat=1
r.MorphTarget.Mode=True
r.GPUCrashDebugging=False
vr.InstancedStereo=False
r.MobileHDR=True
vr.MobileMultiView=False
r.Mobile.UseHWsRGBEncoding=False
vr.RoundRobinOcclusion=False
r.MeshStreaming=False
r.HeterogeneousVolumes=True
r.WireframeCullThreshold=5.000000
r.SupportStationarySkylight=True
r.SupportLowQualityLightmaps=True
r.SupportPointLightWholeSceneShadows=True
r.SupportSkyAtmosphere=True
r.SupportSkyAtmosphereAffectsHeightFog=True
r.SupportCloudShadowOnForwardLitTranslucent=False
r.Shadow.TranslucentPerObject.ProjectEnabled=False
r.Water.SingleLayerWater.SupportCloudShadow=False
r.Substrate=False
r.Substrate.OpaqueMaterialRoughRefraction=False
r.Substrate.Debug.AdvancedVisualizationShaders=False
r.Material.RoughDiffuse=False
r.Material.EnergyConservation=False
r.OIT.SortedPixels=False
r.SkinCache.CompileShaders=False
r.SkinCache.SkipCompilingGPUSkinVF=False
r.SkinCache.DefaultBehavior=1
r.SkinCache.SceneMemoryLimitInMB=128.000000
r.Mobile.EnableStaticAndCSMShadowReceivers=True
r.Mobile.EnableMovableLightCSMShaderCulling=True
r.Mobile.Forward.EnableLocalLights=True
r.Mobile.Forward.EnableClusteredReflections=False
r.Mobile.EnableNoPrecomputedLightingCSMShader=False
r.Mobile.AllowDistanceFieldShadows=True
r.Mobile.AllowMovableDirectionalLights=True
r.Mobile.EnableMovableSpotlightsShadow=False
r.GPUSkin.Support16BitBoneIndex=False
r.GPUSkin.Limit2BoneInfluences=False
r.SupportDepthOnlyIndexBuffers=True
r.SupportReversedIndexBuffers=True
r.Mobile.AmbientOcclusion=False
r.GPUSkin.UnlimitedBoneInfluences=False
r.GPUSkin.UnlimitedBoneInfluencesThreshold=8
DefaultBoneInfluenceLimit=(Default=0,PerPlatform=())
MaxSkinBones=(Default=65536,PerPlatform=(("Mobile", 256)))
r.Mobile.PlanarReflectionMode=0
r.Mobile.SupportsGen4TAA=True
bStreamSkeletalMeshLODs=(Default=False,PerPlatform=())
bDiscardSkeletalMeshOptionalLODs=(Default=False,PerPlatform=())
VisualizeCalibrationColorMaterialPath=/Engine/EngineMaterials/PPM_DefaultCalibrationColor.PPM_DefaultCalibrationColor
VisualizeCalibrationCustomMaterialPath=None
VisualizeCalibrationGrayscaleMaterialPath=/Engine/EngineMaterials/PPM_DefaultCalibrationGrayscale.PPM_DefaultCalibrationGrayscale
[/Script/WorldPartitionEditor.WorldPartitionEditorSettings]
CommandletClass=Class'/Script/UnrealEd.WorldPartitionConvertCommandlet'
[/Script/Engine.UserInterfaceSettings]
bAuthorizeAutomaticWidgetVariableCreation=False
[/Script/Engine.Engine]
+ActiveGameNameRedirects=(OldGameName="TP_Blank",NewGameName="/Script/Cut5")
+ActiveGameNameRedirects=(OldGameName="/Script/TP_Blank",NewGameName="/Script/Cut5")
+ActiveClassRedirects=(OldClassName="TP_BlankGameModeBase",NewClassName="Cut5GameModeBase")
[/Script/AndroidFileServerEditor.AndroidFileServerRuntimeSettings]
bEnablePlugin=True
bAllowNetworkConnection=True
SecurityToken=64F25A3B42285FEAB8C132B15063357A
bIncludeInShipping=False
bAllowExternalStartInShipping=False
bCompileAFSProject=False
bUseCompression=False
bLogFiles=False
bReportStats=False
ConnectionType=USBOnly
bUseManualIPAddress=False
ManualIPAddress=

3
Config/DefaultGame.ini Normal file
View File

@ -0,0 +1,3 @@
[/Script/EngineSettings.GeneralProjectSettings]
ProjectID=DC8863584B4EB976B538D48259B614C0

85
Config/DefaultInput.ini Normal file
View File

@ -0,0 +1,85 @@
[/Script/Engine.InputSettings]
-AxisConfig=(AxisKeyName="Gamepad_LeftX",AxisProperties=(DeadZone=0.25,Exponent=1.f,Sensitivity=1.f))
-AxisConfig=(AxisKeyName="Gamepad_LeftY",AxisProperties=(DeadZone=0.25,Exponent=1.f,Sensitivity=1.f))
-AxisConfig=(AxisKeyName="Gamepad_RightX",AxisProperties=(DeadZone=0.25,Exponent=1.f,Sensitivity=1.f))
-AxisConfig=(AxisKeyName="Gamepad_RightY",AxisProperties=(DeadZone=0.25,Exponent=1.f,Sensitivity=1.f))
-AxisConfig=(AxisKeyName="MouseX",AxisProperties=(DeadZone=0.f,Exponent=1.f,Sensitivity=0.07f))
-AxisConfig=(AxisKeyName="MouseY",AxisProperties=(DeadZone=0.f,Exponent=1.f,Sensitivity=0.07f))
-AxisConfig=(AxisKeyName="Mouse2D",AxisProperties=(DeadZone=0.f,Exponent=1.f,Sensitivity=0.07f))
+AxisConfig=(AxisKeyName="Gamepad_LeftX",AxisProperties=(DeadZone=0.250000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="Gamepad_LeftY",AxisProperties=(DeadZone=0.250000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="Gamepad_RightX",AxisProperties=(DeadZone=0.250000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="Gamepad_RightY",AxisProperties=(DeadZone=0.250000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="MouseX",AxisProperties=(DeadZone=0.000000,Sensitivity=0.070000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="MouseY",AxisProperties=(DeadZone=0.000000,Sensitivity=0.070000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="Mouse2D",AxisProperties=(DeadZone=0.000000,Sensitivity=0.070000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="MouseWheelAxis",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="Gamepad_LeftTriggerAxis",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="Gamepad_RightTriggerAxis",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="Gamepad_Special_Left_X",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="Gamepad_Special_Left_Y",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="Vive_Left_Trigger_Axis",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="Vive_Left_Trackpad_X",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="Vive_Left_Trackpad_Y",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="Vive_Right_Trigger_Axis",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="Vive_Right_Trackpad_X",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="Vive_Right_Trackpad_Y",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="MixedReality_Left_Trigger_Axis",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="MixedReality_Left_Thumbstick_X",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="MixedReality_Left_Thumbstick_Y",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="MixedReality_Left_Trackpad_X",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="MixedReality_Left_Trackpad_Y",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="MixedReality_Right_Trigger_Axis",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="MixedReality_Right_Thumbstick_X",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="MixedReality_Right_Thumbstick_Y",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="MixedReality_Right_Trackpad_X",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="MixedReality_Right_Trackpad_Y",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="OculusTouch_Left_Grip_Axis",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="OculusTouch_Left_Trigger_Axis",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="OculusTouch_Left_Thumbstick_X",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="OculusTouch_Left_Thumbstick_Y",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="OculusTouch_Right_Grip_Axis",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="OculusTouch_Right_Trigger_Axis",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="OculusTouch_Right_Thumbstick_X",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="OculusTouch_Right_Thumbstick_Y",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="ValveIndex_Left_Grip_Axis",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="ValveIndex_Left_Grip_Force",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="ValveIndex_Left_Trigger_Axis",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="ValveIndex_Left_Thumbstick_X",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="ValveIndex_Left_Thumbstick_Y",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="ValveIndex_Left_Trackpad_X",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="ValveIndex_Left_Trackpad_Y",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="ValveIndex_Left_Trackpad_Force",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="ValveIndex_Right_Grip_Axis",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="ValveIndex_Right_Grip_Force",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="ValveIndex_Right_Trigger_Axis",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="ValveIndex_Right_Thumbstick_X",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="ValveIndex_Right_Thumbstick_Y",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="ValveIndex_Right_Trackpad_X",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="ValveIndex_Right_Trackpad_Y",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
+AxisConfig=(AxisKeyName="ValveIndex_Right_Trackpad_Force",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False))
bAltEnterTogglesFullscreen=True
bF11TogglesFullscreen=True
bUseMouseForTouch=False
bEnableMouseSmoothing=True
bEnableFOVScaling=True
bCaptureMouseOnLaunch=True
bEnableLegacyInputScales=True
bEnableMotionControls=True
bFilterInputByPlatformUser=False
bShouldFlushPressedKeysOnViewportFocusLost=True
bAlwaysShowTouchInterface=False
bShowConsoleOnFourFingerTap=True
bEnableGestureRecognizer=False
bUseAutocorrect=False
DefaultViewportMouseCaptureMode=CapturePermanently_IncludingInitialMouseDown
DefaultViewportMouseLockMode=LockOnCapture
FOVScale=0.011110
DoubleClickTime=0.200000
DefaultPlayerInputClass=/Script/EnhancedInput.EnhancedPlayerInput
DefaultInputComponentClass=/Script/EnhancedInput.EnhancedInputComponent
DefaultTouchInterface=/Engine/MobileResources/HUD/DefaultVirtualJoysticks.DefaultVirtualJoysticks
-ConsoleKeys=Tilde
+ConsoleKeys=Tilde
+ConsoleKeys=Caret

BIN
Content/MainMap.umap Normal file

Binary file not shown.

Binary file not shown.

73
Cut5.sln Normal file
View File

@ -0,0 +1,73 @@
Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17
VisualStudioVersion = 17.0.31314.256
MinimumVisualStudioVersion = 10.0.40219.1
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Engine", "Engine", "{233774A8-CC9D-3FA9-86D1-90573E92B704}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Games", "Games", "{DE1F8B53-6C02-3C13-9101-A7C8D96F3FF6}"
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Cut5", "Intermediate\ProjectFiles\Cut5.vcxproj", "{B95E7D0E-DB45-3765-9058-E00EBBC4B157}"
EndProject
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
..\..\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|Win64 = DebugGame Editor|Win64
DebugGame|Android = DebugGame|Android
DebugGame|Win64 = DebugGame|Win64
Development Editor|Android = Development Editor|Android
Development Editor|Win64 = Development Editor|Win64
Development|Android = Development|Android
Development|Win64 = Development|Win64
Shipping|Android = Shipping|Android
Shipping|Win64 = Shipping|Win64
EndGlobalSection
# UnrealVS Section
GlobalSection(ddbf523f-7eb6-4887-bd51-85a714ff87eb) = preSolution
AvailablePlatforms=Win64;Android
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{B95E7D0E-DB45-3765-9058-E00EBBC4B157}.DebugGame Editor|Android.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|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|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|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|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|Win64.ActiveCfg = BuiltWithUnrealBuildTool|Win64
{C48D0E9D-C862-3EA3-96A7-752EE9D06362}.DebugGame|Android.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|Win64.ActiveCfg = BuiltWithUnrealBuildTool|Win64
{C48D0E9D-C862-3EA3-96A7-752EE9D06362}.Development|Android.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|Win64.ActiveCfg = BuiltWithUnrealBuildTool|Win64
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(NestedProjects) = preSolution
{C48D0E9D-C862-3EA3-96A7-752EE9D06362} = {233774A8-CC9D-3FA9-86D1-90573E92B704}
{B95E7D0E-DB45-3765-9058-E00EBBC4B157} = {DE1F8B53-6C02-3C13-9101-A7C8D96F3FF6}
EndGlobalSection
EndGlobal

25
Cut5.uproject Normal file
View File

@ -0,0 +1,25 @@
{
"FileVersion": 3,
"EngineAssociation": "5.2",
"Category": "",
"Description": "",
"Modules": [
{
"Name": "Cut5",
"Type": "Runtime",
"LoadingPhase": "Default",
"AdditionalDependencies": [
"Engine"
]
}
],
"Plugins": [
{
"Name": "ModelingToolsEditorMode",
"Enabled": true,
"TargetAllowList": [
"Editor"
]
}
]
}

15
Source/Cut5.Target.cs Normal file
View File

@ -0,0 +1,15 @@
// Copyright Epic Games, Inc. All Rights Reserved.
using UnrealBuildTool;
using System.Collections.Generic;
public class Cut5Target : TargetRules
{
public Cut5Target( TargetInfo Target) : base(Target)
{
Type = TargetType.Game;
DefaultBuildSettings = BuildSettingsVersion.V2;
IncludeOrderVersion = EngineIncludeOrderVersion.Unreal5_1;
ExtraModuleNames.Add("Cut5");
}
}

23
Source/Cut5/Cut5.Build.cs Normal file
View File

@ -0,0 +1,23 @@
// Copyright Epic Games, Inc. All Rights Reserved.
using UnrealBuildTool;
public class Cut5 : ModuleRules
{
public Cut5(ReadOnlyTargetRules Target) : base(Target)
{
PCHUsage = PCHUsageMode.UseExplicitOrSharedPCHs;
PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine", "InputCore" });
PrivateDependencyModuleNames.AddRange(new string[] { });
PrivateDependencyModuleNames.AddRange(new string[] { "Slate", "SlateCore", "UMG"});
// Uncomment if you are using online features
// PrivateDependencyModuleNames.Add("OnlineSubsystem");
// To include OnlineSubsystemSteam, add it to the plugins section in your uproject file with the Enabled attribute set to true
}
}

6
Source/Cut5/Cut5.cpp Normal file
View File

@ -0,0 +1,6 @@
// Copyright Epic Games, Inc. All Rights Reserved.
#include "Cut5.h"
#include "Modules/ModuleManager.h"
IMPLEMENT_PRIMARY_GAME_MODULE( FDefaultGameModuleImpl, Cut5, "Cut5" );

6
Source/Cut5/Cut5.h Normal file
View File

@ -0,0 +1,6 @@
// Copyright Epic Games, Inc. All Rights Reserved.
#pragma once
#include "CoreMinimal.h"

View File

@ -0,0 +1,12 @@
// Copyright Epic Games, Inc. All Rights Reserved.
#include "Cut5GameModeBase.h"
#include "MainHUD.h"
ACut5GameModeBase::ACut5GameModeBase()
: AGameModeBase()
{
HUDClass = AMainHUD::StaticClass();
}

View File

@ -0,0 +1,18 @@
// Copyright Epic Games, Inc. All Rights Reserved.
#pragma once
#include "CoreMinimal.h"
#include "GameFramework/GameModeBase.h"
#include "Cut5GameModeBase.generated.h"
/**
*
*/
UCLASS()
class CUT5_API ACut5GameModeBase : public AGameModeBase
{
GENERATED_BODY()
ACut5GameModeBase();
};

25
Source/Cut5/MainHUD.cpp Normal file
View File

@ -0,0 +1,25 @@
// Fill out your copyright notice in the Description page of Project Settings.
#include "MainHUD.h"
#include "Blueprint/WidgetBlueprintLibrary.h"
#include "Kismet/GameplayStatics.h"
#include "Widgets/SCutMainWindow.h"
AMainHUD::AMainHUD()
{
if (GEngine && GEngine->GameViewport)
{
GEngine->GameViewport->AddViewportWidgetContent(
SNew(SCutMainWindow)
);
GEngine->bUseFixedFrameRate = 1;
GEngine->FixedFrameRate = 60000.0f;
UWidgetBlueprintLibrary::SetInputMode_UIOnlyEx(UGameplayStatics::GetPlayerController(GWorld, 0), nullptr, EMouseLockMode::DoNotLock);
UGameplayStatics::GetPlayerController(GWorld, 0)->bShowMouseCursor = true;
}
}

19
Source/Cut5/MainHUD.h Normal file
View File

@ -0,0 +1,19 @@
// Fill out your copyright notice in the Description page of Project Settings.
#pragma once
#include "CoreMinimal.h"
#include "GameFramework/HUD.h"
#include "MainHUD.generated.h"
/**
*
*/
UCLASS()
class CUT5_API AMainHUD : public AHUD
{
GENERATED_BODY()
AMainHUD();
};

View File

@ -0,0 +1,7 @@
// Fill out your copyright notice in the Description page of Project Settings.
#include "WidgetInterface.h"
// Add default functionality here for any IWidgetInterface functions that are not pure virtual.

View File

@ -0,0 +1,27 @@
// Fill out your copyright notice in the Description page of Project Settings.
#pragma once
#include "CoreMinimal.h"
#include "UObject/Interface.h"
#include "WidgetInterface.generated.h"
// This class does not need to be modified.
UINTERFACE()
class UWidgetInterface : public UInterface
{
GENERATED_BODY()
};
/**
*
*/
class CUT5_API IWidgetInterface
{
GENERATED_BODY()
// Add interface functions to this class. This is the class that will be inherited to implement this interface.
public:
virtual void UpdateTimelineLength() = 0;
};

View File

@ -0,0 +1,55 @@
#pragma once
#include "DragAndDrop/DecoratedDragDropOp.h"
class CUT5_API FGlobalData
{
public:
inline static int32 DefaultTrackHeight = 50;
inline static int32 TrackLength = 1000;
inline static double DefaultTimeTickSpace = 10.0;
};
enum class ETrackType
{
VideoTrack,
AudioTrack,
PlayerTrack,
AtomSphereLightTrack,
SpotLightTrack,
};
struct FClipData;
struct CUT5_API FTrackData
{
FString TrackName;
ETrackType TrackType;
TArray<FClipData> ClipData;
};
struct CUT5_API FClipData
{
FGuid ClipGuid;
ETrackType ClipType;
int32 ClipStartFrame = 0;
int32 ClipEndFrame = 10;
TArray<FLinearColor> ClipColors;
};
struct CUT5_API FTimelinePropertyData
{
FTimelinePropertyData() {};
FTimelinePropertyData(FString InName, ETrackType InType)
{
Name = InName;
Type = InType;
}
FString Name = "";
ETrackType Type = ETrackType::VideoTrack;
};
class CUT5_API FTrackClipDragOperation final : public FDecoratedDragDropOp
{
public:
TSharedPtr<SWidget> DraggingWidget;
FTimelinePropertyData TimelinePropertyData;
};

View File

@ -0,0 +1,105 @@
// Fill out your copyright notice in the Description page of Project Settings.
#include "SCutMainWindow.h"
#include "SCutTimeline.h"
#include "SlateOptMacros.h"
#include "STimelinePropertyPanel.h"
#include "Widgets/Layout/SConstraintCanvas.h"
#include "Widgets/Layout/SScaleBox.h"
BEGIN_SLATE_FUNCTION_BUILD_OPTIMIZATION
void SCutMainWindow::Construct(const FArguments& InArgs)
{
SAssignNew(CutTimeline, SCutTimeline);
ChildSlot
[
SNew(SScaleBox)
.HAlign(HAlign_Fill)
.VAlign(VAlign_Fill)
.Stretch(EStretch::Fill)
[
SNew(SConstraintCanvas)
+ SConstraintCanvas::Slot()
.Anchors(FAnchors(0, 0, 1, 1))
[
SNew(SVerticalBox)
+ SVerticalBox::Slot()
.HAlign(HAlign_Fill)
.VAlign(VAlign_Fill)
[
SNew(SHorizontalBox)
+ SHorizontalBox::Slot()
.HAlign(HAlign_Fill)
.VAlign(VAlign_Fill)
[
SNew(SVerticalBox)
+ SVerticalBox::Slot()
[
// Property Panel
SNew(STimelinePropertyPanel)
.MainWindow(SharedThis(this))
]
]
+ SHorizontalBox::Slot()
[
SNew(SVerticalBox)
+ SVerticalBox::Slot()
]
+ SHorizontalBox::Slot()
[
SNew(SVerticalBox)
+ SVerticalBox::Slot()
]
]
+ SVerticalBox::Slot()
.HAlign(HAlign_Fill)
.VAlign(VAlign_Fill)
[
CutTimeline.ToSharedRef()
]
]
]
];
FTrackData NewTrack;
NewTrack.TrackName = "Track 1";
NewTrack.TrackType = ETrackType::VideoTrack;
CutTimeline->AddNewTrack(NewTrack, 0);
FTrackData NewTrack2;
NewTrack2.TrackName = "Track 2";
NewTrack2.TrackType = ETrackType::VideoTrack;
CutTimeline->AddNewTrack(NewTrack2, 0);
CutTimeline->AddNewTrack(NewTrack2, 0);
CutTimeline->AddNewTrack(NewTrack2, 0);
CutTimeline->AddNewTrack(NewTrack2, 0);
CutTimeline->AddNewTrack(NewTrack2, 0);
CutTimeline->AddNewTrack(NewTrack2, 0);
CutTimeline->AddNewTrack(NewTrack2, 0);
CutTimeline->AddNewTrack(NewTrack2, 0);
CutTimeline->AddNewTrack(NewTrack2, 0);
CutTimeline->AddNewTrack(NewTrack2, 0);
CutTimeline->AddNewTrack(NewTrack2, 0);
CutTimeline->AddNewTrack(NewTrack2, 0);
CutTimeline->AddNewTrack(NewTrack2, 0);
CutTimeline->AddNewTrack(NewTrack2, 0);
CutTimeline->AddNewTrack(NewTrack2, 0);
CutTimeline->AddNewTrack(NewTrack2, 0);
CutTimeline->AddNewTrack(NewTrack2, 0);
CutTimeline->AddNewTrack(NewTrack2, 0);
}
FReply SCutMainWindow::OnDragOver(const FGeometry& MyGeometry, const FDragDropEvent& DragDropEvent)
{
const FTrackClipDragOperation& ClipDragOperation = static_cast<FTrackClipDragOperation&>(DragDropEvent.GetOperation().ToSharedRef().Get());
return SCompoundWidget::OnDragOver(MyGeometry, DragDropEvent);
}
FReply SCutMainWindow::OnDrop(const FGeometry& MyGeometry, const FDragDropEvent& DragDropEvent)
{
return FReply::Handled().EndDragDrop();
}
END_SLATE_FUNCTION_BUILD_OPTIMIZATION

View File

@ -0,0 +1,28 @@
// Fill out your copyright notice in the Description page of Project Settings.
#pragma once
#include "CoreMinimal.h"
#include "SCutTimeline.h"
#include "Widgets/SCompoundWidget.h"
/**
*
*/
class CUT5_API SCutMainWindow : public SCompoundWidget
{
public:
SLATE_BEGIN_ARGS(SCutMainWindow)
{
}
SLATE_END_ARGS()
/** Constructs this widget with InArgs */
void Construct(const FArguments& InArgs);
TSharedPtr<SCutTimeline> CutTimeline;
virtual FReply OnDragOver(const FGeometry& MyGeometry, const FDragDropEvent& DragDropEvent) override;
virtual FReply OnDrop(const FGeometry& MyGeometry, const FDragDropEvent& DragDropEvent) override;
};

View File

@ -0,0 +1,141 @@
// Fill out your copyright notice in the Description page of Project Settings.
#include "SCutTimeline.h"
#include "SlateOptMacros.h"
#include "STimelineTick.h"
#include "STrackBody.h"
#include "Widgets/Input/SSlider.h"
#include "Widgets/Layout/SScrollBox.h"
BEGIN_SLATE_FUNCTION_BUILD_OPTIMIZATION
void SCutTimeline::UpdateTimelineLength()
{
TimelineTickBox->SetWidthOverride(FGlobalData::TrackLength);
for (IWidgetInterface* Interface : AllWidgets)
{
Interface->UpdateTimelineLength();
}
TimelineTick->TickLengthBox->SetWidthOverride(FGlobalData::TrackLength);
TimelineTick->GenerateTickBox(FGlobalData::TrackLength / FGlobalData::DefaultTimeTickSpace);
}
void SCutTimeline::Construct(const FArguments& InArgs)
{
ChildSlot
[
SNew(SVerticalBox)
+ SVerticalBox::Slot()
[
// Tool bar
SNew(SHorizontalBox)
]
+ SVerticalBox::Slot()
[
// Timeline
SNew(SHorizontalBox)
+ SHorizontalBox::Slot()
.SizeParam(FStretch(0.1f))
[
SNew(SVerticalBox)
+ SVerticalBox::Slot()
.SizeParam(FAuto())
[
SNew(SBox)
.WidthOverride(10000)
.HeightOverride(25)
// 刻度补差值
]
+ SVerticalBox::Slot()
[
SAssignNew(TrackHeadScrollBox, SScrollBox)
.OnUserScrolled_Lambda([this](float ScrollValue)
{
TrackBodyScrollBox->SetScrollOffset(ScrollValue);
})
]
// Track Head
]
+ SHorizontalBox::Slot()
.SizeParam(FStretch(0.9f))
[
SNew(SVerticalBox)
+ SVerticalBox::Slot()
.SizeParam(FAuto())
[
SAssignNew(TimelineTickBox, SBox)
.WidthOverride(FGlobalData::TrackLength)
.HeightOverride(25)
[
SAssignNew(TickScrollBox, SScrollBox)
.ScrollBarVisibility(EVisibility::Hidden)
.Orientation(EOrientation::Orient_Horizontal)
+ SScrollBox::Slot()
[
SAssignNew(TimelineTick, STimelineTick)
]
]
// 刻度
]
+ SVerticalBox::Slot()
[
SAssignNew(TrackBodyHScrollBox, SScrollBox)
.Orientation(EOrientation::Orient_Horizontal)
.Visibility(EVisibility::SelfHitTestInvisible)
.ScrollBarVisibility(EVisibility::Hidden)
+ SScrollBox::Slot()
[
// Track Body
SAssignNew(TrackBodyScrollBox, SScrollBox)
.ScrollBarVisibility(EVisibility::Hidden)
.OnUserScrolled_Lambda([this](float ScrollValue)
{
TrackHeadScrollBox->SetScrollOffset(ScrollValue);
})
]
]
+ SVerticalBox::Slot()
.SizeParam(FAuto())
[
SNew(SSlider)
.Value(0.0f)
.OnValueChanged_Lambda([this](float ChangedValue)
{
TrackBodyHScrollBox->SetScrollOffset(ChangedValue * TrackBodyHScrollBox->GetScrollOffsetOfEnd());
TickScrollBox->SetScrollOffset(ChangedValue * TickScrollBox->GetScrollOffsetOfEnd());
})
]
]
]
];
TrackHeadScrollBox->SetScrollBarVisibility(EVisibility::Hidden);
}
void SCutTimeline::AddNewTrack(FTrackData TrackData, int32 TrackIndex)
{
TrackDataArray.Insert(TrackData, TrackIndex);
const TSharedPtr<STrackHead> NewTrackHead = SNew(STrackHead).TrackData(TrackData).CutTimeline(SharedThis(this));
const TSharedPtr<STrackBody> NewTrackBody = SNew(STrackBody).TrackHead(NewTrackHead);
TrackHeadScrollBox->AddSlot()
[
NewTrackHead.ToSharedRef()
];
TrackBodyScrollBox->AddSlot()
[
NewTrackBody.ToSharedRef()
];
AllWidgets.Add(NewTrackBody.Get());
}
FReply SCutTimeline::OnDragOver(const FGeometry& MyGeometry, const FDragDropEvent& DragDropEvent)
{
return SCompoundWidget::OnDragOver(MyGeometry, DragDropEvent);
}
END_SLATE_FUNCTION_BUILD_OPTIMIZATION

View File

@ -0,0 +1,47 @@
// Fill out your copyright notice in the Description page of Project Settings.
#pragma once
#include "CoreMinimal.h"
#include "DefineGlobal.h"
#include "STimelineTick.h"
#include "Cut5/WidgetInterface.h"
#include "Widgets/SCompoundWidget.h"
#include "Widgets/Layout/SScrollBox.h"
/**
*
*/
class CUT5_API SCutTimeline : public SCompoundWidget
{
public:
SLATE_BEGIN_ARGS(SCutTimeline)
{
}
SLATE_END_ARGS()
void UpdateTimelineLength();
/** Constructs this widget with InArgs */
void Construct(const FArguments& InArgs);
void AddNewTrack(FTrackData TrackData, int32 TrackIndex);
TArray<FTrackData> TrackDataArray;
TArray<IWidgetInterface*> AllWidgets;
TSharedPtr<STimelineTick> TimelineTick;
TSharedPtr<SScrollBox> TrackHeadScrollBox;
TSharedPtr<SScrollBox> TrackBodyScrollBox;
TSharedPtr<SScrollBox> TrackBodyHScrollBox;
TSharedPtr<SBox> TimelineTickBox;
TSharedPtr<SScrollBox> TickScrollBox;
virtual FReply OnDragOver(const FGeometry& MyGeometry, const FDragDropEvent& DragDropEvent) override;
};

View File

@ -0,0 +1,20 @@
// Fill out your copyright notice in the Description page of Project Settings.
#include "STimelineClip.h"
#include "SlateOptMacros.h"
BEGIN_SLATE_FUNCTION_BUILD_OPTIMIZATION
void STimelineClip::Construct(const FArguments& InArgs)
{
/*
ChildSlot
[
// Populate the widget
];
*/
}
END_SLATE_FUNCTION_BUILD_OPTIMIZATION

View File

@ -0,0 +1,25 @@
// Fill out your copyright notice in the Description page of Project Settings.
#pragma once
#include "CoreMinimal.h"
#include "DefineGlobal.h"
#include "Widgets/SCompoundWidget.h"
/**
*
*/
class CUT5_API STimelineClip : public SCompoundWidget
{
public:
SLATE_BEGIN_ARGS(STimelineClip)
{
}
SLATE_END_ARGS()
/** Constructs this widget with InArgs */
void Construct(const FArguments& InArgs);
FClipData ClipData;
};

View File

@ -0,0 +1,52 @@
// Fill out your copyright notice in the Description page of Project Settings.
#include "STimelineProperty.h"
#include "SlateOptMacros.h"
BEGIN_SLATE_FUNCTION_BUILD_OPTIMIZATION
void STimelineProperty::Construct(const FArguments& InArgs)
{
TimelinePropertyData = InArgs._TimelinePropertyData;
MainWindow = InArgs._MainWindow;
ChildSlot
[
SNew(SBox)
.WidthOverride(128)
.HeightOverride(128)
.Padding(10, 10, 10, 10)
[
SNew(SOverlay)
+ SOverlay::Slot()
[
SNew(SImage)
]
+ SOverlay::Slot()
[
SNew(STextBlock)
.Text(FText::FromString(TimelinePropertyData.Name))
]
]
];
// this->AssignParentWidget(MainWindow->CutTimeline.ToSharedRef());
}
FReply STimelineProperty::OnMouseButtonDown(const FGeometry& MyGeometry, const FPointerEvent& MouseEvent)
{
return FReply::Handled().DetectDrag(SharedThis(this), EKeys::LeftMouseButton);
}
FReply STimelineProperty::OnDragDetected(const FGeometry& MyGeometry, const FPointerEvent& MouseEvent)
{
UE_LOG(LogTemp, Warning, TEXT("On Drag Detected"));
const TSharedPtr<FTrackClipDragOperation> Operation = MakeShared<FTrackClipDragOperation>();
Operation->TimelinePropertyData = TimelinePropertyData;
Operation->DraggingWidget = SharedThis(this);
return FReply::Handled().BeginDragDrop(Operation.ToSharedRef());
}
END_SLATE_FUNCTION_BUILD_OPTIMIZATION

View File

@ -0,0 +1,31 @@
// Fill out your copyright notice in the Description page of Project Settings.
#pragma once
#include "CoreMinimal.h"
#include "SCutMainWindow.h"
#include "SCutTimeline.h"
#include "Widgets/SCompoundWidget.h"
/**
*
*/
class CUT5_API STimelineProperty : public SCompoundWidget
{
public:
SLATE_BEGIN_ARGS(STimelineProperty)
{
}
SLATE_ARGUMENT(FTimelinePropertyData, TimelinePropertyData)
SLATE_ARGUMENT(TSharedPtr<SCutMainWindow>, MainWindow)
SLATE_END_ARGS()
/** Constructs this widget with InArgs */
void Construct(const FArguments& InArgs);
FTimelinePropertyData TimelinePropertyData;
TSharedPtr<SCutMainWindow> MainWindow;
virtual FReply OnMouseButtonDown(const FGeometry& MyGeometry, const FPointerEvent& MouseEvent) override;
virtual FReply OnDragDetected(const FGeometry& MyGeometry, const FPointerEvent& MouseEvent) override;
};

View File

@ -0,0 +1,57 @@
// Fill out your copyright notice in the Description page of Project Settings.
#include "STimelinePropertyPanel.h"
#include "SlateOptMacros.h"
#include "Widgets/Layout/SGridPanel.h"
BEGIN_SLATE_FUNCTION_BUILD_OPTIMIZATION
void STimelinePropertyPanel::Construct(const FArguments& InArgs)
{
MainWindow = InArgs._MainWindow;
ChildSlot
[
SNew(SBox)
[
SNew(SScrollBox)
+ SScrollBox::Slot()
.HAlign(HAlign_Fill)
.VAlign(VAlign_Fill)
[
SAssignNew(GridPanel, SGridPanel)
]
]
];
AddNewSelection(FTimelinePropertyData("Test", ETrackType::VideoTrack));
AddNewSelection(FTimelinePropertyData("Test1", ETrackType::VideoTrack));
AddNewSelection(FTimelinePropertyData("Test2", ETrackType::VideoTrack));
AddNewSelection(FTimelinePropertyData("Test3", ETrackType::VideoTrack));
AddNewSelection(FTimelinePropertyData("Test4", ETrackType::VideoTrack));
AddNewSelection(FTimelinePropertyData("Test5", ETrackType::VideoTrack));
AddNewSelection(FTimelinePropertyData("Test6", ETrackType::VideoTrack));
AddNewSelection(FTimelinePropertyData("Test7", ETrackType::VideoTrack));
AddNewSelection(FTimelinePropertyData("Test8", ETrackType::VideoTrack));
AddNewSelection(FTimelinePropertyData("Test9", ETrackType::VideoTrack));
}
void STimelinePropertyPanel::AddNewSelection(FTimelinePropertyData TimelinePropertyData)
{
const int32 TotalCount = GridPanel->GetChildren()->Num();
GridPanel->AddSlot(TotalCount % MaxRowIndex, TotalCount / MaxRowIndex)
[
SNew(STimelineProperty)
.TimelinePropertyData(TimelinePropertyData)
.MainWindow(MainWindow)
];
}
FReply STimelinePropertyPanel::OnDragOver(const FGeometry& MyGeometry, const FDragDropEvent& DragDropEvent)
{
return SCompoundWidget::OnDragOver(MyGeometry, DragDropEvent);
}
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 "STimelineProperty.h"
#include "Widgets/SCompoundWidget.h"
#include "Widgets/Layout/SGridPanel.h"
/**
*
*/
class CUT5_API STimelinePropertyPanel : public SCompoundWidget
{
public:
SLATE_BEGIN_ARGS(STimelinePropertyPanel)
{
}
SLATE_ARGUMENT(TSharedPtr<SCutMainWindow>, MainWindow)
SLATE_END_ARGS()
/** Constructs this widget with InArgs */
void Construct(const FArguments& InArgs);
void AddNewSelection(FTimelinePropertyData TimelinePropertyData);
virtual FReply OnDragOver(const FGeometry& MyGeometry, const FDragDropEvent& DragDropEvent) override;
private:
int32 MaxRowIndex = 3;
TSharedPtr<SCutMainWindow> MainWindow;
TSharedPtr<SGridPanel> GridPanel;
};

View File

@ -0,0 +1,47 @@
// Fill out your copyright notice in the Description page of Project Settings.
#include "STimelineTick.h"
#include "DefineGlobal.h"
#include "SlateOptMacros.h"
BEGIN_SLATE_FUNCTION_BUILD_OPTIMIZATION
void STimelineTick::Construct(const FArguments& InArgs)
{
FSlateRenderTransform RenderTransform = FSlateRenderTransform();
RenderTransform.
ChildSlot
[
SAssignNew(TickLengthBox, SBox)
.WidthOverride(FGlobalData::TrackLength)
.HeightOverride(25)
[
SAssignNew(TickBox, SOverlay)
+ SOverlay::Slot()
[
SAssignNew(TickCursor, SImage)
.RenderTransform()
]
]
];
GenerateTickBox(FGlobalData::TrackLength / FGlobalData::DefaultTimeTickSpace);
}
void STimelineTick::GenerateTickBox(int32 TickCount)
{
for (int32 i = 0; i < TickCount; i++)
{
TSharedPtr<STextBlock> TickText = SNew(STextBlock).Text(FText::FromString("|"));
TickBox->AddSlot()
[
TickText.ToSharedRef()
];
TickText->SetRenderTransform(FSlateRenderTransform(FVector2D(i * FGlobalData::DefaultTimeTickSpace, 0)));
}
}
END_SLATE_FUNCTION_BUILD_OPTIMIZATION

View File

@ -0,0 +1,27 @@
// Fill out your copyright notice in the Description page of Project Settings.
#pragma once
#include "CoreMinimal.h"
#include "Widgets/SCompoundWidget.h"
/**
*
*/
class CUT5_API STimelineTick : public SCompoundWidget
{
public:
SLATE_BEGIN_ARGS(STimelineTick)
{
}
SLATE_END_ARGS()
/** Constructs this widget with InArgs */
void Construct(const FArguments& InArgs);
void GenerateTickBox(int32 TickCount);
TSharedPtr<SOverlay> TickBox;
TSharedPtr<SBox> TickLengthBox;
TSharedPtr<SImage> TickCursor;
};

View File

@ -0,0 +1,121 @@
// Fill out your copyright notice in the Description page of Project Settings.
#include "STrackBody.h"
#include "SlateOptMacros.h"
#include "Widgets/Layout/SConstraintCanvas.h"
BEGIN_SLATE_FUNCTION_BUILD_OPTIMIZATION
void STrackBody::Construct(const FArguments& InArgs)
{
TrackHead = InArgs._TrackHead;
ChildSlot
[
SAssignNew(TrackBodyBox, SBox)
.WidthOverride(FGlobalData::TrackLength)
.HeightOverride(FGlobalData::DefaultTrackHeight)
[
SNew(SConstraintCanvas)
+ SConstraintCanvas::Slot()
.AutoSize(true)
.Offset(FMargin(0, 0, 0, 0))
.Anchors(FAnchors(0, 0, 1, 1))
[
SNew(SBorder)
.HAlign(HAlign_Fill)
.VAlign(VAlign_Fill)
.BorderBackgroundColor(FLinearColor(0.1f, 0.15f, 0.2f, 1.0f))
[
SAssignNew(Overlay, SOverlay)
]
]
]
];
}
void STrackBody::CallRender()
{
Overlay->ClearChildren();
for (FClipData TempClipData : TrackHead->TrackData.ClipData)
{
if (TempClipData.ClipEndFrame > FGlobalData::TrackLength)
{
FGlobalData::TrackLength = TempClipData.ClipEndFrame;
TrackHead->CutTimeline->UpdateTimelineLength();
}
Overlay->AddSlot()
.HAlign(HAlign_Left)
[
SNew(SBox)
.WidthOverride(TempClipData.ClipEndFrame - TempClipData.ClipStartFrame)
.HeightOverride(FGlobalData::DefaultTrackHeight)
.RenderTransform(FSlateRenderTransform(FVector2D(TempClipData.ClipStartFrame, 0)))
[
SNew(SBorder)
.ColorAndOpacity(TempClipData.ClipColors[0])
.BorderBackgroundColor(TempClipData.ClipColors[0])
]
];
const FString A = FString::Printf(TEXT("%d"), TempClipData.ClipEndFrame - TempClipData.ClipStartFrame);
UE_LOG(LogTemp, Warning, TEXT("%s"), *A);
}
}
FReply STrackBody::OnDrop(const FGeometry& MyGeometry, const FDragDropEvent& DragDropEvent)
{
const FTrackClipDragOperation& ClipDragOperation = static_cast<FTrackClipDragOperation&>(DragDropEvent.GetOperation().ToSharedRef().Get());
if (ClipDragOperation.TimelinePropertyData.Type == TrackHead->TrackData.TrackType)
{
FClipData NewClipData;
NewClipData.ClipGuid = FGuid::NewGuid();
NewClipData.ClipType = ClipDragOperation.TimelinePropertyData.Type;
NewClipData.ClipStartFrame = FMath::TruncToInt(MyGeometry.AbsoluteToLocal(DragDropEvent.GetScreenSpacePosition()).X / FGlobalData::DefaultTimeTickSpace) * FGlobalData::DefaultTimeTickSpace;
NewClipData.ClipColors.Add(FLinearColor(1, 1, 1, 1));;
NewClipData.ClipEndFrame = NewClipData.ClipStartFrame + 200;
//Overwrite the clip if it is in the same position
for (int32 i = TrackHead->TrackData.ClipData.Num() - 1; i > 0; i--)
{
const double ClipStartTime = TrackHead->TrackData.ClipData[i].ClipStartFrame;
const double ClipEndTime = TrackHead->TrackData.ClipData[i].ClipEndFrame;
if ((NewClipData.ClipEndFrame < ClipEndTime && ClipEndTime > ClipStartTime))
{
TrackHead->TrackData.ClipData[i].ClipStartFrame = NewClipData.ClipEndFrame;
}
if ((NewClipData.ClipStartFrame < TrackHead->TrackData.ClipData[i].ClipEndFrame && NewClipData.ClipStartFrame > TrackHead->TrackData.ClipData[i].ClipStartFrame))
{
TrackHead->TrackData.ClipData[i].ClipEndFrame = NewClipData.ClipStartFrame;
}
}
TrackHead->TrackData.ClipData.Add(NewClipData);
CallRender();
}
return FReply::Handled().EndDragDrop();
}
FReply STrackBody::OnDragOver(const FGeometry& MyGeometry, const FDragDropEvent& DragDropEvent)
{
// GEngine->AddOnScreenDebugMessage(-1, 10.0f, FColor::Blue, DragDropEvent.GetScreenSpacePosition().ToString());
// GEngine->AddOnScreenDebugMessage(-1, 10.0f, FColor::Green, MyGeometry.GetAbsolutePosition().ToString());
// GEngine->AddOnScreenDebugMessage(-1, 10.0f, FColor::Red, MyGeometry.AbsoluteToLocal(DragDropEvent.GetScreenSpacePosition()).ToString());
return SCompoundWidget::OnDragOver(MyGeometry, DragDropEvent);
}
void STrackBody::OnDragEnter(const FGeometry& MyGeometry, const FDragDropEvent& DragDropEvent)
{
SCompoundWidget::OnDragEnter(MyGeometry, DragDropEvent);
}
void STrackBody::OnDragLeave(const FDragDropEvent& DragDropEvent)
{
SCompoundWidget::OnDragLeave(DragDropEvent);
}
END_SLATE_FUNCTION_BUILD_OPTIMIZATION

View File

@ -0,0 +1,37 @@
// Fill out your copyright notice in the Description page of Project Settings.
#pragma once
#include "CoreMinimal.h"
#include "STrackHead.h"
#include "Widgets/SCompoundWidget.h"
/**
*
*/
class CUT5_API STrackBody : public SCompoundWidget, public IWidgetInterface
{
public:
SLATE_BEGIN_ARGS(STrackBody)
{
}
SLATE_ARGUMENT(TSharedPtr<STrackHead>, TrackHead)
SLATE_END_ARGS()
/** Constructs this widget with InArgs */
void Construct(const FArguments& InArgs);
void CallRender();
virtual FReply OnDrop(const FGeometry& MyGeometry, const FDragDropEvent& DragDropEvent) override;
virtual FReply OnDragOver(const FGeometry& MyGeometry, const FDragDropEvent& DragDropEvent) override;
virtual void OnDragEnter(const FGeometry& MyGeometry, const FDragDropEvent& DragDropEvent) override;
virtual void OnDragLeave(const FDragDropEvent& DragDropEvent) override;
TSharedPtr<STrackHead> TrackHead;
TSharedPtr<SOverlay> Overlay;
TSharedPtr<SBox> TrackBodyBox;
// Interface
virtual void UpdateTimelineLength() override
{
TrackBodyBox->SetWidthOverride(FGlobalData::TrackLength);
};
};

View File

@ -0,0 +1,31 @@
// Fill out your copyright notice in the Description page of Project Settings.
#include "STrackHead.h"
#include "SlateOptMacros.h"
BEGIN_SLATE_FUNCTION_BUILD_OPTIMIZATION
void STrackHead::Construct(const FArguments& InArgs)
{
TrackData = InArgs._TrackData;
CutTimeline = InArgs._CutTimeline;
ChildSlot
[
SNew(SBox)
.WidthOverride(100)
.HeightOverride(FGlobalData::DefaultTrackHeight)
[
SNew(SVerticalBox)
+ SVerticalBox::Slot()
[
SNew(STextBlock)
.Text(FText::FromString(TrackData.TrackName))
]
]
];
}
END_SLATE_FUNCTION_BUILD_OPTIMIZATION

View File

@ -0,0 +1,27 @@
// Fill out your copyright notice in the Description page of Project Settings.
#pragma once
#include "CoreMinimal.h"
#include "SCutTimeline.h"
#include "Widgets/SCompoundWidget.h"
/**
*
*/
class CUT5_API STrackHead : public SCompoundWidget
{
public:
SLATE_BEGIN_ARGS(STrackHead)
{
}
SLATE_ARGUMENT(FTrackData, TrackData);
SLATE_ARGUMENT(TSharedPtr<SCutTimeline>, CutTimeline);
SLATE_END_ARGS()
/** Constructs this widget with InArgs */
void Construct(const FArguments& InArgs);
FTrackData TrackData;
TSharedPtr<SCutTimeline> CutTimeline;
};

View File

@ -0,0 +1,15 @@
// Copyright Epic Games, Inc. All Rights Reserved.
using UnrealBuildTool;
using System.Collections.Generic;
public class Cut5EditorTarget : TargetRules
{
public Cut5EditorTarget( TargetInfo Target) : base(Target)
{
Type = TargetType.Editor;
DefaultBuildSettings = BuildSettingsVersion.V2;
IncludeOrderVersion = EngineIncludeOrderVersion.Unreal5_1;
ExtraModuleNames.Add("Cut5");
}
}