VOP structs

Overview

VEX structured type (주로 “struct”라고 부른다)는 멤버member로 불리는 서브데이터의 (예, integer, float, vector, matrix, struct) 이름된 조각들을 만드는 복합 데이터 타입 (compound data type)이다.

struct의 정의는 멤버의 이름, 데이터 타입, UI 이름을 지정한다. 이 것은 새로운 데이터 타입을 vector와 matrix와 유사하게 정의한다. 그런 다음 템플렛의 인스턴스들을 만들 수 있고 멤버 값들을 채워 넣을 수 있다.

VOP 네트워크에서 Struct, Struct Pack, Struct Unpack 노드들을 통해 struct를 사용할 수 있다.

** Note **

Houdini 13에서 struct들은 Houdini를 통해 사용되지 않았다. 그 것들은 조직의 형태로 서로 와이어들이 바인딩되는데 유용했다. 이 후 버전의 Houdini는 struct가 더 심도있게 통합시킬 것이다. 예를 들어, ramp와 noise 셋팅들 같은 현재 다중 와이어들로 표현되는 독립체들은 번갈아가며 struct로 표현될 수 있다.

Defined and ad-hoc structs

두 가지 방법으로 Houdini는 struct를 VOPs로 작업할 수 있다.

  • “정의된” struct들은 Houdini  경로에 있는 파일로 저장이 되고 Houdini 모든 곳에서 사용할 수 있다. 이 것은 사용자가 하나의 네트워크 이상에서 재사용하거나 사용하고자 할 때 또는 네트워크들끼리 공유하는 타입들에 대해 유용하다. 시영자는 Struct 노드를 사용해 정의된 struct들의 인스턴스들을 생성한다.
  • “ad-hoc” struct들은 “on the fly” 방식으로 생성되고 그 노드를 포함하는 네트워크 안에서만 사용 가능하다. 이 것은 네트워크를 단순히 하기 위해 와이어들을 일괄하고자 할 때 유용하다. 사용자는 Struct Pack node를 사용해 ad-hoc struct 인스턴스들을 생성한다.

The nodes

  • Struct node는 분리되어 있는 와이어들을 struct 와이어로 일괄할 수 있다. 그 노드는 정의된 struct 타입을 지정하는 것을 필요로 하고, 정의된 멤버들을 기반으로 인풋/아웃풋을 생성한다.
    또한 Struct 노드를 struct 와이어를 분리된 멤버 와이어들로 일괄 해제하는데도 사용할 수 있다.
  • Struct Pack node는 분리되어 있는 와이어들을 struct 와이어로 일괄한다. Struct node와 달리, 이 노드는 정의된 struct 타입을 정의하지 않아도 된다. 대신 이 노드는 입력되는 모든 와이어들의 타입으로 (그리고 파라미터에서 지정한 이름들) ad-hoc struct 타입을 생성하는데 사용한다.
  • Struct Unpack node는 이름을 통해 인풋 struct 와이어 밖으로 멤버들을 개별화 한다. 주로 사용자는 Struct node를 사용해 struct 와이어를 멤버 와이어들로 일괄 해제해야 한다. 그러나, 이 노드는 모든 struct 타입을 받아드리는 에셋/서브네트워크들을 사용자가 작성할 수 있게 한다. 이 노드가 이름과 타입을 통해 멤버들을 추출하기 때문이고, 반면 Struct의 아웃풋들을 연결하는 것은 위치(position)에 의한다.만약 인풋 struct가 주어진 이름의 멤버를 가지고 있고 잘못된 타입이라면, 네트워크에서 오류를 발생시킬 것이다. Houdini는 예상되는 타입을 명확하게 설정하도록 강제해 (Houdini가 어떤 struct 타입이 연결되었든 간에 자동적으로 아웃풋 타입을 변경하는 것 대신) 사용자가 지속적으로 아웃춧들을 연결할 수 있도록 한다.

How to

To… Do this
Create a new defined struct type
  1. Create a Struct node.
  2. In the parameter editor, click Edit.
  3. Use the Create new menu to create a new
  4. Use the VOP structure editor to define the members.
  5. Click Accept.
Create an instance of a defined struct
  1. Create a Struct node.
  2. In the parameter editor, choose the struct type from the Struct name menu.
  3. Wire member data into the inputs. The first output contains the struct instance.
Create an ad-hoc struct
  1. Create a Struct Pack node.
  2. Wire member data into the inputs.
  3. In the parameter editor, you can name the members. This will make wiring and debugging easier. If the name is blank, Houdini uses the name of the wire. In some cases this will be what you want anyway (for example, if the input is from a Parameter node, the default name is the parameter name).
  4. The output contains the struct instance.
Extract the members of a struct as separate wires
  1. Create a Struct node.
  2. Wire the struct into the first input.
  3. If you want to require that the input be of a certain defined type, in the parameter editor, set the Struct name to the type. The node will error if the input is not of that type.
  4. The outputs after the first contain the member data.
Extract one or more members of a struct by name
  1. Create a Struct Unpack node.
  2. Wire the struct into the input.
  3. In the parameter editor, set the Number of members you want to extract.
  4. For each item, set the Member n name and the type you expect the member to be.(The node will error if the input struct does not have all the specified members or if they are not of the specified type.)
  5. The outputs contain the extracted values.
Set the value of a struct member
  1. Create a Struct node
  2. Wire the struct into the first input.
  3. Wire new values into the inputs corresponding to the members you want to set.

set_struct

Modify the value of a struct member
  1. Unbundle the struct into separate wires using Struct or Struct Unpack (see above).
  2. Wire the output(s) you want to change into nodes that modify the value.
  3. Create a second Struct node to re-bundle the struct. Wire the struct (first) output of the unbundling node to the struct (first) input of this node.
  4. Insert nodes between the member outputs of the “unbundling” node and the member inputs of the “rebundling” node to change the values.

modify_struct

Create a new instance of an ad-hoc struct given a wire of that type
  1. Create a Struct node.
  2. Wire the struct into the first input.
  3. Wire member data into the inputs. The first output contains the struct instance.

Tips

  • struct에 대한 디폴트 와이어 색이 있지만, struct를 편집할 때 사용자는 struct 타입인 와이어들에 대한 커스텀 색을 지정할 수 있다.
  • 디스크에 있는 struct 정의 파이들을 “직접” 편집하려면, 아래의 Storage of defined types에서 파일 위치와 포맷에 대한 정보를 확인한다.
  • 사용자가 VOP 디지털 에셋을 만들때, 정의된 struct들을 인풋과 아웃풋 타임들로 지정할 수 있다.
  • Houdini가 경로에 있는 정의 파일들을 찾기 때문에, 사용자가 경로에 저장되어 있는 공유된 네트워크를 가지고 있다면, shader 작성자들에 의해 사용해하기 위해 site-wide struct들을 정의할 수 있다.

Storage of defined types

Houdini에서 사용가능한 “정의된” struct 타입들은 JSON 파일들로부터 불러와진다. Houdini는 모든 *.json 파일들을 HOUDINI_BOP_DEFINITIONS_PATH 환경 변수에 정의된 경로에서 불러온다. 디폴트 경로는 HOUDINI_PATH/vop 이다. Houdini에 있는 편집창을 사용해 생성되는 struct 타입들에 대한 디폴트 파일은 $HOME/HoudiniX.Y/vop/vopdefinitions/json 이다.

에셋이 VopTypeDefinitions로 이름된 섹션을 가지고 있다면 Houdini는 에셋에서 struct 정의들을 불러올 것이다. 이 섹션은 같은 포맷의 파일로 JSON string을 포함하고 있어야만 한다.

다음 예제는 struct 타입 정의 파일의 기본 구조를 보여준다. connectorColor 키와 멤버의 label은 옵션이다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
{
    “typeDefinitions”: [
        {
            “type”“struct”,
            “typeName”“StructTest”,
            “connectorColor”: {
                “type”“RGB”,
                “data”: [0.250.20.9]
            },
            “variables”: [
                {
                    “typeName”“int”,
                    “name”“a”
                },
                {
                    “typeName”“vector”,
                    “name”“b”,
                    “label”“Label B”
                },
                {
                    “typeName”“matrix3”,
                    “name”“c”
                }
            ]
        }
    ]
}
cs

 

완전한 포맷은 $HFS/houdini/vop/TypeDefinitions.json.schema에 있는 “JSON schema” 파일에 정의 된다.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s