Crapadilla
![]() |
With the release of FF4 and its Loop component, we've all been witness to the birth of a new type of component: the Slave. Then came Beta5, and it brought slave-based pixel-awareness plus an interesting discussion about how Bomber+ will conduct its very own breed of extensive slavery.
![]() With slaves becoming firmly established as an entirely new paradigm inside FF, I'm thinking it is time to start discussing this system with the goal of wrapping our heads around its potential applications, its possibilities and future prospects. So what are Slaves?
That's three distinct cases of the Slave component paradigm at work, each time operating in a slightly different iterative context. That begs a few questions: What is the potential reach of this new system? And where will it go fr om here?
The Question is: WHERE do they make sense? I've been thinking about this lately, but I'm still finding it hard to what other components might benefit fr om "slavification".
This reads like the new paradigm could potentially have far-reaching consequences for all of FF's components.
I get the feeling that Vlad has thought about this extensively, and that it's a direction he's planning to take FF. So, with the wall-O-text critical damage threshold most definitely reached, I'll cut it short and write: Let us speculate! ![]() ![]() --- Crapadilla says: "Damn you, stupid redundant feature requests!" ;) |
|||||||||
Posted: November 7, 2015 5:49 am | ||||||||||
Skybase
![]() |
Curve component with expandable slave components!
|
|||||||||
Posted: November 7, 2015 7:23 am | ||||||||||
Indigo Ray
![]() |
So, slave components are used to control iterations? Then, any component that iterates something can have slave components.
For example, the Multiblend component currently operates on 7 sources. But it could operate on any number of sources, and each layer could have its own opacity and blend mode. So, there would be a "layer" slave, which outputs the integer value of each layer (1st layer = 1, 2nd layer = 2, etc.). But honestly, can't we already do this with a Loop? Polygon (and Free Polygon) uses discrete points for the corners of the shape. How about a Polygon+ where we can control the location of each point, and the shape gets auto-filled? Like this filter, but with straight edges? Then there would be a "point ID" (point count) slave. As an extension of Polygon+, how about a line-drawer? Or heck, ThreeDee's filter as a component! Bezier+! 3-Color (and 5-Color) Gradient: How about an n-color Gradient? Here, the slave would be "color index" or whatever you want to call it. Useful for people who don't have Photoshop. Bricks, Pavements, and Tiles... do they have particles like the Bomber? Something tells me, no. Worley noises (blocks, cells, etc.)... they work by generating discrete points, and then calculating the distance from those points. But then, we can already replicate worley noise with the Bomber, with more control... |
|||||||||
Posted: November 7, 2015 2:40 pm | ||||||||||
Sphinx.
![]() |
Map Script and Curve Script
These two are obvious candidates I think. Due to their generic nature, the possibilities are endless. For example if you are making a fractal it will be possible to "post back" iteration index and internal coordinates/variables. Examples of Curve Script slave usage may be less obvious, but the implementation would be pretty much the same as with the Map Script. Implementation-wise I imagine something like this: Slaves would be defined much in the same way as inputs. When you define a slave node, a corresponding variable would be available in the script. Whenever a get_sample_x input function is called, the values of the slave variables at that point would be available through the slave nodes. Groups/Map Group Result When speaking of groups, I think the deal here is simply about being able to hook into slave flows inside the group. I.e. the Map Group Result should have a dynamic slave node designer much like with the script components. This is a rather fuzzy idea and there most likely is other angles on this.. Patterns All the classic FF pattern components, i.e. Bricks, Checker, Kaleidoscope, Pavements, Tiles all remap the source input(s) to new "cells". Properties of these cells such as their position, orientation and scale would be useful General slaves I do not see any real potential elsewhere in any single component, but since most components have several fixed gray inputs, it would be rather useful to be able to post back these values through slaves. I am aware there there no iterations, cells, particles etc to make these values unique in several passes - it would simply be a fixed value. Useful nonetheless. |
|||||||||
Posted: November 8, 2015 6:42 am | ||||||||||
SpaceRay
![]() |
This would be very good to have an improved multiblend with any number of sources AND be able to have it's own custom configuration blend mode layer, cool Would this be possible with a Loop component? ![]() |
|||||||||
Posted: November 9, 2015 12:42 am | ||||||||||
Skybase
![]() |
So basically, for each iteration, pick an image from a list, and blend? How do we choose the image? Huhm... |
|||||||||
Posted: November 9, 2015 2:33 am | ||||||||||
Sphinx.
![]() |
Missed this one...
Noises, Noise gradient and Noise Distortion The internal combination of internal layers/octaves could be useful to promote as slaves. It will allow for different curves and textures per octave.. |
|||||||||
Posted: November 9, 2015 3:41 am | ||||||||||
Vladimir Golovin
Administrator |
Bingo ![]() (As for the noise-based stuff, I'd like to do basic Noises first, and I'm not yet sure about Noise Distortion and Noise Gradient, since these can be easily assembled from basic Noises).
Curves yes, textures no. Noises don't fire samples per octave to determine their color. They compute octaves in black-and-white, add them together, then use the result for blending the colors. On the other hand, the Profile input is sampled per octave, which makes it an ideal candidate for a master input for slaves that expose octave-specific info, which would allow to create different curve profiles for each octave. |
|||||||||
Posted: November 9, 2015 6:20 am | ||||||||||
Sphinx.
![]() |
You forgot to quote the script part ![]() |
|||||||||
Posted: November 9, 2015 7:26 am | ||||||||||
Vladimir Golovin
Administrator |
No, I haven't. Adding slaves to script is A LOT of work. Slaves, in addition to connectable inputs, contain so-called preview parameters, which can be anything and can use any arbitrary logic. At this momemnt, I have no idea how to allow implementation of preview parameters in custom-made slaves. |
|||||||||
Posted: November 9, 2015 7:37 am | ||||||||||
Vladimir Golovin
Administrator |
Rather than doing this, which would add even more ugliness to an already ugly system of gray components / inputs, I'd look for a way to make the gray stuff more palatable. I recently had a radical idea about turning gray inputs into green ones by adding to each previously gray input a remapper that would specify the method of rounding, e.g. round, ceil, floor etc. Obviously, some of the gray inputs that are used for defining precalculation stuff will stay gray, but I guess that many others can possibly be greenified by this method. I'm far from understanding all implications of this idea, though. |
|||||||||
Posted: November 9, 2015 8:15 am | ||||||||||
Sphinx.
![]() |
Stick to the final value of a slave variable.. |
|||||||||
Posted: November 9, 2015 8:52 am | ||||||||||
Vladimir Golovin
Administrator |
Uh, I'm not sure I understand what you mean. Please clarify.
|
|||||||||
Posted: November 9, 2015 8:53 am | ||||||||||
Sphinx.
![]() |
In relation to the implementation idea presented earlier in the thread: slave previews may simply express the final value of any eventually iterative sample steps. For example think of a script with a loop structure. Inside the loop there is a slave variable X which changes in each iteration and each iteration also contain a get_sample_map call from source A. Source A uses the slave X for a parameter. The script itself ends up producing an output I.e. return something. At this point the value of variable X has stopped changing and you can use that for a generic preview solution. |
|||||||||
Posted: November 9, 2015 9:30 am | ||||||||||
Vladimir Golovin
Administrator |
1. How do you get the final value for Bomber's particle ID, given the fact that it has an infinite number of particles, and there's no way to predict which particles will end up getting sampled during the rendering and which ones won't? 2. If you have just a single fixed value as the preview for the slave, then how do you debug the subtree between the slave and the master? How will you see the reaction of the subtree to various possible inputs? 3. Given your idea, how would the preview for Loop slaves look? Would it just output the number of the last iteration / the random number corresponding to the last iteration? |
|||||||||
Posted: November 9, 2015 9:44 am | ||||||||||
Vladimir Golovin
Administrator |
We've just implemented the octave-based slaves for the Perlin Noise, but I didn't like the result. Very hard to understand and set up. I spent about 15 minutes just to understand whether it works at all or not. I'm not satisfied so we're not releasing it, at least for now.
|
|||||||||
Posted: November 9, 2015 11:39 am | ||||||||||
Betis
![]() |
What would you say to having a checkbox that DID have the noise sample texture per-octave. It is probably slower but if it was optional, or implemented as a Noise+ component, I think people will intentionally make that decision. Unless it's not really possible?
Roses are #FF0000
Violets are #0000FF All my base are belong to you. |
|||||||||
Posted: November 9, 2015 12:03 pm | ||||||||||
Vladimir Golovin
Administrator |
That's possible but that would be quite a big rewrite - and rethinking. |
|||||||||
Posted: November 9, 2015 12:21 pm | ||||||||||
Betis
![]() |
Isn't all of this Slave-logic a big rewrite and rethinking though?
Roses are #FF0000
Violets are #0000FF All my base are belong to you. |
|||||||||
Posted: November 9, 2015 1:16 pm | ||||||||||
Sphinx.
![]() |
First of all let me say that the proposal was meant as a tradeoff between complexity and functionality for the Map Script explicitly. Since you can't really know what sorcery is going on inside a script, and it will be too much to require people to implement additional preview callbacks, the solution would have to be "generic". That said, I believe the same concept could (but not necessarily should) be used in other components too. Consider this scenario: M = Main Component Ms = Slave "variable" of M Mp = Property of M S = Sub Component Sp = Property of S The connection is as follows: S -> Mp, Ms -> Sp. I.e. the simplest thinkable slave setup, involving two components. We know that Ms is the enslaved "variable". There may be any number of calls to S from M in the production of one output sample from M, and we don't know the principles behind the sample scheme. But when the component M is done producing its output, the internal Ms variable will be left with the last used value (as if you left the current loop preview slider at max). It is this value that is used for the preview in the Ms slave node.
The short answer: I won't. At least not using a special preview slider. What I will do however is tweaking the parameters of the main component.
I'd simply change the maximum iterations temporarily. -- I am not saying this is a definitive trouble-free solution at all - its more like free thinking about possible alternatives to not showing previews in the slave chain (a solution which I wouldn't be too scared by anyways). |
|||||||||
Posted: November 9, 2015 4:23 pm | ||||||||||
Crapadilla
![]() |
![]() Wow. So if we take Perlin Noise as an example, does it even make sense to "greenify" gray inputs like Scale, Stretch, Angle, Details or Variation? If these inputs were map inputs, they would certainly need to be mapped with great care so as to not produce any discontinuous or nonsensical results. Furthermore, would the method of rounding be hard-coded, or would you expose that setting to the user? (thus making the component UI much more complex by creating an additional control per "greenified" gray input.) Also, what about out-of-range handling? If OOR-behaviour is not hard-coded, then we would end up with yet another control on the UI, no? On the other hand, we already have all the necessary RGB math components (Round, Ceil, Floor, Min, Max) to correctly "massage" the data going to these greenified inputs, do we not? So this could also be taken care of by the advanced user. --- Crapadilla says: "Damn you, stupid redundant feature requests!" ;) |
|||||||||
Posted: November 10, 2015 3:34 am | ||||||||||
Vladimir Golovin
Administrator |
Exactly. That's one of the main reasons why we didn't make them mappable back in FF1.0.
Since the inputs will be green, you can, theoretically, implement any rounding method you want using RGB Math or whatever other components you want to use. On the other hand, remappers have an important advantage over components: they know the type and range of both their source value and output value, and thus can tailor their output and UI accordingly. For example, if you have a greenified dropdown control with, say 17 options, you'll need to hardcode this number 17 somewhere in your custom rounding logic; while a remapper would by definition 'know' that number.
The input would just clip the incoming value into an acceptable range. Obviously, if you implement custom logic via green components, you can avoid situations where clipping is harmful.
Yes. So, to recap, the dilemma is more power versus less sensible behavior of randomly made connections for a novice user. |
|||||||||
Posted: November 10, 2015 8:48 am | ||||||||||
Crapadilla
![]() |
Since I never make connections randomly, I'll cast my vote for... the 'more power' side of things. ![]() ![]() Edit: What about an "Advanced" mode for all components, like you did with Result (or with LDR & HDR Bomber)? Toggle it on, and the dilemma-free novice components become fully pimped-out advanced components that sport the new "greenified" map inputs. --- Crapadilla says: "Damn you, stupid redundant feature requests!" ;) |
|||||||||
Posted: November 10, 2015 9:46 am | ||||||||||
Betis
![]() |
I WAS IN THE MIDDLE OF TYPING THAT SAME THING
![]() ![]() Roses are #FF0000
Violets are #0000FF All my base are belong to you. |
|||||||||
Posted: November 10, 2015 11:55 am | ||||||||||
Vladimir Golovin
Administrator |
I HATE modes, but I was thinking about some kind of a safeguard against making nonsensical random connections. Advanced Mode seems to be a good candidate for that role...
Edit: this would solve another problem with greenification. Greenified components will generally be slower because the stuff that was precalculated during the Prepare step is now calculated for every sample, since the inputs are now green. Advanced Mode would allow a deliberate choice between speed and more power. (But I still hate modes.) |
|||||||||
Posted: November 10, 2015 12:21 pm | ||||||||||
Betis
![]() |
Is it possible to make inputs polymorphic? Like how in lerp you can plug in a grey constant control but also a green map input? Would it be possible to switch between pre-calculated vs mapped per input based on what's plugged into it?
It might have a small balloon next to it (similar to wrong input like a slider to intslider) saying that this is an advanced connection and that it can be slower than a standard constant input. Roses are #FF0000
Violets are #0000FF All my base are belong to you. |
|||||||||
Posted: November 10, 2015 1:24 pm | ||||||||||
SpaceRay
![]() |
I also wonder how it will work this of picking an image from a list. Will there be a new list component? How would the list be built? Would be able to make a list with images taken from a folder? |
|||||||||
Posted: November 11, 2015 6:52 am | ||||||||||
Skybase
![]() |
On the other thread there's a new switch that was discussed. Basically picks stuff based on values between 0 and 1 I believe. |
|||||||||
Posted: November 11, 2015 7:02 am | ||||||||||
Vladimir Golovin
Administrator |
Some follow-up thoughts on mass greenification:
1. Checkbox inputs should be easy to greenify. Just make them mappable, with a single fixed (non-adjustable) rounding logic: clip any HDR into 0..1, or just make the input LDR-only, then Round. This way they should behave pretty nicely even when a newbie connects random stuff into them. Darker zones mean that the checkbox is off, brighter zones mean that the checkbox is on. Pretty visual and self-explaining. We should be careful with the AAZones though, as the new rounding code will inevitably introduce additional AAZones. 2. Same with Lists / Dropdowns. They will accept HDR input via a single rounding logic: they will Round the incoming HDR value to the nearest integer. Ranges: Black (and any negative value) to 0.5 means Item #0, 0.5 to 1.5 means Item #1, 1.5 to 2.5 means Item #2, etc. Any out-of-range signal is simply clipped, i.e. means the Last Item. The need for HDR signal will protect such inputs from newbie-induced randomness: if they plug a simple non-HDR signal into such input, they'll just get zones for Input #1 (black to half-gray) and Input #2 (half-gray to white). Again, pretty safe, pretty visual and self-explaining. And again, we should be careful around new AAZones that will be introduced by rounding. 3. Technically, greenifying Slider / Angle / Spinner is trivial. The only obstacle here is newbie-friendliness / sensibility of random connections. Take, for example, the Rotation and Size sliders in Perlin Noise. Edit: They don't even need to be greenified because we already have their green counterparts: standard map inputs! (A note on remappers: all these greenified inputs should have the same remappers as their gray counterparts, in case when we connect a gray control to these newly green inputs.) To sum up, I see no obstacles to greenifying applicable (i.e. not involved in Prepare-stage precalculation) Lists and Checkboxes, but I'm not yet sure about greenifying the rest of gray controls, mostly due to newbie UX reasons. (And I still think that modes are ugly.) |
|||||||||
Posted: November 13, 2015 9:02 am | ||||||||||
Vladimir Golovin
Administrator |
(Greenification also opens the possibility for adding new control components, such as Mapped Checkbox, Mapped IntSlider, Mapped Angle, Mapped List etc., for use in filter interface, groups inputs and script inputs, but I'm not yet sold on this idea.)
|
|||||||||
Posted: November 13, 2015 9:10 am | ||||||||||
Vladimir Golovin
Administrator |
Open problem with greenification: how to deal with established / idiomatic controls such as Repeat (usually IntSlider 1...100) and Variation (always IntSlider 1...30000)?
In case of Repeat, the 1...100 range limitation is arbitrary, and in most cases it can be increased if not removed altogether. The case of Variation is more complicated. On one hand, the 30000 limitation is arbitrary as well, and it can be removed. On the other hand, Variation is often involved in pre-calculation that happens before sampling begins, and in many cases it can't be greenified. The question is, if we can greenify Variation in some cases, but cannot in other, should we have some components with greenified Variation, while leaving others with gray Variation? |
|||||||||
Posted: November 13, 2015 11:43 am | ||||||||||
Betis
![]() |
What about introducing noise evolution and then leaving variation grey? (I don't really see a point to greenifying variation when evolution would be a better control)
Roses are #FF0000
Violets are #0000FF All my base are belong to you. |
|||||||||
Posted: November 13, 2015 11:55 am | ||||||||||
Ramlyn
![]() |
Just curious. Why do you hate modes?
|
|||||||||
Posted: November 13, 2015 11:55 am | ||||||||||
Betis
![]() |
Re: New Mapped Controls
Although this is modal (and therefore hated by Vlad inherently), having checkboxes be able to switch to their mapped counterparts would be very clean and easy to understand. Similar to image components being able to accept images (which is already implemented) and controls being remappable. Roses are #FF0000
Violets are #0000FF All my base are belong to you. |
|||||||||
Posted: November 13, 2015 12:04 pm | ||||||||||
Sphinx.
![]() |
Before this thread was greenified the topic was slave components..
![]() So what hinders slaves fr om being used to generally provide additional special purpose outputs? I.e. instead of thinking them as something that has to be plugged in somewh ere down the source side of things, it may simply be thought of as the possibility to provide additional outputs. So will that angle change things? For the script I definitely think this has potential - with several of my scripts I wanted to output more than three "channels". I guess many other components have interesting "free" stuff to output.. |
|||||||||
Posted: November 17, 2015 9:08 am | ||||||||||
SpaceRay
![]() |
I think that if the slaves could be extended to other components that would be worth and useful to be used with slaves, it could maybe be a great advance and great feature to want to upgrade to FF 5.0 and not only having slaves on Loop and Bomber+ component and would surely make FF much better
I would not be able to use it, but surely the FF experts and experienced users would know how to use it and bring cool and amazing creations. |
|||||||||
Posted: November 19, 2015 1:39 am | ||||||||||
Vladimir Golovin
Administrator |
I think channels should be done as channels. Or perhaps as multi-output components. The concept of Slaves is, in my opinion, completely orthogonal to the concept of channels, so I'd prefer not to mix the two. |
|||||||||
Posted: December 22, 2015 7:50 am | ||||||||||
Sphinx.
![]() |
Perhaps they shouldn't be mixed, but additional outputs - either gray or colored (multichannel) depending on what makes sense - is a whole new dimension to explore then.
The content potential is much like for the particle slave etc, but as output slaves you'd see the combined values that end up being used etc. Much of my so-called channel trickery with the Tint input in the bomber is about making auxiliary outputs available, such as transformed particle texture space, particle depth map, angles etc.. for new post processing steps. Of course the blending complicate things regarding a generic solution. |
|||||||||
Posted: December 22, 2015 9:17 am | ||||||||||
LexArt
![]()
Posts: 256 |
I have just seen this thread, and wonder if all these will be going further or not
|
|||||||||
Posted: April 2, 2016 3:59 am | ||||||||||
Vladimir Golovin
Administrator |
LexArt, the next step will be more slave-friendly components. We plan to greenify a lot of inputs in existing components.
|
|||||||||
Posted: April 13, 2016 9:43 am | ||||||||||
Crapadilla
![]() |
One thing I would love to have is slave-components for image-accepting control components (i.e. Color Control and Grayscale Control). Example: In my Chalk-a-Dilla filter, I implemented a "custom default image" for the Source Image input (see attached image). However, the control logic for this requires a Switch setup using 2 control components - a Color Control (user image input) and a Checkbox Control (for toggling between default/user image). Now, if the Color Control had a slave component that would output its "image load state" as a boolean value and that component was connected to the Switch's greenified Selector, this setup would just have ONE control, and thus be much less confusing to the user. In principle, this is similar to the 'Override' feature that was redacted from Color Controls when support for multiple images was first introduced to FF, and I would love to have it back in a different (more elegant) form. ![]() --- Crapadilla says: "Damn you, stupid redundant feature requests!" ;) |
|||||||||
Posted: August 3, 2016 12:04 pm |
Filter Forge has a thriving, vibrant, knowledgeable user community. Feel free to join us and have fun!
33,712 Registered Users
+19 new in 30 days!
153,534 Posts
+32 new in 30 days!
15,348 Topics
+73 new in year!
27 unregistered users.