USDC nested variantSet の構造メモ
ネストした variantSet を考えます.
#usda 1.0
def Xform "Implicits" (
append variantSets = "shapeVariant"
)
{
variantSet "shapeVariant" = {
"Capsule" ( variantSets = "geo" ) {
variantSet "geo" = {
"CapsuleA" {
def Capsule "PillA"
{
}
}
}
}
}
}
これのパスは以下のようになります.
/home/syoyo/work/tinyusdz/src/crate-reader.cc:ReadPaths:6147 path[0] = /
/home/syoyo/work/tinyusdz/src/crate-reader.cc:ReadPaths:6147 path[1] = /Implicits
/home/syoyo/work/tinyusdz/src/crate-reader.cc:ReadPaths:6147 path[2] = /Implicits{shapeVariant=}
/home/syoyo/work/tinyusdz/src/crate-reader.cc:ReadPaths:6147 path[3] = /Implicits{shapeVariant=Capsule}
/home/syoyo/work/tinyusdz/src/crate-reader.cc:ReadPaths:6147 path[4] = /Implicits{shapeVariant=Capsule}{geo=}
/home/syoyo/work/tinyusdz/src/crate-reader.cc:ReadPaths:6147 path[5] = /Implicits{shapeVariant=Capsule}{geo=CapsuleA}
/home/syoyo/work/tinyusdz/src/crate-reader.cc:ReadPaths:6147 path[6] = /Implicits{shapeVariant=Capsule}{geo=CapsuleA}/PillA
ここで
/Implicits{shapeVariant=}
[2] の親は /Implicits
[1]
/Implicits{shapeVariant=Capsule}
[3] の親は /Implicits
[1]
/Implicits{shapeVariant=Capsule}{geo=}
[4] の親は [3]
/Implicits{shapeVariant=Capsule}{geo=CapsuleA}
[5] の親は [3]
/Implicits{shapeVariant=Capsule}{geo=CapsuleA}/PillA
[6] の親は [5]
/Implicits{shapeVariant=}
[2]
/Implicits{shapeVariant=Capsule}{geo=}
[4]
は SpecType::VariantSet
/Implicits{shapeVariant=Capsule}
[3]
/Implicits{shapeVariant=Capsule}{geo=CapsuleA}
[5]
は SpecType::Variant
/Implicits{shapeVariant=Capsule}{geo=CapsuleA}/PillA
[6]
は SpecType::Prim
となります.
SpecType::VariantSet
と SpecType::Variant
のパスは同じ親を持つようになります.
(SpecType::VariantSet
は子を持つことが無い模様)
/Implicits [1]
+- {shapeVariant=} [2]
+- {shapeVariant=Capsule} [3]
+- {geo=} [4]
+- {geo=CapsuleA} [5]
+- PillA [6]
のような.
つまり nested Variant の場合, 自身も子も SpecType:Variant
なパスとなります.
階層の復元
- 自身が
SpecType::VariantSet
だった場合- 親ノードが VariantSet を持つことを知らせる
- 自身が
SpecType::Variant
だった場合- 親ノードの子である
SpecType::VariantSet
があるのを確認し, 適切な variantSet に追加する
- 親ノードの子である
- 自身が
SpecType::Prim
だった場合- 親ノードが
SpecType::Variant
であれば variantSet 内の Prim として処理 - 親ノードが
SpecType::Prim
(or PseudoRoot)であれば, 通常の Prim 階層として処理
- 親ノードが
となるでしょうか...
Discussion