/*	kacAE Ver0.1 試験版
倍率をキーフレーム指定して、擬似的に３次元（奥行き）であるかのように
スケーリングするエクスプレッション。本来のスケーリングとは別にエフェクトとして解決する。
とりあえず倍率指定版
フレーム指定は、組み込みにするか別版を作るか考慮中
 このエクスプレッションのために以下のレイヤが必要である。

倍率指定用レイヤとして
	effect("指定倍率(%)").param("スライダ")
フレームスキップ用コマ数指定レイヤとして
	effect("フレームスキップ").param("スライダ")
撮影フレーム指定スイッチとして
	effect("フレーム指定").param("チェックボックス")


 名前で参照するために、これ以外の名前の場合は、エクスプレッションを修正してください。テンプレートには組み込み済みです。


--- おことわり
このプログラムの著作権は「ねこまたや」にあります。

あなたは、このプログラムのこの著作権表示を改変しないかぎり
自由にプログラムの使用・複製・再配布などを行うことができます。

あなたは、このプログラムを自己の目的にしたがって改造することができます。
その場合、このプログラムを改造したものであることを明記して、この著作権表示を
添付するように努めてください。

このプログラムを使うも使わないもあなたの自由なのです。

作者はこのプログラムを使用したことによって起きたいかなる
不利益に対しても責任を負いません。
あなたは、あなたの判断と責任においてこのプログラムを使用するのです。

なんか、困ったことがあったら以下で連絡してもらえると何とかなるかもしれません。
http://homepage2.nifty.com/Nekomata/
mailto:nekomata_ya@mac.com

そんな感じです。

追伸　このプログラムは、まだ試験中なので
もう少し待つともっと良いものになるかもしれません。
再配布とかもう少し待ってみると良いかもしれませんね。

2004/04/19

*/
var output = 100;
//参照すべきキーの総数を求める。
//失敗した時（キーまたはレイア事態がない場合）は、値を100%に初期化して終了
	var maxIndex = effect("指定倍率(%)").param("スライダ").num_keys
	if ( maxIndex != 0) {
// 再近接のキーの時間とインデックスを求める
	nKey = effect("指定倍率(%)").param("スライダ").nearest_key(time);
// 現在時と比較して前キーの値と後ろキーのインデックスを求める。
// 最少キーの前と最終キーの後ろは前後キーに同じ値を代入
	if( time >= nKey.time ) {
		var preIndex = nKey.index;
		var postIndex = nKey.index + 1;
		if(postIndex > maxIndex){postIndex = maxIndex}
	}else{
		var postIndex = nKey.index;
		var preIndex = nKey.index - 1;
		if(preIndex == 0){preIndex = 1}
	}
// 前後キーが一致している場合は、無条件で最近接キーの値を引き継いで終了
	if(preIndex == postIndex) { output = nKey.value } else {
//ステップ係数を取得 ステップ係数にしたがって算定用の時間オブジェクトを生成
//ステップ係数は、フレーム継続時間に掛ける値。スキップ0なら1、11なら12
var StepValue = Math.abs(effect("フレームスキップ").param("スライダ")) + 1;
//現在時間をステッピングする
if (StepValue == 1){var Stepedtime = time} else {
var Stepedtime= Math.floor(time /(this_comp.frame_duration * StepValue)) * (this_comp.frame_duration * StepValue);
}
//前と後ろのキーフレームオブジェクトを取得
	preKey = effect("指定倍率(%)").param("スライダ").key(preIndex);
	postKey = effect("指定倍率(%)").param("スライダ").key(postIndex);
// * 補正係数の分母を得るために前後キーの差をとっているので、
//前後キーの値が同一だとゼロ除算エラーになる
//回避のため前後キーの値が同一の場合最近接キーの値を与えて終了
if(preKey.value == postKey.value){ output = nKey.value } else {
//前後のキーの値と現在のキーの値を比較して補正係数を取得
	var TimingValue = Math.abs(effect("指定倍率(%)").param("スライダ").value_at_time(Stepedtime) - preKey.value)/Math.abs(postKey.value - preKey.value);
//スライス数を取得=キー間の継続時間をフレーム継続時間で割る
	var SliceValue=(postKey.time - preKey.time)/this_comp.frame_duration;
/*
スライスポイントを取得 現在時間をフレーム継続時間で割って前キーの値を引く
//AEのキーオリジネーションが1なので前キーから1減算しておくこと
//	var SlicePoint= Stepedtime/this_comp.frame_duration - (preKey.index - 1) ;
スライスポイント算定方式変更のため不要
*/
//キータイミングを反映するために拡大比率をスライスポイントにすり替え
	SlicePoint = SliceValue * TimingValue;
//いつもの計算式で倍率を算出
//分子(preKey.value * postKey.value * SliceValue)/10000
//分母(preKey.value * SlicePoint + postKey.value * (SliceValue-SlicePoint))
output = (preKey.value * postKey.value * SliceValue)/(preKey.value * SlicePoint + postKey.value * (SliceValue-SlicePoint))
}}}
if (effect("フレーム指定").param("チェックボックス")==true) {100*(160/(output+60))} else {output}
/*
2004/04/17 バルク版ひとまず動作
フレームステップとタイミングカーブ参照はまだ。
04/17
ひとまず旧版の範囲まで消化
以降の拡張はタイミング参照およびステップ動作
ステップ動作はキーの値に関わらずフラット内か？継続時間を消化してO.L.か？

04/18
ホレ、タイミング情報の反映オワリわりと良いカンジ
検証グラフを書かせてみよう。見た。いけるみたい。

4/19
なんてことを言ってるうちにステップ動作も書いた
次は、フレーム数での指定かな
	とか思っていたらバグ発見
	前後キーの値が同じときゼロ除算？
	解決そろそろ公開？
*/
