ItemMotionでのNodeEditor
DPontのNodeItemMotionはLW9.0でなら妥当な結果を得られるけど、9.2からはMotionPluginで動いてる物を参照するノードを含んでいると正常な結果を返さない。
で、代替品を作ってのメモ。
結果的には、Motion->Eval内でEditor->Init/NewTime/Clean(Eval後)を呼んで、各Nodeに処理を促してからRootNode->Evalする事で、9~9.6でMotionPlugで動く物を参照していても妥当な結果を得られるようになった。
Eval内でRootNode->evalするだけでは妥当な値は返ってこない。
RootNodeにNewTime関数を充てて、そこで(Mot->Evalから呼び起こされて)iteminfo->paramを取ると時間のずれた結果しか取れない。
EvalでinstUpdate(LWNODE_HCLASS)しても、エディタを開いていないと、editor->updateFuncは呼ばれない。
パネルを開いても、9.0ではFrame移動/NewTimeでPreviewFuncは呼ばれない。
RootNodeにNewTimeを充てて、そこでinstanceUpdate(LWNODE)を掛ければPreviewが呼ばれる。
instUpdateで起こされるEventFuncからnode->UpDatePreviewする必要はない。
RootNodeのinstUpdateをしないと各Nodeの評価も起こらない。
92からはOption:Autoの場合は、Mot->Eval、(Evalで呼んだなら)Edit->NewTime、Node->Previewの順で呼ばれる。 RootNode->NewTimeは不要(中からのinstUpdateも不要)。
Editor->NewTimeさえ呼んでいれば(RootNode含む。それ故に)各Nodeは評価される。
要件かどうか未確認だけど、item->useItemでLWITEM_ALLにしている。
データ取得(iteminfoとnodeInput->eval)はMot->Evalだけで行ってinstanceに保持し、Previewではinstからの読み出しだけにしている。 一応、(Mot-Evalを経た)PreviewからのnodeInput->evalはMot->Evalでの結果と同じ。
変数を保持しなくても問題ないかも。
9.0でMot->Evalが正常でPrevが異常、9.2からはMot->Eval,Prev共に異常という状態を再現出来てないけ、まぁいいか('A`)
----
ルートノードへの接続/解除時に応じたプレビュー更新。
ルートのinputIDにConnectEventを付ける。
Prev内でnodeI->evalするなら、Event内でLWNODEとLWITEMMOTIONをinstUpdate()する。
nodeI->evalしないで、instUpdateするだけでは解決にならない。
evalせずにMot->Evalで取る値を表示するだけなら、Event内でRefershコマンドを発行する。
Mot->Evalが再評価されてモーションの適用と表示、プレビュが更新される事になる。
instUpdateで起こるRefreshとは結果が異なるのが味噌?
Prevでevalすると、同一時において常にMot->Evalでのevalと2回行う事になるから、Refreshでごり押しが無難か。
LWS/.nodesのロードにConnectInputが呼ばれない事については目を瞑っていいかも(呼ばれたらinputIDの数だけRefreshの空打ちが起こって無駄になるし)。
----
ItemMotionでのNodeEditorの特殊性はおいといて、ChannelHandler版は至極素直な本来こうなんだろうなという感じに出来た。
特別な事はしないで済んだ。 Verによる分岐すらもいらない( ^ω^)
前から少し進んだけど、ItemMotionはまだまだ詰めないとあかんな('A`)
で、代替品を作ってのメモ。
結果的には、Motion->Eval内でEditor->Init/NewTime/Clean(Eval後)を呼んで、各Nodeに処理を促してからRootNode->Evalする事で、9~9.6でMotionPlugで動く物を参照していても妥当な結果を得られるようになった。
Eval内でRootNode->evalするだけでは妥当な値は返ってこない。
RootNodeにNewTime関数を充てて、そこで(Mot->Evalから呼び起こされて)iteminfo->paramを取ると時間のずれた結果しか取れない。
EvalでinstUpdate(LWNODE_HCLASS)しても、エディタを開いていないと、editor->updateFuncは呼ばれない。
パネルを開いても、9.0ではFrame移動/NewTimeでPreviewFuncは呼ばれない。
RootNodeにNewTimeを充てて、そこでinstanceUpdate(LWNODE)を掛ければPreviewが呼ばれる。
instUpdateで起こされるEventFuncからnode->UpDatePreviewする必要はない。
RootNodeのinstUpdateをしないと各Nodeの評価も起こらない。
92からはOption:Autoの場合は、Mot->Eval、(Evalで呼んだなら)Edit->NewTime、Node->Previewの順で呼ばれる。 RootNode->NewTimeは不要(中からのinstUpdateも不要)。
Editor->NewTimeさえ呼んでいれば(RootNode含む。それ故に)各Nodeは評価される。
要件かどうか未確認だけど、item->useItemでLWITEM_ALLにしている。
データ取得(iteminfoとnodeInput->eval)はMot->Evalだけで行ってinstanceに保持し、Previewではinstからの読み出しだけにしている。 一応、(Mot-Evalを経た)PreviewからのnodeInput->evalはMot->Evalでの結果と同じ。
変数を保持しなくても問題ないかも。
9.0でMot->Evalが正常でPrevが異常、9.2からはMot->Eval,Prev共に異常という状態を再現出来てないけ、まぁいいか('A`)
----
ルートノードへの接続/解除時に応じたプレビュー更新。
ルートのinputIDにConnectEventを付ける。
Prev内でnodeI->evalするなら、Event内でLWNODEとLWITEMMOTIONをinstUpdate()する。
nodeI->evalしないで、instUpdateするだけでは解決にならない。
evalせずにMot->Evalで取る値を表示するだけなら、Event内でRefershコマンドを発行する。
Mot->Evalが再評価されてモーションの適用と表示、プレビュが更新される事になる。
instUpdateで起こるRefreshとは結果が異なるのが味噌?
Prevでevalすると、同一時において常にMot->Evalでのevalと2回行う事になるから、Refreshでごり押しが無難か。
LWS/.nodesのロードにConnectInputが呼ばれない事については目を瞑っていいかも(呼ばれたらinputIDの数だけRefreshの空打ちが起こって無駄になるし)。
----
ItemMotionでのNodeEditorの特殊性はおいといて、ChannelHandler版は至極素直な本来こうなんだろうなという感じに出来た。
特別な事はしないで済んだ。 Verによる分岐すらもいらない( ^ω^)
前から少し進んだけど、ItemMotionはまだまだ詰めないとあかんな('A`)
この記事へのコメント