The minimum Maya Linux version has been updated to CentOS 7.6.
The devkit now requires gcc 9.3.1 and Visual Studio 2019.7
The required Linux libraries has been updated.
See Additional required Linux packages for Maya installation for the complete list of required Linux libraries.
Maya 2022 for Linux and Windows now supports both Python 2 and Python 3. However, future versions of Maya will only support Python 3.
Maya 2022 for macOS only supports Python 3.
Note: Maya 2022 for Linux and Windows now supports both Python 2 and Python 3. However, future versions of Maya will only support Python 3.
Maya 2022 for macOS only supports Python 3.
Maya on Windows and Linux now start in Python 3 mode by default. However, if needed, it can still be started in Python 2 mode.
To start Maya in Python 2 mode, start Maya from the command line with -pythonver 2
. For example, to start Maya on Windows in Python 2 mode, run maya.exe -pythonver 2
from a command window.
Alternately, you can use the MAYA_PYTHON_VERSION
environment variable to set the Python mode.
MAYA_PYTHON_VERSION
environment variable to 2The Python mode specified in the Maya start up command will override the mode specified by MAYA_PYTHON_VERSION
.
The pythonver
command line option has been added to the command line renderer on Windows and Linux. This lets users choose whether they want to run the command line renderer in either Python 2 or Python 3 mode.
Use Render.exe -pythonver 2
on Windows or ./Render -pythonver 2
to use Python 2.
Use Render.exe -pythonver 3
on Windows or ./Render -pythonver 3
to use Python 3.
mayapy
now supports installing Python 3 modules with pip. To use pip with mayapy
, use the following commands:
Linux | ./mayapy -m pip <command> |
macOS | ./mayapy -m pip <command> |
Windows | mayapy -m pip <command> |
See Managing Python packages with mayapy and pip for more information.
The versions of Qt and PySide used by Maya have been updated to version 5.15.2. Any code that uses an older version of Qt will need to be recompiled.
Updates have been made to the Alembic and OpenEXR libraries packaged with Maya. Minor security updates have been made to Alembic, and OpenEXR has been updated to version 2.4.1.
Plug-ins that rely on these libraries will need to be recompiled.
Qt Creator auxiliary tools will not be distributed in their entirety with Maya from this point forward.
Qt Creator tools can be downloaded from the Qt website.
Starting in PySide 5.14, the pysideuic module has been removed by QtC.
Users should use:
uic -g python <ui_file> -o <output_python_file>
to generate python code from their .ui files.
The Maya Script Editor now fully supports Unicode characters. Python scripts are now saved using UTF-8 encoding as prescribed by PEP-263, ensuring that file contents do not appear corrupted when reopened.
If a script containing international characters needs to be read by the script editor in an earlier version of Maya that does not support UTF-8, a new option in the Maya Preferences menu lets you save files using the system encoding instead. Go to Preferences -> Settings -> Files/Projects, scroll down to Script Editor and select system encoding from the drop-down menu.
The script editor now also correctly reads, and can optionally insert, magic comments indicating the encoding to use.
Two new environment variables, MAYA_BATCH_STDOUT_LOGGING_LEVEL
and MAYA_BATCH_STDERR_LOGGING_LEVEL
, have been added to control what is output to stderr and stdout by scripts, commands, and API calls.
Valid values for both variables are all
, info
, result
, warning
, error
, and none
.
MAYA_BATCH_STDOUT_LOGGING_LEVEL
defaults to none, and MAYA_BATCH_STDERR_LOGGING_LEVEL
defaults to all.
When starting Maya in batch mode, analytics will run by default. To opt out of analytics, set MAYA_DISABLE_ADP
to 1 before starting Maya.
See General variables.
A new option, AutoLoadOnce
has been added to the PackageContents.xml
file that is used when distributing plug-ins using the Autodesk App Store format. When set to True
, the plug-in will be autoloaded the first time Maya is started after it has been installed. However, if the plug-in's autoload option is unchecked in the plug-in manager, the plug-in will not be autoloaded on startup from that point on.
<ComponentEntry ModuleName="./Contents/plug-ins/myNode.py" AutoLoadOnce="True" />
See the section on distributing applications through the Autodesk app store for more information.
MSharedPtr<> has been added to Maya.
MSharedPtr<> objects are used in the Maya API to make object ownership explicit. They must be used with the Maya APIs that use MSharedPtr<>. No other object ownership scheme may be mixed with usage of MSharedPtr<>.
As with any other smart pointer, hold an MSharedPtr<> for any object you may want to reuse later. Maya will hold its own MSharedPtr<> for any objects it may use again later to prevent the objects from being destroyed and deallocated.
The MayaQclocaleDoubleValidator
was added to maya.internal.common.qt.doubleValidator
to accomodate locales where decimal values use commas instead of periods.
This validator should be used instead of QDoubleValidator
when developing a user interface with PySide.
MFalloffContext has been added to the OpenMayaAnim module.
MFnFloatVectorArrayData has been added to provide access to MFloatVectorArray. This is part of the GPU deformers upgrade.
MPxViewportComputeItem has been added to perform MRenderItem-specific evaluation. MRenderItem::addViewportComputeItem()
and MRenderItem::viewportComputeItem()
have been added to associate MPxViewportComputeItem with an MRenderItem.
New iterator syntax has been added to both Python API 1.0 and 2.0.
The existing syntax calls next
on the object: iterator.next()
.
The newly-added syntax calls next
with the iterator as the parameter: next(iterator)
.
The existing syntax has not been deprecated in the Maya Python APIs, and any plug-ins and applications that use the existing syntax do not need to be updated to use the new syntax.
Examples that used the existing syntax have been updated to use the new syntax.
Calling MGlobal::setActiveSelectionList()
with an empty selection list no longer clears the active selection list regardless of the ListAdjustment
parameter value.
Now MGlobal::setActiveSelectionList()
behaves as expected: when it is called with an empty selection list, it will delete the list if ListAdjustment
is set to kReplaceList
, otherwise it will do nothing.
The following changes have been made to the MCacheSchema class:
reset()
has been deprecated. It should be removed from any code that uses it.
attributes()
is now a range over MObject rather than MPlug. Any code that uses this method needs to be modified to reflect this change.
For example, if the original code used:
for (MPlug plug : schema.attributes())
{
//...
}
it must be changed to:
for (MObject attribute : schema.attributes())
{
//...
}
Two new constructors have been added:
MItGeometry()
MItGeometry( MDataHandle& dataHandle, const MString & componentTagExpression, bool readOnly, MStatus * ReturnStatus)
The new non-empty constructor is used when iterating over a subset of the geometry specified by a componentTagExpression.
The behavior of
MItGeometry (MDataHandle &dataHandle, unsigned int groupId, bool readOnly, MStatus *ReturnStatus)
has changed. Now when a groupID of 0 is passed to it, zero vertices are returned instead of all vertices. To return all vertices, pass the constructor a groupID of -1.
Six methods have been added to MRenderItem.
One method was added to set the primitive type of a RenderItem explicitly created by a plug-in:
void setPrimitive(MGeometry::Primitive primitive, int stride)
Two new methods were added for the purpose of marking objects for display filtering:
MUint64 objectTypeExclusionFlag() const
MStatus setObjectTypeExclusionFlag(MUint64 flag)
setObjectTypeExclusionFlag()
sets a bit flag for display filtering based on object type. objectTypeExclusionFlag()
queries the bit flag.
Three methods were added that use the new MSharedPtr:
void setCustomData (const MSharedPtr< MUserData > &userData)
MSharedPtr< MUserData > getCustomData () const
MStatus setShaderFromNode2 (const MObject &shaderNode, const MDagPath &shapePath, LinkLostCallback linkLostCb=nullptr, const MSharedPtr< MUserData > &linkLostUserData=nullptr, bool nonTextured=false)
Three methods have been deprecated:
void setCustomData (MUserData *userData)
MUserData * customData () const
bool setShaderFromNode (const MObject &shaderNode, const MDagPath &shapePath, LinkLostCallback=NULL, MUserData *linkLostUserData=NULL, bool nonTextured=false)
Note:
You will need to replace any instances of
setShaderFromNode()
in your code withsetShaderFromNode2()
.
The componentTagExpression
attribute has been added to MPxGeometry filter in the OpenMayaAnim module.
The following new method was also added to the class:
MFnGeometryData::SubsetState getGeometryIterator (MItGeometry &iter, MDataBlock &block, MDataHandle &dataHandle, unsigned int multiIndex, bool readOnly=true, MStatus *ReturnStatus=nullptr) const
The following interface was added to MRenderOverride to override the default Viewport 2.0 selection:
virtual bool MRenderOverride::select(const MFrameContext& frameContext, const MSelectionInfo& selectInfo, bool useDepth, MSelectionList& selectionList, MPointArray& worldSpaceHitPts)
The following methods were added to MSelectionInfo:
bool pointSnapping(MStatus* ReturnStatus = nullptr) const;
MStatus cursorPoint(int& x, int& y) const;
pointSnapping()
determines whether the Viewport 2.0 selection is launched to find snap points, and cursorPoint()
queries the cursor point relative the lower left corner of the viewport.
enum ComponentTagCategory
enum SubsetState
MStatus componentTags (MStringArray &keys) const
bool hasComponentTag (const MString &key, MStatus *ReturnStatus=NULL) const
MStatus addComponentTag (const MString &key)
MStatus removeComponentTag (const MString &key)
MStatus renameComponentTag (const MString &key, const MString &newKey)
MObject componentTagContents (const MString &key, MStatus *ReturnStatus=NULL) const
MStatus setComponentTagContents (const MString &key, MObject &component)
MFn::Type componentTagType (const MString &key, MStatus *ReturnStatus=NULL) const
ComponentTagCategory componentTagCategory (const MString &key, MStatus *ReturnStatus=NULL) const
unsigned int objectGroupCount ( MStatus* ReturnStatus = NULL)
SubsetState objectGroupSubsetState (unsigned int, MStatus *ReturnStatus=NULL) const
MObject resolveComponentTagExpression (const MString &expression, ComponentTagCategory ctg=MFnGeometryData::ComponentTagCategory::kAuto, MStatus *ReturnStatus=NULL) const
SubsetState componentTagExpressionSubsetState (const MString &expression, ComponentTagCategory ctg=MFnGeometryData::ComponentTagCategory::kAuto, MStatus *ReturnStatus=NULL) const
Several new methods and types have been added to MItDependencyGraph to allow for traversing on graphs based on different relations. Whereas previously it only followed "affects" relationships, it can now traverse dependencies, traverse dependency graph connections, or traverse the evaluation graph.
New type:
enum MItDependencyGraph::Relationship
New constructors:
MItDependencyGraph::MItDependencyGraph ( MObject & rootNode, MFn::Type filter = MFn::kInvalid, Direction direction = kDownstream, Traversal traversal = kDepthFirst, Level level = kNodeLevel, Relationship relationship = kDependsOn, MStatus * ReturnStatus = NULL )
MItDependencyGraph::MItDependencyGraph ( MPlug & rootPlug, MFn::Type filter = MFn::kInvalid, Direction direction = kDownstream, Traversal traversal = kDepthFirst, Level level = kPlugLevel, Relationship relationship = kDependsOn, MStatus * ReturnStatus = NULL )
MItDependencyGraph::MItDependencyGraph ( MObject & rootNode, MPlug & rootPlug, MIteratorType & infoObject,Direction direction = kDownstream, Traversal traversal = kDepthFirst, Level level = kNodeLevel, Relationship relationship = kDependsOn, MStatus * ReturnStatus = NULL )
New methods:
MItDependencyGraph::Relationship MItDependencyGraph::currentRelationship( MStatus * ReturnStatus = NULL )
MStatus MItDependencyGraph::setCurrentRelationship( MItDependencyGraph::Relationship relationship )
Two new methods were added to MFragmentManager to add and remove, respectively, a specific shader stage's input parameters.
bool addAutomaticShaderStageInput(ShaderStage shaderStage, const MString& parameterName, const MString& semantic, MShaderInstance::ParameterType parameterType, bool isVaryingInput);
bool removeAutomaticShaderStageInput(ShaderStage shaderStage, const MString& parameterName);
Three new methods were added to manage the mapping between parameter names and transient names.
bool addDomainShaderInputNameMapping(const MString& realParamName, const MString& domainParamName);
bool removeDomainShaderInputNameMapping(const MString& realParamName);
MString findDomainShaderInputName(const MString& realParamName);
MStatus getPlug ( unsigned int index, bool convertComponents, MPlug &plug ) const
has been added to MSelectionList. convertComponents
controls whether selected components are converted to their equivalent plug when possible.
MStatus deleteNode( const MObject & node, bool includeParents )
has been added to MDGModifier. This method exposes a boolean parameter that controls whether a DAG node's parents will be considered for deletion when it is deleted.
Two new methods have been added to MPxGPUDeformer:
MObject getFixedSetupData( const MString& name )
static bool hasPlugBeenModified( const MPlug &plug )
getFixedSetupData()
facilitates sharing of setup data between the CPU and GPU versions of the deformer node.
hadPlugBeenModified()
indicates whether a plug has been changed since the last call to MPxGPUDeformer::evaluate()
.
The offsetNode example has been updated to use getFixedSetupData()
.
A new method has been added to MFnNurbsCurve:
double findParamFromLength( double partLength, double tolerance, MStatus * ReturnStatus = NULL ) const
This method is identical to the two parameter findParamFromLength()
method, but adds a tolerance parameter to control the search precision.
Two new methods have been added to MEvaluationNode:
void skipEvaluation(const MObject& attribute, bool allowSingleDownstreamDependency = false, MStatus* ReturnStatus = nullptr) const
bool skippingEvaluation(const MObject& attribute, MStatus* ReturnStatus = nullptr) const
skipEvaluation()
tries to mark an attribute as skippable so that it is not evaluated by the Evaluation Engine. skippingEvaluation()
returns true if an attribute is marked as skippable.
A new example, simpleSkipNode, has been added to demonstrate the use of these new methods.
Two new methods have been added to MPxCustomEvaluator:
bool MPxCustomEvaluator::wantPruneExecution ( ) const
bool MPxCustomEvaluator::pruneExecution ( const MCustomEvaluatorClusterNode * cluster ) virtual
A new example, evaluationPruningEvaluator, has been added to demonstrate the use of these new methods.
Four new methods have been added to MGPUDeformerRegistrationInfo:
void inputMeshAttributes(MOjbectArray& inputAttributes)
bool matchAncestorLogicalIndices(const MPlug& original, MPlug& target)
virtual const MObject passTrhoughInputMeshAttribute()
virtual bool matchAncestorLogicalIndices (const MPlug &original, MPlug &target)
Two new methods added to MGPUDeformerBuffer:
const MPlug plug()
MOpenCLBuffer createMOpenCLBuffer()
And the signature for MGPUDeformerBuffer()
has been changed from
MGPUDeformerBuffer(const MUniqueString& name, bool readOnly, unsigned int elementSizeInBytes, unsigned int elementCount, unsigned int capacityInBytes, const MAutoCLMem& buffer, const MAutoCLEvent& event);
to
MGPUDeformerBuffer::MGPUDeformerBuffer(const MPlug& plug, const MUniqueString& name, bool readOnly, unsigned int elementSizeInBytes, unsigned int elementCount, unsigned int capacityInBytes, const MAutoCLMem& buffer, const MAutoCLEvent& event);
The signature for MGPUDeformerData::getBuffer()
has changed from
virtual MGPUDeformerBuffer MGPUDeformerData::getBuffer (const MUniqueString &name) const
to
virtual MGPUDeformerBuffer MGPUDeformerData::getBuffer(const MUniqueString& name, const MPlug& plug) const
The signature for MPxGPUDeformer::evaluate()
changed from
virtual DeformerStatus evaluate (MDataBlock &block, const MEvaluationNode &evaluationNode, const MPlug &outputPlug, const MGPUDeformerData &inputData, MGPUDeformerData &outputData)
to
virtual DeformerStatus evaluate(MDataBlock& block, const MEvaluationNode& evaluationNode, const MPlug& outputPlug, const MPlugArray& inputPlugs, const MGPUDeformerData& inputData, MGPUDeformerData& outputData)
A new argument, append
, has been added to MPxCommand.setResult
in Python API 2.0. When set to False
, setResult
returns a single value instead of a list.
To maintain backward compatibility, append
is set to True
by default.
MStatus MDagPath::matchTransform (const MDagPath &source, const MDagPath &target, const MDagPath &relative, MTransformationMatrix &transformationMatrix, bool preserveOffsetParentMatrix=true, bool preservePivot=true, bool preservePivotOffset=false)
MCallbackId MDagMessage::addMatrixModifiedCallback(MDagPath &affectedNode, MDagMessage::MWorldMatrixModifiedFunction func, void * clientData ,MStatus * ReturnStatus)
MObject MFnGeometryFilter::getComponentAtIndex (unsigned int index, MStatus * ReturnStatus = NULL)
The node IDs (MTypeID
) of many examples have changed.
These changes were made to ensure that the node IDs used in all examples were unique.
However, any scene created using an example with a changed node ID will no longer open. You will need to recompile the example and recreate the scene.
If you will be using an example in production, request a unique ID from http://mayaid.autodesk.io/ and use the provided node ID in the example before compiling.
Python API 1.0 examples have been renamed to have the py1
prefix, and Python API 2.0 examples have been renamed to have the py2
prefix.
Python examples have also been moved from the scripting
directory to the python
directory.
Platform | Python API 1.0 | Python API 2.0 | Python standalone applications |
---|---|---|---|
Windows | devkit\plug-ins\python\api1 | devkit\plug-ins\python\api2 | devkit\applications\python |
macOS and Linux | devkit/plug-ins/python/api1 | devkit/plug-ins/python/api2 | devkit/applications/python |
MEvaluationNode::skipEvaluation()
.MPxCustomEvaluator::wantPruneExecution
and MPxCustomEvaluator:pruneExecution
methods.The folllowing examples have been updated:
MPxGPUDeformer::getFixedSetupData()
.MThreadUtils::syncNumOpenMPThreads()
has been removed from threadingLockTests.moveManip.py
example has been updated to have the same behavior as the C++ version.pyBlindDoubleDataCmd.py
plug-in has been modified to fix a bug in the blindDoubleData
command.Maya no longer supports HDF5 variants of Alembic. Because of this, the following devkit examples now only support Ogawa Alembic files:
The following examples have been removed:
Some commands now accept UFE path strings.
Commands that are UFE-aware will have different syntax than non-UFE-aware commands.
The following is a list of UFE-aware commands. You are encouraged to look at the technical documentation for these commands before using them:
|
|
|
convertToComponentTags
command to MayasnapTransform
command to MayagameVertexCount
command to MayaThe FBXExtPlugin
command has been added to the fbxmaya plug-in. This command lets the user pass arguments to the FBX Extensions plug-in.
The mimicManipulation
command has been added to Maya.
The mergeBaseAnimLayer
(mbl
) and uiLoadConfiguration
(ulc
) options have been added to the file
command.
autoExpandAnimatedShapes
(xas
) flag has been added to the outlinerEditor
command.
noIntermediate
(ni
) flag has been added to the sets
command.
The dumpInfo
(di
) option has been added to the deformerEvaluator
command. Executing deformerEvaluator -di
prints debug information about the deformer evaluator's clusters in JSON format.
Two new options, startTime
(s
) and endTime
(e
), have been added to the filterCurve
command. These options specify the start time and end time, respectively, of the section to filter.
Three new options, stash
, unstash
, and clearStash
, have been added to the optVar
command. These options let you backup and restore a variable.
Several new options related to deformable chains have been added to the geometryAttrInfo
and deformableShape
commands.
Several new options have been added to the ghosting
command to support the new ghosting editor workflows.
The deformableShape
command's componentTagInjection
(cti
) option has been renamed tagInjectionList
(til
), and three new options, createUpstreamTagInjectionNode
, tagInjectionNode
, and upstreamTagInjectionNode
have been added.
The name
flag has been removed from the deleteAttr
, affectedNet
, and dynExpression
commands.
To specify all keys when using the cutKey Python command, use time=(None,None)
rather than time=()
.
The performSkinCluster.mel
script has been removed. The equivalent functionality can be achieved using:
import maya.internal.nodes.skincluster.cmd_create as sk_create
sk_create.Command().executeWithDefaults()