// Persistence of Vision Ray Tracer Scene Description File
// File: ?.pov
// Vers: 3.5
// Desc: Basic Scene Example
// Date: mm/dd/yy
// Auth: ?
//
/*script
     start with "tunnel view", now wave
     transition to exterior view
     turn on wave
     transition back to "tunnel wave"
     turn off wave
*/
#version 3.5;

#include "colors.inc" 
#include "mrg_misc3.inc"
//transitions  do these as actual seconds
#declare t1=.5;  //move to outside
#declare dt1=3.0;
#declare t2=5;  //wave "turnon"
#declare dt2=.25;//wave turnon risetime
#declare t3=8;  //move back inside
#declare dt3=3.0;
#declare t4=14.5;  //turn wave off
#declare dt4=.25;


#declare lclock=clock+0;
#declare tr1=trans((lclock-t1)/dt1);
#declare tr3=trans((lclock-t3)/dt3);
//pulse shape for wave turn on/off
#declare pls=function(tt) {trans((tt-t2)/dt2)-trans((tt-t4)/dt4) }


global_settings {
  assumed_gamma 1.0
}

// ----------------------------------------
#declare coutsidecp=<0.0, 2, -15>;
#declare coutsidela=<-12, 0.0,  0.0>;
#declare cinsidecp=<0.0, 0, 0>;
#declare coutsidela=<-12, 0.0,  0.0>;
#declare cpos=coutsidecp*(tr1-tr3)+ cinsidecp*(1-tr1+tr3);
camera {
  location  cpos
  direction 1.5*z
  right     x*image_width/image_height
  look_at   <-12, 0.0,  0.0>
}


light_source {
  <0, 0, 0>            // light's position (translated below)
  color rgb <1, 1, 1>  // light's color
  translate <-30, 30, -30>
}

// ----------------------------------------
#declare Rorb=.075;
#declare orb=sphere{0,Rorb
     texture { 
           pigment { color rgb <.2,.2,.9> } 
           finish{ambient .3 diffuse .5 phong .25}
     } 
     no_shadow no_reflection
}
#declare gorb=sphere{0,Rorb*.98
     texture { 
           pigment { color rgbt <.2,.2,.9,.85> } 
           finish{ambient .3 diffuse .5 phong .25}
     } 
     no_shadow no_reflection

}
#declare loopR=.8;
#declare wavelength=10;
#declare freq=1;
#declare wvel=wavelength*freq;
#declare womega=freq*2*pi;
#declare f_e1=function(xx,tt) {cos(2*pi*xx/wavelength-womega*tt)*pls(tt-xx/wvel)}
#declare f_e2=function(xx,tt) {0*sin(2*pi*xx/wavelength-womega*tt)*pls(tt-xx/wvel)}
#declare amplitude=.3;                

#declare ii=0;
#declare gcirc= union{
     #while(ii < 12)
          #object {gorb translate vrotate(loopR*y,x*ii/12*360)}
          #declare ii=ii+1;
     
     #end
}
#macro markers(p1,p2)
     #declare ic=0;
     union{
     #while (ic<12)
          #declare xm=vrotate(loopR*y,x*ic/12*360);
          #declare xm=xm.x*x+xm.y*y*(1+p1)+xm.z*z*(1-p1);
          #declare xm=vrotate(xm, 45*x);
          #declare xm=xm.x*x+xm.y*y*(1+p2)+xm.z*z*(1-p2);
          
          #declare xm=vrotate(xm,-45*x);
          object{orb
               translate xm
          }   
     
          #declare ic=ic+1;
     #end
     }        
#end

#declare dx=2;//ring spacing
#declare ii=0;
#declare nloops=90;
#while(ii < nloops)
     #declare xn= dx*(ii-nloops/2);
     #declare ey=1+amplitude*f_e1(xn,lclock);
     #declare ez=1-amplitude*f_e1(xn,lclock);
     #declare p1 =amplitude*f_e1(xn,lclock);
     #declare p2 =amplitude*f_e2(xn,lclock);
     
     #object {markers(p1,p2) translate dx*x*(ii-nloops/2)}
     torus {loopR, 0.025 
          rotate z*90
          texture { 
                pigment { color rgb <.4,.0,.0> } 
                finish{ambient .3 diffuse .5 phong .25}
          } 
          no_shadow no_reflection
          //first component
          scale x+(1+p1)*y+(1-p1)*z
          //second component
          rotate 45*x
          scale x+(1+p2)*y+(1-p2)*z
          rotate -45*x
          translate dx*x*(ii-nloops/2)
     }
      
     #declare ii=ii+1;

#end

#declare ii=0;
#declare nloops=30;
#while(ii < nloops)
     #object {gcirc translate 2*x*(ii-nloops/2)}
     #declare xn= dx*(ii-nloops/2);
     torus { loopR, 0.015 rotate z*90 translate dx*x*(ii-nloops/2)
          texture { 
                pigment { color rgbt <.2,.0,.0,.85> } 
                finish{ambient .3 diffuse .5 phong .25}
          } 
          no_shadow no_reflection
      }
     #declare ii=ii+1;

#end
/**/

#declare dx=.1;

#declare xn =-90;
     #declare xmold=loopR*y+(xn-dx)*x;
#while(xn<=90)
     #declare p1 =amplitude*f_e1(xn,lclock);
     #declare p2 =amplitude*f_e2(xn,lclock);
     #declare xm=loopR*y;
     #declare xm=xm.x*x+xm.y*y*(1+p1)+xm.z*z*(1-p1);
     #declare xm=vrotate(xm, 45*x);
     #declare xm=xm.x*x+xm.y*y*(1+p2)+xm.z*z*(1-p2);
     
     #declare xm=vrotate(xm,-45*x)+xn*x;

     cylinder{xmold,xm,Rorb*.25
          texture { 
                pigment { color rgb <.2,.8,.4> } 
                finish{ambient .3 diffuse .5 phong .25}
          } 
     no_shadow no_reflection
     
     }
     #declare xmold=xm;
     #declare xn=xn+dx;
#end         



