Maya Notes Plugin: Persistent Scene Annotations with Custom Node Architecture

Developed by Ryan Wang
Technical Support from Claude (Anthropic)
View on GitHub →
Maya Notes Plugin preview animation

Overview

Maya Notes Plugin is a production-ready tool that embeds persistent text annotations directly into Maya scene files using a custom locator node architecture. The plugin provides a floating, always-on-top text editor with real-time viewport display, enabling artists to document scene state, leave TODO lists, and maintain project continuity—eliminating the need for external documentation files that become desynchronized from scene files.

Problem & Motivation

Pain Points Solved:

  • Lost Context: Opening a scene weeks later with no memory of what needs to be done or what's broken
  • No Native Note Storage: Maya has no built-in system for scene-level annotations—artists resort to external text files that get lost or outdated
  • Collaboration Friction: Team members can't see previous artist's notes, leading to duplicate work or missed issues
  • TODO Management: No centralized place to track incomplete work within the scene itself

This plugin transforms Maya scenes into self-documenting files where notes travel with the scene, ensuring every artist who opens the file knows exactly what to work on next.

Technical Architecture

Custom Node Design (Maya API 2.0)

Built using MPxLocatorNode base class with custom attributes:

Viewport 2.0 Draw Override

Implements MPxDrawOverride for real-time viewport text rendering:

Qt-Based Editor Interface

PySide2 dialog with WindowStaysOnTopHint flag:

Organizational Structure

Notes are organized under a locked "NOTES" group in the outliner:

Implementation Methods

1. Maya API 2.0 Plugin Registration

def maya_useNewAPI(): pass # Forces Maya to use API 2.0 def initializePlugin(obj): plugin = om2.MFnPlugin(obj, "Notes Plugin", "1.0", "Any") plugin.registerNode( kPluginNodeName, kPluginNodeId, NotesNode.creator, NotesNode.initialize, om2.MPxNode.kLocatorNode )

2. Attribute Creation with Function Sets

tAttr = om2.MFnTypedAttribute() NotesNode.noteText = tAttr.create("noteText", "nt", om2.MFnData.kString) tAttr.writable = True tAttr.storable = True # Persists in .ma/.mb files NotesNode.addAttribute(NotesNode.noteText)

3. Viewport Drawing Pipeline

def prepareForDraw(self, objPath, cameraPath, frameContext, oldData): node = objPath.node() plug = om2.MPlug(node, NotesNode.noteText) data['text'] = plug.asString() # Extract attribute value return data def addUIDrawables(self, objPath, drawManager, frameContext, data): drawManager.setColor(om2.MColor(color)) drawManager.text(position, text, omr2.MUIDrawManager.kCenter)

4. Qt Signal-Slot Event Handling

self.nodeCombo.currentIndexChanged.connect(self.loadNote) saveBtn.clicked.connect(self.saveNote) def saveNote(self): cmds.setAttr(self.currentNode + ".noteTitle", title, type="string") cmds.setAttr(self.currentNode + ".noteText", text, type="string")

5. Auto-Startup Integration

cmds.evalDeferred(showNotesEditor) # Open editor after Maya loads cmds.pluginInfo("notesPlugin", edit=True, autoload=True) # Auto-load on startup

Key Features

Use Cases

Current Limitations

Future Development

Impact

Maya Notes Plugin demonstrates how custom node architecture can extend Maya's core functionality to solve real production pain points. By embedding documentation directly into scene files, it eliminates the context-switching cost of external note-taking tools and ensures critical information never gets lost. This is especially valuable in team environments where scene handoffs are common, or for solo artists returning to projects after long breaks.

Tech Stack

Python 3 Maya API 2.0 OpenMaya OpenMayaUI OpenMayaRender PySide2 (Qt) MPxLocatorNode MPxDrawOverride

Project Type: Production Tool Development
Status: Active Development
Developed: November 2024

Technical References