// PoVRay 3.7 Scene File " ... .pov"
// author:  ...
// date:    ...
//--------------------------------------------------------------------------
#version 3.7;
global_settings{ assumed_gamma 1.0 }
//--------------------------------------------------------------------------
#include "colors.inc"
#include "textures.inc"
#include "glass.inc"
#include "metals.inc"
#include "golds.inc"
#include "stones.inc"
#include "woods.inc"
#include "shapes.inc"
#include "shapes2.inc"
#include "functions.inc"
#include "math.inc"
#include "transforms.inc"
#include "mrg_misc3.inc"
#include "platonic_solids.inc"

#declare lclock=clock+0;

//move test charge around  1-6,6-11 
    //rotate in screen plane with varying distance then corkscrew down

#declare test_r=vrotate((1.2+.2*sin(3*pi*trans((lclock-1)/5)))*x, 390*trans((lclock-1)/5)*z); 
#declare test_r=vrotate(test_r, 540*trans((lclock-6)/5)*y)+.5*trans((lclock-6)/2)-2.2*y*trans((lclock-8)/3); 

//fade in efield marker array 11-13
#declare t2F=trans((lclock-11)/2);


// rotate perspective  13-21

#declare cpos= vrotate (<.5, 2+2*sin(pi*trans((lclock-13)/8)), 7>, 180*trans((lclock-13)/8)*y);


//fade in efield lines phade out efied markers 21-23
#declare t4F=trans((lclock-21)/2); 

//and rotate perspective   23-31

#declare cpos= vrotate (cpos, 180*trans((lclock-23)/8)*y)+2*sin(pi*trans((lclock-23)/8))*y;








// perspective (default, not required) camera
camera {
  perspective
  location  cpos
  look_at   <0, 0,  0>
  right     -x*image_width/image_height  // aspect &RH coords
  // direction z                        // direction and zoom
  // angle 67                           // field (overides direction zoom)
}
// create a regular point light source
light_source {
  0*x                  // light's position (translated below)
  color rgb <1,1,1>    // light's color
  translate 5*<-20, 40, 20>
}


#declare p_texture= texture {pigment{color rgb <.7,.0,.0>} finish{Shiny}} ;
#declare test_texture= texture {pigment{color rgb .5*<1,.025,.10>} finish{Shiny}} ;
#declare n_texture= texture {pigment{color rgb <.0,.0,.7>} finish{Shiny}} ;
#declare Efieldlinetexture=texture{pigment{color rgb <1,.15,.1>} finish{Shiny}}; 
#declare Bfieldlinetexture=texture{pigment{color rgb <.1,.1,1>} finish{Luminous}}; 
#declare charge_radius=.12;
#declare test_charge_radius=.4*charge_radius;
 
//two positive charges, mod from dipole
#declare q_dipole=.3;       // k=1
#declare l_dipole=1;
#declare pp_dipole=<0,.5*l_dipole,0>; 
#declare pn_dipole=<0,-.5*l_dipole,0>; 
#macro E_dipole(_fieldpoint)
  q_dipole*( (_fieldpoint-pp_dipole)/pow(vlength(_fieldpoint-pp_dipole),3) + (_fieldpoint-pn_dipole)/pow(vlength(_fieldpoint-pn_dipole),3))
#end
 

//Make_Vector(vec,head_length,post_diameter,head_diameter)

#declare post_diameter=.2*test_charge_radius;
#declare head_diameter=3*post_diameter;
#declare head_length=3*head_diameter;


//charge
sphere { <0,.5*l_dipole,0>, charge_radius texture{p_texture}}   
sphere { <0,-.5*l_dipole,0>, charge_radius texture{p_texture}}   

//testcharge
#declare E=E_dipole(test_r);
sphere { <0,0,0>, test_charge_radius texture{test_texture} translate test_r}  // end of sphere ----------------------------------- 
object{Make_Vector(E,head_length,post_diameter,head_diameter) translate test_r texture{Efieldlinetexture}}    


#if((t2F>0)&(t4F<1))
    #declare ds=.75;
    #declare smax=3 ;
    
    #declare snowx=-smax;
    #while (snowx<= smax)
        #declare snowy=-smax;
        #while (snowy<= smax)
            #declare snowz=-smax;
            #while (snowz<= smax)
                #declare snow=<snowx,snowy,snowz>;
                #if( (vlength(snow-pp_dipole)>ds)&(vlength(snow-pn_dipole)>ds))
                    #declare E=E_dipole(snow);
                    #declare Etexturefadein=texture{pigment{color rgbt <1,.15,.1,1-t2F+t4F>} finish{Shiny}}; 
    
                    object{Make_Vector(E,head_length,post_diameter,head_diameter) translate snow texture{Etexturefadein}}    
                    
                
                #end
                #declare snowz=snowz+ds;
            #end
            #declare snowy=snowy+ds;
        #end
        #declare snowx=snowx+ds;
    #end
#end

//field lines
#if(t4F>0)

    #declare ds=.5*charge_radius;
    #declare iv=0;
    #while(iv<20)
        #declare fieldline_point=pp_dipole+ds*PDvertex[iv];
        #declare s_fieldline=0;
        #while((s_fieldline<10)&(vlength(fieldline_point-pn_dipole)>ds))
            #declare E=E_dipole(fieldline_point);
            #declare new_fieldline_point=fieldline_point+ds*E/vlength(E);
            #declare Etexturefadein=texture{pigment{color rgbt <1,.15,.1,1-t4F>} finish{Shiny}}; 
            //#declare Etexturefadein=texture{pigment{color rgbt <1,.15,.1,0>} finish{Shiny}}; 
            
        
            sphere{fieldline_point,post_diameter texture{Etexturefadein}}
            cylinder{fieldline_point,new_fieldline_point,post_diameter texture{Etexturefadein}}
            
            #if((abs(s_fieldline-1)<.5*ds))
               object{Make_Vector(E/vlength(E)*head_length*1.01,head_length,post_diameter,head_diameter) texture{Etexturefadein} translate fieldline_point} /*  */
            #end
             
            #declare fieldline_point=new_fieldline_point;
            #declare s_fieldline=s_fieldline+ds;
        #end
        #declare iv=iv+1;
    #end    
    #declare iv=0;
    #while(iv<20)
        #declare fieldline_point=pn_dipole+ds*PDvertex[iv];
        #declare s_fieldline=0;
        #while((s_fieldline<10)&(vlength(fieldline_point-pn_dipole)>ds))
            #declare E=E_dipole(fieldline_point);
            #declare new_fieldline_point=fieldline_point+ds*E/vlength(E);
            #declare Etexturefadein=texture{pigment{color rgbt <1,.15,.1,1-t4F>} finish{Shiny}}; 
            //#declare Etexturefadein=texture{pigment{color rgbt <1,.15,.1,0>} finish{Shiny}}; 
            
        
            sphere{fieldline_point,post_diameter texture{Etexturefadein}}
            cylinder{fieldline_point,new_fieldline_point,post_diameter texture{Etexturefadein}}
            
            #if((abs(s_fieldline-1)<.5*ds))
               object{Make_Vector(E/vlength(E)*head_length*1.01,head_length,post_diameter,head_diameter) texture{Etexturefadein} translate fieldline_point} /*  */
            #end
             
            #declare fieldline_point=new_fieldline_point;
            #declare s_fieldline=s_fieldline+ds;
        #end
        #declare iv=iv+1;
    #end    
    
#end  
    
    
    
    