import processing.core.*;
import processing.opengl.*;

import processing.video.*; //cam
import jp.nyatla.nyar4psg.*; //AR
import javax.media.opengl.*;
import mri.*; //3d
import pogg.*; //video
import ddf.minim.*; //audio

Minim minim1;
AudioPlayer musica;

TheoraMovie myMovie;

Capture cam;
NyARMultiBoard nya;
PFont font;

V3dsScene sol;
V3dsScene mercurio;
V3dsScene venus;
V3dsScene tierra;
V3dsScene marte;
V3dsScene jupiter;
V3dsScene saturno;
V3dsScene urano;
V3dsScene neptuno;
V3dsScene luna;

float angSol,angMercurio,angVenus,angTierra,angMarte,angJupiter,angSaturno,angUrano,angNeptuno,angLuna;
float angRotSol,angRotMercurio,angRotVenus,angRotTierra,angRotMarte,angRotJupiter,angRotSaturno,angRotUrano,angRotNeptuno,angRotLuna;
float Rot;

int interruptor = 0;

void setup() {
  //Camera on
  try {
    quicktime.QTSession.open();
  } catch (quicktime.QTException qte) {
    qte.printStackTrace();
  }//END Camera on

  size(640,480,OPENGL);
  // I'm using the GSVideo capture stack
  cam=new Capture(this,width,height,24);
  // array de marcadores
  String[] patts = {"marcadores/ss","marcadores/sol2","marcadores/mercurio2","marcadores/venus2","marcadores/tierra2","marcadores/marte2","marcadores/jupiter2","marcadores/saturno2","marcadores/urano2","marcadores/neptuno2","marcadores/video"};
  // array de los tamaños en mm
  double[] widths = {80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80};

  // inicializar el NyARMultiBoard
  nya=new NyARMultiBoard(this,width,height,"camera_para.dat",patts,widths);

  nya.gsThreshold=110;//(0<n<255) default=110
  nya.cfThreshold=0.4;//(0.0<n<1.0) default=0.4


  try
  {
      //cargar modelos 3D
      sol = new V3dsScene(this,"planetas/sol.3ds");
      mercurio = new V3dsScene(this,"planetas/mercurio.3ds");
      venus = new V3dsScene(this,"planetas/venus.3ds");
      tierra = new V3dsScene(this,"planetas/tierra.3ds");
      marte = new V3dsScene(this,"planetas/marte.3ds");
      jupiter = new V3dsScene(this,"planetas/jupiter.3ds");
      saturno = new V3dsScene(this,"planetas/saturno.3ds");
      urano = new V3dsScene(this,"planetas/urano.3ds");
      neptuno = new V3dsScene(this,"planetas/neptuno.3ds");
      luna = new V3dsScene(this,"planetas/luna.3ds");
      sol.useMaterial(true);
      mercurio.useMaterial(true);
      venus.useMaterial(true);
      tierra.useMaterial(true);
      marte.useMaterial(true);
      jupiter.useMaterial(true);
      saturno.useMaterial(true);
      urano.useMaterial(true);
      neptuno.useMaterial(true);
      luna.useMaterial(true);
  }
  catch( Exception e )
  {
    println( e );
    System.exit( 0 );
  }
  //video
  myMovie = new TheoraMovie(this, "SistemaSolar2.ogg");
  myMovie.loop();
  //audio
  minim1 = new Minim(this);
  musica=minim1.loadFile("SistemaSolar2.mp3",2048);   
  
}//END void setup()

void drawMarkerPos(int[][] pos2d)
{

  stroke(100,0,0);
  fill(100,0,0);
  
  // Aquí estan los puntos en las esquinas de los marcadores
  for(int i=0;i<4;i++){
    ellipse(pos2d[i][0], pos2d[i][1],5,5);
  }
  
  fill(0,255,0);
  for(int i=0;i<4;i++){
    text(pos2d[i][0]+","+pos2d[i][1],pos2d[i][0],pos2d[i][1]);
  }
  noStroke();
}
void draw() {
  background(200);
  if (cam.available() )
  {
    cam.read();
  }
  
  background(255);

  hint(DISABLE_DEPTH_TEST);
  image(cam,0,0,800,600);
  hint(ENABLE_DEPTH_TEST);

  if (nya.detect(cam))
  {
    hint(DISABLE_DEPTH_TEST);
    for (int i=0; i < nya.markers.length; i++)
    {
      if (nya.markers[i].detected)
      {
        translate(60,50,70);
        //drawMarkerPos(nya.markers[i].pos2d);
      }
    }
    
    hint(ENABLE_DEPTH_TEST);

    PGraphicsOpenGL pgl = (PGraphicsOpenGL) g;
    for (int i=0; i < nya.markers.length; i++)
    {
      if (nya.markers[i].detected)
      {
        nya.markers[i].beginTransform(pgl);
        /*translate(0,0,20);
        rotateY(PI/2);
        rotateZ(PI/2);*/
        translate(20,-20,0);
        if ( i == 0 )
        {
            println("marker sistema solar");
            ss();
        }
        else if ( i == 1)
        {
            println("marker sol");
            sol();
        }
        else if ( i == 2)
        {
            println("marker mercurio");
            mercurio();
        }
        else if ( i == 3)
        {
            println("marker Venus");
            venus();
        }
        else if ( i == 4)
        {
            println("marker tierra");
            tierra();
        }
        else if ( i == 5)
        {
            println("marker marte");
            marte();
        }
        else if ( i == 6)
        {
            println("marker jupiter");
            jupiter();
        }
       else if ( i == 7)
        {
            println("marker saturno");
            saturno();
        }
       else if ( i == 8)
        {
            println("marker urano");
            urano();
        }
       else if ( i == 9)
        {
            println("marker neptuno");
            neptuno();
        }
       else if ( i == 10)
        {
            println("marker video");
            video();
        }        

        nya.markers[i].endTransform();
      }
    }
  }
}
void sombra(int radio){
    pushMatrix();
    translate(0,0,-50);
    fill(0,50);
    ellipse(0,0,radio,radio); 
    popMatrix();  
}
