Porting Plugins from 3ds Max 2024 to 3ds Max 2025
3ds Max 2025 came with some breaking changes that marked an era of new approaches aimed at improving performance at the core. As a result, some tools tailored to pre-2025 3ds Max versions may fail to load into 2025. In this blog, we will give you a walkthrough of how to handle porting a plugin to 2025, using one of our samples as a base example.
Originally Posted: https://getcoreinterface.typepad.com/blog/2025/05/porting-plugins-from-3ds-max-2024-to-3ds-max-2025.html
What Changed in 2025?
2025 brings some exciting changes; here are some highlights:
- Menu Changes: 3ds Max 2025 introduces an overhaul of the menu system, deprecating the old
MenuManager (menuMan)
and introducing the new CuiMenuManager and its associated classes. This brings more ways of creating menus, statically or dynamically. - shape.h: Introduced 8 helper methods for enhanced Bezier shape handling and end cap material options to improve shape rendering and control.
- spline3d.h: Added methods for checking spline segment linearity , managing angle constraints, and enhancing spline manipulation capabilities.
- splshape.h: Implemented methods to override spline closure prompts, providing customizable control over user interface prompts.
- mnmesh.h: Introduced new classes and optimizations for vertex origins and mesh management, focusing on performance improvements with complex meshes.
- Mesh.h: We have added a helper method in ScopedLockChannels to efficiently update transformed bounding boxes, thereby enhancing mesh rendering accuracy.
- MaxGuid.h: Introduced the MaxGuid class for GUID management within MaxSDK, facilitating efficient unique identifier handling.
- iparamm2.h: A virtual SetRange method has been added for defining UI control ranges, enabling flexible parameter range customization.
- imorpher.h: Established interface classes for Morpher modifiers, expanding morphing capabilities with multiple channels of geometric transformation control.
- control.h: Implemented the GetDefaultController method to select appropriate user controls based on parameter types, ensuring efficient and accurate UI element assignment.
Now that you have seen some SDK changes in 2025, let's see how you would port a 2024 sample to work with 3ds Max 2025.
Porting the Explode Geometry Sample
The Explode Geometry Sample is one of the sample plugins maintained by the ADN team, with the installer available on the Autodesk App Store and the source code hosted on the ADN GitHub repo. To begin the porting process, let's begin with fetching the code we will be working with.
Fetching the source code
Using your favorite tool, whether GitHub Desktop, SourceTree, the command line, etc., clone the Explode Geometry Sample. Note that you need to clone on the version tag indicated below, as the code has been updated already to support newer versions of 3ds Max.
// Lets fetch code from v2.6 tag which supports 3ds Max 2024
// https://github.com/ADN-DevTech/3dsMax-Explode-Geometry/releases/tag/v2.6
git clone --branch v2.6 https://github.com/ADN-DevTech/3dsMax-Explode-Geometry.git
cd 3dsMax-Explode-Geometry
Updating to 2025 Assembly Versions
First, let's start by updating the assembly reference version to 3ds Max 2025 as well as setting our assembly output directory to 2025. In the .csproj project file, update the occurrence of 2024 to 2025, the assumption here being that you already have the 3ds Max 2025 setup installed.
With the project version updated, another interesting section to update is in our AssemblyInfo.cs
file. Here we have pre-defined assembly versions and other organizational details, which may need to be bumped up to match the 3ds Max 2025 version.
// Update the following two lines if need be
[assembly: AssemblyVersion("2.7.0.0")]
[assembly: AssemblyFileVersion("2.7.0.0")]
At this point, we have all versioning details updated and ready to work on 2025 feature changes. First, let's look at our core functionality.
Note: The system requirements for .NET are v4.8, if you have any build issues with version incompatibility, switch to v4.8.1.
MNVert Changes
As noted earlier about some small changes to the C++ API that affect .NET-generated code, MNVert is among the victims of performance optimization. With the C++ API dropping the original copy operator for the C++ default copy, making MNVert trivially copiable and allocatable. This subtle change that works the same on the C++ side results in missing the `Assign` operator on the .NET `MNVert`.
Below is the final output for the 2024 vs. 2025 `ExplodeGeometry` with the MNVert functionality unchanged. You will note that the 2025 version shows no shapes on the scene as the Assign method is missing, which assigns vertex points to the `polyNewFace` which we are using to create new faces.
How can we remedy this? A quick fix is as shown below:
// Original code ..
polyNewFace.Mesh.V(k).Assign(vert);
// New code ...
polyNewFace.Mesh.V(k).P = vert.P;
Note that the method `Assign` still works on the `MNVert`, but this originates from the `FlagUser`, where `MNVert` derives from.
With that fixed, let's have a look at the menu system changes and how to effect those changes in our sample.
Upgrading to the new Menu System
Unfortunately, we will go over all the menu changes and how to make use of them here, but you can find a detailed guide on the following topic below:
- The Menu System: https://help.autodesk.com/view/MAXDEV/2025/ENU/?guid=GUID-FF48D0EC-6669-4EC7-AB43-E9998A14A198 & https://help.autodesk.com/view/MAXDEV/2025/ENU/?guid=menu_system
- Menu Migration Guide: https://help.autodesk.com/view/MAXDEV/2025/ENU/?guid=menu_migration_guide
The sample packs a few useful packaging scripts and configuration files. This is where we will be modifying to set up the menu changes. But first, why do we need to make use of the menu in this sample?
The sample is distributed as part of the ADN samples through the Autodesk AppStore. As such, to invoke the sample:
- First, the assembly must be loaded to 3ds Max, which we are achieving by using the `PackageContents.xml` file. You can check the section on ` Packaging Your Project` in the Menu Migration Guide linked above.
- Secondly, we expose the action items through MacroScript. This is not necessary, as we can make use of the Action table IDs directly to invoke the .NET methods.
- Lastly, we create a menu entry under the `
App Store
` menu item on the main menu bar.
With all that in mind, let's navigate to the `PackageContents.xml
` located in the `/Bundle2
` directory and start the packaging process upgrade.
PackageContents.xml file
First, let's expand the package runtime environment to support 2025. This can be done by updating the `SeriesMax
` value to 2025. Similarly, let's expand the `SeriesMax
` for `macroscripts parts
` segment as shown below:
<RuntimeRequirements
OS="Win64"
Platform="3ds Max"
SeriesMin="2020"
SeriesMax="2025"
/>
<Components Description="macroscripts parts">
<RuntimeRequirements ... SeriesMax="2025" />
...
</Components>
With MacroScript support for 2025 added, let's add .NET assembly as shown below.
<Components Description="assemblies parts">
<RuntimeRequirements OS="Win64" Platform="3ds Max" SeriesMin="2025" SeriesMax="2025" />
<ComponentEntry AppName="ADNExplodeGeometry" Version="2.6.0" ModuleName="./Contents/ManagedAssemblies/2025/ADNExplodeGeometry.dll" AppDescription="..." />
</Components>
Lastly, let's add a post-startup script for 2025 that will create the menu entry for us on 3ds Max boot. Don't worry for now; we'll create the actual file and its contents next.
<Components Description="post-start-up scripts parts">
<RuntimeRequirements OS="Win64" Platform="3ds Max" SeriesMin="2025" SeriesMax="2025" />
<ComponentEntry AppName="ADNExplodeGeometry" Version="2.6.0" ModuleName="./Contents/Post-Start-Up_Scripts/ADNGeometryExplodeSetupMenu2025.ms" AppDescription="Setup Menu to execute tool" />
</Components>
Creating Menu Entries for 2025
As we noted above in the `PackageContents.xml`, we need to add a new post-startup script that will handle menu creation for our package when it's loaded. We create a new file called ` ADNGeometryExplodeSetupMenu2025.ms` in the `./Bundle2/Contents/Post-Start-Up_Scripts/` directory. Unlike 3ds Max 2024 and earlier versions, 2025 uses callbacks to register new menu entries for both regular and quad menus.
Within the file, let's add code to register our callback as well as get the main menu bar handle, which we will use to add new menu or sub-menu entries.
function menuCallback = (
local menuMgr = callbacks.notificationParam()
local mainMenuBar = menuMgr.mainMenuBar
)
-- Register Callback to the #CuiRegisterMenus
callbacks.removeScripts id:#adnExplodeGeomMenu
callbacks.addScript #cuiRegisterMenus menuCallback id:#adnExplodeGeomMenu
From the callback, we can access the menu manager, which hosts the main menu bar. We'll use the main menu bar to add a sub-menu item, which will have our menu item. Let's see how this is attained:
local stringAppStoreDefaultMenu = "App Store"
-- ADN Explode Geometry MXS
local stringMacroScriptName = "ADNExplodeGeomMS"
local stringMacroScriptCategory = "ADN Samples"
local helpMenuId = "cee8f758-2199-411b-81e7-d3ff4a80d143"
-- ID of the "App Store" menu in the menu bar. Use this ID when in need of adding new submenu items to the "App Store" menu entry.
local appStoreMenuId = "CC18FEFC-E8A4-4B16-B519-664E8FA3B549"
local newSubMenu = mainMenuBar.CreateSubMenu appStoreMenuId stringAppStoreDefaultMenu beforeId:helpMenuId
local separatorId = "96FB49D4-6263-4D8E-AC95-6D304673327B"
newSubMenu.CreateSeparator separatorId
local permanentId = stringMacroScriptName + "`" + stringMacroScriptCategory
-- 647394: MacroScript Action Table ID
newSubMenu.CreateAction "9DE5BDB9-E47F-4614-BDF8-C331B9B38C70" 647394 permanentId
This script defines some local variables like the menu entry name and our menu name, as well as some system data like the `Help Menu` GUID. From the main menu bar, we create a submenu called `App Store` using mainMenuBar.CreateSubMenu.
In the submenu, we add a separator at the end of the existing menu items, if any (in our case it may be empty), and then we create a new action entry for our sample.
With the script completed, we have one last piece remaining: adding the built assembly to the package.
Build & Adding Assembly to the Package
Under the `PackageContents.xml
` section, we added a reference to a built assembly supporting 2025. From our upgraded project, we build our project, and the generated assembly is written out to our project's `OutputPath` directive. We can copy over this assembly to the `./Bundle2/Contents/ManagedAssemblies/2025/
` directory.
The Bundle2 directory can be copied over as is now to the 3ds Max plugin directory, and on the next 3ds Max boot, the plugin will be loaded. For a full guide to plugin packaging, check the docs here: https://help.autodesk.com/view/MAXDEV/2025/ENU/?guid=packaging_plugins.
Final touches
To finalize the plugin details, we can do a couple of things:
- Update version information for the plugin, as encompassed in the `
PackageContents.xml
` - Documentation: Updating the documentation details for new features, fixes, and/or new version information.
We hope you found that helpful!