posted by cimple 2017. 8. 31. 12:07

Maya Node 를 개발할 때, attribute 로 모든 데이터를 저장하기에는 무겁고 처음 한번만 initialize 하면 되는 경우, 별도의 멤버변수를 만들어서 저장해 줄 수 있다.

그러나 이 때, Scene 을 저장했다가 open 할 때 initilize 가 되어 있지 않아서 연산되지 않는 경우가 발생한다. 이를 위해 Scene 이 열릴 때 한 번 더 업데이트를 해주면 된다.

이 때 사용되는 것이 MSceneManager 콜백 함수이다.

나는 다음과 같은 예제에서 활용하였다.


먼저 pluginMain.cpp 에

..

#include <maya/MSceneMessage.h>

MCallbackId openCallback;

..

MStatus initializePlugin(MObject obj){

...

openCallback = MSceneMessage::addCallback(MSceneMessage::kAfterOpen,  lightFollicleNode::sceneOpenSetup)

...

}

MStatus uninitializePlugin(MObject obj){

...

MSceneMessage::removeCallback(openCallback);

...

}


위와 같이 Plugin 에서 Callback 함수를 add 해 주고, Plugin 을 deregister 할 때 반드시 removeCallback 을 해주어야 한다.

이제 Scene 이 열렸을 때 sceneOpenSetup() 이라는 함수를 호출하게 된다.


void lightFollicleNode::sceneOpenSetup(void *data){

  cout << "***lightFollicleNode:scene open***" << endl;

  isSceneOpen = true;

}

위와 같이 단순하게 flag 를 바꾸어주는 함수이다. 이를 통해서 compute function 에서 간단하게 업데이트 컨트롤을 해 줄수 있다.