Miscellaneous Changes and Improvements
- Inclusive Language Changes
- C++17 support and geometry library performance
MaxSDK::Array
and Standard Library algorithmsMaxSDK::Array
static assertions ensure requirements on the types it can store- Class
WindowsMessageFilter
and handling of Qt events - New
GetTypedInterface
API IPathConfigMgr
interface changes- Deprecation of
Interface18
andInterface19
- Deprecation of
REFMSG_GET_PARAM_NAME
reference message
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.