지오메트리 변경

SOP_Node의 또 하나의 기본 형태는 필터노드다. 이런 노드들은 지오메트리를 받아 이것을 수정한다. 이는 포인트나 프리미티브를 생성하고, 제거하고, 수정하는 등의 방식으로 이루어진다.

SOP_Node 필더는 생성노드와 만드는 방식이 똑같다. 다른점이라면 요리를 시작할때 GU_Detail::clearAndDestroy를 써 지오메트리를 지우는 대신 인풋 지오메트리를 복사한다는 점이다.

노드의 인풋에 접근하기 위해서는 먼저 잠궈야 한다. 매 프레임 내려오는 인풋을 받아 잠그는 한가지 방법은 OP_Node::lockInput이다. 인풋이 잠기고 나면 const GU_Detail * 를 통해 SOP_Node::inputGeo에 접근할수 있다. 이 포인터는 OP_Node::unlockInput을 부르기 전까지만유효하다. lockInput과 짝을 이루어 unlockInput을 하는 것은 매우 중요하다.

또는 노드로 받아들여진 모든 인풋을 잠그고 싶을때는 OP_Node::lockInputs와 OP_Node::unlockInputs를 부르면 된다.

인풋을 잠그려면 OP_Context를 지정해야한다. 보통 SOP_Node::cookMySop에서 넘어온 OP_Context가 되겠지만, 만약 그외에 인풋을 사용하려면, 직접 OP_Context 만들어야만 한다.

인풋 지오메트리를 복사하해야 하는 경우가 빈번히 일어나는데, SOP_Node::duplicateSource는이를 쉽게 처리하게끔 도와준다.

노드가 하는 일이 포인트를 수정하기만 하고 만들거나 지우는게 아니라면 포인트 값만을 다시 설정하는 "빠른 복사"를 할수 있다.

SOP_Node::duplicatePointSource로 이 최적화를 실행한다.

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

gdp->notifyCache(GU_CACHE_ALL);

포인트 디포머의 간단한 예제로는 SOP/SOP_PointWave.c 와 SOP/SOP_PointWave.C 가 있다.

(C++ HOM API를 이용한) 다른 버전의 예제는 HOM/SOP_HOMWave.C와 HOM/SOP_HOMWave.h가 있다. 또한 후디니의 인라인cpp 파이썬 모듈을 통해 쉽게 파이썬 SOP에서 C++을 통해 가속하는 법을 살펴보도록 하자.

여러 개의 인풋이 들어오고, 서로 다른 시간에 그들을 계산해야 할 때의 예제로는 SOP/SOP_TimeCompare.C와 SOP/SOP_TimeCompare.h가 있다.