3030logger .addHandler (logging .NullHandler ())
3131
3232try :
33+ import maya
3334 import maya .cmds as mc
3435 import maya .OpenMayaUI as omui
3536 import maya .OpenMayaRender as omr
@@ -457,28 +458,33 @@ def __init__(self):
457458 # `mscreen` works by registering ONE callback in a Maya 3dview, said
458459 # callback calls to `__draw` where all the registered primitives are
459460 # proccessed.
461+ self .callback = omui .MUiMessage .add3dViewPostRenderMsgCallback (
462+ self .getCurrentModelPanel (), lambda * args : self .__draw ())
460463 self .primitives = list ()
461- # `_callback` holds Maya's callback ID.
462- self ._callback = None
464+ self .refresh ()
463465
464- def __registerCallback (self ):
465- if self ._callback is not None :
466+ # Maya's callback is stored as a singleton in the maya module so it can be
467+ # managed after reloading this module avoiding memory leaks.
468+ @property
469+ def callback (self ):
470+ if hasattr (maya , "mscreen_callback" ):
471+ return maya .mscreen_callback
472+
473+ @callback .setter
474+ def callback (self , value ):
475+ del self .callback
476+ maya .mscreen_callback = value
477+
478+ @callback .deleter
479+ def callback (self ):
480+ if not self .callback :
466481 return
467- self ._callback = omui .MUiMessage .add3dViewPostRenderMsgCallback (
468- self .getCurrentModelPanel (), lambda * args : self .__draw ())
469-
470- def __unregisterCallback (self ):
471- if self ._callback is not None and len (self .primitives ) == 0 :
472- try :
473- omui .MUiMessage .removeCallback (self ._callback )
474- except Exception as err :
475- logger .debug (err )
476- self ._callback = None
482+ omui .MUiMessage .removeCallback (self .callback )
483+ del maya .mscreen_callback
477484
478485 def __draw (self ):
479486 for each in self .primitives :
480487 each .draw (self .view , self .renderer )
481- self .__unregisterCallback ()
482488
483489 def refresh (self ):
484490 """
@@ -494,7 +500,6 @@ def clear(self):
494500
495501 def registerPrimitive (self , primitive ):
496502 self .primitives .append (primitive )
497- self .__registerCallback ()
498503
499504 def unregisterPrimitive (self , primitive ):
500505 if primitive in self .primitives :
0 commit comments