とりあえず指定した範囲にキーフレームが打てればいいんで、仮で作ってみた
今のところは、followerをbakeする為だけのプラグインかも
あれば便利そうな機能とかは暇が出来てから
GUIは範囲の最初と最後、増分を入力する部分のみ
GoToFrameでフレームを移動して、CreaetKeyで選択されているオブジェクト等にキーフレームを打つ。
を指定した範囲分繰り返している
キーは全チャンネルに打たれてしまう
↓ソースの一部
typedef struct {
GlobalFunc *global;
int start, end, step;
}MyData;
int Panel(MyData *data, GlobalFunc *global)
{
LWPanelFuncs *panel =
(LWPanelFuncs*)global(LWPANELFUNCS_GLOBAL, GFUSE_TRANSIENT);
LWPanelID pid = NULL;
int result = 0;
LWControl *ctl[3];
if( !panel )
return result;
if( pid = PAN_CREATE(panel, SERVERNAME) ){
ctl[0] = INT_CTL(panel, pid, "StartFrame");
ctl[1] = INT_CTL(panel, pid, "EndFrame");
ctl[2] = INT_CTL(panel, pid, "FrameStep");
SET_INT(ctl[0], data->start);
SET_INT(ctl[1], data->end);
SET_INT(ctl[2], data->step);
if( PAN_POST(panel, pid) ){
result = 1;
GET_INT(ctl[0], data->start);
GET_INT(ctl[1], data->end);
GET_INT(ctl[2], data->step);
}
PAN_KILL(panel, pid);
}
return result;
}
XCALL_(int) Activate(long version, GlobalFunc *global,
LWLayoutGeneric *local, void *serverData)
{
if( LWLAYOUTGENERIC_VERSION != version )
return AFUNC_BADVERSION;
LWSceneInfo *sceneInfo =
(LWSceneInfo*)global(LWSCENEINFO_GLOBAL, FUSE_TRANSIENT);
LWInterfaceInfo *ifInfo =
(LWInterfaceInfo*)global(LWINTERFACEINFO_GLOBAL,GFUSE_TRANSIENT);
char cmdline[MAX_PATH];
if( !sceneInfo || !ifInfo ) return AFUNC_BADGLOBAL;
MyData data = { global, ifInfo->previewStart, ifInfo->previewEnd, ifInfo->previewStep };
if( 0 == Panel(&data, global) ) return AFUNC_OK;
if( data.start > data.end ){
int temp = data.end;
data.end = data.start;
data.start = temp;
}
if( 0 == data.step ) data.step = 1;
else if( 0 > data.step ) data.step *= -1;
for(int i=data.start; i<=data.end; i+=data.step){
sprintf(cmdline, "GoToFrame %d", i);
local->evaluate(local->data, cmdline);
float time = (float)i /
sceneInfo->framesPerSecond;
sprintf(cmdline, "CreateKey %f", time);
local->evaluate(local->data, cmdline);
}
return AFUNC_OK;
}