5 Must-Have Features in a Foundry Filters

14 Apr.,2024

 

What's New in Mari 5

Mari 5 has several new features and feature enhancements in addition to bug fixes. This page documents the new features, and links to the appropriate page of the online help so you can get the information you need to start working with the new features right away. To read about bug fixes and feature enhancements, navigate to a specific release.

Note:  See the navigation bar on the left for links to specific release notes by version.

Mari 5.0

USD Preview Look Export

Mari now ships with a built version of our open source USD plug-ins. Our mission at Foundry is to continually grow Mari's USD integration by adding to the features available in our USD plug-ins. For Studios who want to build their own version of the plug-in, to better tailor how it reads or writes USD suited to Studio pipeline needs, a handy preference is available (Preferences > USD > General > Load USD Plugin) to disable the shipped USD plug-in, allowing Studio versions to load unconflicted in its place.

See Exporting a Flattened USD Preview of Your Asset's Look for more information.

Filtering Non-Destructively Using Bake Point Filters

In Mari, certain Filter effects like Blur could only be applied to a Paint layer/node. In order to perform a Blur operation on a graph network of procedural nodes, artists would have to first convert the graph to a Paint node, then apply the Filter there. This would disrupt the flow of the artists' creativity and was a completely destructive workflow.

We have addressed this opportunity to increase Mari's proceduralism by bringing Filters to Mari's Bake Points. Artists can now insert a Bake Point into their Node Graph network and apply a stack of Filters to the baked result.

See Bake Point Node for more information.

Changing Brush Color Dynamically

We've introduced new brush dynamic controls to the Brush Settings. With the addition of precise range controls for new Jittering techniques, artists can now create more stylistic brush strokes than have ever been possible before.

See Changing Brush Color Dynamically for more information.

Brush Tip Improvements

Previously, bringing in custom brush tip images into Mari required artists to ensure the desired brush Alpha was encoded into an image's Alpha Channel. Our improved Brush Engine now allows you to specify whether a brush tip's Alpha is generated from an image file's Red, Green, Blue, Alpha or Luminance Channels, giving artists complete control on how their custom brush tips are generated.

Have you ever wanted to create a brush that stamped down a full color image, along with all the ability to stylistically control each splat with the various jittering controls of the brush settings. Now you can, with the new ability to utilize the full RGBA color data from an image file. Including colorspace controls, this new addition unlocks artistic freedom with Mari's brush engine.

Gradient Procedurals

We’ve introduced five new types of Procedural patterns that can be used in conjunction with our Projectors and Locators to create powerful Procedural Masks that drive complex materials.

See Projection Nodes for more information.

Math Nodes

We've introduced new math nodes to perform various mathematical operations on incoming vector data:

  • Max - Outputs the larger of the two input values, per-component.
  • Min - Outputs the smaller of the two input values, per-component.
  • Sin - Outputs the sine of the input, per-component.
  • Cos - Outputs the cosine of the input, per-component.

See Math Nodes for more information.

Node Graph Snapping

Mari's Node Graph now comes with Grid Snapping. From Mari's Preferences, artists can now toggle grid snapping with Node Graph > Grid > Snap to Grid and enable a visual grid in the Node Graph view background with Node Graph > Grid > Show Grid.

See Snapping Nodes in the Node Graph for more information.

VFX Reference Platform CY2020

Mari's third party libraries have now been upgraded to the versions specified by the VFX Reference Platform. See Third-Party Licenses for a full list of third-party libraries.

  1. You can set up a filter interaction the crosses object types by using multiple filter list widgets. There are different combinations that can be used to achieve different desired behavior, but the simplest might be a "cascade" where you have a filter list for Object Type A, then apply the output filter variable to create an [o] Object Type A [filtered] object set variable.

Then you use [o] Object Type A [filtered] as an input to another object set variable and do the search around step to create the object set of Type B that corresponds to the filtered set of Type A.

Then that set of Type B is the input into the second filter list widget, where you can further refine the Type B objects and ultimately have an output object set that reflects the results of both filters.

  1. This is currently not possible in the Pivot Table widget, though is a feature under active development. In the meantime you can use a Typescript Function to create custom aggregations and display them in a Function-backed chart, which while not the exact same as a pivot table in this context, can still help visualize the derived, aggregated data.

You can also, as you suggest, create an intermediate object type that represents the "aggregated" metrics. Sometimes this is "natural" - for example in the Foundry Reference Project the idea of a flight "Route" is derived by aggregating flight-level information and calculating some metrics that are then easier to work with in some instances than always doing a dynamic calculation by aggregating flight data by destination and origin. In some other cases it's less natural, but can still be necessary if you have more complex calculations or business logic to apply to derive the relevant information.

The limitation here is obviously that pre-calculated metrics aren't as flexible as dynamically calculating the aggregations if you need to provide arbitrary filtering for the user based on the most granular data (i.e. show a chart of the route performance only for flights on this airline, during this time window, with these three aircraft models, etc.

  1. For high-cardinality pivots, you'll have more success with an intermediate aggregate object type than trying to work with them dynamically. Logically providing any set of the "top" pivoted rows requires calculating the metrics for the entire object set, which for high-cardinality is computationally tough to do in "real time".

In the case where you can filter down proactively to an object set that represents just a few hundred entities (again say filtering down to a set of 1 million flights that represents 100 routes, then pivoting by route_name you should be ok working dynamically, but if you have 1 million flights across 10,000 routes, then you want be able to dynamically pivot to count the number of flights per route then order a pivot table, even if you only want to show the "top 10 routes by flight count").

So again here, some more expressive representations of the data at different levels of aggregation in new, linked object types can help provide the expressiveness necessary to build your visualizations and workflows.

5 Must-Have Features in a Foundry Filters

Foundry Workshop, filter and pivot limits and possibilities