let lib3d_litemode = false;

/**
 * 軽量モードの切り替え
 * trueにするとz座標を計算しなくなるので少し軽くなります
 * z座標の値が必要ない場合はtrueにした方がいいかも
 * 
 * @param {Boolean} flag 軽量モードフラグ
 */
function Lib3DLiteMode( flag ){
	lib3d_litemode = flag;
}

/**
 * 回転情報を作成
 * 要はxyz軸の回転角度それぞれに対してsin,cosを求めるだけ
 * 
 * @param {Integer} x x軸回転角度
 * @param {Integer} y y軸回転角度
 * @param {Integer} z z軸回転角度
 * @return {Array(Integer)} 回転情報(要素数6の配列、xyz軸回転量のsin,cos値)
 */
function MakeRotation( x, y, z ){
	return [ sin( x ), sin( y ), sin( z ), cos( x ), cos( y ), cos( z ) ];
}

/**
 * 3D座標を2D座標に変換する その1
 * 基本形です
 * 
 * @param {Integer}        x   x座標
 * @param {Integer}        y   y座標
 * @param {Integer}        z   z座標
 * @param {Array(Integer)} rot 回転情報(要素数6の配列、xyz軸回転量のsin,cos値)
 * @return {Array(Integer)} x座標,y座標,z座標の配列[x,y,z]
 */
function Conv3Dto2D( x, y, z, rot ){
	let sa = rot[ 0 ];
	let ca = rot[ 3 ];
	let sb = rot[ 1 ];
	let cb = rot[ 4 ];
	let sc = rot[ 2 ];
	let cc = rot[ 5 ];
	
	let xsc = x * sc;
	let xcc = x * cc;
	let ysc = y * sc;
	let ycc = y * cc;
	let zsa = z * sa;
	let zca = z * ca;
	
	let xscycc = xsc + ycc;
	let xccysc = xcc - ysc;
	
	let xscyccsazca = xscycc * sa + zca;
	
	let xx = xscyccsazca * sb + xccysc * cb;
	let yy = xscycc * ca - zsa;
	let zz = 0;
	
	if( !lib3d_litemode ){
		zz = xscyccsazca * cb - xccysc * sb;
	}
	
	return [ xx, yy, zz ];
}

/**
 * 3D座標を2D座標に変換する その2
 * z座標を完全に無視した軽量版です
 * 
 * @param {Integer}        x   x座標
 * @param {Integer}        y   y座標
 * @param {Array(Integer)} rot 回転情報(要素数6の配列、xyz軸回転量のsin,cos値)
 * @return {Array(Integer)} x座標,y座標の配列[x,y]
 */
function Conv3Dto2DLite( x, y, rot ){
	let sa = rot[ 0 ];
	let ca = rot[ 3 ];
	let sb = rot[ 1 ];
	let cb = rot[ 4 ];
	let sc = rot[ 2 ];
	let cc = rot[ 5 ];
	
	let xsc = x * sc;
	let xcc = x * cc;
	let ysc = y * sc;
	let ycc = y * cc;
	
	let xscycc = xsc + ycc;
	let xccysc = xcc - ysc;
	
	let xscyccsa = xscycc * sa;
	
	let xx = xscyccsa * sb + xccysc * cb;
	let yy = xscycc * ca;
	let zz = 0;
	
	return [ xx, yy, zz ];
}
