ニッチなblender手記

世の中には自分に似た人が3人いるとされています。その人達へと情報共有するために主にblenderの記事を書いていきます。

loose usage about hardOps (hops sort tests)

主旨

hardOps の hops sort 機能の挙動が気になったのでテストしてみた結果の記事です。

本編はこっち

minorblender.hatenablog.com

ソートルール実験

読んでもルールが分からないので、観察してみることに。
観察方法は パターン網羅 で行う。
全て off の場合はソートなしと同じなので、まずは当然のように全ての条件を on にする。

テストケース1:全部のせパターン(昇順)

まずは全てのモディファイアを、 オプション設定の順序に沿って 積み上げる

f:id:r9aArrowhead:20201014140904p:plain

f:id:r9aArrowhead:20201014140910p:plain

f:id:r9aArrowhead:20201014140922p:plain

f:id:r9aArrowhead:20201014140928p:plain

f:id:r9aArrowhead:20201014140935p:plain

処理前後のスタック部分だけ抜粋。

f:id:r9aArrowhead:20201014140944p:plain

f:id:r9aArrowhead:20201014140940p:plain

上の結果から確実に判明した部分だけを記載すると、以下の通り。

  • Cast モディファイアは HardOps経由のboolean を実行すると、最初に実行する
  • boolean モディファイアは Cast モディファイアよりも後に実行する
  • Sort と Sort Lastに指定したモディファイアは、boolean モディファイアの後へとソートされている
  • Weight Normal モディファイアは最後に実行する

その他にはソートや Last Sortの On / Offで変わる可能性はあるが、全部のせからは判断できない。

テストパターン2:全部のせパターン(降順)

次は全てのモディファイアを、 オプション設定とは逆の順序に沿って 積み上げる。

f:id:r9aArrowhead:20201014140949p:plain

f:id:r9aArrowhead:20201014140955p:plain

f:id:r9aArrowhead:20201014141001p:plain

処理前後の比較

f:id:r9aArrowhead:20201014141011p:plain

f:id:r9aArrowhead:20201014141006p:plain

上の結果から確実に判明した部分だけを記載すると、以下の通り。

  • Cast モディファイアは HardOps経由のboolean を実行すると、最初に実行する
  • boolean モディファイアは Cast モディファイアよりも後に実行する
  • Sort と Sort Lastに指定したモディファイアは、boolean モディファイアの後へとソートされている
  • Weight Normal モディファイアは最後に実行する

テストパターン3:Arrayのみソート(昇順)

まずは Sort Modifier のみ確認していく。

array のソートについては以下の法則が記述されている。

sort array - ensures array is last so it shows booleans in all subparts

では実験

f:id:r9aArrowhead:20201014141016p:plain

f:id:r9aArrowhead:20201014141022p:plain

f:id:r9aArrowhead:20201014141032p:plain

f:id:r9aArrowhead:20201014141028p:plain

処理前後から確実に分かる内容は以下の通り

  • Cast モディファイアは Sort に関わらず HardOps経由のboolean の前に配置された
  • Array モディファイアは Sort と Sort Last の影響を受けて 後ろにソートされた
    • Sort Last を選択したモディファイアであっても、必ず最後になるわけではない
  • Weight Normal モディファイアは最後に実行する

テストパターン4:Arrayのみソート(降順)

テストパターン3とはモディファイアの順序を逆にして実行する。

f:id:r9aArrowhead:20201014141037p:plain

f:id:r9aArrowhead:20201014141045p:plain

f:id:r9aArrowhead:20201014141055p:plain

f:id:r9aArrowhead:20201014141050p:plain

処理前後から確実に分かる内容は以下の通り

  • Cast モディファイアは Sort に関わらず HardOps経由のboolean の前に配置された
  • Array モディファイアは Sort と Sort Last の影響を受けて 後ろにソートされた
    • Sort Last を選択したモディファイアであっても、必ず最後になるわけではない
  • Weight Normal モディファイアは最後に実行する

テストパターン5:Arrayのみソートで Sort Lastはしない(昇順)

次は Sort Last を外して Sort Modifier だけの状態にした Array モディファイアを確認していく。

f:id:r9aArrowhead:20201014141100p:plain

f:id:r9aArrowhead:20201014141107p:plain

f:id:r9aArrowhead:20201014141118p:plain

f:id:r9aArrowhead:20201014141112p:plain

処理前後から確実に分かる内容は以下の通り

  • Cast モディファイアは Sort に関わらず HardOps経由のboolean の前に配置された
  • Weight Normal モディファイアは最後に実行する

挙動から不明な点が一つ

  • Sort Last を選択していないにも関わらず、 Sort 対象となった Array モディファイアが後ろにソートされた
    • HardOpsの Array ソートルールに従えばあっているようにも見えるが・・・?

テストパターン6:Arrayのみソートで Sort Lastはしない(降順)

次は テストパターン5の逆パターン。

f:id:r9aArrowhead:20201014141122p:plain

f:id:r9aArrowhead:20201014141129p:plain

f:id:r9aArrowhead:20201014141140p:plain

f:id:r9aArrowhead:20201014141135p:plain

処理前後から確実に分かる内容は以下の通り(テストパターン5と同じ)

  • Cast モディファイアは Sort に関わらず HardOps経由のboolean の前に配置された
  • Weight Normal モディファイアは最後に実行する

挙動から不明な点が一つ(テストパターン5と同じ)

  • Sort Last を選択していないにも関わらず、 Sort 対象となった Array モディファイアが後ろにソートされた
    • HardOpsの Array ソートルールに従えばあっているようにも見えるが・・・?

テストパターン7:全てのモディファイアをソートし、 全てのモディファイアのSort Lastはしない(昇順)

テストパターン5およびテストパターン6で発生した不明点の確認ケース。
全てのモディファイアをソートする条件下でもArray モディファイアがWeigh Normal を除いた最後へと配置されるのかテスト。

f:id:r9aArrowhead:20201014141145p:plain

f:id:r9aArrowhead:20201014141152p:plain

f:id:r9aArrowhead:20201014141202p:plain

f:id:r9aArrowhead:20201014141158p:plain

処理前後から確実に分かる内容は以下の通り(テストパターン6と同じ)

  • Cast モディファイアは Sort に関わらず HardOps経由のboolean の前に配置された
  • ソートを選択したモディファイアは全て後ろにソートされた
  • Weight Normal モディファイアは最後に実行する

ここまでから推測できる内容は以下の通り

  • boolean を実行すると、 booleanモディファイアを一番最後に配置する
    • これはblenderの通常仕様と同等なので、仕様通り
  • boolean を実行した際、 Cast モディファイアがあればそれをbooleanの直前へ並び替える
    • これは HardOps のソートルール通り
  • Sort Modifier でソートを On にしているモディファイアは、 boolean の後へと回される
    • テストパターン5、テストパターン6、テストパターン7の結果から判断
    • ソート対象とした場合とそうでない場合で boolean 実行後の並び順が変わったため

テストパターン8:Sort 設定の奇数は On、偶数は Offにする、全てのモディファイアのSort Lastはしない(昇順)

テストパターン7から、ソートは モディファイアに関係なく Onならば booleanの後、Offならば移動なし となるのではないかと推測したためテスト。

ちなみに奇数をOn にしたのは、Weight Normalが偶数番号の設定だったため。 これをoff に含めた場合も順番はそのままか見たかった。

f:id:r9aArrowhead:20201014141206p:plain

f:id:r9aArrowhead:20201014141212p:plain

f:id:r9aArrowhead:20201014141222p:plain

f:id:r9aArrowhead:20201014141218p:plain

処理前後から確実に分かる内容は以下の通り(テストパターン6と同じ)

  • Cast モディファイアは Sort に関わらず HardOps経由のboolean の前に配置された
  • ソートを選択したモディファイアは全て後ろにソートされた
    • このことから、 Sortで選択したモディファイアは、 boolean モディファイアの後へソートされる と分かる
  • Weight Normal モディファイアは最後に実行する
    • Sort の選択 On / Off には関わらない

テストパターン9:全てのモディファイアをソートし、 全てのモディファイアのSort Lastはしない(順不同)

これまでのテストから、ソートを on にしたモディファイアは boolean 実行後、 boolean モディファイアの後ろにソートされるのが分かっている。
しかし、複数の対象が存在する状態でソートを実行した時に、モディファイアの並び順は実行前と同じであるかは観察できていない。

このテストパターンでは、それを確認する。

f:id:r9aArrowhead:20201014144725p:plain

f:id:r9aArrowhead:20201014144730p:plain

f:id:r9aArrowhead:20201014144739p:plain

f:id:r9aArrowhead:20201014144735p:plain

処理前後から確実に分かる内容は以下の通り

  • Cast モディファイアは Sort に関わらず HardOps経由のboolean の前に配置された
  • ソートを選択したモディファイアは全て後ろにソートされた
    • このことから、 Sortで選択したモディファイアは、 boolean モディファイアの後へソートされる と分かる
  • Weight Normal モディファイアは最後に実行する
    • Sort の選択 On / Off には関わらない
  • Cast, Weight Normal といった特殊なルールに従うモディファイアを除き、ソートを選択したモディファイアはソート前の順序を守っている
    • このことから、パネルの並びと実際のモディファイアの並びに関連性はないことが分かる

テストパターン10:Sort Modifier を Offにした上で全てのモディファイアをSort 設定をonにし、 全てのモディファイアのSort LastをOnにする(昇順)

ここまでのテストで、 Weight Normal モディファイアはソートの On / Off に関わらず、boolean 実行後は最後にソートされる ことが分かっている。

しかしこれまでは ソートの Off はパネルのみで実行してきた。
ソートを Off にする方法は Sort Modifier のチェックボックスを Off にすることでも選択できる。

このテストパターンでは、 Sort Modifier のチェックボックスを Off にした状態を観察する。
ただし、通常のUI設計から考えれば親元の sort modifiers の on にしなければ 詳細設定は参照しないはずなので、詳細設定側は全て On にする。

設定から考えれば、チェックボックス Off でもWeight Normal がソートされた場合はバグに近いわけだけど・・・

f:id:r9aArrowhead:20201014144744p:plain

f:id:r9aArrowhead:20201014144749p:plain

f:id:r9aArrowhead:20201014144753p:plain

f:id:r9aArrowhead:20201014144802p:plain

f:id:r9aArrowhead:20201014144758p:plain

処理前後から確実に分かる内容は以下の通り

  • Cast モディファイアは Sort に関わらず HardOps経由のboolean の前に配置された
  • 詳細設定で全て ON にしていたソートは、 一部の例外を除いて Sort Modifiers をOff にすると実行されない
  • sort modifiers の選択 On / Off には関わらず、Weight Normal モディファイアは最後に実行する

テストパターン11:Sort Modifier を Offにした上で全てのモディファイアをSort 設定をoffにし、 全てのモディファイアのSort LastをOffにする(昇順)

テストパターン10の結果が予想と大きく異なっているため、それの確認を行うテスト。

UI設計的には親の設定の On / Off があれば子の設定はそれに影響を受ける。
しかし、Cast および Weight Normal モディファイアは Sort Modifiers の設定に関わらずソートが発生した。

ここでのテストは、子の設定も全て off にしても上記2つのモディファイアはソートが発生するかの確認を行うためのテストとなる。

f:id:r9aArrowhead:20201014144806p:plain

f:id:r9aArrowhead:20201014144812p:plain

f:id:r9aArrowhead:20201014144817p:plain

f:id:r9aArrowhead:20201014144827p:plain

f:id:r9aArrowhead:20201014144823p:plain

処理前後から確実に分かる内容は以下の通り

  • Cast モディファイアは Sort に関わらず HardOps経由のboolean の前に配置された
  • 詳細設定で全て Off にしていたソートは、 一部の例外を除いて Sort Modifiers をOff にすると実行されない
  • sort modifiers の選択 On / Off には関わらず、Weight Normal モディファイアは最後に実行する

テストパターン12:全てのモディファイアが必ず複数個存在し、全てのモディファイアをソートし、 全てのモディファイアのSort Lastをする(昇順)

ここからは別パターンのテスト。
ソートの対象となるモディファイアが複数個存在した場合、ソートはどのような挙動をするかのテスト。

f:id:r9aArrowhead:20201014144831p:plain

f:id:r9aArrowhead:20201014144837p:plain

f:id:r9aArrowhead:20201014144847p:plain

f:id:r9aArrowhead:20201014144843p:plain

処理前後から確実に分かる内容は以下の通り

  • 多重化しているモディファイアは、一つだけがソートの対象となる
  • sort modifiers の選択 On / Off には関わらず、Weight Normal モディファイアは最後に実行する
    • このモディファイアのみ、多重化は関係ない。 存在する全ての Weight Normal モディファイアは最後に回される

もしかすると、モディファイアのスタック内に同一種が複数あることは想定していない?