頂点カラーのアニメーション作成に頂点ペイントモディファイヤを使用し、そいつを export させようと企んでいます。
で。
以下のコードを書いてみました。
boost::optional<int, int> CheckVertexPaint(INode* in_node)
{
Object* max_obj = in_node->GetObjectRef();
while( max_obj && max_obj->SuperClassID() == GEN_DERIVOB_CLASS_ID ) {
IDerivedObject* dobj = static_cast(max_obj);
const int num_modifier = dobj->NumModifiers();
for( int modifier_cnt = 0; modifier_cnt < num_modifier; ++modifier_cnt ) {
Modifier* mod = dobj->GetModifier(modifier_cnt);
if( mod && mod->ClassID() == PAINTLAYERMOD_CLASS_ID ) {
/// キーフレームの取得
int lc_min_frame = INT_MAX;
int lc_max_frame = INT_MIN;
const int num_ref = mod->NumRefs();
for( int ref_cnt = 0; ref_cnt < num_ref; ++ref_cnt ) {
RefTargetHandle ref = mod->GetReference(ref_cnt);
// max 9 では頂点ペイントモディファイヤでアニメート可能なパラメータは1つのみ
Animatable* IAnim = ref->SubAnim(0); /// レイヤーの不透明度
Tab key_frames;
IAnim->GetKeyTimes(key_frames, FOREVER, 1);
if( key_frames.Count() > 0 ) {
if( key_frames[0] < lc_min_frame ) {
lc_min_frame = key_frames[0];
}
if( key_frames[key_frames.Count() - 1] > lc_max_frame ) {
lc_max_frame = key_frames[key_frames.Count() - 1];
}
}
}
if( lc_min_frame == INT_MAX ) {
continue;
}
/// キーフレームの範囲が取得できたので取得した値を返却する
return boost::optional<int, int>(std::make_pair(lc_min_frame, lc_max_frame));
}
}
// 次の referenced object を検索
max_obj = dobj->GetObjRef();
}
/// 取得できなかったのでこのノードには Vertex Paint モディファイヤは存在しない
return boost::optional<int, int>();
}
頂点ペイントモディファイヤでレイヤーの不透明度にキーフレームが存在する場合、始点キーフレームと終点キーフレームを
std::pair<>に詰め込んで返す関数になってます。
最初、Modifier クラスから派生していない IVertexPaint クラスからどうやってアニメーションキーフレーム取るのか悩んでこのエントリーで愚痴ろうかとしていました。
エントリー書いている途中で閃いて無事キーフレーム取得できました。息抜きって必要ですね。
max 9では頂点ペイントモディファイヤで、アニメート可能なパラメータは1つしか存在しないので
Animatable* IAnim = ref->SubAnim(0); /// レイヤーの不透明度
とSubAnim の引数を0で決めうちしています。
再利用される方はご注意を。
#あ、こんなネタ再利用するの私くらいかw