Share

Miscellaneous Changes and Improvements

Inclusive Language Changes

Several terms in the 3ds Max user interface, class, and method names in 3ds Max SDK, and MAXScript have been changed or removed because they were not aligned with Autodesk values of diversity and inclusion. We want everyone to feel welcome when using 3ds Max as an end user or tool developer.

Therefore, the names of several SDK elements that included words such as "master" or "slave" have been changed to use the terms "driver" and "driven" respectively. Usage of the old SDK elements will trigger a deprecation warning that will inform the developer of the new APIs to use instead of the old ones.

GetMasterController(anim) -> GetDriverController(...)
I_MASTER -> I_DRIVER
dh_master_unit_dialog -> dh_system_unit_dialog
MasterPointControl -> PointControllerContainer
NewDefaultMasterPointController() -> NewDefaultPointControllerContainer()
CreateMasterPointControl() -> CreatePointControllerContainer()
I_BIPMASTER
I_BIPMASTER8
I_BIPMASTER9
I_BIPMASTER10
I_BIPMASTER11
I_BIPMASTER12 -> BipDriver
BIPSLAVE_CONTROL_CLASS_ID -> BipDriven
IGAME_MASTER -> IGAME_POINTCTRLCONTAINER
GetMasterBase()
GetMaster()
AddSlaveNode()
CreateIKMasterControl(...)
CreateIKSlaveControl(...) -> Driver/Driven
MASTERLAYERCONTROLMANAGER_CLASS_ID    -> MAIN
virtual bool PreReplacement(..., INode *masterNode, Animatable *masterAnim, ...) = 0;
virtual bool PostReplacement(..., INode *masterNode, ...) = 0;
virtual INode *NewNode(INode *masterNode) = 0; -> main
MasterPointControlImp::Save(...) MasterPointControlImp::Load(...) -> SamplePointControlImp
MasterDlgDeleted(...) -> MainDlgDeleted(...)
masterMDlg -> mainMDlg
masterEDlg
masterRDlg
is_master()
Is_slave()
set_slave_animation(...)
get_slave_animation() -> Driver/Driven
pc_load_type_slave -> pc_load_type_network
MASTERLIST_CONTROL_CLASS_ID -> DRIVERBLOCKLIST_CONTROL_CLASS_ID
MasterEnable() -> SuperEnable()
virtual unsigned int DeleteNode(..., BOOL overrideSlaves=FALSE) = 0;
virtual unsigned int DeleteNodes(..., bool overrideSlaveTM = false) = 0; -> overrideDriven
MASTERMAXCLIP_CLASS_ID
SLAVE_CONTROL_CLASS_ID
SLAVEFLOAT_CONTROL_CLASS_ID
SLAVEPOS_CONTROL_CLASS_ID
SLAVEROTATION_CONTROL_CLASS_ID
SLAVESCALE_CONTROL_CLASS_ID
SLAVEPOINT3_CONTROL_CLASS_ID
SLAVEPOINT4_CONTROL_CLASS_ID
SLAVEMATRIX3_CONTROL_CLASS_ID
I_MIXSLAVEINTERFACE -> Driver/Driven
master_block_controller -> driver_block_controller
masterMDlg -> mainMDlg
masterFXDlg -> mainFXDlg
RO_UTIL_MASTER -> RO_UTIL_MAIN
EP_MASTER_CONTROL_REF -> EP_POINT_CTRL_CONTAINER_REF
masterCont -> pointCtrlContainer
MASTERBLOCK_SUPER_CLASS_ID -> DRIVERBLOCK_SUPER_CLASS_ID
CTRL_MASTERPOINT_CLASS_ID -> POINTCTRLCONTAINER_SUPERCLASS_ID
MASTERPOINTCONT_CLASS_ID -> POINTCTRLCONTAINER_CLASS_ID
PROP_MASTER -> PROP_POINT_CONTROLLER_CONTAINER
ES_MASTER_CONTROL_REF -> ES_POINT_CTRL_CONTAINER_REF
masterCont -> pointCtrlContainer
SV_FILTER_MASTER_POINT -> SV_FILTER_POINTCTRLCONTAINERS
GetMasterScale(...) -> System Unit Scale
GetMasterUnitInfo(...) -> System Unit Info
SetMasterUnitInfo(...)

C++17 support and geometry library performance

We have made several changes to the 3ds Max SDK with the goal of making its entire code base C++17 standard compliant.

We have also modernized our geometry library to enable standard C++11 optimizations. This improves performance and stability when using standard containers and algorithms.

This effort will continue throughout future releases of 3ds Max.

MaxSDK::Array and Standard Library algorithms

Class MaxSDK::Array has been updated with begin() and end() methods and can now be used with Standard Library algorithms.

MaxSDK::Array static assertions ensure requirements on the types it can store

The following static assertion has been added to the MaxSDK::Array class template:

static_assert(std::is_trivial<T>::value || (std::is_copy_constructible<T>::value && std::is_copy_assignable<T>::value), "The type stored by MaxSDK::Array must be trivial, or it must have a copy constructor and a copy assignment operator.");

The purpose of that static assertion is to validate that the type of the objects stored by the MaxSDK::Array satisfies at least one of the following conditions:

The type is trivial. See this page for information on what this means.

The type has a copy constructor and a copy assignment operator.

If neither of those conditions is satisfied, then certain functions that the MaxSDK::Array class template calls internally could result in undefined behavior. To protect 3rd party developers from that problem, we have added the static assertion described above, which causes a compilation error when the assertion is violated.

Class WindowsMessageFilter and handling of Qt events

The WindowsMessageFilter class ensures that any messages required by the internal Qt event system are passed through for the Qt UI. This is automatically done within the default implementation of IsAcceptableMessage(), which calls the IsQtSystemMessage() method.

Custom overrides of IsAcceptableMessage() should include a call to IsQtSystemMessage(). Failure to do that can cause the Qt UI to freeze.

New GetTypedInterface API

Some interfaces that derive from class InterfaceServer can now be retrieved by simply specifying the interfaces name, without the need to specify the interface ID.

For example, the following retrieves the INode interface of an object:

INode* node = obj->GetTypedInterface<INode>();

To support the GetTypedInterface mechanism in your interface class, you need to declare a constexpr member of type Interface_ID, called ID, that has the value of the interface ID of your class.

Here's how this is done for class ILayerProperties

class ILayerProperties : public FPMixinInterface 
{ 
public: 
static constexpr Interface_ID ID = LAYERPROPERTIES_INTERFACE; 
 

} 

These are the 3ds Max SDK interfaces that support GetTypedInterface:

INode 
ILayerProperties 
IMNMeshUtilities18 
IMNMeshUtilities17 
IMNMeshUtilities16 
IMNMeshUtilities15 
IMNMeshUtilities14 
IMNMeshUtilities13 
IMNMeshUtilities10 
IMNMeshUtilities8 
IMNTempData10 
IMNFaceExtrude 

IPathConfigMgr interface changes

The IPathConfigMgrEx and IPathConfigMgrEx2 pure virtual classes where collapsed down to the base IPathConfigMgr class.

The IPathConfigMgr::DoProjectSetupStepsUsingDirectory and DoProjectSetupSteps were invoking the 'Set Project Folder' macroscript rather than the 'Create Default Project' macroscript. The proper macroscript is now being called. Added IPathConfigMgr::DoSetProjectFolderStepsUsingDirectory and DoSetProjectFolder which invoke the 'Set Project Folder' macroscript.

Deprecation of Interface18 and Interface19

Methods of class Interface18 and class Interface19 have been moved to class Interface13 and class Interface14 respectively.

Deprecation of REFMSG_GET_PARAM_NAME reference message

REFMSG_GET_PARAM_NAME has been deprecated and replaced by REFMSG_GET_PARAM_NAME_LOCALIZED. This message is sent by a parameter block to its client when it needs the localized animatable name of the i-th parameter.

If a plugin overrides ReferenceMaker::NotifyRefChanged(...), but does not provide localized string resources, it can simply handle this message in the exact same way that it handles REFMSG_GET_PARAM_NAME_NONLOCALIZED, namely by returning a name in locale en-US.

If a plugin overrides ReferenceMaker::NotifyRefChanged(...) and provides localized string resources, it can handle this message in the same way that it handles REFMSG_GET_PARAM_NAME_NONLOCALIZED, but the name returned should be localized.

Was this information helpful?