What's New: 3ds Max 2026 SDK
This topic describes new items and changes that affect the 3ds Max 2026 C++ SDK.
- SDK Break
- SDK Requirements
- SDK Changes
- API Changes
- ActionTable(actiontable.h)
- Animatable(Animatable.h)
- Biped (CS\Biped10Api.h, BipedApi.h)
- Custcont (custcont.h)
- Bitarray (Geom\bitarray.h)
- Color Management
- Geom\dpoint3.h
- Geom\dmatrix3.h
- Geometry import/export (impapi.h)
- Graphics (Graphics\IRefObject.h)
- IO (ioapi.h)
- Maxapi (maxapi.h)
- Notify & NotifyParams (notifyParams.h)
- Object (object.h)
- Shape
- SingleRefMaker (ref.h)
- Right Click (rtclick.h)
- UI Control (maxscript\UI\rollouts.h)
- Uiextend (uiextend.h )
- Util (\Util\ScopedTrace.h)
- Menu System
SDK Break
3ds Max 2026 is an SDK breaking release. Plug-ins compiled for 3ds Max 2025 will need to be recompiled to work in 3ds Max 2026 builds.
SDK Requirements
The developer environment is unchanged from 2025 except that .NET has been updated from .NET Framework v4.8 to .NET 8 in this version.
SDK Changes
- Developer environment for .NET upgraded to .NET Core 8
- SDK Licensing updates: SDK header licenses have been updated for conformity to the Autodesk license agreement, which is provided at the time of installation or download
- Updated samples and documentation to reflect API changes.
- String class (
strclass
) disabled implicit conversion to bool in CStr, UTF8Str and WStr classes.
New Headers
- iEditObjectContextProvider.h: An additional interface for any object to provide different edit contexts for the object when being modified. Exposes the IEditObjectContextProvider class.
- Rendering\IRenderRegionManager.h: Access to render region editing for the viewport and VFB. Exposes the IRenderRegionManager class and a GetIRenderRegionManager() method to acquire a pointer to the render region manager.
API Changes
Deprecated methods, classes, and headers in 2025 have been dropped in the 2026 SDK. This SDK version also refines some of the existing methods to add more functionality or improve on a feature set.
ActionTable(actiontable.h)
ActionManager.GetShortcutString
and GetActionDescription
now takes MSTR&
arg instead of MCHAR*
Before when arg was MCHAR*
, had to pass in a pointer to a buffer, but had no idea what size the buffer should be, and could write beyond end of buffer causing memory corruption. By passing MSTR&
, memory management is automatic and safe.
virtual BOOL GetShortcutString(ActionTableId tableId, int commandId, MSTR& buf) = 0;
virtual BOOL GetActionDescription(ActionTableId tableId, int commandId, MSTR& buf) = 0;
Animatable(Animatable.h)
Added two methods, one to fetch the number and list of existing Animatable objects.
CoreExport static DWORD GetNumAnimatables();
CoreExport static Tab<AnimHandle> GetExistingAnimatables();
Biped (CS\Biped10Api.h, BipedApi.h)
Added extraBonesNameMatch
parameter to LoadBipStpfile
method in IBipDriver
class and LoadBipedBaseAnimationLayer
method in IBipDriver10
class to load extra bones according to exact name matching.
class IBipDriver : public MaxHeapOperators
{
virtual int LoadBipStpfile(const MCHAR *fname, BOOL redraw, BOOL msgs, BOOL MatchFile = false, BOOL ZeroHgt = false, BOOL loadMaxObjects = false,
BOOL promptForDuplicates = false, BOOL retargetHeight = false, BOOL retargetLimbSizes = false,
BOOL scaleIKObjectSize = false, BOOL loadSubAnimControllers = false,Tab<const MCHAR *> *selectedNodes = NULL,
Tab<LoadSubAnimInfo> *selectedControllers = NULL, BOOL extraBonesNameMatch = false) =0;
};
class IBipDriver10 : public IBipDriver9
{
/*
\param[in] extraBonesNameMatch - when true, instead of loading extra bones according to index, extra bones will get remapped according to exact name matching.
\return true if the load was successful, false if the load was unsuccessful
*/
virtual bool LoadBipedBaseAnimationLayer(const MCHAR *fname, BOOL MatchFile, BOOL ZeroFootHeight,
BOOL promptForDuplicates, int retargetType, BOOL scaleIKObjectSize,
int loadMaxObjects, Tab<const MCHAR *> *maxObjectNames,
int loadControllers, Tab<LoadSubAnimInfo> *controllers, BOOL extraBonesNameMatch) = 0;
};
Custcont (custcont.h)
Added a method that can be implemented in order to support different contexts for drag and drop for rollups, regardless of whether custom drop handling is used.
virtual BOOL GetEditObjContext(MSTR& context){ **return** FALSE; }
Deprecated DoCUICustomizeDialog()
in favour of GetCOREInterface7()->DoUICustomization(CUI_PAGE_P
to achieve same functionality.
MAX_DEPRECATED void DoCUICustomizeDialog();
Bitarray (Geom\bitarray.h)
Added Get
Method to BitArray
.
/*! \remarks Gets the i-th bit.
\param i - The index of the bit. If the index is a negative or bigger than the array size, it returns 0 */
inline int Get(int i) const
{
return ((const BitArray)*this)[i];
}
Color Management
IColorCorrectionMgr.h
IColorCorrectionMgr.h and COLORCORRECTIONMGR_INTERFACE
macro was deprecated in 2025 and now removed. Please use IColorPipelineMgr
which provides better color management functionality.
MaxSDK::ColorManagement::IColorPipelineMgr
IModeSettings.h
Added new formatType
parameter for GetDefaultOutputConversion
and SetDefaultOutputConversion
methods.
virtual OutputConversion GetDefaultOutputConversion(OutputFormatType formatType, MSTR* colorSpaceOrDisplay = nullptr, MSTR* viewTransform = nullptr) const = 0;
virtual bool SetDefaultOutputConversion(OutputFormatType formatType, OutputConversion conversion,
const MSTR& colorSpaceOrDisplay = {}, const MSTR& viewTransform = {}) = 0;
// Enum for output image file formats (e.g. for SetDefaultOutputConversion() )
enum class OutputFormatType : uint8_t
{
kGAMMA_ENCODED, //!< Image file formats that use gamma encoding (such as jpeg, png, etc)
kLINEAR, //!< Image file formats that use linear and log encoding (hdr, exr, etc). \see BitmapIOMetaData::UseLinearStorage()
kNumOutputFormatTypes
};
gamma.h
GammaMgr::Enable()
method is marked as deprecated and its behavior is changed so that if the current color management mode is an OCIO-based mode, this function will not do anything. It can still toggle between gamma and unmanaged modes though, for backward compatibility.
We strongly recommend developers to start using IColorPipelineMgr for any color management related tasks as GammaMgr won't operate correctly in OCIO-based modes.
MAX_DEPRECATED void Enable(BOOL onOff)
Use IColorPipelineMgr
which provides better color management functionality.
MaxSDK::ColorManagement::IColorPipelineMgr
Geom\dpoint3.h
Fixed the +
operator of the DPoint3
class, which was returning a Point3 type instead of a DPoint3.
DPoint3AddLegacy
is added for backward compatibility.
/*! \remarks For backward compatibility, computes the previous incorrect version of the operator +
The operator used to create a floating-point Point3, which was then converted to DPoint3. */
constexpr DPoint3 DPoint3AddLegacy(const DPoint3& a, const DPoint3& b)
Geom\dmatrix3.h
Added method that uses previous less-accurate version of DPoint::operator +
GEOM_EXPORT void OrthogonalizeLegacy();
Geometry import/export (impapi.h)
Added two virtual functions to get drag & drop import information and use the 3ds Max default placement mode in drag & drop behavior.
virtual BOOL IsDragAndDropImport(POINT& screenLocationOut) = 0;
virtual void SetUseInteractivePlacement(BOOL wantPlacementMode) = 0
Graphics (Graphics\IRefObject.h)
virtual long RefCount() = 0;
Pure virtual 'long RefCount()' method was added to class MaxSDK::Graphics::IRefObject. Objects that derive from this class must add an implementation of this method that returns the current reference count.
IO (ioapi.h)
Added two methods to disable/enable chunk warnings and check whether chunk warnings are enabled.
virtual void DisableChunkWarnings(bool disable) = 0;
virtual bool AreChunkWarningsEnabled() const = 0;
Maxapi (maxapi.h)
Added new methods to get/set stack, viewport, snap status and scene file information.
// get/set preserve stack selection.
virtual BOOL GetPreserveStackPosition() = 0;
virtual void SetPreserveStackPosition(BOOL preserve) = 0;
// Checks if the specified screen coordinate is over a viewport.
virtual bool GetViewportFromScreenCoord(const POINT& pt, int& panelIndex, int& vptIndex, inHWND& hWnd, INode** node) const = 0;
// Invalidate all pages in Grid and Snap Settings dialog.
virtual void UpdateOsnapDlg() const = 0;
// Enable/Disable Angle Snap.
virtual void SetASnapStatus(BOOL enable) = 0;
virtual void SetPSnapStatus(BOOL enable) = 0;
// Get/Set the User Name stored in scene files.
virtual MSTR GetSceneFileUserName() const = 0;
virtual void SetSceneFileUserName(const MSTR& name, bool persist) = 0;
// Get/Sets the Computer Name stored in scene files.
virtual MSTR GetSceneFileComputerName() const = 0;
virtual void SetSceneFileComputerName(const MSTR& name, bool persist) = 0;
Added handleBranching
and preferSelected
options to Interface7.FindNodeFromBaseObject
. Both of these default to false to maintain existing behavior.
/*
\param[in] handleBranching If true, if obj is a branch of an object (such as Boolean), will continue search using the object.
\param[in] preferSelected If true, if find node that is not selected, continue searching and if find node that is selected return the selected node instead.
*/
virtual INode* FindNodeFromBaseObject(ReferenceTarget* obj, bool allowXRefNodes = true,
bool allowNonSceneNodes = true, bool allowScriptedPlugins = false, bool allowXrefObjects = false,
bool handleBranching = false, bool preferSelected = false) = 0;
Added to DependentEnumProc
//! \brief This is the method called by system from ReferenceTarget::DoEnumDependents() when entering
//! enumerating dependents for an object.
//! \param rmaker - A pointer to the reference maker
virtual void push(ReferenceMaker* rmaker)
{
UNUSED_PARAM(rmaker);
}
//! \brief This is the method called by system from ReferenceTarget::DoEnumDependents() when exitting
//! enumerating dependents for an object.
//! \param rmaker - A pointer to the reference maker
virtual void pop(ReferenceMaker* rmaker)
{
UNUSED_PARAM(rmaker);
}
Notify & NotifyParams (notifyParams.h)
Changed RegisterNotification and UnRegisterNotification code parameter to type NotifyCode instead of type int in 2025.
CoreExport int RegisterNotification(NOTIFYPROC proc, void* param, NotifyCode code);
CoreExport int UnRegisterNotification(NOTIFYPROC proc, void* param, NotifyCode code);
Object (object.h)
Added a helper class to remove a binding modifier when the node it is bound to is deleted.
class BindingModifierSceneRemove : public MaxHeapOperators
{
public:
CoreExport BindingModifierSceneRemove();
CoreExport ~BindingModifierSceneRemove();
/** This method potentially adds the binding modifier to the list of modifiers to be removed from nodes.
The modifier is added to the list if 3ds Max is in the middle of deleting one or more nodes, and 3ds Max is not in
the middle of an undo or redo. The list of modifiers is processed at the end of deleting the nodes.
\param mod The binding modifier. */
CoreExport void AddModifierToProcess(Modifier* mod);
private:
// PImpl_
struct Implementation;
Implementation* const m_implementation;
};
Shape
The trim/extend method for BezierShape adds another boolean method argument useLegacyDPoint3Add
as the last method argument.
CoreExport BOOL PerformTrimOrExtend(
IObjParam *ip,
ViewExp *vpt,
ShapeHitData *hit,
IPoint2 &m, ShapeContextCallback &cb,
int trimType, int trimInfinite, BOOL useLegacyDPoint3Add
);
SingleRefMaker (ref.h)
Add member variables to hold state on whether to force deletion of held references when dropping reference to it, as well as if SingleRefMaker was specified as a static instance. Used for animatable leakage detection at shutdown.
bool m_forceDelete;
bool m_isStaticInstance;
// Get whether SingleRefMaker was specified as a static instance_
CoreExport bool GetIsStaticInstance() const;
Right Click (rtclick.h)
Classes marked as deprecated as of 2026 SDK:
class MAX_DEPRECATED RightClickMenu final {};
class MAX_DEPRECATED RCMData final {};
class MAX_DEPRECATED RightClickMenuManager final {};
UI Control (maxscript\UI\rollouts.h)
added colorSpace
and doDisplayTransform
parameters for BitmapControl
class.
class BitmapControl : public RolloutControl
{
public:
TSTR colorSpace; // only used when the bitmap is specified via a filename, not an existing bitmap object
bool doDisplayTransform;
};
added ColorContext
parameter for ColorPickerControl
class.
class ColorPickerControl : public RolloutControl
{
public:
ColorContext colorContext;
};
Uiextend (uiextend.h )
Classes marked as deprecated from 2026
class MAX_DEPRECATED MSRightClickMenu {};
MAX_DEPRECATED static void* msmenu;
Util (\Util\ScopedTrace.h)
Added MaxSDK.Util.ScopedTrace.SetMessage
to allow for improved diagnostics.
void SetMessage(const MCHAR* extra_message)
{
mMessage = extra_message;
}
Menu System
imenuman.h
imenuman.h was deprecated in 2025 and now removed. As from 2025, a new menu system was adopted with the imenuman being succeeded by ICuiMenuManger
.
ICuiDynamicMenu
- Added a new
AddAction()
overload to simply add macroScript-based menu items via macroScript name and category.
virtual ICuiActionMenuItem* AddAction(
const MSTR& macroScriptName,
const MSTR& macroScriptCategory,
const MSTR& title = MSTR()) = 0;
- The method
AddItem()
contains two new optional arguments for specifying an icon and tooltip.
virtual ICuiActionMenuItem* AddItem(
UINT itemCmdId,
const MSTR& title,
DWORD flags = 0,
const MSTR& iconName = MSTR(), //
const MSTR& toolTip = MSTR()
) = 0;
ICuiMenu
- Added a new
CreateAction()
overload to simply add macroScript-based menu items via macroScript name and category.
virtual ICuiActionMenuItem* CreateAction(
const MaxSDK::MaxGuid& id,
const MSTR& macroScriptName,
const MSTR& macroScriptCategory,
const MSTR& title = MSTR(),
const MaxSDK::MaxGuid& beforeId = MaxSDK::MaxGuid() ) = 0;