The following examples show possible ways to implement trackbar key filter functions:
In order to register a filter that will display only Visibility keys,
we can say
fn filterVisibilityKeys theAnim theParent theIndex theGParent theNode =
if theParent != undefined then
theParent[theIndex].name == "Visibility"
fn testCallbackAdditionFunction arg1 arg2 = (true)
theInterface = maxOps.trackbar
theIndex = theInterface.registerFilter filterVisibilityKeys callbackAdditionFunction "Visibility" 8 active:true stopTraversal:false
The filter function will return true only when the Parent is not undefined and the subAnim indexed track of the parent is called "Visibility".
A faster and better way to define a visibility track key filter function would be
fn filterVisibilityKeys theAnim theParent theIndex theGParent theNode = ( theIndex == 2 and theParent == theNode )
This function will return true only when the parent is the node itself and the index is 2 which corresponds to the Visibility track!
Obviously, you can define filter functions that will filter keys by the class or even the name of the node being traversed,
--this function will show keys only of Sphere class nodes:
fn filterSphereKeys theAnim theParent theIndex theGParent theNode = ( classof theNode == Sphere )
--this function will show keys only of objects whose name starts with "Sphere":
fn filterSphereByNameKeys theAnim theParent theIndex theGParent theNode = ( substring theNode.name 1 6 == "Sphere" )
In some cases, for example when animating using Reactor or baking animation to keys per frame using MAXScript, the trackBar could become very slow as it tries to display hundreds and even thousands of keys.
The following function will show keys only of those controllers that have less than 10 keys:
fn filterNonMassiveKeys theAnim theParent theIndex theGParent theNode = (superClassof theAnim == FloatController and theAnim.keys.count < 10 )
Create some object in the scene, for example a Box, set the Animation mode to Set Key and start animating the position by pressing the Key button. The trackBar will display the keys of the Box until you create the 10th key, after that all keys will be filtered out and disappear! You could define a global variable to control the number of keys to be displayed at a time,
global maxNumberOfKeysInTrackbar = 50
fn filterNonMassiveKeys theAnim theParent theIndex theGParent theNode = ( superClassof theAnim == FloatController and theAnim.keys.count < maxNumberOfKeysInTrackbar )
Simply changing the value stored in the global variable maxNumberOfKeysInTrackbar will control how many keys a controller may have in order to appear in the trackBar. You could even define a small dialog with a spinner and dock it in the UI to have interactive control over the keys display:
global maxNumberOfKeysInTrackbar = 20
--Define a rollout with a spinner
rollout MassiveKeysFilterCount "Keys Limit"
spinner massive_count "Max.Keys:" range:[10,1000,20] type:#integer fieldwidth:40
on massive_count changed val do
maxNumberOfKeysInTrackbar = val
--Create a dialog, register as DialogBar and dock at bottom
createDialog MassiveKeysFilterCount 120 25
cui.RegisterDialogBar MassiveKeysFilterCount style:#(#cui_dock_all)
cui.DockDialogBar MassiveKeysFilterCount #cui_dock_bottom
--Define, register and enable the key filter functions:
fn callbackAdditionFunction arg1 arg2 = (true)
fn filterNonMassiveKeys theAnim theParent theIndex theGParent theNode =
superClassof theAnim == FloatController and theAnim.keys.count < maxNumberOfKeysInTrackbar
theIndex = (maxOps.trackBar).registerFilter filterNonMassiveKeys callbackAdditionFunction "Massive Keys Filter" 13 active:true stopTraversal:false
Exploring the Trackbar Filter Callback Functions