NodeHandler地雷メモ
ノードの地雷メモ。
ノードと言ってもノードハンドラーの地雷であって、個々のノードプラグインがそれを踏んでるかは実装次第。
○ノードのインターフェースハンドラー。
ノードのインスタンス作成毎に呼ばれる。
ノードエディター上のパネル表示を切り替える毎にも呼ばれる(ノードの選択変更等)。
1インスタンスにつき一回だと仮定して随時create()してる物があると破綻する気がする。
○ノードの破棄動作。
ノードエディタ上から消すと、そのノードのDestroy()を読んだ後にXPanleのDestroy()を呼ぶ。
で、消しても何か(Undo用のインスタンスコピー?)が残ったままになり、該当プラグインDLLのUnloadは出来ない。
ノードエディタの[Purge]を押す事でノードのDestroy()が再度呼ばれる(Undo用にコピーされた回数?)。 これで晴れてUnload出来るようになる。
[Purge]が呼ぶDestroy()で同じインスタンス(メモリ)を投げて来た事があったような気がするけど、本当に気のせいかは謎。
一応、Nullで潰したインスタンス相当のメモリブロックを投げて来てる気はする。
struct{ any; panleID; any; } data; として、data->panelIDがNULLになってるゆえ。
ノードのDestroy()はインスタンス用にユーザが確保したメモリを解放する用途に使われるわけで、[Purge]時に渡されるメモリブロックに対してfree()するのは問題にならないのだろうか。
深く考えずに落ちなければ善しとして使うしかなさげ。
○ノードのXPanelでのアイテムリストとインデックスの更新。
恐らく素直に組むとアイテムの増減に対応出来ない。 てか、標準のノードが対応出来てない(参照が外れる事で対応してる、と言えるかもしれないけど)。
対策には二箇所の処理が必要。
毎回インターフェースハンドラー内で目標IDを検索しインデックスを取る。初回時のみ検索する、みたいな省力化は仇になる。
流れとして初回(panelID未作成)時はそのままリソースを充ててcreate()すればよし(panelIDはインスタンス内に保持する)。
2回目以降は既にpanelIDがあるのでXPanleのviewRefresh()だけして終了。
これでノードエディタ内で非アクティブからアクティブに成った時にインデックスの正しいアイテムリストになる。
でも、これだけでは最初からアクティブだった時は不正なインデックスのままになる。
ノードがアクティブな場合の為に、ChangeNotifyFunc()を使う。
アイテムの増減操作をするという事はノードエディタからフォーカスが移ってるという事なので、ChangeNotify()でForcus系のイベントを拾い、目標IDの再検索とviewRefresh()をする。
○ノードのXPanelのボタン幅。
左側が4Dot小さい(・з・)
ノードと言ってもノードハンドラーの地雷であって、個々のノードプラグインがそれを踏んでるかは実装次第。
○ノードのインターフェースハンドラー。
ノードのインスタンス作成毎に呼ばれる。
ノードエディター上のパネル表示を切り替える毎にも呼ばれる(ノードの選択変更等)。
1インスタンスにつき一回だと仮定して随時create()してる物があると破綻する気がする。
○ノードの破棄動作。
ノードエディタ上から消すと、そのノードのDestroy()を読んだ後にXPanleのDestroy()を呼ぶ。
で、消しても何か(Undo用のインスタンスコピー?)が残ったままになり、該当プラグインDLLのUnloadは出来ない。
ノードエディタの[Purge]を押す事でノードのDestroy()が再度呼ばれる(Undo用にコピーされた回数?)。 これで晴れてUnload出来るようになる。
[Purge]が呼ぶDestroy()で同じインスタンス(メモリ)を投げて来た事があったような気がするけど、本当に気のせいかは謎。
一応、Nullで潰したインスタンス相当のメモリブロックを投げて来てる気はする。
struct{ any; panleID; any; } data; として、data->panelIDがNULLになってるゆえ。
ノードのDestroy()はインスタンス用にユーザが確保したメモリを解放する用途に使われるわけで、[Purge]時に渡されるメモリブロックに対してfree()するのは問題にならないのだろうか。
深く考えずに落ちなければ善しとして使うしかなさげ。
○ノードのXPanelでのアイテムリストとインデックスの更新。
恐らく素直に組むとアイテムの増減に対応出来ない。 てか、標準のノードが対応出来てない(参照が外れる事で対応してる、と言えるかもしれないけど)。
対策には二箇所の処理が必要。
毎回インターフェースハンドラー内で目標IDを検索しインデックスを取る。初回時のみ検索する、みたいな省力化は仇になる。
流れとして初回(panelID未作成)時はそのままリソースを充ててcreate()すればよし(panelIDはインスタンス内に保持する)。
2回目以降は既にpanelIDがあるのでXPanleのviewRefresh()だけして終了。
これでノードエディタ内で非アクティブからアクティブに成った時にインデックスの正しいアイテムリストになる。
でも、これだけでは最初からアクティブだった時は不正なインデックスのままになる。
ノードがアクティブな場合の為に、ChangeNotifyFunc()を使う。
アイテムの増減操作をするという事はノードエディタからフォーカスが移ってるという事なので、ChangeNotify()でForcus系のイベントを拾い、目標IDの再検索とviewRefresh()をする。
○ノードのXPanelのボタン幅。
左側が4Dot小さい(・з・)
"NodeHandler地雷メモ" へのコメントを書く