package com.roxiga.guitar;

import android.content.Context;
import android.opengl.GLSurfaceView;
import android.opengl.GLU;
import javax.microedition.khronos.egl.EGLConfig;
import javax.microedition.khronos.opengles.GL10;
import android.media.MediaPlayer;
import com.roxiga.hypermotion3d.*;
import com.roxiga.models.*;

public class Guitar implements GLSurfaceView.Renderer
{
	//コンテクスト
	private Context _context;
	//画面幅
	public int _width;
	//画面高さ
	public int _height;
    //カメラ位置
    private Vector3D _eye = new Vector3D(0.0f, 100.0f, 1200.0f);
    //カメラの注視する点
    private Vector3D _lookAt = new Vector3D(0.0f, 100.0f, 0.0f);
    //カメラ視点上方向を表すベクトル
    private Vector3D _up = new Vector3D(0.0f, 1.0f, 0.0f);
    //アコギを持つ主人公
    private Model3D _jersey = new BlueJersey();
    //タイトル画面
    private Sprite2D _title = new Sprite2D();
    //
    static final int GS_TITLE = 0;
    //
    static final int GS_MAIN = 1;
    //
    static final int GS_GAMEOVER = 2;
    //
    int _gameState = GS_TITLE;
    //音楽
    public MediaPlayer _mpBGM = new MediaPlayer();
    //
    static final float TEMPO = 100.0f;
    //
    static final float NOTE4 = (1000.0f*(60.0f/TEMPO));
    //
    int[] _progression = {2,5,6,2,2,5,6,2,2,5,6,2,5,6,2,2,2,5,6,2,5,6,2,2,2,5,6,2,2,5,6,2,2,5,6,2,2,5,6,2,5,6,2,2,5,6,2,2,  2,2,2,2};
	//①8ビートでダウンストロークに関する時間を
    float _current;
    //②8ビートでアップストロークに関する時間を
    float _current2;
    //
    float _current3;
    //現在のコード
    int _chord = 0;

    /**
     * @Override
     * コンストラクタ
     */
    public Guitar(Context context)
    {
        _context = context;
        _mpBGM = MediaPlayer.create(context, R.raw.bgm);
    }

    // @Override
    // 描画のために毎フレーム呼び出されるイベント
    public void onDrawFrame(GL10 gl)
    {
        // 描画用バッファをクリア
        gl.glClear(GL10.GL_COLOR_BUFFER_BIT
        		| GL10.GL_DEPTH_BUFFER_BIT);

        // モデルビュー行列を指定
        gl.glMatrixMode(GL10.GL_MODELVIEW);
        // 現在選択されている行列(モデルビュー行列)に、単位行列をセット
        gl.glLoadIdentity();

        // カメラ位置をセット
        GLU.gluLookAt(gl,
                _eye._x,_eye._y,_eye._z,
                _lookAt._x,_lookAt._y,_lookAt._z,
                _up._x,_up._y,_up._z);
        
        switch ( _gameState )
        {
        case GS_TITLE:
        	_title.draw(gl,getRatio());
        	break;
        case GS_MAIN:
        	play(gl);
        	if ( !_mpBGM.isPlaying() )
			{
 				_gameState = GS_GAMEOVER;
			}
			break;
        case GS_GAMEOVER:
    		gl.glClearColor(1,1,1,1);
        	break;
        }
    }

    //演奏
    void play(GL10 gl)
    {
		//③
        float pos  = _mpBGM.getCurrentPosition() - _current;
		//④
    	float pos2 = _mpBGM.getCurrentPosition() - _current2;
    	float pos3 = _mpBGM.getCurrentPosition() - _current3;

    	//⑤ダウンストローク
    	if (NOTE4 <= pos)
    	{
    		//⑥アニメーション
     		_jersey.setAnimation(_chord);
    		//⑦
     		_current += NOTE4;
    	}
    	//⑧アップストローク
    	if (NOTE4 <= pos2)
    	{
    		//⑨
    		_jersey.setAnimation(_chord+7);
    		//⑩
    		_current2 += NOTE4;
    	}
    	//コード進行
    	if (NOTE4*2<=pos3)
    	{
    		_chord=_progression[(int)((float)_mpBGM.getCurrentPosition()/NOTE4/2)];
    		_jersey.setAnimation(_chord);
    		_current3 += 2*NOTE4;
    	}

   		_jersey.draw(gl);
    }
  
	private float getRatio()
	{
		return (float)_width/600.0f;
	}
    
    // @Override
    // サーフェイスのサイズ変更時に呼ばれる
    public void onSurfaceChanged(
    		GL10 gl, int width, int height)
    {
    	// ビューポートをサイズに合わせてセットしなおす
        gl.glViewport(0, 0, width, height);
        // アスペクトレート
        float ratio = (float) width / height;
        // 射影行列を選択
        gl.glMatrixMode(GL10.GL_PROJECTION);
        // 現在選択されている行列(射影行列)に、単位行列をセット
        gl.glLoadIdentity();
        /* Perspectiveの設定(視野角度, アスペクト比)、ニア、ファー*/
        GLU.gluPerspective(gl, 30.0f, ratio, 10f, 10000f);
    }

    // @Override
    //サーフェイスが生成または再生成される際に呼ばれる
    public void onSurfaceCreated(
    		GL10 gl, EGLConfig config)
    {
        // ディザを無効化
        gl.glDisable(GL10.GL_DITHER);
        // カラーとテクスチャ座標の補間精度を、最も効率的なものに指定
        gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT,
        		GL10.GL_FASTEST);
        // 片面表示を有効に
        gl.glEnable(GL10.GL_CULL_FACE);
        // カリング設定をCCWに
        gl.glFrontFace(GL10.GL_CCW);
        // 深度テストを有効に
        gl.glEnable(GL10.GL_DEPTH_TEST);
    	//テクスチャ機能ON
    	gl.glEnable(GL10.GL_TEXTURE_2D);
    	//背景色
    	gl.glClearColor(0,0,0,1);
    	// 頂点配列を使うことを宣言
        gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
        //テクスチャ
        gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
        //テクスチャ読み込み
		_jersey.setTexture(gl,_context.getResources(),R.drawable.bluejersey);
        //テクスチャ読み込み
		_title.setTexture(gl,_context.getResources(),R.drawable.title);
   }
    
	
	public void actionDown(float x,float y)
	{
	}
	
	public void actionMove(float x,float y)
	{
	}

	public void actionUp(float x,float y)
	{
		switch ( _gameState )
		{
		case GS_TITLE:
			init();
			break;

		case GS_MAIN:
			break;

		case GS_GAMEOVER:
			_gameState = GS_TITLE;
			break;
		}
 	}

	private void init()
	{
		_gameState = GS_MAIN;
		_mpBGM.seekTo(0);
		_mpBGM.start();
		_jersey.playAnimation(_progression[0],false,true);
		//⑪
		_current = 0;
		//⑫
	    _current2 = (500.0f*60.0f/TEMPO);
	    _current3 = 0;
	}
}
