tyFlow operators are what create and drive particles in a simulation.
Click an operator name in the sidebar to find more information about a particular operator.
After an operator has been added to a flow, it can be enabled/disabled by clicking on its icon.
The settings for a particular operator can be accessed in the subrollout on the right hand side of the tyFlow editor. An operator must be selected before its settings will be revealed.
Many operators contain common settings. These settings pertain to operator timing controls, as well as test condition controls.
The Filters rollout allows you to control which particles will be affected by an operator.
Enable filters: controls whether particle filtering will be enabled for the operator.
AND/OR: controls the test condition for multiple filters. “And” means that a particle must pass all filters in order to be affected by the operator. “Or” means that a particle must pass any filter in order to be affected by the operator.
Filter list: the list of filters that will be used to test particle properties.
Enabled: controls whether the selected filter will be enabled.
Property Type: the property that the selected filter will test.
Test TRUE if property is: the property test condition.
Absolute/Custom Float: controls whether the test value will be an absolute value, or a value derived from a custom float data channel of the particle being tested.
Value: the absolute test value.
Channel: the custom float data channel from which to derive the test value.
The Keyframes rollout allows to control how animated spinner values will be synchronized - either to the current time or to particle ages.
Absolute: spinner parameters will be synced to the current time, regardless of particle age.
Event Age: spinner parameters will be synced to particle event ages. For example, a particle that has been in an event for 5 frames, will query animated spinner values at frame 5.
Particle Age: spinner parameters will be synced to particle ages. For example, a particle that has an age of 5 frames, will query animated spinner values at frame 5.
Offset: the per-particle frame offset to apply to the sync method.
Variation: the per-particle variation to apply to the sync method.
Speed %: the rate at which to synchronize keyframes. Lower values will slow animation.
The Timing rollout controls when particles will be affected by an operator.
On Event Entry: particles will only be affected by the operator when they first enter the event.
On Event Entry (Interval): particles will only be affected by the operator if they enter the event within a specified range of frames.
Continuous: particles will be continually affected by the operator as long as they stay in the event.
Event Age: particles will be continually affected by the operator as long as their lifetime within the event is within a specified range of values.
Particle Age: particles will be continually affected by the operator as long as their lifetime within the simulation is within a specified range of values.
Frames: particles will be continually affected by the operator as long as the current frame is within a specified range of values.
Some parts of a simulation (ex: the tearing solver) can generate new particles after all normal operators have already finished processing existing particles. This means that those new particles will not be processed by any normal operators until the next time step. However, since those new particles’ event age will be greater than 0 at the start of the next time step, trying to catch them “on entry” will fail, because particles are only treated as new in an event when their event age is 0. Enabling this setting will artificially treat them as new at the beginning of the next time step, allowing you to catch them with operators whose timing is set to affect particles on entry. NOTE: this used to happen automatically, but situations were discovered where this functionality needed to be disabled, so now this setting has been added in order to give users full control over the process.
Enabling this setting can be useful when you want to modify particle properties after PhysX evaluates, but prior to end-of-timestep velocity/spin integration. For example, this would allow you to modify PhysX linear/angular velocties directly on the same step where they are computed, rather than at the beginning of the next time step.
Enable frame exclusions: controls whether the list of frames to exclude will be processed by the operator.
Frame exclusion list: the list of frames to exclude from the operator’s affect.
The list may contain multiple frames or frame ranges. Separate frames with commas, and denote ranges of frames with dashes. A valid list may look something like: “0, 10, 20, 35-50, 100” (without quotations).
The frame skipping parameters allow you to control whether an operator will be activated or deactivated on certain frames, using a modulus operation to easily skip every other frame, or every 3rd frame, etc.
Activate/de-activate: Controls what will happen on the desired nth frames. Activate nth means that the operator will only be active on the specified whole frames. De-activate means the operator will be disabled on the specified whole frames.
Relative to frame/age: controls which temporal property ‘nth’ frame settings will be relative to.
Every Nth: controls the divisor of the modulus operation, which takes the form of: if (frame % divisor == 0) {…do work…}. In other words, if the current frame is not evenly divisible by this value, then operator activation/de-activation on this frame will be disabled. So if you set the value to 2, only every other frame will be activated. If you set it to 3, only every 3rd frame will be activated/de-activated, etc.
Offset: allows you to offset the time value of the modulus operation. An activation/de-activation value of 2 and an offset value of 0 will activate/de-activate these frames: 0, 2, 4, 6, 8…etc. An activation/de-activation value of 2 and an offset value of -1 will activate/de-activate these frame: 1, 3, 5, 7, 9…etc.
An activation/de-activation value of 0 means every whole frame and every substep (that also satisfy the other Timing rollout conditions) will be evaluated. An activation/de-activation value of 1 means only whole frames will be activate/de-active (subframes will not be evaluated). An activation/de-activation value greater than 1 means only every Nth whole frame (where N is the activation/de-activation value) will be evaluated (subframes will not be evaluated).
You can speed up the overall evaluation of your flow by using these settings to limit the activation of certain operators. Many operators do not need to evaluate on every timestep or subframe in order to maintain the fidelity of your flow. Using these settings to control frame activation can greatly increase performance in certain situations.
The Test Action rollout controls what will happen to particles that satisfy a conditional test within an operator.
Send Out: controls whether particles that satisfy the test condition of an operator will be sent to the next event (if the operator has a valid output connection).
Increment custom float: controls whether particles that satisfy the test condition of an operator will have the value of one of their custom data channels incremented.
Channel: the channel whose value will be incremented.
Sometimes you may want a particle to satisfy the test conditions of multiple operators before sending it to another event. In that case, you would set the test action of all of the relevant operators to “increment custom float”. Then, you would put a Custom Properties operator (whose timing is set to “continuous”) at the top of the event’s operator stack (and have it reset the value of the appropriate custom data channel to 0 each time step), and a Property Test at the end of the event’s operator stack which would be used to check the value of that custom data channel. The Property Test’s test action would be set to “send out” and the condition would be set to the desired value of the custom data channel. For example, if you wanted to chain three different operator’s test conditions together, you would use the Property Test to test for a custom data channel value of 3 before sending particles to the next event.
With that method in mind you can easily craft more complex test conditions within certain events.
Enabling the “save all test values” option is a good way to track the properties of particles within tested operators - especially the Property Test operator. You may, for example, save the number of neighbors a particle has from a Property Test, and use that value later as a filter in another operator.
Save test value when test TRUE: saves the value of the particle property to a custom float data channel when the value satisfies the test condition.
Save event age when test TRUE: saves the event age of a particle to a custom float data channel at the time when it satisfies the test condition.
Frames/Ticks: controls which unit of time to save the event age value in.
Channel: the channel where the value will be saved.