지오메트리 생성

SOP의 가장 단순한 형태는 인풋을 받지 않고 대신 자기노드의 파라미터값에 따라 지오메트리를 생성하는 것이다. 이런 노드를생성노드라 불러, 필터노드와 구분짓는다.

처음에 SOP_Node를 상속받고, newSopOperator를 이용해 새로운 SOP_Node클래스를 만들고 이를 OP_OperatorTable에 추가한다. 등록후에는 PRM_TemplateList가 후디니로 전달되어 SOP_Node의 인터페이스를 이룬다. 마지막에는 실제 실행될 코드를 오버라이드 된 SOP_Node::cookMySop 메소드에 넣어준다.

SOP_Node::cookMySop에는 gdp타입의 GU_Detail이라는 지역멤버 변수가 있다. 모든 수정이 끝난후에는 변경한 지오메트리가 반영되도록 이 멤버 변수를 업데이트 해 주어야 한다. SOP_Node::gdp 는 쿠킹프로세스 밖에서는 빈객체일 뿐이다. 그러니외부에서 이를 볼수 있다는 생각은 버리자! 종종 이 변수는 이전에 만들어진 데이터를 저장하고 최적화하는데 쓰이기도 한다. 하지만 꼭 그런것은 아니니, 이를 사용하기 전에 GA_Detail::getUniqueId를 통해서 같은 지오메트리인지를 꼭 확인하여야 한다.

생성노드에서는 비어있는 GU_Detail로부터 계산을 하게되는데, 이를 위해GU_Detail::clearAndDestroy를 쓴다. GU_Detail::clearAndDestroy는 모든 지오메트리를 지운다. 이는 비슷한 지오메트리를 빨리 생성하는데에는 효율적이지 않다. 이럴때는 GEO_Detail::stashAll로 포인트와 프리미티브를 특별히 숨겨놓은 빈 GDP를 불러 지오메트리 재생성에 도움을 준다 . 작업을 마치면 숨겨놓은 프리미티브나 포인트 중 쓰이지 않은 것들을 지우기 위해 반드시GEO_Detail::destroyStashed를 불러야 한다.

빈 GU_Detail 상태에서는 주로 지오메트리 생성을 하게 되는데 두가지 형태의 지오메트리, 프리미티브와 포인트는 각각 다른방식으로 생성해야 한다. GU_detail::appendPoint를 이용하면 새 포인트를 생성할수 있다. 프리미티브를 생성할때는 GU_PrimPoly::build같은 각 타입에 맞는 정적 생성 메소드를 써서 새로운 프리미티브를 만들수 있다. GU_PrimPoly::build 같은생성 메소드는 보통 버텍스를 구성하는데 필요한 포인트를 만드는 옵션을 가지고 있다. 만약 새로운 포인트를 생성하지 않으면버텍스는 빈 포인트를 참조하고 이를 디스플레이 할 경우 후디니가 다운될수 있으니 각별히 주의하자.

후디니는 프리미티브, 특히 넙스 프리미티브의 디스플레이 캐시를 저장한다. 이 캐시는 직접 지오메트리를 만들때가 아니면 바로 변경되지 않는다. 이 디스플레이 캐시를 업데이트 하고 싶다면 지오메트리 수정이 모드 끝난후 GU_Detail::notifyCache를 쓰면 된다.

gdp->notifyCache(GU_CACHE_ALL);

생성노드 예제로는 SOP.SOPStar.C 와 SOP/SOP_Star.h 가 있다.