#include <assert.h>
#include <maya/MSelectionList.h>
#include <maya/MConditionMessage.h>
#include <maya/MFnDagNode.h>
#include <maya/MDagPath.h>
#include "ShapeMonitor.h"
ShapeMonitor* ShapeMonitor::instance()
{
if (privateInstance == NULL)
{
privateInstance = new ShapeMonitor();
}
return privateInstance;
}
ShapeMonitor* ShapeMonitor::initialize()
{
destroy();
return instance();
}
void ShapeMonitor::destroy()
{
if (privateInstance != NULL)
delete privateInstance;
}
void ShapeMonitor::watch(
MString mayaNodeName, MonitoredObject* pMon)
{
if (retrieveMonitorObject(mayaNodeName))
return;
selList.
add(mayaNodeName);
pMon->mayaNodeName = mayaNodeName;
assert(stat);
assert(stat);
monitoredObjectsPtrArray.append(pMon);
}
void ShapeMonitor::stopWatching(
MString mayaNodeName)
{
for (int i = monitoredObjectsPtrArray.length()-1; i >= 0; i--)
{
if (monitoredObjectsPtrArray[i]->mayaNodeName == mayaNodeName)
{
removeCallbacks(monitoredObjectsPtrArray[i]);
delete monitoredObjectsPtrArray[i];
monitoredObjectsPtrArray.removeElements(i, i, false);
}
}
}
void ShapeMonitor::stopWatchingAll()
{
for (int i = monitoredObjectsPtrArray.length()-1; i >= 0; i--)
{
removeCallbacks(monitoredObjectsPtrArray[i]);
delete monitoredObjectsPtrArray[i];
monitoredObjectsPtrArray.removeElements(i, i, false);
}
}
void ShapeMonitor::stopWatchingUnselectedDagObjects(
MSelectionList& selectedObjects)
{
for (int i = monitoredObjectsPtrArray.length()-1; i >= 0; i--)
{
MonitoredObject *pMonObject = monitoredObjectsPtrArray[i];
selList.
add(pMonObject->mayaNodeName);
if (stat)
{
bool found = false;
while (!found && dagpath.
length() > 0)
{
found = true;
}
if (!found)
stopWatching(pMonObject->mayaNodeName);
}
}
}
ShapeMonitor* ShapeMonitor::privateInstance = NULL;
ShapeMonitor::ShapeMonitor()
{
}
ShapeMonitor::~ShapeMonitor()
{
stopWatchingAll();
}
MonitoredObject* ShapeMonitor::retrieveMonitorObject(
MString mayaNodeName)
{
for (int i = 0; i < (int) monitoredObjectsPtrArray.length(); i++)
{
if (monitoredObjectsPtrArray[i]->mayaNodeName == mayaNodeName)
return monitoredObjectsPtrArray[i];
}
return NULL;
}
void ShapeMonitor::removeCallbacks(MonitoredObject *mon)
{
assert(stat);
assert(stat);
}
void ShapeMonitor::watchedObjectDirtyCallback( void* clientData )
{
MonitoredObject *mon = (MonitoredObject*) clientData;
privateInstance->stopWatching(mon->mayaNodeName);
}
void ShapeMonitor::watchedObjectRenamedCallback(
MObject & node,
void* clientData )
{
MonitoredObject *mon = (MonitoredObject*) clientData;
privateInstance->stopWatching(mon->mayaNodeName);
}