Page 1 of 1

Followers and keyframes

PostPosted: Mon Sep 14, 2020 8:46 am
by febros
Hello again.

I am still trying to optimize my workflow with Motion Graphics. Using Resolve version 16.2.6 on Windows 10.

Right now I am solving this example with 3 title layers, based on the same custom composition with multiple text sizes, followers, and a reversed ending:


The current workflow allows me to be very fast at editing, I only have to enter the text and set the desired duration from the Editing tab. But, as I mentioned, it has a serious penalty on rendering performance. The original composition is already optimized, my main problem now is that I am using many of them simultaneously in order to achieve what I want.

It would be SO much efficient to use some kind of keyframe on the selection range at the follower level, that is, being able to control the delay of the ending character, or even better, to make the follower react directly to a keyframe at the StyledText level. Unfortunately, I haven't found anything similar in the manuals nor the forums. I am assuming I'd need to create a fuse for that, but I don't even know where to start from.

Any tips or thoughts on how to improve it?

Re: Followers and keyframes

PostPosted: Mon Sep 14, 2020 11:41 pm
by TheBloke
Could you show your comp. If you're in Resolve, you can do: Fusion -> Export Fusion Composition, then zip it and upload it here.

Or select all the nodes, paste them here surrounded by code blocks. If it says it's too long for the forum, paste it instead to a site like Pastebin.com, and link it here.

Re: Followers and keyframes

PostPosted: Tue Sep 15, 2020 6:01 pm
by febros
Of course, here it is:

Code: Select all
{
   Tools = ordered() {
      Shadow1 = Shadow {
         Inputs = {
            ShadowOffset = Input { Value = { 0.502, 0.498 }, },
            Softness = Input { Value = 0.003, },
            Input = Input {
               SourceOp = "Merge2",
               Source = "Output",
            },
         },
         ViewInfo = OperatorInfo { Pos = { 110, 115.5 } },
      },
      TimeStretcher1 = TimeStretcher {
         Inputs = {
            SourceTime = Input {
               SourceOp = "TimeStretcher1SourceTime",
               Source = "Value",
            },
            Input = Input {
               SourceOp = "Shadow1",
               Source = "Output",
            },
         },
         ViewInfo = OperatorInfo { Pos = { 220, 115.5 } },
      },
      TimeStretcher1SourceTime = BezierSpline {
         SplineColor = { Red = 233, Green = 217, Blue = 243 },
         NameSet = true,
         KeyFrames = {
            [0] = { 0, RH = { 20, 20 }, Flags = { Linear = true } },
            [60] = { 60, LH = { 40, 40 }, Flags = { Linear = true } }
         }
      },
      SwitchFuse1 = Fuse.Switch {
         CtrlWZoom = false,
         Inputs = {
            Which = Input {
               SourceOp = "SwitchFuse1Which",
               Source = "Value",
               Expression = "iif(time<(comp.RenderEnd-15),1,2)",
            },
            Input1 = Input {
               SourceOp = "TimeStretcher1",
               Source = "Output",
            },
            Input2 = Input {
               SourceOp = "TimeSpeed2",
               Source = "Output",
            },
         },
         ViewInfo = OperatorInfo { Pos = { 440, 115.5 } },
      },
      SwitchFuse1Which = BezierSpline {
         SplineColor = { Red = 248, Green = 90, Blue = 80 },
         NameSet = true,
         KeyFrames = {
            [1162] = { 1, RH = { 1162.33333333333, 1.33333333333333 }, Flags = { Linear = true } },
            [1163] = { 2, LH = { 1162.66666666667, 1.66666666666667 }, RH = { 1983.66666666667, 1.66666666666667 }, Flags = { Linear = true } },
            [3625] = { 1, LH = { 2804.33333333333, 1.33333333333333 }, RH = { 3625.33333333333, 1.33333333333333 }, Flags = { Linear = true } },
            [3626] = { 2, LH = { 3625.66666666667, 1.66666666666667 }, Flags = { Linear = true } }
         }
      },
      ReverseTimeSpeed = MacroOperator {
         Inputs = ordered() {
            MainInput1 = InstanceInput {
               SourceOp = "TimeSpeed2",
               Source = "Input",
            }
         },
         Outputs = {
            MainOutput1 = InstanceOutput {
               SourceOp = "TimeSpeed2",
               Source = "Output",
            }
         },
         ViewInfo = GroupInfo { Pos = { 550, 16.5 } },
         Tools = ordered() {
            TimeSpeed2 = TimeSpeed {
               CtrlWZoom = false,
               CtrlWShown = false,
               Inputs = {
                  Speed = Input { Value = -1, },
                  Input = Input {
                     SourceOp = "TimeStretcher1_1",
                     Source = "Output",
                  },
               },
               ViewInfo = OperatorInfo { Pos = { 0, 8.75758 } },
            }
         },
      },
      text_body_small = TextPlus {
         NameSet = true,
         Inputs = {
            GlobalOut = Input { Value = 59, },
            Width = Input { Value = 1920, },
            Height = Input { Value = 1080, },
            UseFrameFormatSettings = Input { Value = 1, },
            ["Gamut.SLogVersion"] = Input { Value = FuID { "SLog2" }, },
            Center = Input { Value = { 0.1, 0.85 }, },
            LineSpacing = Input { Value = 1.3057, },
            StyledText = Input {
               SourceOp = "Follower2",
               Source = "StyledText",
            },
            Font = Input { Value = "Colaborate-Regular", },
            Style = Input { Value = "Regular", },
            Size = Input { Value = 0.035, },
            VerticalTopCenterBottom = Input { Value = -1, },
            VerticalJustificationNew = Input { Value = 3, },
            HorizontalLeftCenterRight = Input { Value = -1, },
            HorizontalJustificationNew = Input { Value = 3, },
            ManualFontKerningPlacement = Input {
               Value = StyledText {
                  Array = {
                  },
                  Value = ""
               },
            },
         },
         ViewInfo = OperatorInfo { Pos = { -275, 82.5 } },
      },
      Follower2 = StyledTextFollower {
         CtrlWZoom = false,
         Inputs = {
            LastCharacter = Input {
               Value = 0,
               Expression = "",
            },
            DelayType = Input { Value = 2, },
            Delay = Input {
               SourceOp = "Follower1Delay",
               Source = "Value",
            },
            Text = Input {
               Value = StyledText {
                  Array = {
                  },
                  Value = ""
               },
            },
            TransformRotation = Input { Value = 1, },
            TransformSize = Input { Value = 1, },
            CharacterSizeX = Input {
               SourceOp = "Follower3Delay",
               Source = "Value",
            },
         },
      },
      Follower1Delay = BezierSpline {
         SplineColor = { Red = 32, Green = 113, Blue = 253 },
         NameSet = true,
         KeyFrames = {
            [0] = { 25, Flags = { Linear = true } }
         }
      },
      Follower3Delay = BezierSpline {
         SplineColor = { Red = 28, Green = 216, Blue = 243 },
         NameSet = true,
         KeyFrames = {
            [0] = { 0, RH = { 5, 0.333333333333333 }, Flags = { Linear = true } },
            [15] = { 1, LH = { 10, 0.666666666666667 }, Flags = { Linear = true } }
         }
      },
      Merge3_1 = Merge {
         Inputs = {
            Background = Input {
               SourceOp = "Merge2_1",
               Source = "Output",
            },
            Foreground = Input {
               SourceOp = "text_heading_1",
               Source = "Output",
            },
            PerformDepthMerge = Input { Value = 0, },
         },
         ViewInfo = OperatorInfo { Pos = { 220, -49.5 } },
      },
      DirectionalBlur1 = DirectionalBlur {
         Inputs = {
            Length = Input {
               SourceOp = "DirectionalBlur1Length",
               Source = "Value",
            },
            Angle = Input { Value = 37, },
            Input = Input {
               SourceOp = "BrightnessContrast1",
               Source = "Output",
            },
         },
         ViewInfo = OperatorInfo { Pos = { 440, -16.5 } },
      },
      DirectionalBlur1Length = BezierSpline {
         SplineColor = { Red = 141, Green = 167, Blue = 243 },
         NameSet = true,
         KeyFrames = {
            [0] = { 0.1, RH = { 5, 0.1 } },
            [15] = { 0, LH = { 10, 0 } }
         }
      },
      text_heading_1 = TextPlus {
         NameSet = true,
         Inputs = {
            GlobalOut = Input { Value = 59, },
            Width = Input { Value = 1920, },
            Height = Input { Value = 1080, },
            UseFrameFormatSettings = Input { Value = 1, },
            ["Gamut.SLogVersion"] = Input { Value = FuID { "SLog2" }, },
            Center = Input { Value = { 0.1, 0.85 }, },
            StyledText = Input { Expression = "Text(text_heading.StyledText.Value)", },
            Font = Input { Value = "Colaborate-Medium", },
            Style = Input { Value = "Regular", },
            Size = Input { Value = 0.05, },
            VerticalTopCenterBottom = Input { Value = -1, },
            VerticalJustificationNew = Input { Value = 3, },
            HorizontalLeftCenterRight = Input { Value = -1, },
            HorizontalJustificationNew = Input { Value = 3, },
            ManualFontKerningPlacement = Input {
               Value = StyledText {
                  Array = {
                  },
                  Value = ""
               },
            },
         },
         ViewInfo = OperatorInfo { Pos = { 110, -115.5 } },
      },
      text_body_2 = TextPlus {
         NameSet = true,
         Inputs = {
            GlobalOut = Input { Value = 59, },
            Width = Input { Value = 1920, },
            Height = Input { Value = 1080, },
            UseFrameFormatSettings = Input { Value = 1, },
            ["Gamut.SLogVersion"] = Input { Value = FuID { "SLog2" }, },
            Center = Input { Value = { 0.1, 0.85 }, },
            StyledText = Input {
               Value = "test",
               Expression = "Text(text_body.StyledText.Value)",
            },
            Font = Input { Value = "Colaborate-Regular", },
            Style = Input { Value = "Regular", },
            Size = Input { Value = 0.045, },
            VerticalTopCenterBottom = Input { Value = -1, },
            VerticalJustificationNew = Input { Value = 3, },
            HorizontalLeftCenterRight = Input { Value = -1, },
            HorizontalJustificationNew = Input { Value = 3, },
            ManualFontKerningPlacement = Input {
               Value = StyledText {
                  Array = {
                  },
                  Value = ""
               },
            },
         },
         ViewInfo = OperatorInfo { Pos = { 110, -82.5 } },
      },
      TimeStretcher1_1 = TimeStretcher {
         Inputs = {
            SourceTime = Input {
               SourceOp = "TimeStretcher1_1SourceTime",
               Source = "Value",
            },
            Input = Input {
               SourceOp = "DirectionalBlur1",
               Source = "Output",
            },
         },
         ViewInfo = OperatorInfo { Pos = { 550, -16.5 } },
      },
      TimeStretcher1_1SourceTime = BezierSpline {
         SplineColor = { Red = 233, Green = 217, Blue = 243 },
         NameSet = true,
         KeyFrames = {
            [0] = { 0, RH = { 5, 5 }, Flags = { Linear = true } },
            [15] = { 15, LH = { 10, 10 }, Flags = { Linear = true } }
         }
      },
      Shadow1_1 = Shadow {
         Inputs = {
            ShadowOffset = Input { Value = { 0.502, 0.498 }, },
            Softness = Input { Value = 0.003, },
            Input = Input {
               SourceOp = "Merge3_1",
               Source = "Output",
            },
         },
         ViewInfo = OperatorInfo { Pos = { 330, -49.5 } },
      },
      Merge2 = Merge {
         Inputs = {
            Background = Input {
               SourceOp = "Merge1",
               Source = "Output",
            },
            Foreground = Input {
               SourceOp = "text_body",
               Source = "Output",
            },
            PerformDepthMerge = Input { Value = 0, },
         },
         ViewInfo = OperatorInfo { Pos = { -55, 115.5 } },
      },
      text_body_small_1 = TextPlus {
         NameSet = true,
         Inputs = {
            GlobalOut = Input { Value = 59, },
            Width = Input { Value = 1920, },
            Height = Input { Value = 1080, },
            UseFrameFormatSettings = Input { Value = 1, },
            ["Gamut.SLogVersion"] = Input { Value = FuID { "SLog2" }, },
            Center = Input { Value = { 0.1, 0.85 }, },
            LineSpacing = Input { Value = 1.3057, },
            StyledText = Input { Expression = "Text(text_body_small.StyledText.Value)", },
            Font = Input { Value = "Colaborate-Regular", },
            Style = Input { Value = "Regular", },
            Size = Input { Value = 0.035, },
            VerticalTopCenterBottom = Input { Value = -1, },
            VerticalJustificationNew = Input { Value = 3, },
            HorizontalLeftCenterRight = Input { Value = -1, },
            HorizontalJustificationNew = Input { Value = 3, },
            ManualFontKerningPlacement = Input {
               Value = StyledText {
                  Array = {
                  },
                  Value = ""
               },
            },
         },
         ViewInfo = OperatorInfo { Pos = { 110, -49.5 } },
      },
      MediaOut1 = MediaOut {
         Inputs = {
            Index = Input { Value = "0", },
            Input = Input {
               SourceOp = "SwitchFuse1",
               Source = "Output",
            },
         },
         ViewInfo = OperatorInfo { Pos = { 770, 115.5 } },
      },
      text_heading = TextPlus {
         NameSet = true,
         Inputs = {
            GlobalOut = Input { Value = 59, },
            Width = Input { Value = 1920, },
            Height = Input { Value = 1080, },
            UseFrameFormatSettings = Input { Value = 1, },
            ["Gamut.SLogVersion"] = Input { Value = FuID { "SLog2" }, },
            Center = Input { Value = { 0.1, 0.85 }, },
            StyledText = Input {
               SourceOp = "Follower3",
               Source = "StyledText",
            },
            Font = Input { Value = "Colaborate-Medium", },
            Style = Input { Value = "Regular", },
            Size = Input { Value = 0.05, },
            VerticalTopCenterBottom = Input { Value = -1, },
            VerticalJustificationNew = Input { Value = 3, },
            HorizontalLeftCenterRight = Input { Value = -1, },
            HorizontalJustificationNew = Input { Value = 3, },
            ManualFontKerningPlacement = Input {
               Value = StyledText {
                  Array = {
                  },
                  Value = ""
               },
            },
         },
         ViewInfo = OperatorInfo { Pos = { -275, 115.5 } },
      },
      Follower3 = StyledTextFollower {
         CtrlWZoom = false,
         Inputs = {
            Delay = Input {
               SourceOp = "Follower3Delay",
               Source = "Value",
            },
            Text = Input {
               Value = StyledText {
                  Array = {
                  },
                  Value = ""
               },
            },
            TransformSize = Input { Value = 1, },
            CharacterSizeX = Input {
               SourceOp = "Follower3Delay",
               Source = "Value",
            },
         },
      },
      Merge1 = Merge {
         Inputs = {
            Background = Input {
               SourceOp = "text_heading",
               Source = "Output",
            },
            Foreground = Input {
               SourceOp = "text_body_small",
               Source = "Output",
            },
            PerformDepthMerge = Input { Value = 0, },
         },
         ViewInfo = OperatorInfo { Pos = { -165, 115.5 } },
      },
      Opacity = MacroOperator {
         Inputs = ordered() {
            MainInput1 = InstanceInput {
               SourceOp = "BrightnessContrast1",
               Source = "Input",
            },
            Input1 = InstanceInput {
               SourceOp = "BrightnessContrast1",
               Source = "Gain",
               Name = "Opacity",
               MaxScale = 1,
               Default = 1,
            }
         },
         Outputs = {
            MainOutput1 = InstanceOutput {
               SourceOp = "BrightnessContrast1",
               Source = "Output",
            }
         },
         ViewInfo = GroupInfo { Pos = { 440, -49.5 } },
         Tools = ordered() {
            BrightnessContrast1 = BrightnessContrast {
               CtrlWZoom = false,
               CtrlWShown = false,
               Inputs = {
                  Alpha = Input { Value = 1, },
                  Gain = Input {
                     SourceOp = "BrightnessContrast1Gain",
                     Source = "Value",
                  },
                  Input = Input {
                     SourceOp = "Shadow1_1",
                     Source = "Output",
                  },
               },
               ViewInfo = OperatorInfo { Pos = { 0, 8.75758 } },
            }
         },
      },
      BrightnessContrast1Gain = BezierSpline {
         SplineColor = { Red = 104, Green = 144, Blue = 233 },
         NameSet = true,
         KeyFrames = {
            [0] = { 0, RH = { 3.33333333333333, 0 } },
            [10] = { 1, LH = { 6.66666666666667, 1 } }
         }
      },
      Merge2_1 = Merge {
         Inputs = {
            Background = Input {
               SourceOp = "text_body_2",
               Source = "Output",
            },
            Foreground = Input {
               SourceOp = "text_body_small_1",
               Source = "Output",
            },
            PerformDepthMerge = Input { Value = 0, },
         },
         ViewInfo = OperatorInfo { Pos = { 220, -82.5 } },
      },
      text_body = TextPlus {
         NameSet = true,
         Inputs = {
            GlobalOut = Input { Value = 59, },
            Width = Input { Value = 1920, },
            Height = Input { Value = 1080, },
            UseFrameFormatSettings = Input { Value = 1, },
            ["Gamut.SLogVersion"] = Input { Value = FuID { "SLog2" }, },
            Center = Input { Value = { 0.1, 0.85 }, },
            StyledText = Input {
               SourceOp = "Follower1",
               Source = "StyledText",
            },
            Font = Input { Value = "Colaborate-Regular", },
            Style = Input { Value = "Regular", },
            Size = Input { Value = 0.045, },
            VerticalTopCenterBottom = Input { Value = -1, },
            VerticalJustificationNew = Input { Value = 3, },
            HorizontalLeftCenterRight = Input { Value = -1, },
            HorizontalJustificationNew = Input { Value = 3, },
            ManualFontKerningPlacement = Input {
               Value = StyledText {
                  Array = {
                  },
                  Value = ""
               },
            },
         },
         ViewInfo = OperatorInfo { Pos = { -275, 49.5 } },
      },
      Follower1 = StyledTextFollower {
         CtrlWZoom = false,
         Inputs = {
            LastCharacter = Input {
               Value = 0,
               Expression = "Range",
            },
            DelayType = Input { Value = 2, },
            Delay = Input {
               SourceOp = "Follower1Delay",
               Source = "Value",
            },
            Text = Input {
               Value = StyledText {
                  Array = {
                  },
                  Value = "test"
               },
            },
            TransformRotation = Input { Value = 1, },
            TransformSize = Input { Value = 1, },
            CharacterSizeX = Input {
               SourceOp = "Follower3Delay",
               Source = "Value",
            },
         },
      }
   }
}