USDC nested variantSet の構造メモ

2024/07/22に公開

ネストした 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::VariantSetSpecType::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