/*	kacAE Ver0.4 試験版
倍率をキーフレーム指定して、擬似的に３次元（奥行き）であるかのように
スケーリングするエクスプレッション。本来のスケーリングとは別にエフェクトとして解決する。
タイミング調整版

このエクスプレッションのために以下のレイヤが必要である。

倍率／フレーム指定用レイヤとして
	effect("指定倍率(%)").param("スライダ")

フレームスキップ用コマ数指定レイヤとして
	effect("フレームスキップ").param("スライダ")

撮影フレーム指定スイッチとして
	effect("フレーム指定").param("チェックボックス")

フレーム指定時のフレーム数は伝統的なアニメーション撮影フレームの数値であるため
レタスフレームの指定はできません。レタスフレームの指定は、リクエストがあれば考えます。

○ レイヤを名前で参照するために、上記以外の名前をつかいたい場合は、 エクスプレッションを修正する必要があります。
○この版では、[スケール,x座標,y座標,タイミング助変数]の配列データを出力します。受取側のスケールおよび位置に特定のエクスプレッションが必要です。別紙参照
○４次元配列の出力用に「カラー制御」エフェクトを想定している為、出力値が０から１の範囲におさまるよう調整してあります。受け取り側のエクスプレッションはサンプルにあるように値に6000倍して3000を加算する必要があります。

 同梱のエフェクトテンプレートには組み込み済みです。


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

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

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

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

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

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


2004/04/19
計算結果の受け渡しをポイントレイヤに変更／出力値を二次元配列にする。2004/06/08
2004/08/29
位置指定可能な版を派生版として新規設置
ゼロトラップ追加
2005/11/30
構成見直し。位置調整を位置そのものでなく、アークを残してValueAtTimeで置き換え。

*/
function F2SwithSwitch(f){
	if (effect("フレーム指定").param("チェックボックス")==true){
		return 100*(160/(f+60))
	}else{
		return f
	}
}
//出力変数の初期化
var outputScale = scale[1];
outputPos = [position[0],position[1]];
var EXVALUE=0;//助変数初期値//第4要素につけて出す。(拡張用)

//参照すべきキーの総数を求める。
//失敗した時（キーまたはレイア自体がない場合）は、値を0に初期化して終了
	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) {
		outputScale = F2SwithSwitch(nKey.value);
		outputPos = position.value_at_time(time);
	} 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){
		outputScale = F2SwithSwitch(nKey.value);
		outputPos = position.value_at_time(time);
	} else {
	if (effect("フレーム指定").param("チェックボックス")== false){
//被写体寸法からリニア
//前後のキーの値と現在のキーの値を比較して補正係数を取得
	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;
//キータイミングを反映するために拡大比率をスライスポイントにおき替え
	SlicePoint = SliceValue * TimingValue;
//いつもの計算式で倍率を算出
outputScale = (preKey.value * postKey.value * SliceValue)/
(preKey.value * SlicePoint + postKey.value * (SliceValue-SlicePoint));

	if(preKey.value==0 || postKey.value==0 || preKey.value==postKey.value ){
	}else{
EXVALUE=Math.abs(outputScale-preKey.value)/Math.abs(postKey.value-preKey.value);
	}
	} else {
//フレーム寸法から直接倍率割り出し
outputScale = F2SwithSwitch(effect("指定倍率(%)").param("スライダ").value_at_time(Stepedtime));
if(preKey.value==0 || postKey.value==0 || preKey.value==postKey.value ){
}else{
EXVALUE=Math.abs(outputScale-F2SwithSwitch(preKey.value))/Math.abs(F2SwithSwitch(postKey.value)-F2SwithSwitch(preKey.value));
}
	}
//タイミング助変数をもとにタイミングを補正
if (preKey.value==0 || postKey.value==0 || preKey.value==postKey.value || EXVALUE==0){
	outputPos = position.value_at_time(preKey.time);
} else {
outputPos = position.value_at_time(preKey.time+EXVALUE*(postKey.time-preKey.time));
}}}}
//
[(outputScale+30000)/60000,(outputPos[0]+30000)/60000,(outputPos[1]+30000)/60000,EXVALUE]
/*
2004/04/17 バルク版ひとまず動作
フレームステップとタイミングカーブ参照はまだ。
04/17
ひとまず旧版の範囲まで消化
以降の拡張はタイミング参照およびステップ動作
ステップ動作はキーの値に関わらずフラット内か？継続時間を消化してO.L.か？

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

4/19
なんてことを言ってるうちにステップ動作も書いた
次は、フレーム数での指定かな
	とか思っていたらバグ発見
	前後キーの値が同じときゼロ除算？
	解決そろそろ公開？
無理矢理フレーム指定対応版　どうよ此れ？
いちお別セーブ
8/29
がぎがぎ　消失点対応版
消失点のキーフレーム指定と補完ができるぞ。
どうなのかしら？これは
2005/11/30
座標計算でなく、タイミング強制型に変更。
なぜ、今まで考えつかなかったのか疑問だがこれで良さそう。
基本はこれでイロイロ使えることでしょう。
*/
