If the modifier supports sub-object selection, the plug-in must provide methods to allow the system to manipulate the sub-object components of the modifier. When a modifier's parameters are being edited, it has the option of providing the system with different levels of sub-object selection. There are two types of sub-object selection:
A modifier notifies the system of the sub-object selection levels that it provides when the modifier's Animatable::BeginEditParams() method is called.
The Bend modifier for example has sub-object levels for Gizmo and Center. When the user enters sub-object level they expect the standard tool bar translation tools will work for adjusting the sub-object components, for instance moving the center or scaling the gizmo.
When the user changes the selection of the sub-object drop down, the modifier is notified. At the time of the notification, the modifier is expected to provide an instance of a class derived from CommandMode to support move, rotate, uniform scale, non-uniform scale, and squash modes. These modes replace their object level counterparts, although the user still uses the move/rotate/scale tool buttons in the tool bar to activate these modes. A plug-in developer does not need to support all of these modes. For example, they may just support move because rotate and scale don't apply to the specific plug-in type. Any modes that the plug-in doesn't support will be grayed out in the toolbar.
In addition to move/rotate/scale, a plug-in can always have other modes. For instance, the Edit Mesh modifier has an extrude mode where the user can click and drag to interactively extrude faces of a mesh.