/*
ブラウザ上に偽AE環境を作るスクリプト
以下は、AEのドロップダウンリストから取り出した項目

Global
	comp(name)
	footage(name)
	this_comp
	this_layer
	time
//これは、AE独自のオブジェクトリストだとおもう。

Vector Math
	add(vec1, vec2)
	sub(vec1, vec2)
	mul(vec, amount)
	div(vec, amount)
	clamp(value, limit1, limit2)
	dot(vec1, vec2)
	cross(vec1, vec2)
	normalize(vec)
	length(vec)
	length(point1, point2)
	look_at(from_point, at_point)
//ベクトル演算関数
//同等の機能の関数を書く
//デバグ用にダミー値を返す関数でも可

Random Numbers
	seed_random(seed, timeless = false)
	random()
	random(max_val_or_array)
	random(min_val_or_array, max_val_or_array)
	gauss_random()
	gauss_random(max_val_or_array)
	gauss_random(min_val_or_array, max_val_or_array)
	noise(val_or_array)
//ランダム値発生関数
//同等の機能の関数を書く
//デバグ用にダミー値を返す関数でも可

Interpolation
	linear(t, val1, val2)
	linear(t, t_min, t_max, val1, val2)
	ease(t, val1, val2)
	ease(t, t_min, t_max, val1, val2)
	ease_in(t, val1, val2)
	ease_in(t, t_min, t_max, val1, val2)
	ease_out(t, val1, val2)
	ease_out(t, t_min, t_max, val1, val2)
//値の中間値補間関数
//同等の機能の関数を書く

Color Conversion
	rgb_to_hsl(rgba_array)
	hsl_to_rgb(hsla_array)
//色値変換関数
//同等の機能の関数を書く
//やや、機能不足なので独自に書く方がよさそう。
//独自関数のサブセットで置換できる。

Other Math
	degrees_to_radians(degrees)
	radians_to_degrees(radians)
//角度関連補助関数
//同等の機能の関数を書く
//たしかにこれは多そうなので書く
//内容はいつもの奴

Comp
	layer(index)
	layer(name)
	layer(other_layer, rel_index)
	marker(name)
	num_layers
	active_camera
	width
	height
	duration
	frame_duration
	shutter_angle
	shutter_phase
	bg_color
	pixel_aspect
	name
//コンポジットオブジェクトの参照可能なプロパティ? と思う
//ダミーオブジェクトを作れるようにする
// this_comp だけは、デフォルトで作成

Footage
	width
	height
	duration
	pixel_aspect
	name
//フーテージオブジェクトの参照可能なプロパティ? と思う
//ダミーオブジェクトを作れるようにする

Layer Sub-object
	source
	effect(name)
	effect(index)
	mask(name)
	mask(index)

Layer General
	width
	height
	index
	parent
	has_parent
	in_point
	out_point
	start_time
	has_video
	has_audio
	active
	audio_active
//レイヤオブジェクトの参照可能なプロパティ? と思う
//ダミーオブジェクトを作れるようにする
// this_layer だけは、デフォルトで作成

Layer Properties
	anchor_point
	position
	scale
	rotation
	opacity
	audio_levels
	time_remap
	marker
	name
//レイヤオブジェクトの参照・書き込み可能なプロパティ? と思う
//ダミーオブジェクトを作れるようにする
// this_layer だけは、デフォルトで作成

Layer 3D
	orientation
	rotationX
	rotationY
	rotationZ
	light_transmission
	casts_shadows
	accepts_shadows
	accepts_lights
	ambient
	diffuse
	specular
	shininess
	metal
//レイヤオブジェクト(3D)の参照・書き込み可能なプロパティ? と思う
//ダミーオブジェクトを作れるようにする
// this_layer だけは、デフォルトで作成

Layer Space Transforms
	to_comp(point, t = time)
	from_comp(point, t = time)
	to_world(point, t = time)
	from_world(point, t = time)
	to_comp_vec(vec, t = time)
	from_comp_vec(vec, t = time)
	to_world_vec(vec, t = time)
	from_world_vec(vec, t = time)
	from_comp_to_surface(point, t = time)
//
//

Camera
	point_of_interest
	zoom
	depth_of_field
	focus_distance
	aperture
	aperture
	blur_level
	active
//カメラオブジェクトの参照・書き込み可能なプロパティ? と思う
//ダミーオブジェクトを作れるようにする
// アクティブカメラ だけは、デフォルトで作成かな?

Light
	point_of_interest
	intensity
	color
	cone_angle
	cone_feather
	shadow_darkness
	shadow_diffusion

//ライトオブジェクトの参照・書き込み可能なプロパティ? と思う
//ダミーオブジェクトを作れるようにする

Effect
	active
	param(name)
	param(index)
	name
//エフェクトオブジェクト?の参照・書き込み可能なプロパティ? と思う
//ダミーオブジェクトを作れるようにする

Mask
	opacity
	feather
	invert
	expansion
	name
//マスクオブジェクト?の参照・書き込み可能なプロパティ? と思う
//ダミーオブジェクトを作れるようにする
//エクスプレッションからシェイプは操作できないらしい。
//さらにエクスプレッション評価中はシェイプの変形も効かないらしい。

Property
	value
	value_at_time(t)
	velocity
	velocity_at_time(t)
	speed
	speed_at_time(t)
	wiggle(freq, amp, octaves = 1, amp_mult = .5, t = time)
	temporal_wiggle(freq, amp, octaves = 1, amp_mult = .5, t = time)
	smooth(width = .2, samples = 5, t = time)
	loop_in(type = "cycle", num_keyframes = 0)
	loop_out(type = "cycle", num_keyframes = 0)
	loop_in_duration(type = "cycle", duration = 0)
	loop_out_duration(type = "cycle", duration = 0)
	key(index)
	key(marker_name)
	nearest_key(t)
	num_keys
//AEの独自オブジェクトやサブオブジェクト持つプロパティのリスト…と思う。
//入力の便宜を図っているのだと思うぞ。

Key
	value
	time
	index

//キーフレームオブジェクトが持つプロパティ…と思う。(こればっかし)
//キーフレームはタイミングカーブの情報とか持ってると思うんだけど…
//書き込みは出来なくてもいいから読み出しはさせてほしいにゃあ。にゃごにゃご

//	index はキーフレームオブジェクトのインデックス。オリジネーションは 1 。
//	value はキーの種別によって配列次元が変わる。
//	time はキーが置いてある時間値.
*/
//ベクトル演算事前処理
//与えられたベクトルの次数を最も多いものに揃えて不足分に0を加えて返す
function preformvector(vec1,vec2){

	return [vec1,vec2]
}
//ベクトル和を返す。
function add(vec1,vec2) {
	if (typeof(vec1)=="number") {vec1=[vec1]}
	if (typeof(vec2)=="number") {vec2=[vec2]}
//ベクトルの次数を求める 二次元か三次元か四次元か
	var difD = (vec1.length - vec2.length)
	if (0 <= difD){
			var vecD = vec1.length;
	} else {	var vecD = vec2.length;}
//片方が不足する場合は0で補う
	if (difD > 0) {
		for (var idx = 0 ; idx > difD; idx --){
			vec2 = vec2.concat([0]);}}
	if (difD < 0) {
		for (var idx = 0 ; idx < difD; idx ++){
			vec1 = vec1.concat([0]);}}
	var vec3 = new Array
//和を求めて返す。
for (idx = 0;idx < vecD ; idx ++) {
 vec3 = vec3.concat([(vec1[idx] + vec2[idx])]);
}
return vec3;
}
//ベクトル差を返す
function sub(vec1,vec2) {
	if (typeof(vec1)=="number") {vec1=[vec1]}
	if (typeof(vec2)=="number") {vec2=[vec2]}
//ベクトルの次数を求める 二次元か三次元か四次元か
	var difD = (vec1.length - vec2.length)
	if (0 <= difD){
			var vecD = vec1.length;
	} else {	var vecD = vec2.length;}
//片方が不足する場合は0で補う
	if (difD > 0) {
		for (var idx = 0 ; idx > difD; idx --){
			vec2 = vec2.concat([0]);}}
	if (difD < 0) {
		for (var idx = 0 ; idx < difD; idx ++){
			vec1 = vec1.concat([0]);}}
	var vec3 = new Array
//差を求めて返す。
for (idx = 0;idx < vecD ; idx ++) {
 vec3 = vec3.concat([(vec1[idx] - vec2[idx])]);
}
return vec3;
}

//ベクトル積を返す
function mul(vec,amount) {
	if (typeof(vec)=="number") {vec=[vec]}
//ベクトルの次数を求める 二次元か三次元か四次元か
	var vecD = (vec.length)
	var vecNew = new Array
//積を求めて返す。
for (idx = 0;idx < vecD ; idx ++) {
 vecNew = vecNew.concat([(vec[idx] * amount)]);
}
return vecNew;
}

//ベクトル商を返す
function div(vec,amount) {
	if (typeof(vec)=="number") {vec=[vec]}
//ベクトルの次数を求める 二次元か三次元か四次元か
	var vecD = (vec.length)
	var vecNew = new Array
//商を求めて返す。
for (idx = 0;idx < vecD ; idx ++) {
 vecNew = vecNew.concat([(vec[idx] / amount)]);
}
return vecNew;
}


//ベクトルクランプ
function clamp(vec, limit1, limit2) {
		var max=limit1;var min=limit2;
	if (limit1 < limit2){
		max=limit2;min=limit1;
}
	if (typeof(vec)=="number") {vec=[vec]}
//ベクトルの次数を求める 二次元か三次元か四次元か
	var vecD = (vec.length)
	var vecNew = new Array
//要素ごとに値をクランプして返す。
for (idx = 0;idx < vecD ; idx ++) {
	if (vec[idx] >= min && vec[idx] <= max){
		vecNew = vecNew.concat([vec[idx]])
	}else {
		if (vec[idx] >= min ) {
			vecNew = vecNew.concat([max])
		}else{
			vecNew = vecNew.concat([min])
		}
	}
}
return vecNew;
}

//内積
function dot(vec1,vec2) {
	if (typeof(vec1)=="number") {vec1=[vec1]}
	if (typeof(vec2)=="number") {vec2=[vec2]}
//ベクトルの次数を求める 二次元か三次元か四次元か
	var difD = (vec1.length - vec2.length)
	if (0 <= difD){
			var vecD = vec1.length;
	} else {	var vecD = vec2.length;}
//片方が不足する場合は0で補う
	if (difD > 0) {
		for (var idx = 0 ; idx > difD; idx --){
			vec2 = vec2.concat([0]);}}
	if (difD < 0) {
		for (var idx = 0 ; idx < difD; idx ++){
			vec1 = vec1.concat([0]);}}
	var Result = 0;
//要素ごとに積算。
	for (idx = 0;idx < vecD ; idx ++) {
		Result= Result + (vec1[idx] * vec2[idx])
	}
	return Result;
}

