カスタム アトリビュートのバージョン番号の処理

3ds Max 2012 では、スクリプト カスタム アトリビュートをシーン ファイルからロードするときにバージョン番号を処理できるようになりました。

技術的な概要

スクリプト カスタム アトリビュートの定義は、ILoadImp::LoadDllDir に読み込まれる、「ScriptedCustAttribDefs」ストリーム内のシーン ファイルに保存されます。これは、ファイルのロード処理の早い段階、つまり使用済みクラスのリストを読み込む直前に呼び出されます。なぜなら、スクリプト カスタム アトリビュートのクラスが使用済みクラスに含められるからです。

3ds Max 2012 よりも前のバージョンの 3ds Max では、スクリプト カスタム アトリビュートの定義を読み込むときにスクリプト カスタム アトリビュートの定義と既存の定義が正確に一致しなかった場合、ロードされた定義が評価され、そのスクリプト カスタム アトリビュートの既存のインスタンスがすべて ロードされた定義に変換されました。

3ds Max 2012 では、ロードされた定義と既存の定義が正確に一致せずかつロードされた定義のバージョン番号が既存のバージョン番号よりも大きい場合にのみ、ロードされた定義が評価されるようにします。

以前のバージョンの 3ds Max では、スクリプト カスタム アトリビュートの定義がロードされた定義に必ず更新されたため、シーン ファイルのロード中に作成されたインスタンスを既存の定義に移行する必要はありませんでした。ただし、3ds Max 2012 以降では、この移行を行う必要があります。

注:

移行のための内部ロジックは既に存在していました。スクリプト プラグインに対して同じ処理が実行されるからです。

ただし、この移行を行うには、「Config」ストリームからロードされ、まだ読み込まれていないデータが必要になります。

3ds Max 2012 よりも前のバージョンのロード順序: 3ds Max 2012 以降のロード順序:
  1. ScriptedCustAttribDefs をロードし、現在のインスタンスをロードした定義に更新します。
  2. 参照階層をロードします。
  3. ロード後のコールバックを実行します。
  4. 設定データをロードします。この設定データには、スクリプト プラグインの pb2 定義を含む MAXScript データが含まれています。
  5. ロード後のコールバックを実行します。これにより、スクリプト プラグインのパラメータ ブロックがスクリプト プラグインの現在の定義に移行されます。

場合によっては、ステップ 3シーン評価が行われることがあります。この評価にスクリプト プラグインの評価が含まれる場合は、 エラーが発生する可能性があります。この時点では、スクリプト プラグインのパラメータ ブロックがスクリプト プラグインの定義に一致していない可能性があるからです。

  1. ScriptedCustAttribDefs をロードし、ロードした定義のバージョンがより新しい場合は、現在のインスタンスをロードした定義に更新します。
  2. 参照階層をロードします。
  3. 設定データの一部のロード: スクリプト プラグインの pb2 定義を含む MAXScript データをロードします。
  4. ロード後のコールバックを実行します。これにより、スクリプト プラグインのパラメータ ブロックがスクリプト プラグインの現在の定義に移行されます。
  5. 残りの設定データのロード: スクリプト プラグインの pb2 定義を含む MAXScript データ以外の設定データをロードします。
  6. ロード後のコールバックを実行します。

スクリプト カスタム アトリビュートの定義(またはスクリプト プラグインの定義)を評価した場合は、以前に存在していた定義のバージョン番号に関係なく、評価した定義が常に使用されるようになります