// Collier d'Antoine, version animée
// Pour Wikipedia, un collier à huit anneau a été créé.

#include "colors.inc"
#include "textures.inc"
#include "shapes.inc"
#include "metals.inc"
//#include "stones.inc"
//#include "woods.inc"                                                
#include "glass.inc"

// ***************************
// Installation de la caméra *
// ***************************
// On installe la caméra et on définit son orientation.
// L'axe des x est vers la droite, l'axe des y vers le haut, l'axe des z vers le fond.

#declare cc=27; // clock varie de 1 à 400

camera {
#declare DistanceObservateur = 3+sin((cc-25)/375*pi);
#declare HauteurObservateur = 0;
#declare Angle = -2;  // pour une vision stéréoscopique :
                     // < 0 pour l'oeil gauche (G.POV) . L'image devra être placée à DROITE en vision croisée
                     // > 0 pour l'oeil droit (D.POV) (en degré), l'image devra être placée à GAUCHE. 
                     // En général 3 à 5 degré d'écart entre les deux yeux. Angle est en degré. 
//Définir l'angle pour choisir l'oeil

location  <DistanceObservateur*cos(Angle/180*pi), HauteurObservateur, DistanceObservateur*sin(Angle/180*3.142)> 
look_at  <0,0,0>
}

// On définit le fond (par défaut noir)

background {color Black}  

#declare Couleur_1=Yellow;
#declare Couleur_2=Red; 
#declare Couleur_3=White; 
#declare Couleur_4=Blue; 
#declare TextureTore=Silver_Metal;

#declare N=8; // Nombre de tores par collier. Il y a en tout 4*N^2 = 256 tores
#declare nbTores=0; // nombre de tores dessinés

//*********
//        *
// Macros *
//        *
//*********

// montore dessine en tore centré en <x0,y0,z0>, de rayons grand R et petit r, d'axe orthogonal <a,b,c>. Col est la couleur
#macro Montore(R,r,x0,y0,z0,a,b,c,Col)
     #if (a*a+c*c=0)
       #local phi=0;
       #local theta=0;
     #else
       #local theta=acos(b/sqrt(a*a+b*b+c*c));
       #if (c<0)
          #local phi=-acos(-a/sin(theta)/sqrt(a*a+b*b+c*c));
       #else 
          #local phi=acos(-a/sin(theta)/sqrt(a*a+b*b+c*c));
       #end
     #end
     #if (nbTores<cc-25)  // on dessine le premier tore quand cc=26 
       torus {R, r                    
            texture{TextureTore} pigment{color Col}
            rotate theta*180/pi*z
            rotate phi*180/pi*y
            translate <x0,y0,z0>}
       #declare nbTores=nbTores+1;
     #end
#end

// R0, R1, R2 sont les trois rayons de tores décroissants. 
// ralpha un angle de rotation de la figure par rapport à son axe, 
// <x0,y0,z0> est le vecteur de translation, <a,b,c> le vecteur normal au plan du tore principal, 
// C1 et C2 les deux couleurs utilisées.
// Montore1 utilise 2*N tores. 
#macro Montore1(R0,R1,R2,ralpha,x0,y0,z0,a,b,c,C1,C2)
     union {
     #local Index = 1;
     #while (Index <= N)
       Montore(R1,R2,R0*cos(2*pi/N*Index),0,R0*sin(2*pi/N*Index),0,1,0,C1)
	   #local Index = Index + 1;
     #end      
     #local Index = 1;
     #while (Index <= N)
 	   Montore(R1,R2,(R0-R2/2)*cos(2*pi/N*(Index+0.5)),0,(R0-R2/2)*sin(2*pi/N*(Index+0.5)),cos(2*pi/N*(Index+0.5)),0,sin(2*pi/N*(Index+0.5)),C2)
	   #local Index = Index + 1;
     #end      
     
     #if (a*a+c*c=0)
       #local phi=0;
       #local theta=0;
     #else
       #local theta=acos(b/sqrt(a*a+b*b+c*c));
       #if (c<0)
        #local phi=-acos(-a/sin(theta)/sqrt(a*a+b*b+c*c));
       #else 
        #local phi=acos(-a/sin(theta)/sqrt(a*a+b*b+c*c));
       #end                      
     #end
     rotate y*ralpha
     rotate theta*180/pi*z
     rotate phi*180/pi*y
     translate <x0,y0,z0>
     }
#end

// R0, R1, R2, R3 sont les rayons de tores décroissants. 
// <x0,y0,z0> est le vecteur de translation, <a,b,c> le vecteur normal au plan du tore principal, 
// C1 à C4 les quatre couleurs utilisées.
// Montore2 utilise 4*N^2 tores.
#macro Montore2(R0,R1,R2,R3,ralpha,x0,y0,z0,a,b,c,C1,C2,C3,C4)
     union {
     #local Index2 = 1;
     #while (Index2 <= N)
  	   Montore1(R1,R2,R3,180/N*Index2,R0*cos(2*pi/N*Index2),0,R0*sin(2*pi/N*Index2),0,1,0,C1,C2) 
	   #local Index2 = Index2 + 1;
     #end      
     #local Index2 = 1;
     #while (Index2 <= N)
 	   Montore1(R1,R2,R3,180/N*Index2,(R0-R2/2)*cos(2*pi/N*(Index2+0.5)),0,(R0-R2/2)*sin(2*pi/N*(Index2+0.5)),cos(2*pi/N*(Index2+0.5)),0,sin(2*pi/N*(Index2+0.5)),C3,C4)
	   #local Index2 = Index2 + 1;
     #end      

     #if (a*a+c*c=0)
       #local phi=0;
       #local theta=0;
     #else
       #local theta=acos(b/sqrt(a*a+b*b+c*c));
       #if (c<0)
        #local phi=-acos(-a/sin(theta)/sqrt(a*a+b*b+c*c));
       #else 
        #local phi=acos(-a/sin(theta)/sqrt(a*a+b*b+c*c));
       #end                      
     #end
     rotate y*ralpha 
     rotate theta*180/pi*z
     rotate -phi*180/pi*y
     translate <x0,y0,z0>
     
     // Mouvement propre à l'animation
     rotate y*360*3*cc/400/7
     rotate y*180
     rotate -z*20
     rotate -z*70*sin(cc/400*pi)*sin(cc/400*pi)          
     }
#end


// R0, R1, R2, R3,R4 sont les rayons de tores décroissants. 
// <x0,y0,z0> est le vecteur de translation, <a,b,c> le vecteur normal au plan du tore principal, 
// C1 à C4 les quatre couleurs utilisées
// Montore3 utilise 8*N^3 tores.
#macro Montore3(R0,R1,R2,R3,R4,x0,y0,z0,a,b,c,C1,C2,C3,C4,C5,C6,C7,C8)
     union {
     #local Index3 = 1;
     #while (Index3 <= N)
 	   Montore2(R1,R2,R3,R4,180/N*Index3,R0*cos(2*pi/N*Index3),0,R0*sin(2*pi/N*Index3),0,1,0,C1,C2,C3,C4) 
	   #local Index3 = Index3 + 1;
     #end      
     #local Index3 = 1;
     #while (Index3 <= N)
 	   Montore2(R1,R2,R3,R4,180/N*Index3,(R0-R2/2)*cos(2*pi/N*(Index3+0.5)),0,(R0-R2/2)*sin(2*pi/N*(Index3+0.5)),cos(2*pi/N*(Index3+0.5)),0,sin(2*pi/N*(Index3+0.5)),C5,C6,C7,C8)
	   #local Index3 = Index3 + 1;
     #end      

     #if (a*a+c*c=0)
       #local phi=0;
       #local theta=0;
     #else
       #local theta=acos(b/sqrt(a*a+b*b+c*c));
       #if (c<0)
        #local phi=-acos(-a/sin(theta)/sqrt(a*a+b*b+c*c));
       #else 
        #local phi=acos(-a/sin(theta)/sqrt(a*a+b*b+c*c));
       #end                      
     #end
     rotate theta*180/pi*z
     rotate -phi*180/pi*y
     translate <x0,y0,z0>}
#end

// ********
// Objets *
// ********

Montore2(1,0.29,0.08,0.012, 0, 0,0,0, 0,1,0, Yellow,Yellow,White,White)


// *********
// Lumière *
// *********

light_source { <0, 10, 0> color White shadowless}
light_source { <10, 0, 0> color White shadowless}
//light_source { <0, 0, 10> color White shadowless}
light_source { <10, 10, 10> color White shadowless}
