MPxLocatorNode::draw()

Locator node를 사용하면 draw() 함수 안에서 custom data에 대한 OpenGL rendering을 구현하는 것이 가능하다. 그런데, MPxLocatorNode::draw() 함수 안에서 print를 해보면, Maya viewport에서 camera 정보가 변할 때 뿐만 아니라, viewport를 click하거나 marquee를 그리는 등의 조작을 할 경우에도 호출되는 것을 확인할 수 있다.

Maya에서는 viewport를 click하거나 marquee를 그리는 등의 행동을 하게 되면 vieport 상에서 이렇게 지정한 영역과의 collision을 계산하여 object를 selection하게 된다. 정확한 구현 알고리즘을 알 수 없지만, 대략적으로 예상을 해보면..

현재 scene안에 hide되어 있지 않는 모든 shape object들에 unique color(ID)를 부여하여 OpenGL로 rendering을 하는 것 같다. 예를들면, pSphereShape1은 red, pCubeShape1은 green.. 이런식으로 rendering을 한 후에, mouse로 click한 지점의 pixel color로 어떤 object가 select되었는 지를 판별하는 방식이다. 즉, 만약 현재 click한 지점의 pixel값이 red라면 pSphereShape1이 선택되는 방식이다.

따라서, viewport rendering이 아닌, selection를 처리하기 위해서도 draw함수가 불린다. 물론, 첫 번째 test로 해당 node의 bounding box를 계산하여 현재 viewport와의 충돌을 감지되었을 경우에만 그 다음 과정으로 넘어가게 된다.

만약 MPxLocatorNode::draw()에서 GLSL을 이용하게 되면 selection mode에서 엄청나게 느려지는 문제가 발생한다. glUseProgram() 호출시 엄청난 delay가 발생한다. 따라서, selection mode에서 draw() 함수가 불렸을 경우에는 GLSL을 사용하지 않거나, 또는 아예 그리지 말아야 한다. 물론 그리지 않는다면 해당 object는 viewport 상에서 선택될 수 없다.

문제는 selection mode의 판별 여부다. MPxLocatorNode::draw()함수의 첫 번째 argument인 M3dView에서 이를 판별할 수 있는 함수를 제공한다. M3dView::selectMode() 함수는 selection mode에서는 true 값을 return 한다. 이를 이용하여 selection mode에서는 그리지 않거나 GLSL을 사용하지 않고 drawing을 해주면 된다.

답글 남기기