Jump to: Board index » General » Fusion

Fusion: Copying a Selected Area to another Location

Learn about 3D compositing, animation, broadcast design and VFX workflows.
  • Author
  • Message
Offline

sridharar

  • Posts: 123
  • Joined: Thu Aug 13, 2020 2:56 am
  • Location: Nashua, New Hampshire
  • Real Name: Sri Raghavan

Fusion: Copying a Selected Area to another Location

PostFri Oct 16, 2020 4:09 am

I thought I understood the basic fusion masks, transform and merge nodes to do this.
But I seem to be missing, overlooking something. So this question.

I am looking for a basic idiom of masking an area of the media, Copying/Moving that result to a different area/location for further action.

I will skip other contextual details as they are not the focus.

Here is a simple example of usage:

Creating a simple clip where a small circle is moving over the faces in a Group Photograph, and in another area fixed area of the screen, the magnified face along with name displays. This is akin to Magnifying glass, except that the magnified image is displayed in another location, rather than under the magnifier.

Thanks in advance.

Sri.
https://www.youtube.com/channel/UCeXBbc4qNkdbNPywhopu1iA
Offline
User avatar

Bryan Ray

  • Posts: 2485
  • Joined: Mon Nov 28, 2016 5:32 am
  • Location: Los Angeles, CA, USA

Re: Fusion: Copying a Selected Area to another Location

PostFri Oct 16, 2020 6:02 pm

If I'm understanding you correctly, the way I usually do it is to use a MatteControl tool and put the mask into the Garbage Matte input (it may be necessary to invert the mask). This will create a "cut out" of just the masked area. Use a Transform node to move it to wherever you want it to go, and Merge it back over the original.

Code: Select all
{
   Tools = ordered() {
      MatteControl1 = MatteControl {
         Inputs = {
            ["Garbage.Matte"] = Input {
               SourceOp = "Ellipse1",
               Source = "Mask",
            },
            Background = Input {
               SourceOp = "CheckerCrp",
               Source = "Output",
            },
         },
         ViewInfo = OperatorInfo { Pos = { 433, 35 } },
      },
      Ellipse1 = EllipseMask {
         Inputs = {
            Invert = Input { Value = 1, },
            MaskWidth = Input { Value = 1920, },
            MaskHeight = Input { Value = 1080, },
            PixelAspect = Input { Value = { 1, 1 }, },
            ClippingMode = Input { Value = FuID { "None" }, },
            Width = Input { Value = 0.26126345102013, },
            Height = Input { Value = 0.26126345102013, },
         },
         ViewInfo = OperatorInfo { Pos = { 424, 2 } },
      },
      Transform1 = Transform {
         CtrlWZoom = false,
         Inputs = {
            Center = Input { Value = { 0.779141104294479, 0.336512261580382 }, },
            Input = Input {
               SourceOp = "MatteControl1",
               Source = "Output",
            },
         },
         ViewInfo = OperatorInfo { Pos = { 437, 71 } },
      },
      Checker = GroupOperator {
         NameSet = true,
         Inputs = ordered() {
            Input1 = InstanceInput {
               SourceOp = "CheckerBG",
               Source = "GlobalIn",
               ControlGroup = 1,
               Default = 0,
            },
            Input2 = InstanceInput {
               SourceOp = "CheckerBG",
               Source = "GlobalOut",
               ControlGroup = 1,
               Default = 300,
            },
            Input11 = InstanceInput {
               SourceOp = "CheckerDummyBG",
               Source = "UseFrameFormatSettings",
               Default = 0,
            },
            Input12 = InstanceInput {
               SourceOp = "CheckerDummyBG",
               Source = "Width",
               Default = 720,
            },
            Input13 = InstanceInput {
               SourceOp = "CheckerDummyBG",
               Source = "Height",
               Default = 486,
            },
            Input14 = InstanceInput {
               SourceOp = "CheckerRsz",
               Source = "PixelAspect",
               DefaultX = 1,
               DefaultY = 1,
            },
            Input3 = InstanceInput {
               SourceOp = "CheckerBG",
               Source = "TopLeftRed",
               Name = "Color1",
               ControlGroup = 2,
               Default = 0,
            },
            Input4 = InstanceInput {
               SourceOp = "CheckerBG",
               Source = "TopLeftGreen",
               Name = "Color1 Green",
               ControlGroup = 2,
               Default = 0,
            },
            Input5 = InstanceInput {
               SourceOp = "CheckerBG",
               Source = "TopLeftBlue",
               Name = "Color1 Blue",
               ControlGroup = 2,
               Default = 0,
            },
            Input6 = InstanceInput {
               SourceOp = "CheckerBG",
               Source = "TopLeftAlpha",
               Name = "Color1 Alpha",
               ControlGroup = 2,
               Default = 1,
            },
            Input7 = InstanceInput {
               SourceOp = "CheckerBG",
               Source = "TopRightRed",
               Name = "Color2",
               ControlGroup = 3,
               Default = 1,
            },
            Input8 = InstanceInput {
               SourceOp = "CheckerBG",
               Source = "TopRightGreen",
               Name = "Color2 Green",
               ControlGroup = 3,
               Default = 1,
            },
            Input9 = InstanceInput {
               SourceOp = "CheckerBG",
               Source = "TopRightBlue",
               Name = "Color2 Blue",
               ControlGroup = 3,
               Default = 1,
            },
            Input10 = InstanceInput {
               SourceOp = "CheckerBG",
               Source = "TopRightAlpha",
               Name = "Color2 Alpha",
               ControlGroup = 3,
               Default = 1,
            },
            Input15 = InstanceInput {
               SourceOp = "CheckerXf",
               Source = "FlipHoriz",
               Name = "Flip Horizontally",
               Default = 0,
            },
            Input16 = InstanceInput {
               SourceOp = "CheckerXf",
               Source = "FlipVert",
               Name = "Flip Vertically",
               Default = 0,
            },
            Input17 = InstanceInput {
               SourceOp = "CheckerXf",
               Source = "Center",
            },
            Input18 = InstanceInput {
               SourceOp = "CheckerXf",
               Source = "Size",
               Default = 0.5,
            },
            Input19 = InstanceInput {
               SourceOp = "CheckerXf",
               Source = "Aspect",
               Default = 1,
            },
            Input20 = InstanceInput {
               SourceOp = "CheckerXf",
               Source = "Angle",
               Default = 0,
            }
         },
         Outputs = {
            MainOutput1 = InstanceOutput {
               SourceOp = "CheckerCrp",
               Source = "Output",
            }
         },
         ViewInfo = GroupInfo {
            Pos = { 284, 111 },
            Flags = {
               AllowPan = false,
               AutoSnap = true,
               RemoveRouters = true
            },
            Size = { 456, 97.3, 228, 22 },
            Direction = "Horizontal",
            PipeStyle = "Direct",
            Scale = 1,
            Offset = { 0, 0 }
         },
         Tools = ordered() {
            CheckerBG = Background {
               CtrlWShown = false,
               NameSet = true,
               Inputs = {
                  Width = Input { Value = 2, },
                  Height = Input { Value = 2, },
                  Type = Input { Value = FuID { "Corner" }, },
                  TopRightRed = Input { Value = 0.329, },
                  TopRightGreen = Input { Value = 0.329, },
                  TopRightBlue = Input { Value = 0.329, },
                  BottomLeftRed = Input { Value = 1, },
                  BottomLeftGreen = Input { Value = 1, },
                  BottomLeftBlue = Input { Value = 1, },
                  BottomLeftAlpha = Input { Value = 0.7843137383461, },
                  BottomRightRed = Input { Value = 0.294117659330368, },
                  BottomRightGreen = Input { Value = 0.062745101749897, },
                  BottomRightBlue = Input { Value = 0.10196078568697, },
                  BottomRightAlpha = Input { Value = 0.7843137383461, },
                  FrameRenderScript = Input { Value = "BottomLeftRed = TopRightRed\r\nBottomLeftGreen = TopRightGreen\r\nBottomLeftBlue = TopRightBlue\r\nBottomLeftAlpha = TopRightAlpha\r\nBottomRightRed = TopLeftRed\r\nBottomRightGreen = TopLeftGreen\r\nBottomRightBlue = TopLeftBlue\r\nBottomRightAlpha = TopLeftAlpha\r\n", },
                  Comments = Input { Value = "Creates a 2x2 checker pattern", },
                  EffectMask = Input {
                     SourceOp = "CheckerDummyBG",
                     Source = "Output",
                  }
               },
               ViewInfo = OperatorInfo { Pos = { -165, 43.15 } },
            },
            CheckerCrp = Crop {
               CtrlWShown = false,
               NameSet = true,
               Inputs = {
                  YOffset = Input { Value = 420, },
                  XSize = Input { Value = 1, },
                  YSize = Input { Value = 1, },
                  KeepCentered = Input { Value = 1, },
                  Input = Input {
                     SourceOp = "CheckerXf",
                     Source = "Output",
                  },
                  FrameRenderScript = Input { Value = "XSize = CheckerDummyBG.Width\r\nYSize = CheckerDummyBG.Height\r\n", },
                  Comments = Input { Value = "Crops to final size (from CheckerDummyBG)", }
               },
               ViewInfo = OperatorInfo { Pos = { 165, 43.15 } },
            },
            CheckerDummyBG = Background {
               PassThrough = true,
               CtrlWShown = false,
               NameSet = true,
               Inputs = {
                  Width = Input { Value = 1920, },
                  Height = Input { Value = 1080, },
                  Comments = Input { Value = "This is used only as a source for Width/Height controls. It is connected to the source BG in order to force re-renders when the dimensions change, but disabled to prevent any masking from occurring.", },
               },
               ViewInfo = OperatorInfo { Pos = { -165, 10.15 } },
            },
            CheckerRsz = BetterResize {
               CtrlWShown = false,
               NameSet = true,
               Inputs = {
                  Width = Input { Value = 700, },
                  Height = Input { Value = 200, },
                  ChangePixelAspect = Input { Value = 1, },
                  PixelAspect = Input { Value = { 1, 1 }, },
                  FilterMethod = Input { Value = 0, },
                  Input = Input {
                     SourceOp = "CheckerBG",
                     Source = "Output",
                  },
                  FrameRenderScript = Input { Value = "Width = math.max(CheckerDummyBG.Width, CheckerDummyBG.Height)\r\nHeight = math.max(CheckerDummyBG.Width, CheckerDummyBG.Height)\r\n", },
                  Comments = Input { Value = "Resize up the Checker pattern (with Nearest Neighbour)", }
               },
               ViewInfo = OperatorInfo { Pos = { -55, 43.15 } },
            },
            CheckerXf = Transform {
               CtrlWZoom = false,
               CtrlWShown = false,
               NameSet = true,
               Inputs = {
                  Size = Input { Value = 0.12, },
                  Edges = Input { Value = 1, },
                  Input = Input {
                     SourceOp = "CheckerRsz",
                     Source = "Output",
                  },
                  Comments = Input { Value = "All transformations done here", },
               },
               ViewInfo = OperatorInfo { Pos = { 55, 43.15 } },
            }
         },
      },
      Merge1 = Merge {
         Inputs = {
            Background = Input {
               SourceOp = "CheckerCrp",
               Source = "Output",
            },
            Foreground = Input {
               SourceOp = "Transform1",
               Source = "Output",
            },
            PerformDepthMerge = Input { Value = 0, },
         },
         ViewInfo = OperatorInfo { Pos = { 432, 113 } },
      }
   }
}
Bryan Ray
http://www.bryanray.name
http://www.sidefx.com
Offline
User avatar

Bryan Ray

  • Posts: 2485
  • Joined: Mon Nov 28, 2016 5:32 am
  • Location: Los Angeles, CA, USA

Re: Fusion: Copying a Selected Area to another Location

PostFri Oct 16, 2020 6:13 pm

Hmmm... But now that I re-read what you wrote, I think you'll actually want to slide the original image around under the mask instead of moving the masked area itself. This might be closer to what you want:

Code: Select all
{
   Tools = ordered() {
      Note2 = Note {
         Inputs = {
            Comments = Input { Value = "Move the image under the mask to grab the desired pixels. Driven by the Ellipse's Center control.", }
         },
         ViewInfo = StickyNoteInfo {
            Pos = { 125, -51 },
            Flags = {
               Expanded = true
            },
            Size = { 173, 120.3 }
         },
      },
      Transform2 = Transform {
         Inputs = {
            Center = Input {
               SourceOp = "Publish1",
               Source = "Value",
            },
            InvertTransform = Input { Value = 1, },
            Input = Input {
               SourceOp = "PipeRouter1",
               Source = "Output",
            },
         },
         ViewInfo = OperatorInfo { Pos = { 162, 33 } },
      },
      Publish1 = PublishPoint {
         Inputs = {
            Value = Input { Value = { 0.60674717791411, 0.341961852861035 }, },
         },
      },
      Note3 = Note {
         Inputs = {
            Comments = Input { Value = "Undo the movement of the Ellipse", }
         },
         ViewInfo = StickyNoteInfo {
            Pos = { 383, -75 },
            Flags = {
               Expanded = true
            },
            Size = { 180, 88.3 }
         },
      },
      Note1 = Note {
         Inputs = {
            Comments = Input { Value = "Move the result to the desired location", }
         },
         ViewInfo = StickyNoteInfo {
            Pos = { 419, 94 },
            Flags = {
               Expanded = true
            },
            Size = { 196, 179.3 }
         },
      },
      Transform3 = Transform {
         Inputs = {
            Center = Input {
               SourceOp = "Publish1",
               Source = "Value",
            },
            InvertTransform = Input { Value = 1, },
            Input = Input {
               SourceOp = "Ellipse1",
               Source = "Mask",
            },
         },
         ViewInfo = OperatorInfo { Pos = { 432, -27 } },
      },
      MatteControl1 = MatteControl {
         Inputs = {
            ["Garbage.Matte"] = Input {
               SourceOp = "Transform3",
               Source = "Output",
            },
            Background = Input {
               SourceOp = "Transform2",
               Source = "Output",
            },
         },
         ViewInfo = OperatorInfo { Pos = { 432, 35 } },
      },
      Ellipse1 = EllipseMask {
         CtrlWZoom = false,
         Inputs = {
            Invert = Input { Value = 1, },
            MaskWidth = Input { Value = 1920, },
            MaskHeight = Input { Value = 1080, },
            PixelAspect = Input { Value = { 1, 1 }, },
            ClippingMode = Input { Value = FuID { "None" }, },
            Center = Input {
               SourceOp = "Publish1",
               Source = "Value",
            },
            Width = Input { Value = 0.26126345102013, },
            Height = Input { Value = 0.26126345102013, },
         },
         ViewInfo = OperatorInfo { Pos = { 442, -167 } },
      },
      Background1 = Background {
         Inputs = {
            Width = Input { Value = 1920, },
            Height = Input { Value = 1080, },
            ["Gamut.SLogVersion"] = Input { Value = FuID { "SLog2" }, },
            Type = Input { Value = FuID { "Corner" }, },
            TopLeftRed = Input { Value = 1, },
            TopRightGreen = Input { Value = 1, },
            BottomLeftBlue = Input { Value = 1, },
         },
         ViewInfo = OperatorInfo { Pos = { -38, 181 } },
      },
      Transform1 = Transform {
         Inputs = {
            Center = Input { Value = { 0.779141104294479, 0.336512261580382 }, },
            Input = Input {
               SourceOp = "MatteControl1",
               Source = "Output",
            },
         },
         ViewInfo = OperatorInfo { Pos = { 447, 145 } },
      },
      PipeRouter1 = PipeRouter {
         Inputs = {
            Input = Input {
               SourceOp = "Background1",
               Source = "Output",
            },
         },
         ViewInfo = PipeRouterInfo { Pos = { 84, 182 } },
      },
      Merge1 = Merge {
         Inputs = {
            Background = Input {
               SourceOp = "PipeRouter1",
               Source = "Output",
            },
            Foreground = Input {
               SourceOp = "Transform1",
               Source = "Output",
            },
            PerformDepthMerge = Input { Value = 0, },
         },
         ViewInfo = OperatorInfo { Pos = { 442, 187 } },
      }
   }
}


It's a bit more complicated. First, I Published the Center control on the mask, so other things could be easily connected to it.

I want the mask's widget to be the thing that selects the desired 'cut-out', so I created a bit of weirdness to make it work out. First, I used a Transform to reverse the translation I did on the mask's Center. Then I connected another Transform, also inverted to the mask and applied the translation to the input image. This way, moving the Ellipse's Center will appear to work intuitively, but it's actually moving the source image around underneath instead of moving the mask over the top. That will prevent the inset from moving around along with the selector mask.
Bryan Ray
http://www.bryanray.name
http://www.sidefx.com
Offline

sridharar

  • Posts: 123
  • Joined: Thu Aug 13, 2020 2:56 am
  • Location: Nashua, New Hampshire
  • Real Name: Sri Raghavan

Re: Fusion: Copying a Selected Area to another Location

PostFri Oct 16, 2020 6:50 pm

Bryan


Wow.
Thanks a lot for the suggestions and the code.
I am going through your code and what you have said, diligently.
There is a wealth of idioms in this for broad use besides the context of my question.

I would appreciate a handwave on where/how the code fits in to a Fusion Node Graph.
In a Expression area of one of the correct place in the right node, or in some other global area that receives all events and invokes this code based on some configuration.

BTW, I have gone through your website and the chapter on Expressions a few times. Enormously useful.

Back to my context...

I was able to get the "magnified" part of the focus of the area in a frame (with all other parts of the image masked out), this was quite easy. But the extracted area kept moving in tandem with the focus area on the canvas. I thought I could adjust the X, Y params of a Transform or Merge or Crop to pin it down to a desired location on a frame (using expressions). But has proved elusive so far.

That is where I concluded that I do not understand the coordinate systems and the semantics of the parameters and their behavior clearly. If you have good pointers for getting this understanding, would appreciate it.
https://www.youtube.com/channel/UCeXBbc4qNkdbNPywhopu1iA
Offline

sridharar

  • Posts: 123
  • Joined: Thu Aug 13, 2020 2:56 am
  • Location: Nashua, New Hampshire
  • Real Name: Sri Raghavan

Re: Fusion: Copying a Selected Area to another Location

PostFri Oct 16, 2020 6:56 pm

Bryan

Just looking at the code..

Is it a full Fusion Graph - which I can import into a New [empty] composition and execute/play with it?

br Sri.
https://www.youtube.com/channel/UCeXBbc4qNkdbNPywhopu1iA
Offline
User avatar

Bryan Ray

  • Posts: 2485
  • Joined: Mon Nov 28, 2016 5:32 am
  • Location: Los Angeles, CA, USA

Re: Fusion: Copying a Selected Area to another Location

PostFri Oct 16, 2020 8:46 pm

Just copy and paste it into the graph. The nodes will appear. It's a really nice feature of Fusion (and Nuke) that the tools' properties are just plain-text and can be emailed or posted on forums or in chat.
Bryan Ray
http://www.bryanray.name
http://www.sidefx.com
Offline

sridharar

  • Posts: 123
  • Joined: Thu Aug 13, 2020 2:56 am
  • Location: Nashua, New Hampshire
  • Real Name: Sri Raghavan

Re: Fusion: Copying a Selected Area to another Location

PostSat Oct 17, 2020 2:19 am

Bryan

I simply copied and pasted your code (via windows clipboard) and everything worked nicely.
I added the media where you had the gradient background.

Beautiful. This is absolutely nice mechanism..and I was not aware of this until now.

I am browsing through the nodes. Thanks for the embedded notes.

A few questions if I may...

a) I am not able to see/browse the Expressions/Script using the inspectors in the Fusion Panel. Where do they reside? I am referring to your underlying logic.

b) It is nice to see the Notes and the Graphics of the Nodes. Can these be added via into the Node Graph via Fusion UI? (I do not see any node type "Note" under the Control-Space menus..)

c) Where are export/import functions (on the menus) and the file type for file? I see Fusion->Import but it is not obvious which one is the right submenu there on. I am not able to locate the menu for Exporting the Fusion Composition into XML (like you sent me).

Thanks a lot for your help and introducing me to many new things through your response.

br Sri.
https://www.youtube.com/channel/UCeXBbc4qNkdbNPywhopu1iA
Offline

sridharar

  • Posts: 123
  • Joined: Thu Aug 13, 2020 2:56 am
  • Location: Nashua, New Hampshire
  • Real Name: Sri Raghavan

Re: Fusion: Copying a Selected Area to another Location

PostSat Oct 17, 2020 4:06 am

Bryan

Just FYI. I do not mean to keep you tied into this context. Appreciate a bit more of your diligence.

The center of the focus for the magnification (i.e a face on the Image), and the center of what is shown magnified in the fixed area on the bottom right are not in sync. (the magnified face is off-center).

This drift/divergence is Zero when focus is right in the center of the Image, but grows larger as focus moves away from the center.

I was observing this in my original fusion code, and I also see the behavior in your code.

This indicates that the "shift/correction applied to X and Y" probably needs a proportional multiplier (that is proportional to distance between the focus center and the Image center.

This is the point when I declared that my understanding of the fusion coordinate system and the node behaviors are not quite right. As expressions I tried did not work.

I know this is not because of magnification (done by the transform), as the transform pivot is synced to the ellipse/focus center and so there is no drift introduced by that.

br Sri.
https://www.youtube.com/channel/UCeXBbc4qNkdbNPywhopu1iA
Offline

sridharar

  • Posts: 123
  • Joined: Thu Aug 13, 2020 2:56 am
  • Location: Nashua, New Hampshire
  • Real Name: Sri Raghavan

Re: Fusion: Copying a Selected Area to another Location

PostSat Oct 17, 2020 4:19 am

Bryan

Hold off on my last comment.

It may be an issue only with the "cursor ellipse" I am putting on the image, which I am moving. The actual underlying ellipse that is masking and magnifying has expression for its Center Parameters tying it to the "cursor ellipse". Let me delve on this to get a better reading.

Thanks Sri.
https://www.youtube.com/channel/UCeXBbc4qNkdbNPywhopu1iA
Offline
User avatar

Bryan Ray

  • Posts: 2485
  • Joined: Mon Nov 28, 2016 5:32 am
  • Location: Los Angeles, CA, USA

Re: Fusion: Copying a Selected Area to another Location

PostSat Oct 17, 2020 5:36 am

You don't need to export anything to get the node code. Just select the nodes in the flowgraph and Ctrl+C to copy them.

File > Import can be used to fetch a few specific file types, but most 2D raster images can be imported using a Loader node. Import FBX also brings in OBJ and DAE (Collada), among a few other formats.

Regarding the linkage between the Ellipse's Center control and the Transforms, there are no expressions involved. It's a Publish/Connect To workflow. You can publish any control by right-clicking and choosing "Publish." Then any other control with a matching data type can be connected to it by right-clicking and choosing Connect To > [Control]. It's a little faster than writing an expression, but it doesn't have the benefit of showing you the link in the interface.

I admit I didn't test the set-up very much. It was more a proof-of-concept than a finished piece of work, but let me take a look at it with an actual image and see if I can figure out what's up. I suspect it's a mismatch between the mask's resolution and your footage.
Bryan Ray
http://www.bryanray.name
http://www.sidefx.com
Offline
User avatar

Bryan Ray

  • Posts: 2485
  • Joined: Mon Nov 28, 2016 5:32 am
  • Location: Los Angeles, CA, USA

Re: Fusion: Copying a Selected Area to another Location

PostSat Oct 17, 2020 5:41 am

Hmmm... The only problem I see with it is that if the aspect ratio of the image doesn't match the ellipse, the widget gets deformed, but the center works as expected. By changing the size of the Ellipse to match my photo, I get exactly what I expect to see.

You do need to view the original photo while moving the Ellipse in order for the widget to appear in the correct location, though.

Capture.JPG
Capture.JPG (86.39 KiB) Viewed 3084 times


And I just realized I'd forgotten your question about the Note. Its full name is Sticky Note, and it's three-letter quick code it nte. It shows up in the Add Tool menu under the Flow category.
Bryan Ray
http://www.bryanray.name
http://www.sidefx.com
Offline

sridharar

  • Posts: 123
  • Joined: Thu Aug 13, 2020 2:56 am
  • Location: Nashua, New Hampshire
  • Real Name: Sri Raghavan

Re: Fusion: Copying a Selected Area to another Location

PostSat Oct 17, 2020 3:49 pm

Bryan

Beautiful image and your code in action. Thanks for the additional diligence.

Yes i think there is some size aspect mismatch in my node graph, and I somehow disturbed your code by little things I changed to build on.

Your responses here have a wealth of information of all kinds, clarifying so many basics and as a source of many idioms for self, and I am sure for many other beginners here.

Thanks in advance look forward to many more streams such jewels.

Br Sri.
https://www.youtube.com/channel/UCeXBbc4qNkdbNPywhopu1iA
Offline

sridharar

  • Posts: 123
  • Joined: Thu Aug 13, 2020 2:56 am
  • Location: Nashua, New Hampshire
  • Real Name: Sri Raghavan

Re: Fusion: Copying a Selected Area to another Location

PostTue Oct 20, 2020 12:08 am

Bryan

Whenever you get a chance..

How do I create a "Pipe Router" node on the Fusion Graph?
What is the real node type? I do not see it in the menu list.

Any pointer to understand what it does - not to rely on much on my common sense!

I am trying to document for myself the "Node Operations" of some basic nodes clearly.
Relationships between Input, Mask, Outputs and how the configuration parameters apply to them, in data structure and computational sense.

For example, in case of Transform
what determines the rectangle size of the Output?
Scale params - do they operate on the Input, or the Transform Rectangle, the Mask or the Output? or in what sequence
Center params -- now I know that it positions the transform rectangle, and does not do anything to the input or mask or output.

I am figuring these out playing with the fusion graph interactively.
The code you sent me was an eye opener to see things more clearly instead of navigating through UI.

Similarly for Merge and Matte - which seems to be work horses.

Most of the things are becoming clear and obvious in hindsight.

I now know why centers of different things do not move in sync, but rather proportionately, but embedding the simple compensating math in the right place remains elusive to me.

Overall, many common sense interpretations are/were leading me astray and I am trying to get the functional foundations correct and precise.

Thanks in advance.

br Sri.



Thanks in advance.

Sri.
https://www.youtube.com/channel/UCeXBbc4qNkdbNPywhopu1iA
Offline

xunile

  • Posts: 3070
  • Joined: Mon Apr 23, 2018 5:21 am
  • Real Name: Eric Eisenmann

Re: Fusion: Copying a Selected Area to another Location

PostTue Oct 20, 2020 12:30 am

sridharar wrote:Bryan

Whenever you get a chance..

How do I create a "Pipe Router" node on the Fusion Graph?
What is the real node type? I do not see it in the menu list.



You Alt-Click a pipe connection to create a PipeRouter.
Attachments
2020-10-19 (3).png
2020-10-19 (3).png (516.48 KiB) Viewed 3001 times
Win 10 Home | Intel i7 - 10700f 64 GB 1 TB GB SSD 2 TB SSD
RTX-3060 12 GB | Resolve Studio 18.6.6| Fusion Studio 18.6.6

Win 10 Home | Intel Core I7-7700HQ 32 GB 1 TB NVME SSD 1 TB SATA SSD
GTX-1060-6GB | Resolve 17.4.6
Offline

sridharar

  • Posts: 123
  • Joined: Thu Aug 13, 2020 2:56 am
  • Location: Nashua, New Hampshire
  • Real Name: Sri Raghavan

Re: Fusion: Copying a Selected Area to another Location

PostTue Oct 20, 2020 12:49 am

Thanks. Worked. Are there more such things? Are these keyboard functions listed somewhere?

br Sri.
https://www.youtube.com/channel/UCeXBbc4qNkdbNPywhopu1iA
Offline
User avatar

Bryan Ray

  • Posts: 2485
  • Joined: Mon Nov 28, 2016 5:32 am
  • Location: Los Angeles, CA, USA

Re: Fusion: Copying a Selected Area to another Location

PostTue Oct 20, 2020 12:58 am

sridharar wrote:Bryan

Whenever you get a chance..

How do I create a "Pipe Router" node on the Fusion Graph?
What is the real node type? I do not see it in the menu list.


Hold Alt and click on a pipe. The elbow will appear. Its only purpose is to help organize your flow. Or if you're in a quirky mood, making pictures in your flowgraph.

I am trying to document for myself the "Node Operations" of some basic nodes clearly.
Relationships between Input, Mask, Outputs and how the configuration parameters apply to them, in data structure and computational sense.

For example, in case of Transform
what determines the rectangle size of the Output?
Scale params - do they operate on the Input, or the Transform Rectangle, the Mask or the Output? or in what sequence
Center params -- now I know that it positions the transform rectangle, and does not do anything to the input or mask or output.


Hmmm… There are a few interrelated concepts here that are tricky to pull apart to look at in isolation.

Most nodes have a main Input. This will usually be yellow on the flowgraph. This input determines the properties of the raster—its size in pixels, bit depth, pixel aspect ratio, and interlacing. It is possible, however, for there to be data outside that raster. The Domain of Definition (DoD) is the rectangle containing all of the data available to Fusion, even if some of it is outside of the "window" formed by the image on the Input. DoD might also be smaller than the raster. To visualize the DoD, right-click in the Viewer and choose "Region > Show DoD." Here's an example of a domain that is both smaller than the raster and has data outside the window:

DoD.jpg
DoD.jpg (43.51 KiB) Viewed 2998 times


Many nodes will 'clip' the DoD to the borders of the image window. Some have the option of turning that behavior off. For instance, the Blur tool has a control called Clipping Mode. Setting it to Domain or None will preserve the out-of-raster pixels. In its default Frame mode, it discards them for the sake of performance.

So when you have a Transform tool, and you've moved the image or scaled it up, the pixels that have been pushed outside the raster still exist unless you change the Edges mode.

Between the Input(s) and Output, you typically have a number of other Inputs—the controls in the Inspector. Generally speaking, the order of operations on a tool is top-down—whatever is highest in the Inspector will happen first. These controls act on the pixels present in the main image Input. Unless the tool is specifically designed to change the format, the Output image will have the same properties as the Input, but the pixels in that Output image will have been changed.

Some nodes do alter the format. Resize, Scale, Crop, and ChangeDepth (possibly others; I don't recall off the top of my head) all make adjustments. Resize and Scale change the image's size, and also resample the pixels to fit the new size. Crop changes the size without resampling. ChangeDepth modifies the bit depth. In these cases, the Output format will often not match in the Input format.

There is a hidden Merge operator in most nodes. The Blend control can be used to mix the Input image with the Output image. It doesn't affect the strength of the controls, but how much of the original image is mixed with the result. Try setting the Blend of a Transform to 0.5 and you'll see what I mean.

The Effect Mask input lets you choose what parts of the Input image are affected by the node. In places of the image where the mask is 1.0 (white), the node's controls have full effect. For pixels where the mask is 0 (black), the Input is passed to the Output with no change. For pixels where the mask is gray, you'll get the same result as if you'd changed the Blend control to a matching value—a mix between the two images.

Those last two items, the Mask and the Blend, happen at the very end of processing, after all other controls have been evaluated. That's why adjusting the Center has no effect on the Mask—translation happens first and Masking last.

I now know why centers of different things do not move in sync, but rather proportionately, but embedding the simple compensating math in the right place remains elusive to me.

Overall, many common sense interpretations are/were leading me astray and I am trying to get the functional foundations correct and precise.


You might get some benefit from the book I've abandoned. I published a first draft on my web page a while back. I started in Fusion 7 and gave up when Resolve was released with an unfinished UI, but the principles haven't changed.

http://www.bryanray.name/wordpress/comp ... -contents/

It's intended to be a guide to learning the compositing craft using Fusion rather than as a software reference manual. So while it's less comprehensive than the manual, it present information in an order that is more likely to be useful to someone who is learning. And I'm a technical compositor, so I pay more attention to the math and science than to pretty pretty pictures.
Bryan Ray
http://www.bryanray.name
http://www.sidefx.com
Offline

sridharar

  • Posts: 123
  • Joined: Thu Aug 13, 2020 2:56 am
  • Location: Nashua, New Hampshire
  • Real Name: Sri Raghavan

Re: Fusion: Copying a Selected Area to another Location

PostTue Oct 20, 2020 2:17 am

Bryan

Phenomenal.

This is exactly the kind of knowledge bytes and bits I was looking for and building my basic foundations. I cannot exaggerate the value and importance of these to me, and they are far far more than you may imagine. I do hope that these also helps other beginners who are as much engineers and technologists as they are artists.

You said..

And I'm a technical compositor, so I pay more attention to the math and science than to pretty pretty pictures.

I am happy to read this.
Needless to say, I resonate with your view of the importance of precise understanding of the underlying math, science, data structures and transformation functions - as armed with that one can reliably and fully harness the computational machineries with unbounded imagination and creativity.

It is sad to know that you abandoned your book. Hope your passion is rekindled again, as I see a great need for presenting this platform in the manner of your presentation style - and its fundamentals, anchored on architectures, can remain relevant through feature evolution and cosmetic UI mechanics.

I have been already perusing your website and I will go through the shared link you shared as well.
If you have a pdf version it would be great, as I can adjust colors, fonts etc far more easily for comfortable reading and personal annotations.

br Sri.
https://www.youtube.com/channel/UCeXBbc4qNkdbNPywhopu1iA
Offline
User avatar

Bryan Ray

  • Posts: 2485
  • Joined: Mon Nov 28, 2016 5:32 am
  • Location: Los Angeles, CA, USA

Re: Fusion: Copying a Selected Area to another Location

PostTue Oct 20, 2020 2:19 am

If Blackmagic ever decides to finish their making the UI, I'll finish the book! :lol:
Bryan Ray
http://www.bryanray.name
http://www.sidefx.com
Offline

sridharar

  • Posts: 123
  • Joined: Thu Aug 13, 2020 2:56 am
  • Location: Nashua, New Hampshire
  • Real Name: Sri Raghavan

Re: Fusion: Copying a Selected Area to another Location

PostTue Oct 20, 2020 1:38 pm

Bryan

Happy to hear that.

If you get a chance...

Thanks for sharing the following which is a good reference for various base idioms in action.

To get started, download this file that contains a Fusion 8 comp and two pieces of public-domain clip art: 007_expressions_files.zip

I downloaded, copied on to a Fusion page. I think all the nodes show up.

I updated the disk location in the loaders (car, and tree) and played the clip.

But no animation happens.

Thought I would just ask you, in case there is something to be done to get it them to work on Davinci Resolve 16.2 (free version) which I am running. In parallel, I will also use this as an diagnosis exercise.

Thanks in advance Sri.

P.S. Here is the cut-n-paste of the node graph. This feature is wonderful.
Is there way to preserve the nice indentations (I see it when I am editing but is lost) in/after posting?

{
Tools = ordered() {
TreeLoader = Loader {
Clips = {
Clip {
ID = "Clip1",
Filename = "D:\\VinciProjects\\FromBryan\\007_Expressions_files\\tree-152954_640.png",
FormatID = "PNGFormat",
StartFrame = 640,
LengthSetManually = true,
TrimIn = 0,
TrimOut = 0,
ExtendFirst = 0,
ExtendLast = 0,
Loop = 0,
AspectMode = 0,
Depth = 0,
TimeCode = 0,
GlobalStart = 0,
GlobalEnd = 0
}
},
NameSet = true,
Inputs = {
["Gamut.SLogVersion"] = Input { Value = FuID { "SLog2" }, },
},
ViewInfo = OperatorInfo { Pos = { 458.667, -275.182 } },
Colors = {
TileColor = { R = 0, G = 0.596078431372549, B = 0.6 },
TextColor = { R = 0.725490196078431, G = 0.690196078431373, B = 0.592156862745098 },
}
},
carLoader = Loader {
Clips = {
Clip {
ID = "Clip1",
Filename = "D:\\VinciProjects\\FromBryan\\007_Expressions_files\\sports-car-151962_640.png",
FormatID = "PNGFormat",
StartFrame = 640,
LengthSetManually = true,
TrimIn = 0,
TrimOut = 0,
ExtendFirst = 0,
ExtendLast = 0,
Loop = 0,
AspectMode = 0,
Depth = 0,
TimeCode = 0,
GlobalStart = 0,
GlobalEnd = 0
}
},
NameSet = true,
Inputs = {
["Gamut.SLogVersion"] = Input { Value = FuID { "SLog2" }, },
},
ViewInfo = OperatorInfo { Pos = { 898.667, -275.182 } },
Colors = {
TileColor = { R = 0, G = 0.596078431372549, B = 0.6 },
TextColor = { R = 0.725490196078431, G = 0.690196078431373, B = 0.592156862745098 },
}
},
Background7 = Background {
Inputs = {
GlobalOut = Input { Value = 359, },
Width = Input { Value = 1920, },
Height = Input { Value = 1080, },
["Gamut.SLogVersion"] = Input { Value = FuID { "SLog2" }, },
TopLeftAlpha = Input { Value = 0, },
},
ViewInfo = OperatorInfo { Pos = { 678.667, -176.182 } },
},
car = GroupOperator {
NameSet = true,
Inputs = ordered() {
Input1 = InstanceInput {
SourceOp = "Merge1",
Source = "Foreground",
},
Input2 = InstanceInput {
SourceOp = "carMrg",
Source = "Foreground",
}
},
Outputs = {
Output3 = InstanceOutput {
SourceOp = "Transform2",
Source = "Output",
},
Output2 = InstanceOutput {
SourceOp = "MatteControl2",
Source = "Output",
},
Output1 = InstanceOutput {
SourceOp = "MatteControl1",
Source = "Output",
}
},
ViewInfo = GroupInfo {
Pos = { 898.667, -143.182 },
Flags = {
AllowPan = false,
GridSnap = true,
AutoSnap = true,
RemoveRouters = true
},
Size = { 676, 229.3, 338, 22 },
Direction = "Horizontal",
PipeStyle = "Direct",
Scale = 1,
Offset = { -1705, 621.2 }
},
Tools = ordered() {
Transform2 = Transform {
CtrlWShown = false,
Inputs = {
Edges = Input { Value = 1, },
Input = Input {
SourceOp = "carMrg",
Source = "Output",
},
},
ViewInfo = OperatorInfo { Pos = { 1705, -445.5 } },
},
Ellipse1_1 = EllipseMask {
CtrlWShown = false,
Inputs = {
MaskWidth = Input { Value = 1920, },
MaskHeight = Input { Value = 1080, },
PixelAspect = Input { Value = { 1, 1 }, },
ClippingMode = Input { Value = FuID { "None" }, },
Center = Input { Value = { 0.776736275814196, 0.375982809581634 }, },
Width = Input { Value = 0.17815241017174, },
Height = Input { Value = 0.17815241017174, },
},
ViewInfo = OperatorInfo { Pos = { 1925, -478.5 } },
},
carMrg = Merge {
CtrlWShown = false,
NameSet = true,
Inputs = {
Background = Input {
SourceOp = "Merge1",
Source = "Output",
},
Foreground = Input {
SourceOp = "backWheel",
Source = "Output",
},
PerformDepthMerge = Input { Value = 0, },
},
ViewInfo = OperatorInfo { Pos = { 1705, -478.5 } },
},
Merge1 = Merge {
CtrlWShown = false,
Inputs = {
Background = Input {
SourceOp = "MatteControl3",
Source = "Output",
},
Foreground = Input {
SourceOp = "frontWheel",
Source = "Output",
},
PerformDepthMerge = Input { Value = 0, },
},
ViewInfo = OperatorInfo { Pos = { 1705, -511.5 } },
},
MatteControl2 = MatteControl {
CtrlWShown = false,
Inputs = {
["Garbage.Matte"] = Input {
SourceOp = "Ellipse1_1",
Source = "Mask",
},
["Garbage.MaskInverted"] = Input { Value = 1, },
Background = Input {
SourceOp = "ColorCorrector1",
Source = "Output",
},
},
ViewInfo = OperatorInfo { Pos = { 1870, -511.5 } },
},
Bitmap1 = BitmapMask {
CtrlWShown = false,
Inputs = {
EffectMask = Input {
SourceOp = "Ellipse1_1",
Source = "Mask",
},
MaskWidth = Input { Value = 1920, },
MaskHeight = Input { Value = 1080, },
PixelAspect = Input { Value = { 1, 1 }, },
ClippingMode = Input { Value = FuID { "None" }, },
Image = Input {
SourceOp = "Ellipse1",
Source = "Mask",
},
},
ViewInfo = OperatorInfo { Pos = { 1980, -577.5 } },
},
MatteControl3 = MatteControl {
CtrlWShown = false,
Inputs = {
["Garbage.Matte"] = Input {
SourceOp = "Bitmap1",
Source = "Mask",
},
Background = Input {
SourceOp = "ColorCorrector1",
Source = "Output",
},
},
ViewInfo = OperatorInfo { Pos = { 1980, -544.5 } },
},
Merge18 = Merge {
CtrlWShown = false,
Inputs = {
Background = Input {
SourceOp = "Background8",
Source = "Output",
},
Foreground = Input {
SourceOp = "AlphaMultiply1",
Source = "Output",
},
PerformDepthMerge = Input { Value = 0, },
},
ViewInfo = OperatorInfo { Pos = { 1540, -544.5 } },
},
ColorCorrector1 = ColorCorrector {
CtrlWShown = false,
Inputs = {
MasterRGBGamma = Input { Value = 1.94468085106383, },
ColorRanges = Input {
Value = ColorCurves {
Curves = {
{
Points = {
{ 0, 1 },
{ 0.4, 0.2 },
{ 0.6, 0 },
{ 1, 0 }
}
},
{
Points = {
{ 0, 0 },
{ 0.4, 0 },
{ 0.6, 0.2 },
{ 1, 1 }
}
}
}
},
},
HistogramIgnoreTransparent = Input { Value = 1, },
Input = Input {
SourceOp = "Gamut1",
Source = "Output",
},
},
ViewInfo = OperatorInfo { Pos = { 1760, -544.5 } },
},
Gamut1 = GamutConvert {
CtrlWShown = false,
CustomData = {
Settings = {
[1] = {
Tools = ordered() {
Gamut1 = GamutConvert {
Inputs = {
SourceSpace = Input { Value = FuID { "sRGB" } },
Input = Input {
SourceOp = "Loader1",
Source = "Output"
}
},
Name = "Gamut1",
CtrlWZoom = false,
ViewInfo = OperatorInfo { Pos = { 318, 87 } },
CustomData = {
}
}
}
},
[2] = {
Tools = ordered() {
Gamut1 = GamutConvert {
Inputs = {
OutputSpace = Input { Value = FuID { "sRGB" } },
Input = Input {
SourceOp = "Loader1",
Source = "Output"
}
},
CtrlWZoom = false,
ViewInfo = OperatorInfo { Pos = { 318, 87 } },
CustomData = {
}
}
}
}
}
},
Inputs = {
SourceSpace = Input { Value = FuID { "sRGB" }, },
Input = Input {
SourceOp = "Merge18",
Source = "Output",
},
},
ViewInfo = OperatorInfo { Pos = { 1650, -544.5 } },
},
Ellipse1 = EllipseMask {
CtrlWShown = false,
Inputs = {
MaskWidth = Input { Value = 1920, },
MaskHeight = Input { Value = 1080, },
PixelAspect = Input { Value = { 1, 1 }, },
ClippingMode = Input { Value = FuID { "None" }, },
Center = Input { Value = { 0.21364936440678, 0.371463704206242 }, },
Width = Input { Value = 0.171313273320567, },
Height = Input { Value = 0.171313273320567, },
},
ViewInfo = OperatorInfo { Pos = { 1925, -610.5 } },
},
MatteControl1 = MatteControl {
CtrlWShown = false,
Inputs = {
["Garbage.Matte"] = Input {
SourceOp = "Ellipse1",
Source = "Mask",
},
["Garbage.MaskInverted"] = Input { Value = 1, },
Background = Input {
SourceOp = "ColorCorrector1",
Source = "Output",
},
},
ViewInfo = OperatorInfo { Pos = { 1870, -577.5 } },
},
WirelessLink2 = Fuse.Wireless {
CtrlWShown = false,
Inputs = {
Input = Input {
SourceOp = "carLoader",
Source = "Output",
},
},
ViewInfo = OperatorInfo { Pos = { 1430, -577.5 } },
},
AlphaMultiply1 = AlphaMultiply {
CtrlWShown = false,
Inputs = {
Input = Input {
SourceOp = "WirelessLink2",
Source = "Output",
},
},
ViewInfo = OperatorInfo { Pos = { 1540, -577.5 } },
},
Background8 = Background {
CtrlWShown = false,
Inputs = {
EffectMask = Input {
SourceOp = "Bitmap1",
Source = "Mask",
},
GlobalOut = Input { Value = 359, },
Width = Input { Value = 640, },
Height = Input { Value = 320, },
["Gamut.SLogVersion"] = Input { Value = FuID { "SLog2" }, },
},
ViewInfo = OperatorInfo { Pos = { 1650, -610.5 } },
}
},
},
hills = GroupOperator {
NameSet = true,
Outputs = {
Output1 = InstanceOutput {
SourceOp = "Background5",
Source = "Output",
}
},
ViewInfo = GroupInfo {
Pos = { 18.6667, -110.182 },
Flags = {
AllowPan = false,
GridSnap = true,
AutoSnap = true,
RemoveRouters = true
},
Size = { 219.875, 194.856, 109.938, 22 },
Direction = "Horizontal",
PipeStyle = "Direct",
Scale = 1,
Offset = { -825, 487.756 }
},
Tools = ordered() {
Background5 = Background {
CtrlWShown = false,
Inputs = {
EffectMask = Input {
SourceOp = "Ellipse3_6",
Source = "Mask",
},
GlobalOut = Input { Value = 359, },
Width = Input { Value = 1920, },
Height = Input { Value = 1080, },
["Gamut.SLogVersion"] = Input { Value = FuID { "SLog2" }, },
Type = Input { Value = FuID { "Gradient" }, },
TopLeftGreen = Input { Value = 0.231707317073171, },
BottomLeftGreen = Input { Value = 0.0853658536585366, },
Start = Input { Value = { 0.214523714014632, 0.114173228346457 }, },
End = Input { Value = { 0.214180206794682, 0.434383202099738 }, },
Gradient = Input {
Value = Gradient {
Colors = {
[0] = { 0, 0.0727272727272727, 0, 1 },
[1] = { 0, 0.406060606060606, 0, 1 }
}
},
},
},
ViewInfo = OperatorInfo { Pos = { 825, -346.5 } },
},
Ellipse3_6 = EllipseMask {
CtrlWShown = false,
Inputs = {
EffectMask = Input {
SourceOp = "Ellipse3_5",
Source = "Mask",
},
MaskWidth = Input { Value = 1920, },
MaskHeight = Input { Value = 1080, },
PixelAspect = Input { Value = { 1, 1 }, },
ClippingMode = Input { Value = FuID { "None" }, },
Center = Input { Value = { 1.02584933530281, 0.227034120734908 }, },
Width = Input { Value = 0.306403562042398, },
Height = Input { Value = 0.125820074221251, },
},
ViewInfo = OperatorInfo { Pos = { 825, -379.5 } },
},
Ellipse3_1 = EllipseMask {
CtrlWShown = false,
Inputs = {
EffectMask = Input {
SourceOp = "Ellipse3",
Source = "Mask",
},
MaskWidth = Input { Value = 1920, },
MaskHeight = Input { Value = 1080, },
PixelAspect = Input { Value = { 1, 1 }, },
ClippingMode = Input { Value = FuID { "None" }, },
Center = Input { Value = { 0.223781388478582, 0.208661417322835 }, },
Width = Input { Value = 0.306403562042398, },
Height = Input { Value = 0.125820074221251, },
},
ViewInfo = OperatorInfo { Pos = { 880, -478.5 } },
},
Ellipse3_4 = EllipseMask {
CtrlWShown = false,
Inputs = {
EffectMask = Input {
SourceOp = "Ellipse3_3",
Source = "Mask",
},
MaskWidth = Input { Value = 1920, },
MaskHeight = Input { Value = 1080, },
PixelAspect = Input { Value = { 1, 1 }, },
ClippingMode = Input { Value = FuID { "None" }, },
Center = Input { Value = { 0.715657311669128, 0.213910761154856 }, },
Width = Input { Value = 0.140002213781894, },
Height = Input { Value = 0.167963594437367, },
},
ViewInfo = OperatorInfo { Pos = { 770, -412.5 } },
},
Ellipse3_3 = EllipseMask {
CtrlWShown = false,
Inputs = {
EffectMask = Input {
SourceOp = "Ellipse3_2",
Source = "Mask",
},
MaskWidth = Input { Value = 1920, },
MaskHeight = Input { Value = 1080, },
PixelAspect = Input { Value = { 1, 1 }, },
ClippingMode = Input { Value = FuID { "None" }, },
Center = Input { Value = { 0.522156573116691, 0.190288713910761 }, },
Width = Input { Value = 0.394344962242352, },
Height = Input { Value = 0.161931904731719, },
},
ViewInfo = OperatorInfo { Pos = { 880, -445.5 } },
},
Ellipse3_5 = EllipseMask {
CtrlWShown = false,
Inputs = {
EffectMask = Input {
SourceOp = "Ellipse3_4",
Source = "Mask",
},
MaskWidth = Input { Value = 1920, },
MaskHeight = Input { Value = 1080, },
PixelAspect = Input { Value = { 1, 1 }, },
ClippingMode = Input { Value = FuID { "None" }, },
Center = Input { Value = { 0.830871491875923, 0.211286089238845 }, },
Width = Input { Value = 0.246676514032496, },
Height = Input { Value = 0.125820074221251, },
},
ViewInfo = OperatorInfo { Pos = { 880, -412.5 } },
},
Ellipse3_2 = EllipseMask {
CtrlWShown = false,
Inputs = {
EffectMask = Input {
SourceOp = "Ellipse3_1",
Source = "Mask",
},
MaskWidth = Input { Value = 1920, },
MaskHeight = Input { Value = 1080, },
PixelAspect = Input { Value = { 1, 1 }, },
ClippingMode = Input { Value = FuID { "None" }, },
Center = Input { Value = { 0.39807976366322, 0.23490813648294 }, },
Width = Input { Value = 0.202363367799114, },
Height = Input { Value = 0.125820074221251, },
},
ViewInfo = OperatorInfo { Pos = { 770, -445.5 } },
},
Ellipse3 = EllipseMask {
CtrlWShown = false,
Inputs = {
MaskWidth = Input { Value = 1920, },
MaskHeight = Input { Value = 1080, },
PixelAspect = Input { Value = { 1, 1 }, },
ClippingMode = Input { Value = FuID { "None" }, },
Center = Input { Value = { 0.0288035450516987, 0.227034120734908 }, },
Width = Input { Value = 0.306403562042398, },
Height = Input { Value = 0.125820074221251, },
},
ViewInfo = OperatorInfo { Pos = { 770, -478.5 } },
}
},
},
street = GroupOperator {
NameSet = true,
Outputs = {
Output1 = InstanceOutput {
SourceOp = "Merge17_1",
Source = "Output",
}
},
ViewInfo = GroupInfo {
Pos = { 678.667, -110.182 },
Flags = {
AllowPan = false,
GridSnap = true,
AutoSnap = true,
RemoveRouters = true
},
Size = { 346, 295.3, 173, 22 },
Direction = "Horizontal",
PipeStyle = "Direct",
Scale = 1,
Offset = { -1485, 588.2 }
},
Tools = ordered() {
Merge17_1 = Merge {
CtrlWShown = false,
Inputs = {
Background = Input {
SourceOp = "Merge17",
Source = "Output",
},
Foreground = Input {
SourceOp = "Transform3_1_1",
Source = "Output",
},
PerformDepthMerge = Input { Value = 0, },
},
ViewInfo = OperatorInfo { Pos = { 1430, -346.5 } },
},
Transform3_1_1 = Transform {
CtrlWShown = false,
Inputs = {
Center = Input { Value = { 22.8260927862698, 0.5 }, },
Input = Input {
SourceOp = "Merge15",
Source = "Output",
},
},
ViewInfo = OperatorInfo { Pos = { 1540, -346.5 } },
},
Transform3_1 = Transform {
CtrlWShown = false,
Inputs = {
Center = Input { Value = { 15.9839875231119, 0.5 }, },
Input = Input {
SourceOp = "Merge15",
Source = "Output",
},
},
ViewInfo = OperatorInfo { Pos = { 1540, -379.5 } },
},
Merge17 = Merge {
CtrlWShown = false,
Inputs = {
Background = Input {
SourceOp = "Merge16",
Source = "Output",
},
Foreground = Input {
SourceOp = "Transform3_1",
Source = "Output",
},
PerformDepthMerge = Input { Value = 0, },
},
ViewInfo = OperatorInfo { Pos = { 1430, -379.5 } },
},
Transform3 = Transform {
CtrlWShown = false,
Inputs = {
Center = Input { Value = { 7.50444594995131, 0.5 }, },
Input = Input {
SourceOp = "Merge15",
Source = "Output",
},
},
ViewInfo = OperatorInfo { Pos = { 1540, -412.5 } },
},
Merge16 = Merge {
CtrlWShown = false,
Inputs = {
Background = Input {
SourceOp = "Merge14",
Source = "Output",
},
Foreground = Input {
SourceOp = "Transform3",
Source = "Output",
},
PerformDepthMerge = Input { Value = 0, },
},
ViewInfo = OperatorInfo { Pos = { 1430, -412.5 } },
},
Merge14 = Merge {
CtrlWShown = false,
Inputs = {
Background = Input {
SourceOp = "Background4",
Source = "Output",
},
Foreground = Input {
SourceOp = "Merge15",
Source = "Output",
},
PerformDepthMerge = Input { Value = 0, },
},
ViewInfo = OperatorInfo { Pos = { 1430, -445.5 } },
},
Background4 = Background {
CtrlWShown = false,
Inputs = {
EffectMask = Input {
SourceOp = "Rectangle2",
Source = "Mask",
},
GlobalOut = Input { Value = 359, },
Width = Input { Value = 1920, },
Height = Input { Value = 1080, },
["Gamut.SLogVersion"] = Input { Value = FuID { "SLog2" }, },
TopLeftRed = Input { Value = 0.00666666666666671, },
TopLeftGreen = Input { Value = 0.00666666666666671, },
TopLeftBlue = Input { Value = 0.00666666666666671, },
},
ViewInfo = OperatorInfo { Pos = { 1375, -478.5 } },
},
Transform1_1 = Transform {
CtrlWShown = false,
Inputs = {
Center = Input { Value = { -8.52806558727912, -42.0454545454545 }, },
Input = Input {
SourceOp = "Background6",
Source = "Output",
},
},
ViewInfo = OperatorInfo { Pos = { 1595, -544.5 } },
},
Rectangle2 = RectangleMask {
CtrlWShown = false,
Inputs = {
MaskWidth = Input { Value = 1920, },
MaskHeight = Input { Value = 1080, },
PixelAspect = Input { Value = { 1, 1 }, },
ClippingMode = Input { Value = FuID { "None" }, },
Center = Input { Value = { 0.5, 0.0591719228813675 }, },
Width = Input { Value = 1.03982300884956, },
Height = Input { Value = 0.153488340135494, },
},
ViewInfo = OperatorInfo { Pos = { 1375, -511.5 } },
},
Merge15 = Merge {
CtrlWShown = false,
Inputs = {
Background = Input {
SourceOp = "Transform1",
Source = "Output",
},
Foreground = Input {
SourceOp = "Transform1_1",
Source = "Output",
},
PerformDepthMerge = Input { Value = 0, },
},
ViewInfo = OperatorInfo { Pos = { 1485, -511.5 } },
},
Background6 = Background {
CtrlWShown = false,
Inputs = {
GlobalOut = Input { Value = 359, },
Width = Input { Value = 66, },
Height = Input { Value = 11, },
["Gamut.SLogVersion"] = Input { Value = FuID { "SLog2" }, },
TopLeftRed = Input { Value = 0.933333333333333, },
TopLeftGreen = Input { Value = 0.933333333333333, },
TopLeftBlue = Input { Value = 0.933333333333333, },
},
ViewInfo = OperatorInfo { Pos = { 1540, -577.5 } },
},
Transform1 = Transform {
CtrlWShown = false,
Inputs = {
Center = Input { Value = { -12.2485388669286, -42.0454545454545 }, },
Input = Input {
SourceOp = "Background6",
Source = "Output",
},
},
ViewInfo = OperatorInfo { Pos = { 1485, -544.5 } },
}
},
},
tree = GroupOperator {
NameSet = true,
Outputs = {
Output1 = InstanceOutput {
SourceOp = "Transform6",
Source = "Output",
}
},
ViewInfo = GroupInfo {
Pos = { 458.667, -110.182 },
Flags = {
AllowPan = false,
GridSnap = true,
AutoSnap = true,
RemoveRouters = true
},
Size = { 126, 163.3, 63, 22 },
Direction = "Horizontal",
PipeStyle = "Direct",
Scale = 1,
Offset = { -1155, 654.2 }
},
Tools = ordered() {
Transform6 = Transform {
CtrlWShown = false,
Inputs = {
Center = Input { Value = { -0.691546980028048, 0.243898668425609 }, },
Size = Input { Value = 0.621276595744681, },
Input = Input {
SourceOp = "MatteControl4",
Source = "Output",
},
},
ViewInfo = OperatorInfo { Pos = { 1155, -544.5 } },
},
MatteControl4 = MatteControl {
CtrlWShown = false,
Inputs = {
MatteBlur = Input { Value = 1.4468085106383, },
PostMultiplyImage = Input { Value = 1, },
Background = Input {
SourceOp = "Gamut1_1",
Source = "Output",
},
},
ViewInfo = OperatorInfo { Pos = { 1155, -577.5 } },
},
Gamut1_1 = GamutConvert {
CtrlWShown = false,
CustomData = {
Settings = {
[1] = {
Tools = ordered() {
Gamut1 = GamutConvert {
Inputs = {
SourceSpace = Input { Value = FuID { "sRGB" } },
Input = Input {
SourceOp = "Loader1",
Source = "Output"
}
},
Name = "Gamut1",
CtrlWZoom = false,
ViewInfo = OperatorInfo { Pos = { 318, 87 } },
CustomData = {
}
}
}
},
[2] = {
Tools = ordered() {
Gamut1 = GamutConvert {
Inputs = {
OutputSpace = Input { Value = FuID { "sRGB" } },
Input = Input {
SourceOp = "Loader1",
Source = "Output"
}
},
CtrlWZoom = false,
ViewInfo = OperatorInfo { Pos = { 318, 87 } },
CustomData = {
}
}
}
}
}
},
Inputs = {
SourceSpace = Input { Value = FuID { "sRGB" }, },
Input = Input {
SourceOp = "WirelessLink1",
Source = "Output",
},
},
ViewInfo = OperatorInfo { Pos = { 1155, -610.5 } },
},
WirelessLink1 = Fuse.Wireless {
CtrlWShown = false,
Inputs = {
Input = Input {
SourceOp = "TreeLoader",
Source = "Output",
},
},
ViewInfo = OperatorInfo { Pos = { 1155, -643.5 } },
}
},
},
DaySky1 = DaySky {
Inputs = {
GlobalOut = Input { Value = 359, },
Width = Input { Value = 1920, },
Height = Input { Value = 1080, },
["Gamut.SLogVersion"] = Input { Value = FuID { "SLog2" }, },
Latitude = Input { Value = 24.2790697674419, },
Longitude = Input { Value = 0, },
Day = Input { Value = FuID { "16" }, },
Month = Input { Value = FuID { "June" }, },
Time = Input { Value = 13.3953488372093, },
},
ViewInfo = OperatorInfo { Pos = { -421.333, -110.182 } },
},
clouds = GroupOperator {
NameSet = true,
Outputs = {
Output1 = InstanceOutput {
SourceOp = "Merge5",
Source = "Output",
}
},
ViewInfo = GroupInfo {
Pos = { -641.333, -110.182 },
Flags = {
AllowPan = false,
GridSnap = true,
AutoSnap = true,
RemoveRouters = true
},
Size = { 676, 161.856, 338, 22 },
Direction = "Horizontal",
PipeStyle = "Direct",
Scale = 1,
Offset = { -55, 487.756 }
},
Tools = ordered() {
Merge5 = Merge {
CtrlWShown = false,
Inputs = {
Background = Input {
SourceOp = "Merge4",
Source = "Output",
},
Foreground = Input {
SourceOp = "Merge3_1_1",
Source = "Output",
},
PerformDepthMerge = Input { Value = 0, },
},
ViewInfo = OperatorInfo { Pos = { 330, -379.5 } },
},
Merge4 = Merge {
CtrlWShown = false,
Inputs = {
Background = Input {
SourceOp = "Merge3",
Source = "Output",
},
Foreground = Input {
SourceOp = "Merge3_1",
Source = "Output",
},
PerformDepthMerge = Input { Value = 0, },
},
ViewInfo = OperatorInfo { Pos = { 110, -379.5 } },
},
Merge3_1_1 = Merge {
CtrlWShown = false,
Inputs = {
Background = Input {
SourceOp = "Background3_1_1",
Source = "Output",
},
Foreground = Input {
SourceOp = "Background2_1_1",
Source = "Output",
},
PerformDepthMerge = Input { Value = 0, },
},
ViewInfo = OperatorInfo { Pos = { 330, -412.5 } },
},
Background3_1_1 = Background {
CtrlWShown = false,
Inputs = {
EffectMask = Input {
SourceOp = "Instance_Polygon1_1_2",
Source = "Mask",
},
GlobalOut = Input { Value = 359, },
Width = Input { Value = 1920, },
Height = Input { Value = 1080, },
["Gamut.SLogVersion"] = Input { Value = FuID { "SLog2" }, },
TopLeftRed = Input { Value = 1, },
TopLeftGreen = Input { Value = 1, },
TopLeftBlue = Input { Value = 1, },
},
ViewInfo = OperatorInfo { Pos = { 330, -445.5 } },
},
Instance_Polygon1_1_2 = PolylineMask {
DrawMode = "InsertAndModify",
DrawMode2 = "InsertAndModify",
CtrlWShown = false,
SourceOp = "Polygon1_1_2",
Inputs = {
StartEndRenderScripts = Input { },
EffectMask = Input { },
Solid = Input { },
Polyline2 = Input {
Value = Polyline {
},
Disabled = true,
},
},
ViewInfo = OperatorInfo { Pos = { 330, -478.5 } },
},
Polygon1_1_2 = PolylineMask {
DrawMode = "InsertAndModify",
DrawMode2 = "InsertAndModify",
CtrlWShown = false,
Inputs = {
BorderWidth = Input { Value = 0.00252765957446808, },
Solid = Input { Value = 0, },
MaskWidth = Input { Value = 1920, },
MaskHeight = Input { Value = 1080, },
PixelAspect = Input { Value = { 1, 1 }, },
ClippingMode = Input { Value = FuID { "None" }, },
Polyline = Input {
SourceOp = "Polygon1_1_2Polyline",
Source = "Value",
},
Polyline2 = Input {
Value = Polyline {
},
Disabled = true,
},
},
ViewInfo = OperatorInfo { Pos = { 220, -478.5 } },
},
Background2_1_1 = Background {
CtrlWShown = false,
Inputs = {
EffectMask = Input {
SourceOp = "Polygon1_1_2",
Source = "Mask",
},
GlobalOut = Input { Value = 359, },
Width = Input { Value = 1920, },
Height = Input { Value = 1080, },
["Gamut.SLogVersion"] = Input { Value = FuID { "SLog2" }, },
},
ViewInfo = OperatorInfo { Pos = { 220, -445.5 } },
},
Merge3_1 = Merge {
CtrlWShown = false,
Inputs = {
Background = Input {
SourceOp = "Background3_1",
Source = "Output",
},
Foreground = Input {
SourceOp = "Background2_1",
Source = "Output",
},
PerformDepthMerge = Input { Value = 0, },
},
ViewInfo = OperatorInfo { Pos = { 110, -412.5 } },
},
Merge3 = Merge {
CtrlWShown = false,
Inputs = {
Background = Input {
SourceOp = "Background3",
Source = "Output",
},
Foreground = Input {
SourceOp = "Background2",
Source = "Output",
},
PerformDepthMerge = Input { Value = 0, },
},
ViewInfo = OperatorInfo { Pos = { -110, -412.5 } },
},
Instance_Polygon1_2 = PolylineMask {
DrawMode = "InsertAndModify",
DrawMode2 = "InsertAndModify",
CtrlWShown = false,
SourceOp = "Polygon1_2",
Inputs = {
StartEndRenderScripts = Input { },
EffectMask = Input { },
Solid = Input { },
Polyline2 = Input {
Value = Polyline {
},
Disabled = true,
},
},
ViewInfo = OperatorInfo { Pos = { 110, -478.5 } },
},
Background3_1 = Background {
CtrlWShown = false,
Inputs = {
EffectMask = Input {
SourceOp = "Instance_Polygon1_2",
Source = "Mask",
},
GlobalOut = Input { Value = 359, },
Width = Input { Value = 1920, },
Height = Input { Value = 1080, },
["Gamut.SLogVersion"] = Input { Value = FuID { "SLog2" }, },
TopLeftRed = Input { Value = 1, },
TopLeftGreen = Input { Value = 1, },
TopLeftBlue = Input { Value = 1, },
},
ViewInfo = OperatorInfo { Pos = { 110, -445.5 } },
},
Background2_1 = Background {
CtrlWShown = false,
Inputs = {
EffectMask = Input {
SourceOp = "Polygon1_2",
Source = "Mask",
},
GlobalOut = Input { Value = 359, },
Width = Input { Value = 1920, },
Height = Input { Value = 1080, },
["Gamut.SLogVersion"] = Input { Value = FuID { "SLog2" }, },
},
ViewInfo = OperatorInfo { Pos = { 0, -445.5 } },
},
Polygon1_2 = PolylineMask {
DrawMode = "InsertAndModify",
DrawMode2 = "InsertAndModify",
CtrlWShown = false,
Inputs = {
BorderWidth = Input { Value = 0.00325021276595745, },
Solid = Input { Value = 0, },
MaskWidth = Input { Value = 1920, },
MaskHeight = Input { Value = 1080, },
PixelAspect = Input { Value = { 1, 1 }, },
ClippingMode = Input { Value = FuID { "None" }, },
Polyline = Input {
SourceOp = "Polygon1_2Polyline",
Source = "Value",
},
Polyline2 = Input {
Value = Polyline {
},
Disabled = true,
},
},
ViewInfo = OperatorInfo { Pos = { 0, -478.5 } },
},
Background2 = Background {
CtrlWShown = false,
Inputs = {
EffectMask = Input {
SourceOp = "Polygon1_1_1_1",
Source = "Mask",
},
GlobalOut = Input { Value = 359, },
Width = Input { Value = 1920, },
Height = Input { Value = 1080, },
["Gamut.SLogVersion"] = Input { Value = FuID { "SLog2" }, },
},
ViewInfo = OperatorInfo { Pos = { -220, -445.5 } },
},
Background3 = Background {
CtrlWShown = false,
Inputs = {
EffectMask = Input {
SourceOp = "Instance_Polygon1_1_1_1",
Source = "Mask",
},
GlobalOut = Input { Value = 359, },
Width = Input { Value = 1920, },
Height = Input { Value = 1080, },
["Gamut.SLogVersion"] = Input { Value = FuID { "SLog2" }, },
TopLeftRed = Input { Value = 1, },
TopLeftGreen = Input { Value = 1, },
TopLeftBlue = Input { Value = 1, },
},
ViewInfo = OperatorInfo { Pos = { -110, -445.5 } },
},
Instance_Polygon1_1_1_1 = PolylineMask {
DrawMode = "InsertAndModify",
DrawMode2 = "InsertAndModify",
CtrlWShown = false,
SourceOp = "Polygon1_1_1_1",
Inputs = {
StartEndRenderScripts = Input { },
EffectMask = Input { },
Solid = Input { },
Polyline2 = Input {
Value = Polyline {
},
Disabled = true,
},
},
ViewInfo = OperatorInfo { Pos = { -110, -478.5 } },
},
Polygon1_1_1_1 = PolylineMask {
DrawMode = "InsertAndModify",
DrawMode2 = "InsertAndModify",
CtrlWShown = false,
Inputs = {
BorderWidth = Input { Value = 0.00298553191489362, },
Solid = Input { Value = 0, },
MaskWidth = Input { Value = 1920, },
MaskHeight = Input { Value = 1080, },
PixelAspect = Input { Value = { 1, 1 }, },
ClippingMode = Input { Value = FuID { "None" }, },
Polyline = Input {
SourceOp = "Polygon1_1_1_1Polyline",
Source = "Value",
},
Polyline2 = Input {
Value = Polyline {
},
Disabled = true,
},
},
ViewInfo = OperatorInfo { Pos = { -220, -478.5 } },
}
},
},
Polygon1_1_2Polyline = BezierSpline {
SplineColor = { Red = 173, Green = 255, Blue = 47 },
NameSet = true,
KeyFrames = {
[0] = { 0, Flags = { Linear = true, LockedY = true }, Value = Polyline {
Closed = true,
Points = {
{ X = 0.146976881620675, Y = 0.0932835765294174, LX = -0.0315218594859897, LY = 0.00548385535879412, RX = 0.106481650049961, RY = -0.00186567008495331 },
{ Linear = true, X = 0.466421831770559, Y = 0.0876865662745575, LX = -0.106481650049961, LY = 0.00186567008495331, RX = 0.0124393414479982, RY = 0.0031683864065799 },
{ X = 0.441238196705471, Y = 0.186567169072023, LX = 0.0203492907582517, LY = -0.0175037920243874, RX = -0.0159968958031025, RY = 0.0137600047343059 },
{ X = 0.388772298021932, Y = 0.169776109617148, LX = 0.00440000691183765, LY = 0.0401897629578654, RX = -0.00457923890066389, RY = 0.0416144412678837 },
{ X = 0.341437547976798, Y = 0.186262305547942, LX = 0.00788648447151667, LY = 0.0453761957393151, RX = -0.00864266800646357, RY = 0.0439462914202896 },
{ X = 0.284889834374971, Y = 0.276119413660533, LX = 0.0331905826133111, LY = 0.0021075898759613, RX = -0.0228299957147499, RY = -0.00144969639120867 },
{ X = 0.229506142740226, Y = 0.173507449787054, LX = -0.00237751086402998, LY = 0.0432323072997194, RX = -0.0134168382993644, RY = 0.0321068371093163 },
{ X = 0.173640166682964, Y = 0.227611949639534, LX = 0.0356504214074028, LY = 8.46063979037582e-009, RX = -0.0317420176162112, RY = -7.53308843678243e-009 }
}
} }
}
},
Polygon1_2Polyline = BezierSpline {
SplineColor = { Red = 96, Green = 255, Blue = 47 },
NameSet = true,
KeyFrames = {
[0] = { 0, Flags = { Linear = true, LockedY = true }, Value = Polyline {
Closed = true,
Points = {
{ X = -0.432843655347824, Y = 0.238805964589119, LX = -0.0260510026550124, LY = 0.00548385535879412, RX = 0.0930395255496594, RY = -0.00186566978841278 },
{ Linear = true, X = -0.153725072741508, Y = 0.233208954334259, LX = -0.0930395255496594, LY = 0.00186566978841278, RX = 0.0192040319034556, RY = 0.00327109893696929 },
{ X = -0.188352569296628, Y = 0.388059706385456, LX = 0.0328513487126612, LY = 0.00176998055430336, RX = -0.0197842482754337, RY = -0.00106594511644869 },
{ X = -0.231374606490135, Y = 0.315298497676849, LX = 0.00490083460231086, LY = 0.044764334445174, RX = -0.010401115436384, RY = 0.0945215169676182 },
{ X = -0.304826849780328, Y = 0.46641792112322, LX = 0.0634884851859418, LY = 0.0040314956256401, RX = -0.0340542776080771, RY = -0.00216243419273846 },
{ X = -0.364637970924377, Y = 0.319029837846756, LX = -0.00293089976836914, LY = 0.0644873092758033, RX = -0.0110882446612632, RY = 0.0321068371093163 },
{ X = -0.410807984823445, Y = 0.373134337699235, LX = 0.029463021467669, LY = 8.46063979037582e-009, RX = -0.0262329506786521, RY = -7.53308843678243e-009 }
}
} }
}
},
Polygon1_1_1_1Polyline = BezierSpline {
SplineColor = { Red = 173, Green = 255, Blue = 47 },
NameSet = true,
KeyFrames = {
[0] = { 0, Flags = { Linear = true, LockedY = true }, Value = Polyline {
Closed = true,
Points = {
{ X = -0.22238303443389, Y = 0.167910442201059, LX = -0.0388541636179754, LY = 0.012144733657801, RX = 0.106481650049961, RY = -0.00186567008495331 },
{ Linear = true, X = 0.0970619157159942, Y = 0.162313431946199, LX = -0.106481650049961, LY = 0.00186567008495331, RX = 0.0255731761946889, RY = -0.000420955116824906 },
{ X = 0.0634837371042118, Y = 0.375000004892919, LX = 0.0414136900260482, LY = -0.0356226969180461, RX = -0.0194001377690947, RY = 0.0166873617753488 },
{ X = 0.000524658987304472, Y = 0.348880587229088, LX = 0.0126813071360052, LY = 0.0673966061994412, RX = -0.0289184403696029, RY = 0.101670163796379 },
{ X = -0.0573032704911978, Y = 0.303799618980778, LX = 0.0103239783261021, LY = 0.0594007206919111, RX = -0.00431724064103929, RY = 0.0219523317568996 },
{ X = -0.0844700816795934, Y = 0.350746279332175, LX = 0.0165795714993096, LY = 0.00105279673595448, RX = -0.0168955455948653, RY = -0.00107286097563975 },
{ X = -0.12621264005096, Y = 0.276119390085562, LX = -0.00175949849957938, LY = 0.0319944615093257, RX = -0.0134168382993644, RY = 0.0321068371093163 },
{ X = -0.182078616108222, Y = 0.330223889938041, LX = 0.0356504214074028, LY = 8.46063979037582e-009, RX = -0.0395367305555812, RY = -9.38294759260426e-009 }
}
} }
}
},
Ellipse2 = EllipseMask {
Inputs = {
MaskWidth = Input { Value = 1920, },
MaskHeight = Input { Value = 1080, },
PixelAspect = Input { Value = { 1, 1 }, },
ClippingMode = Input { Value = FuID { "None" }, },
Center = Input { Value = { 0.721751955880467, 0.71373839965845 }, },
Width = Input { Value = 0.138273157307843, },
Height = Input { Value = 0.138273157307843, },
},
ViewInfo = OperatorInfo { Pos = { -862.004, -110.791 } },
},
mountains = GroupOperator {
NameSet = true,
Outputs = {
Output1 = InstanceOutput {
SourceOp = "ColorCorrector2",
Source = "Output",
}
},
ViewInfo = GroupInfo {
Pos = { -201.333, -110.182 },
Flags = {
AllowPan = false,
GridSnap = true,
AutoSnap = true,
RemoveRouters = true
},
Size = { 126, 128.856, 63, 22 },
Direction = "Horizontal",
PipeStyle = "Direct",
Scale = 1,
Offset = { -605, 355.756 }
},
Tools = ordered() {
ColorCorrector2 = ColorCorrector {
CtrlWShown = false,
Inputs = {
MasterRGBGain = Input { Value = 0.0936170212765957, },
ColorRanges = Input {
Value = ColorCurves {
Curves = {
{
Points = {
{ 0, 1 },
{ 0.4, 0.2 },
{ 0.6, 0 },
{ 1, 0 }
}
},
{
Points = {
{ 0, 0 },
{ 0.4, 0 },
{ 0.6, 0.2 },
{ 1, 1 }
}
}
}
},
},
HistogramIgnoreTransparent = Input { Value = 1, },
Input = Input {
SourceOp = "Background1",
Source = "Output",
},
},
ViewInfo = OperatorInfo { Pos = { 605, -280.5 } },
},
Polygon1 = PolylineMask {
DrawMode = "InsertAndModify",
DrawMode2 = "InsertAndModify",
CtrlWShown = false,
Inputs = {
MaskWidth = Input { Value = 1920, },
MaskHeight = Input { Value = 1080, },
PixelAspect = Input { Value = { 1, 1 }, },
ClippingMode = Input { Value = FuID { "None" }, },
Polyline = Input {
SourceOp = "Polygon1Polyline",
Source = "Value",
},
Polyline2 = Input {
Value = Polyline {
},
Disabled = true,
},
},
ViewInfo = OperatorInfo { Pos = { 605, -346.5 } },
},
Background1 = Background {
CtrlWShown = false,
Inputs = {
EffectMask = Input {
SourceOp = "Polygon1",
Source = "Mask",
},
GlobalOut = Input { Value = 359, },
Width = Input { Value = 1920, },
Height = Input { Value = 1080, },
["Gamut.SLogVersion"] = Input { Value = FuID { "SLog2" }, },
Type = Input { Value = FuID { "Vertical" }, },
TopLeftRed = Input { Value = 0.717191876267899, },
TopLeftGreen = Input { Value = 0.916888151197782, },
TopLeftBlue = Input { Value = 0.99390243902439, },
BottomLeftRed = Input { Value = 0.104009281085367, },
BottomLeftGreen = Input { Value = 0.133333333333333, },
BottomLeftBlue = Input { Value = 0.0883235950180545, },
},
ViewInfo = OperatorInfo { Pos = { 605, -313.5 } },
}
},
},
Polygon1Polyline = BezierSpline {
SplineColor = { Red = 173, Green = 255, Blue = 47 },
NameSet = true,
KeyFrames = {
[0] = { 0, Flags = { Linear = true, LockedY = true }, Value = Polyline {
Closed = true,
Points = {
{ X = -0.5, Y = -0.208908762049487, LX = -0.0685753821739407, LY = -0.0218458023759916, RX = 0.110781012175564, RY = 0.0352910916757434 },
{ X = -0.196165189146996, Y = 0.0528713360311478, LX = -0.0965268993387204, LY = -0.113244503202446, RX = 0.0285152400401489, RY = -0.0724670541576666 },
{ X = -0.0353982299566269, Y = -0.117285723995975, LX = -0.107669616387305, LY = -0.00261779308943693, RX = 0.0677780388114997, RY = 0.0016479011216848 },
{ X = 0.156342178583145, Y = 0.00313312261123355, LX = -0.0619811848641362, LY = -0.0593854727427617, RX = 0.0319567369324619, RY = -0.0427574192354192 },
{ X = 0.252212375402451, Y = -0.125139142584613, LX = -0.0503579658247525, LY = 0.0365519821930262, RX = 0.0735808238213591, RY = -0.0534081335101199 },
{ X = 0.500982790950715, Y = -0.208899619197158, LX = -0.0838874608763229, LY = -0.013701870211761, RX = 0.0149133106854957, RY = -0.124155063756536 },
{ Linear = true, X = 0.545722723007202, Y = -0.581364810466766, LX = -0.0149133106854957, LY = 0.124155063756536, RX = -0.362340219370149, RY = 0.00262466560615748 },
{ Linear = true, X = -0.541297912597656, Y = -0.573490798473358, LX = 0.362340219370149, LY = -0.00262466560615748, RX = 0, RY = 0 }
}
} }
}
},
Rectangle1 = RectangleMask {
Inputs = {
SoftEdge = Input { Value = 0.0127659574468085, },
MaskWidth = Input { Value = 1920, },
MaskHeight = Input { Value = 1080, },
PixelAspect = Input { Value = { 1, 1 }, },
ClippingMode = Input { Value = FuID { "None" }, },
Center = Input { Value = { 0.5, -0.0354330708661418 }, },
Width = Input { Value = 1.03097345132743, },
},
ViewInfo = OperatorInfo { Pos = { 238.667, -110.182 } },
},
ground = Background {
NameSet = true,
Inputs = {
EffectMask = Input {
SourceOp = "Rectangle1",
Source = "Mask",
},
GlobalOut = Input { Value = 359, },
Width = Input { Value = 1920, },
Height = Input { Value = 1080, },
["Gamut.SLogVersion"] = Input { Value = FuID { "SLog2" }, },
Type = Input { Value = FuID { "Gradient" }, },
Start = Input { Value = { 0.5, 0.23 }, },
End = Input { Value = { 0.492625368731563, -0.31151832460733 }, },
Gradient = Input {
Value = Gradient {
Colors = {
[0] = { 0, 0.181818181818182, 0, 1 },
[1] = { 0.286666666666667, 0.206468253968254, 0.0784920634920635, 1 }
}
},
},
},
ViewInfo = OperatorInfo { Pos = { 238.667, -77.1818 } },
},
Merge11 = Merge {
Inputs = {
Background = Input {
SourceOp = "Background7",
Source = "Output",
},
Foreground = Input {
SourceOp = "Transform6",
Source = "Output",
},
PerformDepthMerge = Input { Value = 0, },
},
ViewInfo = OperatorInfo { Pos = { 458.667, -77.1818 } },
},
Merge12 = Merge {
Inputs = {
Background = Input {
SourceOp = "Background7",
Source = "Output",
},
Foreground = Input {
SourceOp = "Transform2",
Source = "Output",
},
PerformDepthMerge = Input { Value = 0, },
},
ViewInfo = OperatorInfo { Pos = { 898.667, -77.1818 } },
},
MediaOut2 = MediaOut {
Inputs = {
Index = Input { Value = "1", },
Input = Input {
SourceOp = "Merge9",
Source = "Output",
},
},
ViewInfo = OperatorInfo { Pos = { 1160.99, -1.00685 } },
},
backWheel = Transform {
NameSet = true,
Inputs = {
Pivot = Input { Value = { 0.774753289473684, 0.37719298245614 }, },
Input = Input {
SourceOp = "MatteControl2",
Source = "Output",
},
},
ViewInfo = OperatorInfo { Pos = { 953.667, -11.1818 } },
Colors = {
TileColor = { R = 0.913725490196078, G = 0.549019607843137, B = 0.709803921568627 },
TextColor = { R = 0.725490196078431, G = 0.690196078431373, B = 0.592156862745098 },
}
},
frontWheel = Transform {
NameSet = true,
Inputs = {
Pivot = Input { Value = { 0.213450292397661, 0.371345029239766 }, },
},
ViewInfo = OperatorInfo { Pos = { 843.667, -11.1818 } },
Colors = {
TileColor = { R = 0.913725490196078, G = 0.549019607843137, B = 0.709803921568627 },
TextColor = { R = 0.725490196078431, G = 0.690196078431373, B = 0.592156862745098 },
}
},
treeXF = Transform {
NameSet = true,
Inputs = {
Center = Input { Value = { 0.489675516224189, 0.5 }, },
Edges = Input { Value = 1, },
Input = Input {
SourceOp = "Merge11",
Source = "Output",
},
},
ViewInfo = OperatorInfo { Pos = { 458.667, 21.8182 } },
Colors = {
TileColor = { R = 0.913725490196078, G = 0.549019607843137, B = 0.709803921568627 },
TextColor = { R = 0.725490196078431, G = 0.690196078431373, B = 0.592156862745098 },
}
},
streetXF = Transform {
NameSet = true,
Inputs = {
Edges = Input { Value = 1, },
Input = Input {
SourceOp = "Merge17_1",
Source = "Output",
},
},
ViewInfo = OperatorInfo { Pos = { 678.667, 21.8182 } },
Colors = {
TileColor = { R = 0.913725490196078, G = 0.549019607843137, B = 0.709803921568627 },
TextColor = { R = 0.725490196078431, G = 0.690196078431373, B = 0.592156862745098 },
}
},
carXF = Transform {
NameSet = true,
Inputs = {
Center = Input { Value = { 0.51046989904026, 0.170418848167539 }, },
Edges = Input { Value = 1, },
Input = Input {
SourceOp = "Merge12",
Source = "Output",
},
},
ViewInfo = OperatorInfo { Pos = { 898.667, 21.8182 } },
Colors = {
TileColor = { R = 0.913725490196078, G = 0.549019607843137, B = 0.709803921568627 },
TextColor = { R = 0.725490196078431, G = 0.690196078431373, B = 0.592156862745098 },
}
},
hillsXF = Transform {
NameSet = true,
Inputs = {
Center = Input { Value = { 0.512590249364932, 0.5 }, },
Edges = Input { Value = 1, },
Input = Input {
SourceOp = "Background5",
Source = "Output",
},
},
ViewInfo = OperatorInfo { Pos = { 18.6667, 21.8182 } },
Colors = {
TileColor = { R = 0.913725490196078, G = 0.549019607843137, B = 0.709803921568627 },
TextColor = { R = 0.725490196078431, G = 0.690196078431373, B = 0.592156862745098 },
}
},
mountainXF = Transform {
NameSet = true,
Inputs = {
Center = Input { Value = { 0.50053158346514, 0.56282722513089 }, },
Edges = Input { Value = 1, },
Input = Input {
SourceOp = "ColorCorrector2",
Source = "Output",
},
},
ViewInfo = OperatorInfo { Pos = { -201.333, 21.8182 } },
Colors = {
TileColor = { R = 0.913725490196078, G = 0.549019607843137, B = 0.709803921568627 },
TextColor = { R = 0.725490196078431, G = 0.690196078431373, B = 0.592156862745098 },
}
},
cloudXF = Transform {
NameSet = true,
Inputs = {
Center = Input { Value = { 0.495568685376662, 0.5 }, },
Edges = Input { Value = 1, },
Input = Input {
SourceOp = "Merge5",
Source = "Output",
},
},
ViewInfo = OperatorInfo { Pos = { -641.333, 21.8182 } },
Colors = {
TileColor = { R = 0.913725490196078, G = 0.549019607843137, B = 0.709803921568627 },
TextColor = { R = 0.725490196078431, G = 0.690196078431373, B = 0.592156862745098 },
}
},
MediaOut1 = MediaOut {
Inputs = {
Index = Input { Value = "0", },
},
ViewInfo = OperatorInfo { Pos = { 440, 49.5 } },
},
Merge13 = Merge {
CtrlWZoom = false,
Inputs = {
Background = Input {
SourceOp = "Merge10",
Source = "Output",
},
Foreground = Input {
SourceOp = "streetXF",
Source = "Output",
},
PerformDepthMerge = Input { Value = 0, },
},
ViewInfo = OperatorInfo { Pos = { 680.385, 87.8182 } },
},
Merge10 = Merge {
Inputs = {
Background = Input {
SourceOp = "Merge8",
Source = "Output",
},
Foreground = Input {
SourceOp = "treeXF",
Source = "Output",
},
PerformDepthMerge = Input { Value = 0, },
},
ViewInfo = OperatorInfo { Pos = { 458.667, 87.8182 } },
},
Sun = Background {
NameSet = true,
Inputs = {
EffectMask = Input {
SourceOp = "Ellipse2",
Source = "Mask",
},
GlobalOut = Input { Value = 359, },
Width = Input { Value = 1920, },
Height = Input { Value = 1080, },
["Gamut.SLogVersion"] = Input { Value = FuID { "SLog2" }, },
TopLeftRed = Input { Value = 1, },
TopLeftGreen = Input { Value = 1, },
},
ViewInfo = OperatorInfo { Pos = { -861.333, 87.8182 } },
},
Merge9 = Merge {
Inputs = {
Background = Input {
SourceOp = "Merge13",
Source = "Output",
},
Foreground = Input {
SourceOp = "carXF",
Source = "Output",
},
PerformDepthMerge = Input { Value = 0, },
},
ViewInfo = OperatorInfo { Pos = { 898.667, 87.8182 } },
},
Merge2 = Merge {
Inputs = {
Background = Input {
SourceOp = "DaySky1",
Source = "Output",
},
Foreground = Input {
SourceOp = "Merge",
Source = "Output",
},
PerformDepthMerge = Input { Value = 0, },
},
ViewInfo = OperatorInfo { Pos = { -421.333, 87.8182 } },
},
Merge6 = Merge {
Inputs = {
Background = Input {
SourceOp = "Merge2",
Source = "Output",
},
Foreground = Input {
SourceOp = "mountainXF",
Source = "Output",
},
PerformDepthMerge = Input { Value = 0, },
},
ViewInfo = OperatorInfo { Pos = { -201.333, 87.8182 } },
},
Merge7 = Merge {
Inputs = {
Background = Input {
SourceOp = "Merge6",
Source = "Output",
},
Foreground = Input {
SourceOp = "hillsXF",
Source = "Output",
},
PerformDepthMerge = Input { Value = 0, },
},
ViewInfo = OperatorInfo { Pos = { 18.6667, 87.8182 } },
},
Merge = Merge {
NameSet = true,
Inputs = {
Background = Input {
SourceOp = "Sun",
Source = "Output",
},
Foreground = Input {
SourceOp = "cloudXF",
Source = "Output",
},
PerformDepthMerge = Input { Value = 0, },
},
ViewInfo = OperatorInfo { Pos = { -641.333, 87.8182 } },
},
Merge8 = Merge {
Inputs = {
Background = Input {
SourceOp = "Merge7",
Source = "Output",
},
Foreground = Input {
SourceOp = "ground",
Source = "Output",
},
PerformDepthMerge = Input { Value = 0, },
},
ViewInfo = OperatorInfo { Pos = { 238.667, 87.8182 } },
}
}
}
https://www.youtube.com/channel/UCeXBbc4qNkdbNPywhopu1iA
Offline
User avatar

Bryan Ray

  • Posts: 2485
  • Joined: Mon Nov 28, 2016 5:32 am
  • Location: Los Angeles, CA, USA

Re: Fusion: Copying a Selected Area to another Location

PostTue Oct 20, 2020 2:55 pm

Will look at your comp in a few moments, but if you paste the nodes between [code] [/code] tags, it will go into that nice code box, preserve formatting, and not make your post three miles long.

Fortunately, Lua doesn't care about indentation, so the copy-paste will still work. That won't be the case if you ever try to share Python code this way.
Bryan Ray
http://www.bryanray.name
http://www.sidefx.com
Offline
User avatar

Bryan Ray

  • Posts: 2485
  • Joined: Mon Nov 28, 2016 5:32 am
  • Location: Los Angeles, CA, USA

Re: Fusion: Copying a Selected Area to another Location

PostTue Oct 20, 2020 3:07 pm

Well… there are no expressions yet. It's not a demo, it's a tutorial. You have to follow the directions in the article and put the expressions in yourself. It looks like something broke the wheels, though. They should have taken an output from the car group. Maybe Fusion interpreted it as a feedback loop and broke it. This should be a better starting point:

Code: Select all
{
   Tools = ordered() {
      clouds = GroupOperator {
         NameSet = true,
         Outputs = {
            Output1 = InstanceOutput {
               SourceOp = "Merge5",
               Source = "Output",
            }
         },
         ViewInfo = GroupInfo {
            Pos = { 55, -445.5 },
            Flags = {
               AllowPan = false,
               GridSnap = true,
               AutoSnap = true,
               RemoveRouters = true
            },
            Size = { 676, 161.856, 338, 22 },
            Direction = "Horizontal",
            PipeStyle = "Direct",
            Scale = 1,
            Offset = { -55, 487.756 }
         },
         Tools = ordered() {
            Merge5 = Merge {
               CtrlWShown = false,
               Inputs = {
                  Background = Input {
                     SourceOp = "Merge4",
                     Source = "Output",
                  },
                  Foreground = Input {
                     SourceOp = "Merge3_1_1",
                     Source = "Output",
                  },
                  PerformDepthMerge = Input { Value = 0, },
               },
               ViewInfo = OperatorInfo { Pos = { 330, -379.5 } },
            },
            Merge4 = Merge {
               CtrlWShown = false,
               Inputs = {
                  Background = Input {
                     SourceOp = "Merge3",
                     Source = "Output",
                  },
                  Foreground = Input {
                     SourceOp = "Merge3_1",
                     Source = "Output",
                  },
                  PerformDepthMerge = Input { Value = 0, },
               },
               ViewInfo = OperatorInfo { Pos = { 110, -379.5 } },
            },
            Merge3_1_1 = Merge {
               CtrlWShown = false,
               Inputs = {
                  Background = Input {
                     SourceOp = "Background3_1_1",
                     Source = "Output",
                  },
                  Foreground = Input {
                     SourceOp = "Background2_1_1",
                     Source = "Output",
                  },
                  PerformDepthMerge = Input { Value = 0, },
               },
               ViewInfo = OperatorInfo { Pos = { 330, -412.5 } },
            },
            Background3_1_1 = Background {
               CtrlWShown = false,
               Inputs = {
                  EffectMask = Input {
                     SourceOp = "Instance_Polygon1_1_2",
                     Source = "Mask",
                  },
                  Width = Input { Value = 1920, },
                  Height = Input { Value = 1080, },
                  ["Gamut.SLogVersion"] = Input { Value = FuID { "SLog2" }, },
                  TopLeftRed = Input { Value = 1, },
                  TopLeftGreen = Input { Value = 1, },
                  TopLeftBlue = Input { Value = 1, },
               },
               ViewInfo = OperatorInfo { Pos = { 330, -445.5 } },
            },
            Instance_Polygon1_1_2 = PolylineMask {
               DrawMode = "InsertAndModify",
               DrawMode2 = "InsertAndModify",
               CtrlWShown = false,
               SourceOp = "Polygon1_1_2",
               Inputs = {
                  StartEndRenderScripts = Input { },
                  EffectMask = Input { },
                  Solid = Input { },
                  Polyline2 = Input {
                     Value = Polyline {
                     },
                     Disabled = true,
                  },
               },
               ViewInfo = OperatorInfo { Pos = { 330, -478.5 } },
            },
            Polygon1_1_2 = PolylineMask {
               DrawMode = "InsertAndModify",
               DrawMode2 = "InsertAndModify",
               CtrlWShown = false,
               Inputs = {
                  BorderWidth = Input { Value = 0.00252765957446808, },
                  Solid = Input { Value = 0, },
                  MaskWidth = Input { Value = 1920, },
                  MaskHeight = Input { Value = 1080, },
                  PixelAspect = Input { Value = { 1, 1 }, },
                  ClippingMode = Input { Value = FuID { "None" }, },
                  Polyline = Input {
                     SourceOp = "Polygon1_1_2Polyline",
                     Source = "Value",
                  },
                  Polyline2 = Input {
                     Value = Polyline {
                     },
                     Disabled = true,
                  },
               },
               ViewInfo = OperatorInfo { Pos = { 220, -478.5 } },
            },
            Background2_1_1 = Background {
               CtrlWShown = false,
               Inputs = {
                  EffectMask = Input {
                     SourceOp = "Polygon1_1_2",
                     Source = "Mask",
                  },
                  Width = Input { Value = 1920, },
                  Height = Input { Value = 1080, },
                  ["Gamut.SLogVersion"] = Input { Value = FuID { "SLog2" }, },
               },
               ViewInfo = OperatorInfo { Pos = { 220, -445.5 } },
            },
            Merge3_1 = Merge {
               CtrlWShown = false,
               Inputs = {
                  Background = Input {
                     SourceOp = "Background3_1",
                     Source = "Output",
                  },
                  Foreground = Input {
                     SourceOp = "Background2_1",
                     Source = "Output",
                  },
                  PerformDepthMerge = Input { Value = 0, },
               },
               ViewInfo = OperatorInfo { Pos = { 110, -412.5 } },
            },
            Merge3 = Merge {
               CtrlWShown = false,
               Inputs = {
                  Background = Input {
                     SourceOp = "Background3",
                     Source = "Output",
                  },
                  Foreground = Input {
                     SourceOp = "Background2",
                     Source = "Output",
                  },
                  PerformDepthMerge = Input { Value = 0, },
               },
               ViewInfo = OperatorInfo { Pos = { -110, -412.5 } },
            },
            Instance_Polygon1_2 = PolylineMask {
               DrawMode = "InsertAndModify",
               DrawMode2 = "InsertAndModify",
               CtrlWShown = false,
               SourceOp = "Polygon1_2",
               Inputs = {
                  StartEndRenderScripts = Input { },
                  EffectMask = Input { },
                  Solid = Input { },
                  Polyline2 = Input {
                     Value = Polyline {
                     },
                     Disabled = true,
                  },
               },
               ViewInfo = OperatorInfo { Pos = { 110, -478.5 } },
            },
            Background3_1 = Background {
               CtrlWShown = false,
               Inputs = {
                  EffectMask = Input {
                     SourceOp = "Instance_Polygon1_2",
                     Source = "Mask",
                  },
                  Width = Input { Value = 1920, },
                  Height = Input { Value = 1080, },
                  ["Gamut.SLogVersion"] = Input { Value = FuID { "SLog2" }, },
                  TopLeftRed = Input { Value = 1, },
                  TopLeftGreen = Input { Value = 1, },
                  TopLeftBlue = Input { Value = 1, },
               },
               ViewInfo = OperatorInfo { Pos = { 110, -445.5 } },
            },
            Background2_1 = Background {
               CtrlWShown = false,
               Inputs = {
                  EffectMask = Input {
                     SourceOp = "Polygon1_2",
                     Source = "Mask",
                  },
                  Width = Input { Value = 1920, },
                  Height = Input { Value = 1080, },
                  ["Gamut.SLogVersion"] = Input { Value = FuID { "SLog2" }, },
               },
               ViewInfo = OperatorInfo { Pos = { 0, -445.5 } },
            },
            Polygon1_2 = PolylineMask {
               DrawMode = "InsertAndModify",
               DrawMode2 = "InsertAndModify",
               CtrlWShown = false,
               Inputs = {
                  BorderWidth = Input { Value = 0.00325021276595745, },
                  Solid = Input { Value = 0, },
                  MaskWidth = Input { Value = 1920, },
                  MaskHeight = Input { Value = 1080, },
                  PixelAspect = Input { Value = { 1, 1 }, },
                  ClippingMode = Input { Value = FuID { "None" }, },
                  Polyline = Input {
                     SourceOp = "Polygon1_2Polyline",
                     Source = "Value",
                  },
                  Polyline2 = Input {
                     Value = Polyline {
                     },
                     Disabled = true,
                  },
               },
               ViewInfo = OperatorInfo { Pos = { 0, -478.5 } },
            },
            Background2 = Background {
               CtrlWShown = false,
               Inputs = {
                  EffectMask = Input {
                     SourceOp = "Polygon1_1_1_1",
                     Source = "Mask",
                  },
                  Width = Input { Value = 1920, },
                  Height = Input { Value = 1080, },
                  ["Gamut.SLogVersion"] = Input { Value = FuID { "SLog2" }, },
               },
               ViewInfo = OperatorInfo { Pos = { -220, -445.5 } },
            },
            Background3 = Background {
               CtrlWShown = false,
               Inputs = {
                  EffectMask = Input {
                     SourceOp = "Instance_Polygon1_1_1_1",
                     Source = "Mask",
                  },
                  Width = Input { Value = 1920, },
                  Height = Input { Value = 1080, },
                  ["Gamut.SLogVersion"] = Input { Value = FuID { "SLog2" }, },
                  TopLeftRed = Input { Value = 1, },
                  TopLeftGreen = Input { Value = 1, },
                  TopLeftBlue = Input { Value = 1, },
               },
               ViewInfo = OperatorInfo { Pos = { -110, -445.5 } },
            },
            Instance_Polygon1_1_1_1 = PolylineMask {
               DrawMode = "InsertAndModify",
               DrawMode2 = "InsertAndModify",
               CtrlWShown = false,
               SourceOp = "Polygon1_1_1_1",
               Inputs = {
                  StartEndRenderScripts = Input { },
                  EffectMask = Input { },
                  Solid = Input { },
                  Polyline2 = Input {
                     Value = Polyline {
                     },
                     Disabled = true,
                  },
               },
               ViewInfo = OperatorInfo { Pos = { -110, -478.5 } },
            },
            Polygon1_1_1_1 = PolylineMask {
               DrawMode = "InsertAndModify",
               DrawMode2 = "InsertAndModify",
               CtrlWShown = false,
               Inputs = {
                  BorderWidth = Input { Value = 0.00298553191489362, },
                  Solid = Input { Value = 0, },
                  MaskWidth = Input { Value = 1920, },
                  MaskHeight = Input { Value = 1080, },
                  PixelAspect = Input { Value = { 1, 1 }, },
                  ClippingMode = Input { Value = FuID { "None" }, },
                  Polyline = Input {
                     SourceOp = "Polygon1_1_1_1Polyline",
                     Source = "Value",
                  },
                  Polyline2 = Input {
                     Value = Polyline {
                     },
                     Disabled = true,
                  },
               },
               ViewInfo = OperatorInfo { Pos = { -220, -478.5 } },
            }
         },
      },
      Polygon1_1_2Polyline = BezierSpline {
         SplineColor = { Red = 173, Green = 255, Blue = 47 },
         NameSet = true,
         KeyFrames = {
            [0] = { 0, Flags = { Linear = true, LockedY = true }, Value = Polyline {
                  Closed = true,
                  Points = {
                     { X = 0.146976881620675, Y = 0.0932835765294174, LX = -0.0315218594859897, LY = 0.00548385535879412, RX = 0.106481650049961, RY = -0.00186567008495331 },
                     { Linear = true, X = 0.466421831770559, Y = 0.0876865662745575, LX = -0.106481650049961, LY = 0.00186567008495331, RX = 0.0124393414479982, RY = 0.0031683864065799 },
                     { X = 0.441238196705471, Y = 0.186567169072023, LX = 0.0203492907582517, LY = -0.0175037920243874, RX = -0.0159968958031025, RY = 0.0137600047343059 },
                     { X = 0.388772298021932, Y = 0.169776109617148, LX = 0.00440000691183765, LY = 0.0401897629578654, RX = -0.00457923890066389, RY = 0.0416144412678837 },
                     { X = 0.341437547976798, Y = 0.186262305547942, LX = 0.00788648447151667, LY = 0.0453761957393151, RX = -0.00864266800646357, RY = 0.0439462914202896 },
                     { X = 0.284889834374971, Y = 0.276119413660533, LX = 0.0331905826133111, LY = 0.0021075898759613, RX = -0.0228299957147499, RY = -0.00144969639120867 },
                     { X = 0.229506142740226, Y = 0.173507449787054, LX = -0.00237751086402998, LY = 0.0432323072997194, RX = -0.0134168382993644, RY = 0.0321068371093163 },
                     { X = 0.173640166682964, Y = 0.227611949639534, LX = 0.0356504214074028, LY = 8.46063979037582e-009, RX = -0.0317420176162112, RY = -7.53308843678243e-009 }
                  }
               } }
         }
      },
      Polygon1_2Polyline = BezierSpline {
         SplineColor = { Red = 96, Green = 255, Blue = 47 },
         NameSet = true,
         KeyFrames = {
            [0] = { 0, Flags = { Linear = true, LockedY = true }, Value = Polyline {
                  Closed = true,
                  Points = {
                     { X = -0.432843655347824, Y = 0.238805964589119, LX = -0.0260510026550124, LY = 0.00548385535879412, RX = 0.0930395255496594, RY = -0.00186566978841278 },
                     { Linear = true, X = -0.153725072741508, Y = 0.233208954334259, LX = -0.0930395255496594, LY = 0.00186566978841278, RX = 0.0192040319034556, RY = 0.00327109893696929 },
                     { X = -0.188352569296628, Y = 0.388059706385456, LX = 0.0328513487126612, LY = 0.00176998055430336, RX = -0.0197842482754337, RY = -0.00106594511644869 },
                     { X = -0.231374606490135, Y = 0.315298497676849, LX = 0.00490083460231086, LY = 0.044764334445174, RX = -0.010401115436384, RY = 0.0945215169676182 },
                     { X = -0.304826849780328, Y = 0.46641792112322, LX = 0.0634884851859418, LY = 0.0040314956256401, RX = -0.0340542776080771, RY = -0.00216243419273846 },
                     { X = -0.364637970924377, Y = 0.319029837846756, LX = -0.00293089976836914, LY = 0.0644873092758033, RX = -0.0110882446612632, RY = 0.0321068371093163 },
                     { X = -0.410807984823445, Y = 0.373134337699235, LX = 0.029463021467669, LY = 8.46063979037582e-009, RX = -0.0262329506786521, RY = -7.53308843678243e-009 }
                  }
               } }
         }
      },
      Polygon1_1_1_1Polyline = BezierSpline {
         SplineColor = { Red = 173, Green = 255, Blue = 47 },
         NameSet = true,
         KeyFrames = {
            [0] = { 0, Flags = { Linear = true, LockedY = true }, Value = Polyline {
                  Closed = true,
                  Points = {
                     { X = -0.22238303443389, Y = 0.167910442201059, LX = -0.0388541636179754, LY = 0.012144733657801, RX = 0.106481650049961, RY = -0.00186567008495331 },
                     { Linear = true, X = 0.0970619157159942, Y = 0.162313431946199, LX = -0.106481650049961, LY = 0.00186567008495331, RX = 0.0255731761946889, RY = -0.000420955116824906 },
                     { X = 0.0634837371042118, Y = 0.375000004892919, LX = 0.0414136900260482, LY = -0.0356226969180461, RX = -0.0194001377690947, RY = 0.0166873617753488 },
                     { X = 0.000524658987304472, Y = 0.348880587229088, LX = 0.0126813071360052, LY = 0.0673966061994412, RX = -0.0289184403696029, RY = 0.101670163796379 },
                     { X = -0.0573032704911978, Y = 0.303799618980778, LX = 0.0103239783261021, LY = 0.0594007206919111, RX = -0.00431724064103929, RY = 0.0219523317568996 },
                     { X = -0.0844700816795934, Y = 0.350746279332175, LX = 0.0165795714993096, LY = 0.00105279673595448, RX = -0.0168955455948653, RY = -0.00107286097563975 },
                     { X = -0.12621264005096, Y = 0.276119390085562, LX = -0.00175949849957938, LY = 0.0319944615093257, RX = -0.0134168382993644, RY = 0.0321068371093163 },
                     { X = -0.182078616108222, Y = 0.330223889938041, LX = 0.0356504214074028, LY = 8.46063979037582e-009, RX = -0.0395367305555812, RY = -9.38294759260426e-009 }
                  }
               } }
         }
      },
      mountains = GroupOperator {
         NameSet = true,
         Outputs = {
            Output1 = InstanceOutput {
               SourceOp = "ColorCorrector2",
               Source = "Output",
            }
         },
         ViewInfo = GroupInfo {
            Pos = { 495, -445.5 },
            Flags = {
               AllowPan = false,
               GridSnap = true,
               AutoSnap = true,
               RemoveRouters = true
            },
            Size = { 126, 128.856, 63, 22 },
            Direction = "Horizontal",
            PipeStyle = "Direct",
            Scale = 1,
            Offset = { -605, 355.756 }
         },
         Tools = ordered() {
            ColorCorrector2 = ColorCorrector {
               CtrlWShown = false,
               Inputs = {
                  MasterRGBGain = Input { Value = 0.0936170212765957, },
                  ColorRanges = Input {
                     Value = ColorCurves {
                        Curves = {
                           {
                              Points = {
                                 { 0, 1 },
                                 { 0.4, 0.2 },
                                 { 0.6, 0 },
                                 { 1, 0 }
                              }
                           },
                           {
                              Points = {
                                 { 0, 0 },
                                 { 0.4, 0 },
                                 { 0.6, 0.2 },
                                 { 1, 1 }
                              }
                           }
                        }
                     },
                  },
                  HistogramIgnoreTransparent = Input { Value = 1, },
                  Input = Input {
                     SourceOp = "Background1",
                     Source = "Output",
                  },
               },
               ViewInfo = OperatorInfo { Pos = { 605, -280.5 } },
            },
            Polygon1 = PolylineMask {
               DrawMode = "InsertAndModify",
               DrawMode2 = "InsertAndModify",
               CtrlWShown = false,
               Inputs = {
                  MaskWidth = Input { Value = 1920, },
                  MaskHeight = Input { Value = 1080, },
                  PixelAspect = Input { Value = { 1, 1 }, },
                  ClippingMode = Input { Value = FuID { "None" }, },
                  Polyline = Input {
                     SourceOp = "Polygon1Polyline",
                     Source = "Value",
                  },
                  Polyline2 = Input {
                     Value = Polyline {
                     },
                     Disabled = true,
                  },
               },
               ViewInfo = OperatorInfo { Pos = { 605, -346.5 } },
            },
            Background1 = Background {
               CtrlWShown = false,
               Inputs = {
                  EffectMask = Input {
                     SourceOp = "Polygon1",
                     Source = "Mask",
                  },
                  Width = Input { Value = 1920, },
                  Height = Input { Value = 1080, },
                  ["Gamut.SLogVersion"] = Input { Value = FuID { "SLog2" }, },
                  Type = Input { Value = FuID { "Vertical" }, },
                  TopLeftRed = Input { Value = 0.717191876267899, },
                  TopLeftGreen = Input { Value = 0.916888151197782, },
                  TopLeftBlue = Input { Value = 0.99390243902439, },
                  BottomLeftRed = Input { Value = 0.104009281085367, },
                  BottomLeftGreen = Input { Value = 0.133333333333333, },
                  BottomLeftBlue = Input { Value = 0.0883235950180545, },
               },
               ViewInfo = OperatorInfo { Pos = { 605, -313.5 } },
            }
         },
      },
      Polygon1Polyline = BezierSpline {
         SplineColor = { Red = 173, Green = 255, Blue = 47 },
         NameSet = true,
         KeyFrames = {
            [0] = { 0, Flags = { Linear = true, LockedY = true }, Value = Polyline {
                  Closed = true,
                  Points = {
                     { X = -0.5, Y = -0.208908762049487, LX = -0.0685753821739407, LY = -0.0218458023759916, RX = 0.110781012175564, RY = 0.0352910916757434 },
                     { X = -0.196165189146996, Y = 0.0528713360311478, LX = -0.0965268993387204, LY = -0.113244503202446, RX = 0.0285152400401489, RY = -0.0724670541576666 },
                     { X = -0.0353982299566269, Y = -0.117285723995975, LX = -0.107669616387305, LY = -0.00261779308943693, RX = 0.0677780388114997, RY = 0.0016479011216848 },
                     { X = 0.156342178583145, Y = 0.00313312261123355, LX = -0.0619811848641362, LY = -0.0593854727427617, RX = 0.0319567369324619, RY = -0.0427574192354192 },
                     { X = 0.252212375402451, Y = -0.125139142584613, LX = -0.0503579658247525, LY = 0.0365519821930262, RX = 0.0735808238213591, RY = -0.0534081335101199 },
                     { X = 0.500982790950715, Y = -0.208899619197158, LX = -0.0838874608763229, LY = -0.013701870211761, RX = 0.0149133106854957, RY = -0.124155063756536 },
                     { Linear = true, X = 0.545722723007202, Y = -0.581364810466766, LX = -0.0149133106854957, LY = 0.124155063756536, RX = -0.362340219370149, RY = 0.00262466560615748 },
                     { Linear = true, X = -0.541297912597656, Y = -0.573490798473358, LX = 0.362340219370149, LY = -0.00262466560615748, RX = 0, RY = 0 }
                  }
               } }
         }
      },
      Ellipse2 = EllipseMask {
         Inputs = {
            MaskWidth = Input { Value = 1920, },
            MaskHeight = Input { Value = 1080, },
            PixelAspect = Input { Value = { 1, 1 }, },
            ClippingMode = Input { Value = FuID { "None" }, },
            Center = Input { Value = { 0.721751955880467, 0.71373839965845 }, },
            Width = Input { Value = 0.138273157307843, },
            Height = Input { Value = 0.138273157307843, },
         },
         ViewInfo = OperatorInfo { Pos = { -165, -445.5 } },
      },
      DaySky1 = DaySky {
         Inputs = {
            Width = Input { Value = 1920, },
            Height = Input { Value = 1080, },
            ["Gamut.SLogVersion"] = Input { Value = FuID { "SLog2" }, },
            Latitude = Input { Value = 24.2790697674419, },
            Longitude = Input { Value = 0, },
            Day = Input { Value = FuID { "16" }, },
            Month = Input { Value = FuID { "June" }, },
            Time = Input { Value = 13.3953488372093, },
         },
         ViewInfo = OperatorInfo { Pos = { 275, -445.5 } },
      },
      hills = GroupOperator {
         NameSet = true,
         Outputs = {
            Output1 = InstanceOutput {
               SourceOp = "Background5",
               Source = "Output",
            }
         },
         ViewInfo = GroupInfo {
            Pos = { 715, -445.5 },
            Flags = {
               AllowPan = false,
               GridSnap = true,
               AutoSnap = true,
               RemoveRouters = true
            },
            Size = { 219.875, 194.856, 109.938, 22 },
            Direction = "Horizontal",
            PipeStyle = "Direct",
            Scale = 1,
            Offset = { -825, 487.756 }
         },
         Tools = ordered() {
            Background5 = Background {
               CtrlWShown = false,
               Inputs = {
                  EffectMask = Input {
                     SourceOp = "Ellipse3_6",
                     Source = "Mask",
                  },
                  Width = Input { Value = 1920, },
                  Height = Input { Value = 1080, },
                  ["Gamut.SLogVersion"] = Input { Value = FuID { "SLog2" }, },
                  Type = Input { Value = FuID { "Gradient" }, },
                  TopLeftGreen = Input { Value = 0.231707317073171, },
                  BottomLeftGreen = Input { Value = 0.0853658536585366, },
                  Start = Input { Value = { 0.214523714014632, 0.114173228346457 }, },
                  End = Input { Value = { 0.214180206794682, 0.434383202099738 }, },
                  Gradient = Input {
                     Value = Gradient {
                        Colors = {
                           [0] = { 0, 0.0727272727272727, 0, 1 },
                           [1] = { 0, 0.406060606060606, 0, 1 }
                        }
                     },
                  },
               },
               ViewInfo = OperatorInfo { Pos = { 825, -346.5 } },
            },
            Ellipse3_6 = EllipseMask {
               CtrlWShown = false,
               Inputs = {
                  EffectMask = Input {
                     SourceOp = "Ellipse3_5",
                     Source = "Mask",
                  },
                  MaskWidth = Input { Value = 1920, },
                  MaskHeight = Input { Value = 1080, },
                  PixelAspect = Input { Value = { 1, 1 }, },
                  ClippingMode = Input { Value = FuID { "None" }, },
                  Center = Input { Value = { 1.02584933530281, 0.227034120734908 }, },
                  Width = Input { Value = 0.306403562042398, },
                  Height = Input { Value = 0.125820074221251, },
               },
               ViewInfo = OperatorInfo { Pos = { 825, -379.5 } },
            },
            Ellipse3_1 = EllipseMask {
               CtrlWShown = false,
               Inputs = {
                  EffectMask = Input {
                     SourceOp = "Ellipse3",
                     Source = "Mask",
                  },
                  MaskWidth = Input { Value = 1920, },
                  MaskHeight = Input { Value = 1080, },
                  PixelAspect = Input { Value = { 1, 1 }, },
                  ClippingMode = Input { Value = FuID { "None" }, },
                  Center = Input { Value = { 0.223781388478582, 0.208661417322835 }, },
                  Width = Input { Value = 0.306403562042398, },
                  Height = Input { Value = 0.125820074221251, },
               },
               ViewInfo = OperatorInfo { Pos = { 880, -478.5 } },
            },
            Ellipse3_4 = EllipseMask {
               CtrlWShown = false,
               Inputs = {
                  EffectMask = Input {
                     SourceOp = "Ellipse3_3",
                     Source = "Mask",
                  },
                  MaskWidth = Input { Value = 1920, },
                  MaskHeight = Input { Value = 1080, },
                  PixelAspect = Input { Value = { 1, 1 }, },
                  ClippingMode = Input { Value = FuID { "None" }, },
                  Center = Input { Value = { 0.715657311669128, 0.213910761154856 }, },
                  Width = Input { Value = 0.140002213781894, },
                  Height = Input { Value = 0.167963594437367, },
               },
               ViewInfo = OperatorInfo { Pos = { 770, -412.5 } },
            },
            Ellipse3_3 = EllipseMask {
               CtrlWShown = false,
               Inputs = {
                  EffectMask = Input {
                     SourceOp = "Ellipse3_2",
                     Source = "Mask",
                  },
                  MaskWidth = Input { Value = 1920, },
                  MaskHeight = Input { Value = 1080, },
                  PixelAspect = Input { Value = { 1, 1 }, },
                  ClippingMode = Input { Value = FuID { "None" }, },
                  Center = Input { Value = { 0.522156573116691, 0.190288713910761 }, },
                  Width = Input { Value = 0.394344962242352, },
                  Height = Input { Value = 0.161931904731719, },
               },
               ViewInfo = OperatorInfo { Pos = { 880, -445.5 } },
            },
            Ellipse3_5 = EllipseMask {
               CtrlWShown = false,
               Inputs = {
                  EffectMask = Input {
                     SourceOp = "Ellipse3_4",
                     Source = "Mask",
                  },
                  MaskWidth = Input { Value = 1920, },
                  MaskHeight = Input { Value = 1080, },
                  PixelAspect = Input { Value = { 1, 1 }, },
                  ClippingMode = Input { Value = FuID { "None" }, },
                  Center = Input { Value = { 0.830871491875923, 0.211286089238845 }, },
                  Width = Input { Value = 0.246676514032496, },
                  Height = Input { Value = 0.125820074221251, },
               },
               ViewInfo = OperatorInfo { Pos = { 880, -412.5 } },
            },
            Ellipse3_2 = EllipseMask {
               CtrlWShown = false,
               Inputs = {
                  EffectMask = Input {
                     SourceOp = "Ellipse3_1",
                     Source = "Mask",
                  },
                  MaskWidth = Input { Value = 1920, },
                  MaskHeight = Input { Value = 1080, },
                  PixelAspect = Input { Value = { 1, 1 }, },
                  ClippingMode = Input { Value = FuID { "None" }, },
                  Center = Input { Value = { 0.39807976366322, 0.23490813648294 }, },
                  Width = Input { Value = 0.202363367799114, },
                  Height = Input { Value = 0.125820074221251, },
               },
               ViewInfo = OperatorInfo { Pos = { 770, -445.5 } },
            },
            Ellipse3 = EllipseMask {
               CtrlWShown = false,
               Inputs = {
                  MaskWidth = Input { Value = 1920, },
                  MaskHeight = Input { Value = 1080, },
                  PixelAspect = Input { Value = { 1, 1 }, },
                  ClippingMode = Input { Value = FuID { "None" }, },
                  Center = Input { Value = { 0.0288035450516987, 0.227034120734908 }, },
                  Width = Input { Value = 0.306403562042398, },
                  Height = Input { Value = 0.125820074221251, },
               },
               ViewInfo = OperatorInfo { Pos = { 770, -478.5 } },
            }
         },
      },
      mountainXF = Transform {
         NameSet = true,
         Inputs = {
            Center = Input { Value = { 0.50053158346514, 0.56282722513089 }, },
            Edges = Input { Value = 1, },
            Input = Input {
               SourceOp = "ColorCorrector2",
               Source = "Output",
            },
         },
         ViewInfo = OperatorInfo { Pos = { 495, -313.5 } },
         Colors = {
            TileColor = { R = 0.913725490196078, G = 0.549019607843137, B = 0.709803921568627 },
            TextColor = { R = 0.725490196078431, G = 0.690196078431373, B = 0.592156862745098 },
         }
      },
      cloudXF = Transform {
         NameSet = true,
         Inputs = {
            Center = Input { Value = { 0.495568685376662, 0.5 }, },
            Edges = Input { Value = 1, },
            Input = Input {
               SourceOp = "Merge5",
               Source = "Output",
            },
         },
         ViewInfo = OperatorInfo { Pos = { 55, -313.5 } },
         Colors = {
            TileColor = { R = 0.913725490196078, G = 0.549019607843137, B = 0.709803921568627 },
            TextColor = { R = 0.725490196078431, G = 0.690196078431373, B = 0.592156862745098 },
         }
      },
      hillsXF = Transform {
         NameSet = true,
         Inputs = {
            Center = Input { Value = { 0.512590249364932, 0.5 }, },
            Edges = Input { Value = 1, },
            Input = Input {
               SourceOp = "Background5",
               Source = "Output",
            },
         },
         ViewInfo = OperatorInfo { Pos = { 715, -313.5 } },
         Colors = {
            TileColor = { R = 0.913725490196078, G = 0.549019607843137, B = 0.709803921568627 },
            TextColor = { R = 0.725490196078431, G = 0.690196078431373, B = 0.592156862745098 },
         }
      },
      Rectangle1 = RectangleMask {
         Inputs = {
            SoftEdge = Input { Value = 0.0127659574468085, },
            MaskWidth = Input { Value = 1920, },
            MaskHeight = Input { Value = 1080, },
            PixelAspect = Input { Value = { 1, 1 }, },
            ClippingMode = Input { Value = FuID { "None" }, },
            Center = Input { Value = { 0.5, -0.0354330708661418 }, },
            Width = Input { Value = 1.03097345132743, },
         },
         ViewInfo = OperatorInfo { Pos = { 935, -445.5 } },
      },
      ground = Background {
         NameSet = true,
         Inputs = {
            EffectMask = Input {
               SourceOp = "Rectangle1",
               Source = "Mask",
            },
            Width = Input { Value = 1920, },
            Height = Input { Value = 1080, },
            ["Gamut.SLogVersion"] = Input { Value = FuID { "SLog2" }, },
            Type = Input { Value = FuID { "Gradient" }, },
            Start = Input { Value = { 0.5, 0.23 }, },
            End = Input { Value = { 0.492625368731563, -0.31151832460733 }, },
            Gradient = Input {
               Value = Gradient {
                  Colors = {
                     [0] = { 0, 0.181818181818182, 0, 1 },
                     [1] = { 0.286666666666667, 0.206468253968254, 0.0784920634920635, 1 }
                  }
               },
            },
         },
         ViewInfo = OperatorInfo { Pos = { 935, -412.5 } },
      },
      Merge = Merge {
         NameSet = true,
         Inputs = {
            Background = Input {
               SourceOp = "Sun",
               Source = "Output",
            },
            Foreground = Input {
               SourceOp = "cloudXF",
               Source = "Output",
            },
            PerformDepthMerge = Input { Value = 0, },
         },
         ViewInfo = OperatorInfo { Pos = { 55, -247.5 } },
      },
      Merge2 = Merge {
         Inputs = {
            Background = Input {
               SourceOp = "DaySky1",
               Source = "Output",
            },
            Foreground = Input {
               SourceOp = "Merge",
               Source = "Output",
            },
            PerformDepthMerge = Input { Value = 0, },
         },
         ViewInfo = OperatorInfo { Pos = { 275, -247.5 } },
      },
      Merge6 = Merge {
         Inputs = {
            Background = Input {
               SourceOp = "Merge2",
               Source = "Output",
            },
            Foreground = Input {
               SourceOp = "mountainXF",
               Source = "Output",
            },
            PerformDepthMerge = Input { Value = 0, },
         },
         ViewInfo = OperatorInfo { Pos = { 495, -247.5 } },
      },
      Merge7 = Merge {
         Inputs = {
            Background = Input {
               SourceOp = "Merge6",
               Source = "Output",
            },
            Foreground = Input {
               SourceOp = "hillsXF",
               Source = "Output",
            },
            PerformDepthMerge = Input { Value = 0, },
         },
         ViewInfo = OperatorInfo { Pos = { 715, -247.5 } },
      },
      Merge8 = Merge {
         Inputs = {
            Background = Input {
               SourceOp = "Merge7",
               Source = "Output",
            },
            Foreground = Input {
               SourceOp = "ground",
               Source = "Output",
            },
            PerformDepthMerge = Input { Value = 0, },
         },
         ViewInfo = OperatorInfo { Pos = { 935, -247.5 } },
      },
      Sun = Background {
         NameSet = true,
         Inputs = {
            EffectMask = Input {
               SourceOp = "Ellipse2",
               Source = "Mask",
            },
            Width = Input { Value = 1920, },
            Height = Input { Value = 1080, },
            ["Gamut.SLogVersion"] = Input { Value = FuID { "SLog2" }, },
            TopLeftRed = Input { Value = 1, },
            TopLeftGreen = Input { Value = 1, },
         },
         ViewInfo = OperatorInfo { Pos = { -165, -247.5 } },
      },
      TreeLoader = Loader {
         Clips = {
            Clip {
               ID = "Clip1",
               Filename = "Comp:tree-152954_640.png",
               FormatID = "PNGFormat",
               StartFrame = 640,
               LengthSetManually = true,
               TrimIn = 0,
               TrimOut = 0,
               ExtendFirst = 0,
               ExtendLast = 0,
               Loop = 0,
               AspectMode = 0,
               Depth = 0,
               TimeCode = 0,
               GlobalStart = 0,
               GlobalEnd = 0
            }
         },
         CtrlWZoom = false,
         NameSet = true,
         Inputs = {
            ["Gamut.SLogVersion"] = Input { Value = FuID { "SLog2" }, },
         },
         ViewInfo = OperatorInfo { Pos = { 1155, -610.5 } },
         Colors = {
            TileColor = { R = 0, G = 0.596078431372549, B = 0.6 },
            TextColor = { R = 0.725490196078431, G = 0.690196078431373, B = 0.592156862745098 },
         }
      },
      tree = GroupOperator {
         NameSet = true,
         Outputs = {
            Output1 = InstanceOutput {
               SourceOp = "Transform6",
               Source = "Output",
            }
         },
         ViewInfo = GroupInfo {
            Pos = { 1155, -445.5 },
            Flags = {
               AllowPan = false,
               GridSnap = true,
               AutoSnap = true,
               RemoveRouters = true
            },
            Size = { 126, 163.3, 63, 22 },
            Direction = "Horizontal",
            PipeStyle = "Direct",
            Scale = 1,
            Offset = { -1155, 654.2 }
         },
         Tools = ordered() {
            Transform6 = Transform {
               CtrlWShown = false,
               Inputs = {
                  Center = Input { Value = { -0.691546980028048, 0.243898668425609 }, },
                  Size = Input { Value = 0.621276595744681, },
                  Input = Input {
                     SourceOp = "MatteControl4",
                     Source = "Output",
                  },
               },
               ViewInfo = OperatorInfo { Pos = { 1155, -544.5 } },
            },
            MatteControl4 = MatteControl {
               CtrlWShown = false,
               Inputs = {
                  MatteBlur = Input { Value = 1.4468085106383, },
                  PostMultiplyImage = Input { Value = 1, },
                  Background = Input {
                     SourceOp = "Gamut1_1",
                     Source = "Output",
                  },
               },
               ViewInfo = OperatorInfo { Pos = { 1155, -577.5 } },
            },
            Gamut1_1 = GamutConvert {
               CtrlWShown = false,
               CustomData = {
                  Settings = {
                     [1] = {
                        Tools = ordered() {
                           Gamut1 = GamutConvert {
                              Inputs = {
                                 SourceSpace = Input { Value = FuID { "sRGB" } },
                                 Input = Input {
                                    SourceOp = "Loader1",
                                    Source = "Output"
                                 }
                              },
                              Name = "Gamut1",
                              CtrlWZoom = false,
                              ViewInfo = OperatorInfo { Pos = { 318, 87 } },
                              CustomData = {
                              }
                           }
                        }
                     },
                     [2] = {
                        Tools = ordered() {
                           Gamut1 = GamutConvert {
                              Inputs = {
                                 OutputSpace = Input { Value = FuID { "sRGB" } },
                                 Input = Input {
                                    SourceOp = "Loader1",
                                    Source = "Output"
                                 }
                              },
                              CtrlWZoom = false,
                              ViewInfo = OperatorInfo { Pos = { 318, 87 } },
                              CustomData = {
                              }
                           }
                        }
                     }
                  }
               },
               Inputs = {
                  SourceSpace = Input { Value = FuID { "sRGB" }, },
                  Input = Input {
                     SourceOp = "WirelessLink1",
                     Source = "Output",
                  },
               },
               ViewInfo = OperatorInfo { Pos = { 1155, -610.5 } },
            },
            WirelessLink1 = Fuse.Wireless {
               CtrlWShown = false,
               Inputs = {
                  Input = Input {
                     SourceOp = "TreeLoader",
                     Source = "Output",
                  },
               },
               ViewInfo = OperatorInfo { Pos = { 1155, -643.5 } },
            }
         },
      },
      Merge11 = Merge {
         Inputs = {
            Background = Input {
               SourceOp = "Background7",
               Source = "Output",
            },
            Foreground = Input {
               SourceOp = "Transform6",
               Source = "Output",
            },
            PerformDepthMerge = Input { Value = 0, },
         },
         ViewInfo = OperatorInfo { Pos = { 1155, -412.5 } },
      },
      treeXF = Transform {
         NameSet = true,
         Inputs = {
            Center = Input { Value = { 0.489675516224189, 0.5 }, },
            Edges = Input { Value = 1, },
            Input = Input {
               SourceOp = "Merge11",
               Source = "Output",
            },
         },
         ViewInfo = OperatorInfo { Pos = { 1155, -313.5 } },
         Colors = {
            TileColor = { R = 0.913725490196078, G = 0.549019607843137, B = 0.709803921568627 },
            TextColor = { R = 0.725490196078431, G = 0.690196078431373, B = 0.592156862745098 },
         }
      },
      Merge10 = Merge {
         Inputs = {
            Background = Input {
               SourceOp = "Merge8",
               Source = "Output",
            },
            Foreground = Input {
               SourceOp = "treeXF",
               Source = "Output",
            },
            PerformDepthMerge = Input { Value = 0, },
         },
         ViewInfo = OperatorInfo { Pos = { 1155, -247.5 } },
      },
      Merge13 = Merge {
         Inputs = {
            Background = Input {
               SourceOp = "Merge10",
               Source = "Output",
            },
            Foreground = Input {
               SourceOp = "streetXF",
               Source = "Output",
            },
            PerformDepthMerge = Input { Value = 0, },
         },
         ViewInfo = OperatorInfo { Pos = { 1375, -247.5 } },
      },
      Background7 = Background {
         Inputs = {
            Width = Input { Value = 1920, },
            Height = Input { Value = 1080, },
            ["Gamut.SLogVersion"] = Input { Value = FuID { "SLog2" }, },
            TopLeftAlpha = Input { Value = 0, },
         },
         ViewInfo = OperatorInfo { Pos = { 1375, -511.5 } },
      },
      street = GroupOperator {
         NameSet = true,
         Outputs = {
            Output1 = InstanceOutput {
               SourceOp = "Merge17_1",
               Source = "Output",
            }
         },
         ViewInfo = GroupInfo {
            Pos = { 1375, -445.5 },
            Flags = {
               AllowPan = false,
               GridSnap = true,
               AutoSnap = true,
               RemoveRouters = true
            },
            Size = { 346, 295.3, 173, 22 },
            Direction = "Horizontal",
            PipeStyle = "Direct",
            Scale = 1,
            Offset = { -1485, 588.2 }
         },
         Tools = ordered() {
            Merge17_1 = Merge {
               CtrlWShown = false,
               Inputs = {
                  Background = Input {
                     SourceOp = "Merge17",
                     Source = "Output",
                  },
                  Foreground = Input {
                     SourceOp = "Transform3_1_1",
                     Source = "Output",
                  },
                  PerformDepthMerge = Input { Value = 0, },
               },
               ViewInfo = OperatorInfo { Pos = { 1430, -346.5 } },
            },
            Transform3_1_1 = Transform {
               CtrlWShown = false,
               Inputs = {
                  Center = Input { Value = { 22.8260927862698, 0.5 }, },
                  Input = Input {
                     SourceOp = "Merge15",
                     Source = "Output",
                  },
               },
               ViewInfo = OperatorInfo { Pos = { 1540, -346.5 } },
            },
            Transform3_1 = Transform {
               CtrlWShown = false,
               Inputs = {
                  Center = Input { Value = { 15.9839875231119, 0.5 }, },
                  Input = Input {
                     SourceOp = "Merge15",
                     Source = "Output",
                  },
               },
               ViewInfo = OperatorInfo { Pos = { 1540, -379.5 } },
            },
            Merge17 = Merge {
               CtrlWShown = false,
               Inputs = {
                  Background = Input {
                     SourceOp = "Merge16",
                     Source = "Output",
                  },
                  Foreground = Input {
                     SourceOp = "Transform3_1",
                     Source = "Output",
                  },
                  PerformDepthMerge = Input { Value = 0, },
               },
               ViewInfo = OperatorInfo { Pos = { 1430, -379.5 } },
            },
            Transform3 = Transform {
               CtrlWShown = false,
               Inputs = {
                  Center = Input { Value = { 7.50444594995131, 0.5 }, },
                  Input = Input {
                     SourceOp = "Merge15",
                     Source = "Output",
                  },
               },
               ViewInfo = OperatorInfo { Pos = { 1540, -412.5 } },
            },
            Merge16 = Merge {
               CtrlWShown = false,
               Inputs = {
                  Background = Input {
                     SourceOp = "Merge14",
                     Source = "Output",
                  },
                  Foreground = Input {
                     SourceOp = "Transform3",
                     Source = "Output",
                  },
                  PerformDepthMerge = Input { Value = 0, },
               },
               ViewInfo = OperatorInfo { Pos = { 1430, -412.5 } },
            },
            Merge14 = Merge {
               CtrlWShown = false,
               Inputs = {
                  Background = Input {
                     SourceOp = "Background4",
                     Source = "Output",
                  },
                  Foreground = Input {
                     SourceOp = "Merge15",
                     Source = "Output",
                  },
                  PerformDepthMerge = Input { Value = 0, },
               },
               ViewInfo = OperatorInfo { Pos = { 1430, -445.5 } },
            },
            Background4 = Background {
               CtrlWShown = false,
               Inputs = {
                  EffectMask = Input {
                     SourceOp = "Rectangle2",
                     Source = "Mask",
                  },
                  Width = Input { Value = 1920, },
                  Height = Input { Value = 1080, },
                  ["Gamut.SLogVersion"] = Input { Value = FuID { "SLog2" }, },
                  TopLeftRed = Input { Value = 0.00666666666666671, },
                  TopLeftGreen = Input { Value = 0.00666666666666671, },
                  TopLeftBlue = Input { Value = 0.00666666666666671, },
               },
               ViewInfo = OperatorInfo { Pos = { 1375, -478.5 } },
            },
            Transform1_1 = Transform {
               CtrlWShown = false,
               Inputs = {
                  Center = Input { Value = { -8.52806558727912, -42.0454545454545 }, },
                  Input = Input {
                     SourceOp = "Background6",
                     Source = "Output",
                  },
               },
               ViewInfo = OperatorInfo { Pos = { 1595, -544.5 } },
            },
            Rectangle2 = RectangleMask {
               CtrlWShown = false,
               Inputs = {
                  MaskWidth = Input { Value = 1920, },
                  MaskHeight = Input { Value = 1080, },
                  PixelAspect = Input { Value = { 1, 1 }, },
                  ClippingMode = Input { Value = FuID { "None" }, },
                  Center = Input { Value = { 0.5, 0.0591719228813675 }, },
                  Width = Input { Value = 1.03982300884956, },
                  Height = Input { Value = 0.153488340135494, },
               },
               ViewInfo = OperatorInfo { Pos = { 1375, -511.5 } },
            },
            Merge15 = Merge {
               CtrlWShown = false,
               Inputs = {
                  Background = Input {
                     SourceOp = "Transform1",
                     Source = "Output",
                  },
                  Foreground = Input {
                     SourceOp = "Transform1_1",
                     Source = "Output",
                  },
                  PerformDepthMerge = Input { Value = 0, },
               },
               ViewInfo = OperatorInfo { Pos = { 1485, -511.5 } },
            },
            Background6 = Background {
               CtrlWShown = false,
               Inputs = {
                  Width = Input { Value = 66, },
                  Height = Input { Value = 11, },
                  ["Gamut.SLogVersion"] = Input { Value = FuID { "SLog2" }, },
                  TopLeftRed = Input { Value = 0.933333333333333, },
                  TopLeftGreen = Input { Value = 0.933333333333333, },
                  TopLeftBlue = Input { Value = 0.933333333333333, },
               },
               ViewInfo = OperatorInfo { Pos = { 1540, -577.5 } },
            },
            Transform1 = Transform {
               CtrlWShown = false,
               Inputs = {
                  Center = Input { Value = { -12.2485388669286, -42.0454545454545 }, },
                  Input = Input {
                     SourceOp = "Background6",
                     Source = "Output",
                  },
               },
               ViewInfo = OperatorInfo { Pos = { 1485, -544.5 } },
            }
         },
      },
      streetXF = Transform {
         NameSet = true,
         Inputs = {
            Edges = Input { Value = 1, },
            Input = Input {
               SourceOp = "Merge17_1",
               Source = "Output",
            },
         },
         ViewInfo = OperatorInfo { Pos = { 1375, -313.5 } },
         Colors = {
            TileColor = { R = 0.913725490196078, G = 0.549019607843137, B = 0.709803921568627 },
            TextColor = { R = 0.725490196078431, G = 0.690196078431373, B = 0.592156862745098 },
         }
      },
      frontWheel = Transform {
         NameSet = true,
         Inputs = {
            Pivot = Input { Value = { 0.213450292397661, 0.371345029239766 }, },
            Input = Input {
               SourceOp = "MatteControl2",
               Source = "Output",
            },
         },
         ViewInfo = OperatorInfo { Pos = { 1533.33, -533.773 } },
         Colors = {
            TileColor = { R = 0.913725490196078, G = 0.549019607843137, B = 0.709803921568627 },
            TextColor = { R = 0.725490196078431, G = 0.690196078431373, B = 0.592156862745098 },
         }
      },
      Merge1 = Merge {
         Inputs = {
            Background = Input {
               SourceOp = "MatteControl3",
               Source = "Output",
            },
            Foreground = Input {
               SourceOp = "frontWheel",
               Source = "Output",
            },
            PerformDepthMerge = Input { Value = 0, },
         },
         ViewInfo = OperatorInfo { Pos = { 1594.33, -498.364 } },
         Colors = { TileColor = { R = 0.886274509803922, G = 0.662745098039216, B = 0.109803921568627 }, }
      },
      Merge12 = Merge {
         Inputs = {
            Background = Input {
               SourceOp = "Background7",
               Source = "Output",
            },
            Foreground = Input {
               SourceOp = "Transform2",
               Source = "Output",
            },
            PerformDepthMerge = Input { Value = 0, },
         },
         ViewInfo = OperatorInfo { Pos = { 1596.33, -382.197 } },
      },
      carXF = Transform {
         NameSet = true,
         Inputs = {
            Center = Input { Value = { 0.51046989904026, 0.170418848167539 }, },
            Edges = Input { Value = 1, },
            Input = Input {
               SourceOp = "Merge12",
               Source = "Output",
            },
         },
         ViewInfo = OperatorInfo { Pos = { 1595, -313.5 } },
         Colors = {
            TileColor = { R = 0.913725490196078, G = 0.549019607843137, B = 0.709803921568627 },
            TextColor = { R = 0.725490196078431, G = 0.690196078431373, B = 0.592156862745098 },
         }
      },
      carMrg = Merge {
         NameSet = true,
         Inputs = {
            Background = Input {
               SourceOp = "Merge1",
               Source = "Output",
            },
            Foreground = Input {
               SourceOp = "backWheel",
               Source = "Output",
            },
            PerformDepthMerge = Input { Value = 0, },
         },
         ViewInfo = OperatorInfo { Pos = { 1595, -462.939 } },
         Colors = { TileColor = { R = 0.886274509803922, G = 0.662745098039216, B = 0.109803921568627 }, }
      },
      Transform2 = Transform {
         Inputs = {
            Edges = Input { Value = 1, },
            Input = Input {
               SourceOp = "carMrg",
               Source = "Output",
            },
         },
         ViewInfo = OperatorInfo { Pos = { 1595.67, -435.394 } },
         Colors = { TileColor = { R = 0.886274509803922, G = 0.662745098039216, B = 0.109803921568627 }, }
      },
      car = GroupOperator {
         NameSet = true,
         Outputs = {
            Output1 = InstanceOutput {
               SourceOp = "MatteControl2",
               Source = "Output",
            },
            Output2 = InstanceOutput {
               SourceOp = "MatteControl1",
               Source = "Output",
            },
            Output3 = InstanceOutput {
               SourceOp = "MatteControl3",
               Source = "Output",
            }
         },
         ViewInfo = GroupInfo {
            Pos = { 1597, -573.879 },
            Flags = {
               AllowPan = false,
               AutoSnap = true,
               RemoveRouters = true
            },
            Size = { 676, 196.773, 338, 24.2424 },
            Direction = "Horizontal",
            PipeStyle = "Direct",
            Scale = 1,
            Offset = { -2021, 616.303 }
         },
         Tools = ordered() {
            MatteControl3 = MatteControl {
               Inputs = {
                  ["Garbage.Matte"] = Input {
                     SourceOp = "Bitmap1",
                     Source = "Mask",
                  },
                  Background = Input {
                     SourceOp = "ColorCorrector1",
                     Source = "Output",
                  },
               },
               ViewInfo = OperatorInfo { Pos = { 2296, -541.667 } },
            },
            Bitmap1 = BitmapMask {
               Inputs = {
                  EffectMask = Input {
                     SourceOp = "Ellipse1_1",
                     Source = "Mask",
                  },
                  MaskWidth = Input { Value = 1920, },
                  MaskHeight = Input { Value = 1080, },
                  PixelAspect = Input { Value = { 1, 1 }, },
                  ClippingMode = Input { Value = FuID { "None" }, },
                  Image = Input {
                     SourceOp = "Ellipse1",
                     Source = "Mask",
                  },
               },
               ViewInfo = OperatorInfo { Pos = { 2296, -574.667 } },
            },
            Ellipse1 = EllipseMask {
               Inputs = {
                  MaskWidth = Input { Value = 1920, },
                  MaskHeight = Input { Value = 1080, },
                  PixelAspect = Input { Value = { 1, 1 }, },
                  ClippingMode = Input { Value = FuID { "None" }, },
                  Center = Input { Value = { 0.21364936440678, 0.371463704206242 }, },
                  Width = Input { Value = 0.171313273320567, },
                  Height = Input { Value = 0.171313273320567, },
               },
               ViewInfo = OperatorInfo { Pos = { 2241, -607.667 } },
            },
            Ellipse1_1 = EllipseMask {
               Inputs = {
                  MaskWidth = Input { Value = 1920, },
                  MaskHeight = Input { Value = 1080, },
                  PixelAspect = Input { Value = { 1, 1 }, },
                  ClippingMode = Input { Value = FuID { "None" }, },
                  Center = Input { Value = { 0.776736275814196, 0.375982809581634 }, },
                  Width = Input { Value = 0.17815241017174, },
                  Height = Input { Value = 0.17815241017174, },
               },
               ViewInfo = OperatorInfo { Pos = { 2241, -475.667 } },
            },
            MatteControl1 = MatteControl {
               Inputs = {
                  ["Garbage.Matte"] = Input {
                     SourceOp = "Ellipse1",
                     Source = "Mask",
                  },
                  ["Garbage.MaskInverted"] = Input { Value = 1, },
                  Background = Input {
                     SourceOp = "ColorCorrector1",
                     Source = "Output",
                  },
               },
               ViewInfo = OperatorInfo { Pos = { 2186, -574.667 } },
            },
            MatteControl2 = MatteControl {
               Inputs = {
                  ["Garbage.Matte"] = Input {
                     SourceOp = "Ellipse1_1",
                     Source = "Mask",
                  },
                  ["Garbage.MaskInverted"] = Input { Value = 1, },
                  Background = Input {
                     SourceOp = "ColorCorrector1",
                     Source = "Output",
                  },
               },
               ViewInfo = OperatorInfo { Pos = { 2186, -508.667 } },
            },
            ColorCorrector1 = ColorCorrector {
               Inputs = {
                  MasterRGBGamma = Input { Value = 1.94468085106383, },
                  ColorRanges = Input {
                     Value = ColorCurves {
                        Curves = {
                           {
                              Points = {
                                 { 0, 1 },
                                 { 0.4, 0.2 },
                                 { 0.6, 0 },
                                 { 1, 0 }
                              }
                           },
                           {
                              Points = {
                                 { 0, 0 },
                                 { 0.4, 0 },
                                 { 0.6, 0.2 },
                                 { 1, 1 }
                              }
                           }
                        }
                     },
                  },
                  HistogramIgnoreTransparent = Input { Value = 1, },
                  Input = Input {
                     SourceOp = "Gamut1",
                     Source = "Output",
                  },
               },
               ViewInfo = OperatorInfo { Pos = { 2076, -541.667 } },
            },
            Gamut1 = GamutConvert {
               CustomData = {
                  Settings = {
                     [1] = {
                        Tools = ordered() {
                           Gamut1 = GamutConvert {
                              Inputs = {
                                 SourceSpace = Input { Value = FuID { "sRGB" } },
                                 Input = Input {
                                    SourceOp = "Loader1",
                                    Source = "Output"
                                 }
                              },
                              Name = "Gamut1",
                              CtrlWZoom = false,
                              ViewInfo = OperatorInfo { Pos = { 318, 87 } },
                              CustomData = {
                              }
                           }
                        }
                     },
                     [2] = {
                        Tools = ordered() {
                           Gamut1 = GamutConvert {
                              Inputs = {
                                 OutputSpace = Input { Value = FuID { "sRGB" } },
                                 Input = Input {
                                    SourceOp = "Loader1",
                                    Source = "Output"
                                 }
                              },
                              CtrlWZoom = false,
                              ViewInfo = OperatorInfo { Pos = { 318, 87 } },
                              CustomData = {
                              }
                           }
                        }
                     }
                  }
               },
               Inputs = {
                  SourceSpace = Input { Value = FuID { "sRGB" }, },
                  Input = Input {
                     SourceOp = "Merge18",
                     Source = "Output",
                  },
               },
               ViewInfo = OperatorInfo { Pos = { 1966, -541.667 } },
            },
            Background8 = Background {
               Inputs = {
                  EffectMask = Input {
                     SourceOp = "Bitmap1",
                     Source = "Mask",
                  },
                  Width = Input { Value = 640, },
                  Height = Input { Value = 320, },
                  ["Gamut.SLogVersion"] = Input { Value = FuID { "SLog2" }, },
               },
               ViewInfo = OperatorInfo { Pos = { 1966, -607.667 } },
            },
            Merge18 = Merge {
               Inputs = {
                  Background = Input {
                     SourceOp = "Background8",
                     Source = "Output",
                  },
                  Foreground = Input {
                     SourceOp = "AlphaMultiply1",
                     Source = "Output",
                  },
                  PerformDepthMerge = Input { Value = 0, },
               },
               ViewInfo = OperatorInfo { Pos = { 1856, -541.667 } },
            },
            WirelessLink2 = Fuse.Wireless {
               Inputs = {
                  Input = Input {
                     SourceOp = "carLoader",
                     Source = "Output",
                  },
               },
               ViewInfo = OperatorInfo { Pos = { 1746, -574.667 } },
            },
            AlphaMultiply1 = AlphaMultiply {
               Inputs = {
                  Input = Input {
                     SourceOp = "WirelessLink2",
                     Source = "Output",
                  },
               },
               ViewInfo = OperatorInfo { Pos = { 1856, -574.667 } },
            }
         },
      },
      carLoader = Loader {
         Clips = {
            Clip {
               ID = "Clip1",
               Filename = "Comp:sports-car-151962_640.png",
               FormatID = "PNGFormat",
               StartFrame = 640,
               LengthSetManually = true,
               TrimIn = 0,
               TrimOut = 0,
               ExtendFirst = 0,
               ExtendLast = 0,
               Loop = 0,
               AspectMode = 0,
               Depth = 0,
               TimeCode = 0,
               GlobalStart = 0,
               GlobalEnd = 0
            }
         },
         CtrlWZoom = false,
         NameSet = true,
         Inputs = {
            ["Gamut.SLogVersion"] = Input { Value = FuID { "SLog2" }, },
         },
         ViewInfo = OperatorInfo { Pos = { 1595, -610.5 } },
         Colors = {
            TileColor = { R = 0, G = 0.596078431372549, B = 0.6 },
            TextColor = { R = 0.725490196078431, G = 0.690196078431373, B = 0.592156862745098 },
         }
      },
      Merge9 = Merge {
         Inputs = {
            Background = Input {
               SourceOp = "Merge13",
               Source = "Output",
            },
            Foreground = Input {
               SourceOp = "carXF",
               Source = "Output",
            },
            PerformDepthMerge = Input { Value = 0, },
         },
         ViewInfo = OperatorInfo { Pos = { 1595, -247.5 } },
      },
      backWheel = Transform {
         NameSet = true,
         Inputs = {
            Pivot = Input { Value = { 0.774753289473684, 0.37719298245614 }, },
            Input = Input {
               SourceOp = "MatteControl2",
               Source = "Output",
            },
         },
         ViewInfo = OperatorInfo { Pos = { 1661.33, -534.379 } },
         Colors = {
            TileColor = { R = 0.913725490196078, G = 0.549019607843137, B = 0.709803921568627 },
            TextColor = { R = 0.725490196078431, G = 0.690196078431373, B = 0.592156862745098 },
         }
      }
   }
}


You will have to again relink the images since you're working in Resolve. I guess I'll need to come up with some way to handle the lack of a comp: pathmap if I ever decide to rewrite that chapter to support ReFusion.

edit: Also, I recommend starting at the beginning, or near the beginning. Jumping straight to chapter 7 means you might not have some foundational knowledge that will help you make sense of some things. I'd have to reread it to know if it's likely to be a problem in that lesson, but I was writing with the intent that it would be a systematic course.
Bryan Ray
http://www.bryanray.name
http://www.sidefx.com
Offline

sridharar

  • Posts: 123
  • Joined: Thu Aug 13, 2020 2:56 am
  • Location: Nashua, New Hampshire
  • Real Name: Sri Raghavan

Re: Fusion: Copying a Selected Area to another Location

PostTue Oct 20, 2020 5:21 pm

Thanks Bryan for the new code and clarifying that it is seed code for the demo - but not a fully working demo code.

When I got to that link, I simply paused reading, and started to install the code and play with it..

To your other point, I am indeed going through your draft in many passes without skipping, though I gloss over some sections after getting to know what is in there and come back in the next pass(es).

Yes there are many places where UI on the 16.2 seems to have moved away from what you have in the draft. But it has not posed any issue for me yet.

While it is arguably beneficial for many, since, I do not come at all from Photoshop AE or Nuke or other products, some of those anchoring and comparative references are a bit tangential to my context - but again they are not posing any issues to me, as "free standing" bits are still quite clear.

br Sri.
https://www.youtube.com/channel/UCeXBbc4qNkdbNPywhopu1iA
Offline

sridharar

  • Posts: 123
  • Joined: Thu Aug 13, 2020 2:56 am
  • Location: Nashua, New Hampshire
  • Real Name: Sri Raghavan

Re: Fusion: Copying a Selected Area to another Location

PostFri Oct 23, 2020 12:14 am

Bryan

Preface: I am continuing these exchanges as a post instead of over private channel, as I think your tips and guidance should benefit and be visible to a wider audience than just myself.

Thanks for introducing Sticky Notes and PipeRouter. Very nice to streamline Fusion Pages and Comments Everywhere.

Is there a way to change the color of the Text and Background, and change the Size of the Text? in Sticky Notes?

More importantly...

Can you provide some direction and, ideally a executable code snippet with correct syntax, for the following pseudo code, which I can insert/apply into Transform1.Center.

The names of the three fusion nodes are exact from my graph.

Transform1
Rectangle1
Rectangle2


Step1: Transform1.Center = Rectangle1.Center

Here I am connecting Transform1.Center to what is published by Rectangle1.Center
I can do this if this is all I want to do.
But I want to modify the Transform1.Center with other things as below.

Step2: Transform1.Center.X = Transform1.Center.X - Rectangle2.X +0.2

Here I am changing T1.Center.X value
I want to subtract Rectangle2.X value from it (by also including another connection or expression)
Then add a constant offset to it.

Step3: Transform1.Center.Y = Transform1.Center.X - Rectangle2.Y - 0.2

Here do the same for T1.Center.Y





I see this as a recurring pattern of need and a would be a very valuable idiom to get under the belt.

Whatever I have tried so far has not worked -- with no error messages or feedback from DR

best case: DR remains silent
in-between cases: Node resets or destroys all the expressions in the node
worst case: DR freezes or Crashes.


If you can also point to or share any basic "hello world style" seed examples/snippets for Frame/Start/End render Scripts it would be great. Pointers to your book chapters would be perfect.

br Sri.
https://www.youtube.com/channel/UCeXBbc4qNkdbNPywhopu1iA
Offline
User avatar

Bryan Ray

  • Posts: 2485
  • Joined: Mon Nov 28, 2016 5:32 am
  • Location: Los Angeles, CA, USA

Re: Fusion: Copying a Selected Area to another Location

PostFri Oct 23, 2020 4:11 am

sridharar wrote:
Thanks for introducing Sticky Notes and PipeRouter. Very nice to streamline Fusion Pages and Comments Everywhere.

Is there a way to change the color of the Text and Background, and change the Size of the Text? in Sticky Notes?


In Fusion 9 you can change the color of a Note. In Resolve and Fusion 16, that capability was removed. The text size cannot be changed, to the best of my knowledge. But at least it always remains the same size regardless of zoom level, so that's something.

Can you provide some direction and, ideally a executable code snippet with correct syntax, for the following pseudo code, which I can insert/apply into Transform1.Center.

<snip>
But I want to modify the Transform1.Center with other things as below.

Step2: Transform1.Center.X = Transform1.Center.X - Rectangle2.X +0.2

Here I am changing T1.Center.X value
I want to subtract Rectangle2.X value from it (by also including another connection or expression)
Then add a constant offset


The left side of the expression is implicit when you create it.

When you create an expression on Point control, you will probably have noticed that the default value is Point(0.5, 0.5). Points take a custom 2d vector datatype, and you'll need to use this construct to push data into it. Give this a try:

Point(Rectangle2.X+0.2, Rectangle2.Y-0.2)

edit: Point(Rectangle2.Center.X + 0.2, Rectangle2.Center.Y - 0.2)


You can't reference the control's itself in an expression—it would create a feedback loop. But if you wanted an additional movable widget, you could add another Point control to the Transform tool and use that to provide an intermediate value.

To add a custom control to a tool, right-click it and choose "Edit Controls." You'll get a dialog that's a little difficult to figure out at first, but these are the steps to add a Point control with an in-viewer widget. First, give the new control a Name that doesn't already exist on the tool—this is the user-readable label that appears in the Inspector. The ID, which is the expression or scripting name, will automatically update to match the new name, but you can change it to something else if you'd like.

Choose Point in the Type box. Most of the options in the Input Ctrl and View Ctrl boxes in the second column will vanish when you do that because only a couple of control types work for Points.

Change Page from User to Controls so your new control will show up on the same tab as everything else (User will create a new tab to hold the custom controls).

You can enter default values if you like. (0.5, 0.5) is probably best for a Point control.

For Input Ctrl, choose OffsetControl. This is the control that shows up in the Inspector. For View Ctrl, choose CrosshairControl. This is the in-viewer widget. Crosshair is the typical PointControl you see on the Transform already. PointControl will create something similar to a Bezier handle like on the Polygon tool.

You can change the Style if you want to make the new widget different from the Center (NormalCross) and Pivot (DiagonalCross).

Once you have this new control, you can insert it into the expression on the Transform's Center with something like:

Point(NewControl.X + Rectangle1.X + 0.2, NewControl.Y + Rectangle1.Y - 0.2

The Center widget itself will be immovable in the Viewer because its location is driven by the expressions, but you can move the NewControl widget around, and it will have the same effect as if you could move the Center.

If you can also point to or share any basic "hello world style" seed examples/snippets for Frame/Start/End render Scripts it would be great. Pointers to your book chapters would be perfect.

br Sri.


I haven't really done much of anything with the in-tool scripts. And I never wrote the Scripting and Automation chapter, which is where it would have gone.

There's a section about InTool scripts in the Fusion 8 Scripting Guide, but it's brief and hardly worth mentioning. There's a little bit more, with a couple of examples, on the old VFXPedia:
https://documents.blackmagicdesign.com/ ... _Guide.pdf
Last edited by Bryan Ray on Fri Oct 23, 2020 3:34 pm, edited 1 time in total.
Bryan Ray
http://www.bryanray.name
http://www.sidefx.com
Offline

sridharar

  • Posts: 123
  • Joined: Thu Aug 13, 2020 2:56 am
  • Location: Nashua, New Hampshire
  • Real Name: Sri Raghavan

Re: Fusion: Copying a Selected Area to another Location

PostFri Oct 23, 2020 6:54 am

Bryan

Thanks a lot.

I had figured out Custom Controls and had started using it.

But not the Edit Controls..which you outlined nicely.
It is quite handy and nicer way to organize things.

BTW,

In DR, for an edit control I did not see Page->Control option.
There were Channels, Common, and Merge (probably because I was adding it to a Merge node - so in spirit same as what you were saying, in a reflexive way)
That worked.
The control that I added showed up in the main tab nicely.

There on it was getting the syntax of expressions right.
I did not try combining, "Connect To", "Drawing a Line on UI" and entering Expressions Text..
Just entered expressions manually.

br Sri.

=====
P.S.

Here are few things I discovered and could settle.

Point(-0.2,+3) does not work. It does not like Unary +.

The Edit Control that I added to Merge I had named it as Sri1.

I was able to refer to that as

Sri1 <that is it, nice) or

Point(Sri1.X,Sri.Y) and
also use its Sri1.X and Sri1.Y in Point() expressions.

I could do

Rectangle1.Center or Rectangle1.Center.X
but not as Rectangle1.X

I was able to use expressions like

Point(Sri1.X [+,-,*,/] 2, Sri1.Y [+,-,*,/] 2) etc.

and also

Rectangle1.Center + Sri1 + Point(0.2,-0.4) etc
as a Vector expression.

I also noticed, which I had not done before, that if there was a syntax problem with the expression, the node color changes to Red and if it is all OK displays in normal white.

-----

Is there a nice way to escape to a multi-line, neatly organized, standard LUA or Python code mechanism, that can access the context, and return the value for the Expression?
as nested complex expressions can become horrid, difficult to develop and debug, and is error prone.
https://www.youtube.com/channel/UCeXBbc4qNkdbNPywhopu1iA
Offline
User avatar

Bryan Ray

  • Posts: 2485
  • Joined: Mon Nov 28, 2016 5:32 am
  • Location: Los Angeles, CA, USA

Re: Fusion: Copying a Selected Area to another Location

PostFri Oct 23, 2020 3:33 pm

sridharar wrote:In DR, for an edit control I did not see Page->Control option.
There were Channels, Common, and Merge (probably because I was adding it to a Merge node - so in spirit same as what you were saying, in a reflexive way)
That worked.
The control that I added showed up in the main tab nicely.


Right. I'd assumed a Transform tool. Most tools have a Controls page, but not all of them, and Merge is one of the exceptions.

I did not try combining, "Connect To", "Drawing a Line on UI" and entering Expressions Text..
Just entered expressions manually.


You can't directly combine the two techniques. If you Connect a control to something else, and it also has an expression, the expression will take priority.

However, note that little '+' button next to the expression. That is a pick whip. If you drag it to another control, that control's id will be loaded into the expression field, which can make building expressions a little quicker. I think it takes a tweak to the Preferences in the User Interface section to allow you to view two tools' controls at the same time. Or you can pin one that you want to always keep open. Pin is right next to the Lock button.
[/quote]

Here are few things I discovered and could settle.

Point(-0.2,+3) does not work. It does not like Unary +.


That's correct. Lua's '+' is only an operator, so that creates an expression with a missing operand.

Rectangle1.Center or Rectangle1.Center.X
but not as Rectangle1.X


My fault. Yes, you always need the id of the control. I was going a little too fast and not keeping my mind one what I was writing. I'll correct it above so it doesn't confuse anyone else!


Is there a nice way to escape to a multi-line, neatly organized, standard LUA or Python code mechanism, that can access the context, and return the value for the Expression?
as nested complex expressions can become horrid, difficult to develop and debug, and is error prone.


Well, yes and no. You can write more complex, multi-statement expressions by prefixing the expression with a colon (:), but you still have to write it all on one line and end each statement with a semi-colon (;). When you do so, the expression will require a return statement to send the final result to the input.

While this makes more sophisticated behavior possible, it doesn't do much to make writing the expression cleaner or easier!

When I do something of the sort, I usually write it in a code editor, then collapse it all down to the single-line expression. It makes prototyping difficult and error-prone. Here's an example of a tool that segments a timeline into random-length intervals:

Code: Select all
{
   Tools = ordered() {
      MT_TimeSegmenter = MacroOperator {
         CtrlWZoom = false,
         Inputs = ordered() {
            Comments = Input { Value = "Increments a counter at randomized time intervals. \r\n\r\nMuse Tools Library, Glitch Tools Collection\r\nby Bryan Ray\r\nwww.musevfx.com", },
            Segment = InstanceInput {
               SourceOp = "TimeSegmenter",
               Source = "Gain",
               Expression = ":i=0; seg=-1; randomseed(RandomSeed); while i<=time do seg=seg+1; i=i+random(MinimumSegmentLength,MaximumSegmentLength); end; return seg",
               Name = "Current Segment",
               Default = 10,
            },
            MinimumSegmentLength = InstanceInput {
               SourceOp = "TimeSegmenter",
               Source = "MinimumSegmentLength",
               Default = 3,
            },
            MaximumSegmentLength = InstanceInput {
               SourceOp = "TimeSegmenter",
               Source = "MaximumSegmentLength",
               Default = 15,
            },
            RandomSeed = InstanceInput {
               SourceOp = "TimeSegmenter",
               Source = "RandomSeed",
               Default = 0.4068323,
            }
         },
         ViewInfo = GroupInfo { Pos = { 1870, -181.5 } },
         Tools = ordered() {
            TimeSegmenter = BrightnessContrast {
               CtrlWZoom = false,
               CtrlWShown = false,
               NameSet = true,
               Inputs = {
                  Blend = Input { Value = 0, },
                  Gain = Input {
                     Value = 10,
                     Expression = ":i=0; seg=-1; randomseed(RandomSeed); while i<=time do seg=seg+1; i=i+random(MinimumSegmentLength,MaximumSegmentLength); end; return seg",
                  },
                  RandomSeed = Input { Value = 0.4068323, },
               },
               ViewInfo = OperatorInfo { Pos = { 0, 10.15 } },
               UserControls = ordered() {
                  MinimumSegmentLength = {
                     INP_MaxAllowed = 1000,
                     INP_Integer = true,
                     INPID_InputControl = "SliderControl",
                     IC_ControlPage = 0,
                     INP_MaxScale = 30,
                     INP_Default = 3,
                     INP_MinAllowed = 0,
                     LINKID_DataType = "Number",
                     LINKS_Name = "Minimum Segment Length",
                  },
                  MaximumSegmentLength = {
                     INP_MaxAllowed = 10000,
                     INP_Integer = true,
                     INPID_InputControl = "SliderControl",
                     IC_ControlPage = 0,
                     INP_MaxScale = 60,
                     INP_Default = 15,
                     INP_MinScale = 1,
                     INP_MinAllowed = 0,
                     LINKID_DataType = "Number",
                     LINKS_Name = "Maximum Segment Length",
                  },
                  RandomSeed = {
                     LINKID_DataType = "Number",
                     LINKS_Name = "Random Seed",
                     IC_ControlPage = 0,
                     INPID_InputControl = "SliderControl",
                     INP_Default = 0,
                  }
               }
            }
         },
      }
   },
   ActiveTool = "MT_TimeSegmenter"
}


Another option would be to use the Frame Render script to push the final value into your tool. That gives you the option of writing it in a text box control. Instead of a Return statement, though, you'd simply assign the result directly to the control. For instance, on a Transform tool:

Code: Select all
value = time/60
self.Center.X = value


What you'll find, though, is that this doesn't lock the controls. You can still scrub new values into them, but the script will immediately override them since changing an input triggers a render. If you don't know what's happening, it will look like a bug because there's no visible indicator that the control is being overridden by code on another tab.

Also, some controls act weird. If you test it, you may see that the feedback of both the viewer widget and the Inspector values don't change, even though looking at the resulting image shows what you'd expect. If you change it to self.Size = 1 + value, both the widget and the Inspector input act like you'd expect.

InTool scripts can be odd, which is why I avoid them—I don't like the unpredictability. Still, it could be useful to develop your code there, then collapse it to the single-line : syntax when you're ready to deploy.
Bryan Ray
http://www.bryanray.name
http://www.sidefx.com
Offline

Sander de Regt

  • Posts: 3565
  • Joined: Thu Nov 13, 2014 10:09 pm

Re: Fusion: Copying a Selected Area to another Location

PostFri Oct 23, 2020 3:42 pm

Sri and Bryan,

I understand your desire and love for expressions.
I'm just wondering, what is the added benefit to doing it this way in stead of with calculation and off-set modifiers etc? You can connect all kinds of things to each other without the possibility of typing errors etc. To me it appears that most things you're looking for are perfectly doable in the realm of modifiers and connections.
Sander de Regt

ShadowMaker SdR
The Netherlands
Offline
User avatar

Bryan Ray

  • Posts: 2485
  • Joined: Mon Nov 28, 2016 5:32 am
  • Location: Los Angeles, CA, USA

Re: Fusion: Copying a Selected Area to another Location

PostFri Oct 23, 2020 7:53 pm

Well, I can only speak for myself, but I "speak math." Expressions are a language I understand. And what's happening is all right there under the input where I can see it. Connections and modifiers are hidden, and when I come back to something a year after having originally made it, I don't want to have to take the time to trace connections between half a dozen tools to figure out exactly what's driving an input.

And I challenge you to replicate the Time Segmenter with modifiers! :lol:
(It can probably be done with Time Machine, but the macro doesn't have any dependencies.)
Bryan Ray
http://www.bryanray.name
http://www.sidefx.com
Offline

sridharar

  • Posts: 123
  • Joined: Thu Aug 13, 2020 2:56 am
  • Location: Nashua, New Hampshire
  • Real Name: Sri Raghavan

Re: Fusion: Copying a Selected Area to another Location

PostFri Oct 23, 2020 8:30 pm

Bryan

Thanks for clarifying things point-by-point.

Suddenly I find myself lot more at ease to explore and harness the power of Scripting machinery.
I am sure Object Models will be daunting, but is a more formalized world that is free from the endemic idiosyncrasies of UI and Visual Programming.

Thanks for the sample fusion codes - as they make things concrete and interactable.
Az well as the pointer to VFX website.

I took away the following:

1) Expressions

can be arbitrarily (reasonably long) as long as it is just one line. Statements are to be separated by semicolon and ending with CRLF. May be an [avoidable] tradeoff for UI - prone to "dense error prone" expressions, but may not be limiting the "expressibility". The trick of using a text editor and "stripping off" CRLF is a good escape.

2) Frame Render Scripts.

"use the Frame Render script to push the final value into your tool"

So they are executed on any "Event" that changes Params of the Control [during edit time, and rendering time].

The Script written in normal LUA (or Python) code can access the full data context - acquiring handles and navigating the object hierarchy. With "Self" referring to its Hosting or Parent control.

This certainly opens more flexibility and power.

3) Locking

I think the "absence of locking" and its consequences you point out could be managed through "conventions" and programming. For example, I could add an explicit User Control "MyLock" and gate/guide the script execution by its setting. An accetable "Hack".


4) InTool Scripts

I am sure your insight about "Unpredictability" is well-founded. I will keeping that mind while exploring them. I am not sure of the distinction between Start, Frame, and End Scripts. Afraid of common sense interpretation. If you can clarify it would be great.


Again, Truly appreciate your indulgence here and I am sure it will help all beginners and other readers a good understanding of many basics. I will summarize them when we reach some logical end to this post - and start a new one as needed.

I do hope that your accumulated wisdom is getting productive mileage - though you put a pause on your book.

br Sri.
https://www.youtube.com/channel/UCeXBbc4qNkdbNPywhopu1iA
Offline

sridharar

  • Posts: 123
  • Joined: Thu Aug 13, 2020 2:56 am
  • Location: Nashua, New Hampshire
  • Real Name: Sri Raghavan

Re: Fusion: Copying a Selected Area to another Location

PostFri Oct 23, 2020 9:31 pm

Bryan

You already responded "saliently and eloquently" to Sander de Regt.

Sander

Bryan has already provided a simple but a salient reply.

There are many fundamental adages/truths in/from Computer Science and Software Engineering.

I will just touch a few here, from a different angle..without inviting a digressing long discussion on the topic (for which this is not the forum).

"Visual Programming" cannot do all the things that "Text Based Programming" can do, both productively and also "not at all".

Side Note. Yes and To be fair, "Visual Programming" also makes expressing simpler/easier things faster, easier and reliable to express. Like "changing position or color of a Object". You also acknowledge the power of simple expressions, but are wondering why more power is needed. See below.

"Text Based Programming" can deal with dynamic "Objects" which come into existence only during run time. This is impossible to address in "Visual Programming" unless it can present full visual view of the execution environment with all its dynamic objects and dynamic relationships (which can be very very large in numbers, and cannot even be perceived easily, but only in algorithmic terms). What you cannot see in UI you cannot interact with Visual Programming. Period.

Complex Logic are best handled through Procedures that allow advanced "control structures like if-then-else, loops, variables, data structures, mathematical functions" etc.

"Text Based" also have the enormous power of decades of evolution of "programming languages, debugging techniques" and sophisticated "find/replace/cut/copy/macro" capabilities of text editors.

I will leave things at this conceptual level for now.

Taking on the challenge which Bryan posed would quickly reveal you many issues.

br Sri.

P.S. Why I resonate with Bryan? I have been immersed far too long with Man-Machine Collaborative Systems (Academic Research; and Technology and Products in the Industry).
https://www.youtube.com/channel/UCeXBbc4qNkdbNPywhopu1iA
Offline

Sander de Regt

  • Posts: 3565
  • Joined: Thu Nov 13, 2014 10:09 pm

Re: Fusion: Copying a Selected Area to another Location

PostFri Oct 23, 2020 9:58 pm

Bryan Ray wrote:And I challenge you to replicate the Time Segmenter with modifiers! :lol:
(It can probably be done with Time Machine, but the macro doesn't have any dependencies.)


I can't even get the Time Segmenter to do anything. What do I need to connect to what? There are no inputs or outputs to the macro if I copy/paste from this forum.
Sander de Regt

ShadowMaker SdR
The Netherlands
Offline
User avatar

Bryan Ray

  • Posts: 2485
  • Joined: Mon Nov 28, 2016 5:32 am
  • Location: Los Angeles, CA, USA

Re: Fusion: Copying a Selected Area to another Location

PostSat Oct 24, 2020 1:48 am

The only thing it does is provide a number that increases in value at randomized intervals. If you play the timeline, you'll see the Current Segment value count upward irregularly. It's part of the architecture beneath several of the Glitch Tools.

sridharar wrote: I am not sure of the distinction between Start, Frame, and End Scripts. Afraid of common sense interpretation. If you can clarify it would be great.


Frame Render executes every time the tool gets a render request. This happens when the next frame is called for, but also any time an input on the tool is changed, and sometimes when something is changed down-stream that causes Fusion to request a new frame from the the tool.

The Start Render script will execute when a Render process is initiated. Either when the Render button is pressed, or when a render script command is received. Probably also when the Deliver tab is used, but I have never experimented with Fusion in Resolve that deeply. An example of when you might use it is to execute a sanity check script that checks for common errors, like motion blur being turned off or an DCTL fuse being sent to a CPU-only render farm.

Likewise, the End Render script executes when a render is completed. A common use of the End Render script is to initiate a conversion from an image sequence to video using FFMPEG.
Bryan Ray
http://www.bryanray.name
http://www.sidefx.com
Offline

sridharar

  • Posts: 123
  • Joined: Thu Aug 13, 2020 2:56 am
  • Location: Nashua, New Hampshire
  • Real Name: Sri Raghavan

Re: Fusion: Copying a Selected Area to another Location

PostSat Oct 24, 2020 5:12 am

Bryan

Thanks for the clarifications.

I am using simple print statements and seeing them displayed on the console, to study when State, Render, End scripts execute.

So far I can see Frame Render scripts getting invoked as you stated.

Not been able to get the Start and End to execute so far.
I see your above note only now, and I will exercise those events as well.

br Sri.
https://www.youtube.com/channel/UCeXBbc4qNkdbNPywhopu1iA

Return to Fusion

Who is online

Users browsing this forum: No registered users and 29 guests