Modifier nodes
Moderator: Chad
Re: Modifier nodes
Sorry for late reply.
I'm not sure if that's a bug or if you're just not supposed to do both. Like the alternative may be to have two inputs, one as a slider, one as the flow input. The slider one would update if the flow input changed. You'd need all the event handling to work just right, though.
I'm not sure if that's a bug or if you're just not supposed to do both. Like the alternative may be to have two inputs, one as a slider, one as the flow input. The slider one would update if the flow input changed. You'd need all the event handling to work just right, though.
- Farmfield
- Fusionista
- Posts: 366
- Joined: Tue Feb 10, 2015 2:16 am
- Location: Goteborg - Sweden
- Contact:
Re: Modifier nodes
As I'm not sure this has been stated clearly enough before... Chad, you are a complete and utter crazy person.Chad wrote: [...] it's just to show how easy it is to make [...]

Re: Modifier nodes
If you open up a viewer in another window, you won't have that problem. Weird. Goes way back too, tried it in a 6.4 out of curiosity.SecondMan wrote: ↑Tue Aug 30, 2016 12:13 pm That's about as far as I got a while ago when you told me how to do it. It's neat, but it screws up the viewer. Once you've dragged a modifier in there, it will only ever display a strip at the top. And you don't get a visual link between the modifiers and the nodes, of course.
Last edited by Kristof on Fri Jul 26, 2019 1:10 am, edited 1 time in total.
Re: Modifier nodes
@Chad, could you have a look at these three simple fuses, please? I have one that creates a float, a point and a point offset that will add its float inputs to the position coming in. Weird thing is that the initial position is also being modified, while they are two different fuses. So I must be doing something wrong.
In Fu 6.4 this doesn't happen, but it also won't add the offset (it does so in Fu 9).
Comp (first download and install the fuses shared below):
Float fuse:
Point fuse:
Point offset fuse:
In Fu 6.4 this doesn't happen, but it also won't add the offset (it does so in Fu 9).
Comp (first download and install the fuses shared below):
Code: Select all
{
Tools = ordered() {
Float1 = Fuse.Float {
Inputs = {
Float = Input { Value = 2, },
},
ViewInfo = OperatorInfo { Pos = { 605, 82.5 } },
},
Point1 = Fuse.Point {
CtrlWZoom = false,
Inputs = {
Position = Input { Value = { 3, 2 }, },
},
ViewInfo = OperatorInfo { Pos = { 495, 115.5 } },
},
Point_Offset1 = Fuse.Point_Offset {
Inputs = {
Position = Input {
SourceOp = "Point1",
Source = "Output",
},
XOffset = Input {
SourceOp = "Float1",
Source = "Output",
},
YOffset = Input {
SourceOp = "Float1_1",
Source = "Output",
},
},
ViewInfo = OperatorInfo { Pos = { 660, 115.5 } },
},
Float1_1 = Fuse.Float {
ViewInfo = OperatorInfo { Pos = { 715, 82.5 } },
}
}
}
- -- ============================================================================
- -- Blabber
- -- ============================================================================
- --[[
- The authors hereby grant permission to use, copy, and distribute this
- software and its documentation for any purpose, provided that existing
- copyright notices are retained in all copies and that this notice is
- included verbatim in any distributions. Additionally, the authors grant
- permission to modify this software and its documentation for any
- purpose, provided that such modifications are not distributed without
- the explicit consent of the authors and that existing copyright notices
- are retained in all copies.
- IN NO EVENT SHALL THE AUTHORS OR DISTRIBUTORS BE LIABLE TO ANY PARTY FOR
- DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING
- OUT OF THE USE OF THIS SOFTWARE, ITS DOCUMENTATION, OR ANY DERIVATIVES
- THEREOF, EVEN IF THE AUTHORS HAVE BEEN ADVISED OF THE POSSIBILITY OF
- SUCH DAMAGE.
- THE AUTHORS AND DISTRIBUTORS SPECIFICALLY DISCLAIM ANY WARRANTIES,
- INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT.
- THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, AND THE AUTHORS AND
- DISTRIBUTORS HAVE NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT,
- UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
- --]]
- -- ============================================================================
- -- Constants
- -- ============================================================================
- VERSION = "v0.1 (2019-0719) by Kristof Indeherberge"
- FUSE_NAME = "Float"
- -- ============================================================================
- -- Float fuse
- -- Fuse that creates a float number
- -- ============================================================================
- FuRegisterClass( FUSE_NAME , CT_Tool , {
- --REG_Fuse_NoEdit = true,
- --REG_Fuse_NoReload = true,
- --REG_Fuse_TilePic = fuse_pic,
- --REG_NoBlendCtrls = true,
- REG_NoCommonCtrls = true,
- --REG_NoMotionBlurCtrls = true,
- --REG_NoPreCalcProcess = true, -- call Process for precalc requests (instead of PreCalcProcess)
- --REG_OpNoMask = true,
- --REG_SupportsDoD = true, -- this tool supports DoD
- --REG_TimeVariant = true,
- --REG_Unpredictable = true, -- this tool shall never be cached
- --REG_Version = 100,
- REGS_Category = "xmnr0x23\\Math",
- --REGS_Company = "UNT",
- --REGS_HelpTopic = "http://en.wikipedia.org/wiki/Acme_Corporation",
- REGS_Name = FUSE_NAME,
- REGS_OpDescription = "Create a float number",
- REGS_OpIconString = FUSE_NAME,
- --REGS_URL = "http://en.wikipedia.org/wiki/Acme_Corporation",
- } )
- function Create()
- InFloat = self:AddInput( "Float" , "Float" , {
- LINKID_DataType = "Number",
- INPID_InputControl = "SliderControl",
- INP_Default = 1.0,
- } )
- OutN = self:AddOutput( "Output" , "Output" , {
- LINKID_DataType = "Number",
- LINK_Main = 1,
- } )
- --[[
- InLabel = self:AddInput( VERSION , "version" , {
- LINKID_DataType = "Text",
- INPID_InputControl = "LabelControl",
- INP_External = false,
- INP_Passive = true,
- } )
- --]]
- end
- function Process( req )
- local inA = InFloat:GetValue( req ).Value
- print ( inA )
- out = inA
- OutN:Set( req , out )
- end
- -- ============================================================================
- -- Blabber
- -- ============================================================================
- --[[
- The authors hereby grant permission to use, copy, and distribute this
- software and its documentation for any purpose, provided that existing
- copyright notices are retained in all copies and that this notice is
- included verbatim in any distributions. Additionally, the authors grant
- permission to modify this software and its documentation for any
- purpose, provided that such modifications are not distributed without
- the explicit consent of the authors and that existing copyright notices
- are retained in all copies.
- IN NO EVENT SHALL THE AUTHORS OR DISTRIBUTORS BE LIABLE TO ANY PARTY FOR
- DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING
- OUT OF THE USE OF THIS SOFTWARE, ITS DOCUMENTATION, OR ANY DERIVATIVES
- THEREOF, EVEN IF THE AUTHORS HAVE BEEN ADVISED OF THE POSSIBILITY OF
- SUCH DAMAGE.
- THE AUTHORS AND DISTRIBUTORS SPECIFICALLY DISCLAIM ANY WARRANTIES,
- INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT.
- THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, AND THE AUTHORS AND
- DISTRIBUTORS HAVE NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT,
- UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
- --]]
- -- ============================================================================
- -- Constants
- -- ============================================================================
- VERSION = "v0.1 (2019-0719) by Kristof Indeherberge"
- FUSE_NAME = "Point"
- -- ============================================================================
- -- Float fuse
- -- Fuse that creates a integer number
- -- ============================================================================
- FuRegisterClass( FUSE_NAME , CT_Tool , {
- --REG_Fuse_NoEdit = true,
- --REG_Fuse_NoReload = true,
- --REG_Fuse_TilePic = fuse_pic,
- --REG_NoBlendCtrls = true,
- REG_NoCommonCtrls = true,
- --REG_NoMotionBlurCtrls = true,
- --REG_NoPreCalcProcess = true, -- call Process for precalc requests (instead of PreCalcProcess)
- --REG_OpNoMask = true,
- --REG_SupportsDoD = true, -- this tool supports DoD
- --REG_TimeVariant = true,
- --REG_Unpredictable = true, -- this tool shall never be cached
- --REG_Version = 100,
- REGS_Category = "xmnr0x23\\Math",
- --REGS_Company = "UNT",
- --REGS_HelpTopic = "http://en.wikipedia.org/wiki/Acme_Corporation",
- REGS_Name = FUSE_NAME,
- REGS_OpDescription = "Create a point",
- REGS_OpIconString = FUSE_NAME,
- --REGS_URL = "http://en.wikipedia.org/wiki/Acme_Corporation",
- } )
- function Create()
- InPoint = self:AddInput( "Position" , "Position" , {
- LINKID_DataType = "Point",
- INPID_InputControl = "OffsetControl",
- INPID_PreviewControl = "PointControl",
- --INP_Default = 1.0,
- --INP_Integer = true,
- ICS_Name = "Position Locator"
- } )
- OutN = self:AddOutput( "Output" , "Output" , {
- LINKID_DataType = "Point",
- LINK_Main = 1,
- } )
- --[[
- InLabel = self:AddInput( VERSION , "version" , {
- LINKID_DataType = "Text",
- INPID_InputControl = "LabelControl",
- INP_External = false,
- INP_Passive = true,
- } )
- --]]
- end
- function Process( req )
- local inA = InPoint:GetSource( req.Time )
- --print ( inA )
- out = inA
- OutN:Set( req , out )
- end
- -- ============================================================================
- -- Blabber
- -- ============================================================================
- --[[
- The authors hereby grant permission to use, copy, and distribute this
- software and its documentation for any purpose, provided that existing
- copyright notices are retained in all copies and that this notice is
- included verbatim in any distributions. Additionally, the authors grant
- permission to modify this software and its documentation for any
- purpose, provided that such modifications are not distributed without
- the explicit consent of the authors and that existing copyright notices
- are retained in all copies.
- IN NO EVENT SHALL THE AUTHORS OR DISTRIBUTORS BE LIABLE TO ANY PARTY FOR
- DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING
- OUT OF THE USE OF THIS SOFTWARE, ITS DOCUMENTATION, OR ANY DERIVATIVES
- THEREOF, EVEN IF THE AUTHORS HAVE BEEN ADVISED OF THE POSSIBILITY OF
- SUCH DAMAGE.
- THE AUTHORS AND DISTRIBUTORS SPECIFICALLY DISCLAIM ANY WARRANTIES,
- INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT.
- THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, AND THE AUTHORS AND
- DISTRIBUTORS HAVE NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT,
- UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
- --]]
- -- ============================================================================
- -- Constants
- -- ============================================================================
- VERSION = "v0.1 (2019-0719) by Kristof Indeherberge"
- FUSE_NAME = "Point_Offset"
- -- ============================================================================
- -- Float fuse
- -- Fuse that creates a integer number
- -- ============================================================================
- FuRegisterClass( FUSE_NAME , CT_Tool , {
- --REG_Fuse_NoEdit = true,
- --REG_Fuse_NoReload = true,
- --REG_Fuse_TilePic = fuse_pic,
- --REG_NoBlendCtrls = true,
- REG_NoCommonCtrls = true,
- --REG_NoMotionBlurCtrls = true,
- --REG_NoPreCalcProcess = true, -- call Process for precalc requests (instead of PreCalcProcess)
- --REG_OpNoMask = true,
- --REG_SupportsDoD = true, -- this tool supports DoD
- --REG_TimeVariant = true,
- --REG_Unpredictable = true, -- this tool shall never be cached
- --REG_Version = 100,
- REGS_Category = "xmnr0x23\\Math",
- --REGS_Company = "UNT",
- --REGS_HelpTopic = "http://en.wikipedia.org/wiki/Acme_Corporation",
- REGS_Name = FUSE_NAME,
- REGS_OpDescription = "Create a point",
- REGS_OpIconString = FUSE_NAME,
- --REGS_URL = "http://en.wikipedia.org/wiki/Acme_Corporation",
- } )
- function Create()
- InPoint = self:AddInput( "Position" , "Position" , {
- LINKID_DataType = "Point",
- --INPID_InputControl = "OffsetControl",
- --INPID_PreviewControl = "PointControl",
- --INP_Default = 1.0,
- --INP_Integer = true,
- --ICS_Name = "Position Locator",
- LINK_Main = 1,
- } )
- InXOffset = self:AddInput( "X Offset" , "XOffset" , {
- LINKID_DataType = "Number",
- LINK_Main = 2,
- INP_Required = true,
- })
- InYOffset = self:AddInput( "Y Offset" , "YOffset" , {
- LINKID_DataType = "Number",
- LINK_Main = 3,
- INP_Required = false,
- })
- OutN = self:AddOutput( "Output" , "Output" , {
- LINKID_DataType = "Point",
- LINK_Main = 1,
- } )
- --[[
- InLabel = self:AddInput( VERSION , "version" , {
- LINKID_DataType = "Text",
- INPID_InputControl = "LabelControl",
- INP_External = false,
- INP_Passive = true,
- } )
- --]]
- end
- function Process( req )
- local point = InPoint:GetSource( req.Time )
- local x_offset = InXOffset:GetValue( req ).Value
- local y_offset = InYOffset:GetValue( req ).Value
- --print ( point )
- point.X = point.X + x_offset
- point.Y = point.Y + y_offset
- out = point
- OutN:Set( req , out )
- end
- PeterLoveday
- Fusioneer
- Posts: 218
- Joined: Sun Sep 14, 2014 6:09 pm
Re: Modifier nodes
Nodes should never modify their incoming parameters. (Some, like Image, will actively prevent this)
Instead, create a copy to output:
Instead, create a copy to output:
- local point = InPoint:GetSource( req.Time )
- local x_offset = InXOffset:GetValue( req ).Value
- local y_offset = InYOffset:GetValue( req ).Value
- local out = point:Copy()
- out.X = out.X + x_offset
- out.Y = out.Y + y_offset
- OutN:Set( req , out )
Re: Modifier nodes
Thanks @PeterLoveday! Works now...
This is neat, I like it how you can connect this to a 2D transform node--RMB and select it from the menu.
What's the difference between CopyOf() and Copy()?

What's the difference between CopyOf() and Copy()?
- SecondMan
- Site Admin
- Posts: 4825
- Joined: Thu Jul 31, 2014 5:31 pm
- Location: Vancouver, Canada
- Been thanked: 31 times
- Contact:
Re: Modifier nodes
Copy() is a generic function that all parameter types may implement. CopyOf() is specific to Image. The only real difference in behaviour is that CopyOf() may be interrupted if the tool is told to abort. Copy() will always complete the copying across of pixel data. It is generally a better idea to use CopyOf() with images, but either will work.
https://www.steakunderwater.com/VFXPedi ... age/CopyOf
We should also split this off to a separate topic for the Fuses forum. Think of a good title for it?
https://www.steakunderwater.com/VFXPedi ... age/CopyOf
We should also split this off to a separate topic for the Fuses forum. Think of a good title for it?

Re: Modifier nodes
Thanks @SecondMan! Yeah, I was thinking of creating a new thread to demonstrate this workflow. The error described above kept me from going forward and from creating a demo comp (I have something simple in mind).
Feel free to go ahead if you want.
Feel free to go ahead if you want.

Re: Modifier nodes
Discovered this great thread today, thanks to Secondman.
when I try to download the fuses, my Mac saves an html file and I can't make them work.
I was thinking myself about having modifiers as nodes. I'm not advanced as you guys and I'm a bit ashamed to share this... but I made a wiggler/perturb macro myself. You can pipe in an image and wiggle position/scale/angle or use it as a source of modulation, both using expression or connecting as you would do with modifiers.
Emilio
when I try to download the fuses, my Mac saves an html file and I can't make them work.
I was thinking myself about having modifiers as nodes. I'm not advanced as you guys and I'm a bit ashamed to share this... but I made a wiggler/perturb macro myself. You can pipe in an image and wiggle position/scale/angle or use it as a source of modulation, both using expression or connecting as you would do with modifiers.
Emilio
You do not have the required permissions to view the files attached to this post.
- SecondMan
- Site Admin
- Posts: 4825
- Joined: Thu Jul 31, 2014 5:31 pm
- Location: Vancouver, Canada
- Been thanked: 31 times
- Contact:
Re: Modifier nodes
What browser is this?
I've just noticed that the latest Firefox 69 on Windows adds a .html extension to the Codebox downloads. Chrome does it correctly.
Honestly, I'm getting more and more annoyed with Firefox's increasingly erroneous behaviour. I'm at a point now where I'm recommending Chrome or any Chromium based browser for WSL.
Very cool looking Macro by the way - want to start a separate topic for it and explain it a bit further?

Re: Modifier nodes
I use safari. Not going to switch to Chrome due some serious issues with Mojave on Mac.SecondMan wrote: ↑Fri Sep 27, 2019 10:08 amWhat browser is this?
I've just noticed that the latest Firefox 69 on Windows adds a .html extension to the Codebox downloads. Chrome does it correctly.
Honestly, I'm getting more and more annoyed with Firefox's increasingly erroneous behaviour. I'm at a point now where I'm recommending Chrome or any Chromium based browser for WSL.
Very cool looking Macro by the way - want to start a separate topic for it and explain it a bit further?![]()
What I get is a .fuse.html file. Changing the extension won’t work...
- SecondMan
- Site Admin
- Posts: 4825
- Joined: Thu Jul 31, 2014 5:31 pm
- Location: Vancouver, Canada
- Been thanked: 31 times
- Contact:
Re: Modifier nodes
Weird, I get the same on Firefox but the content is still what it's supposed to be.
EDIT: the .html extension is only added when you open the file directly from the browser. If you save the file to disk, the extension is correct (in FF). Sucks a little less, but still sucks.
Don't sweat it, at some point I may have to have a developer look into this. For now if you want to use the Fuses just copy/paste the code in a text editor and save the files yourself.