//2D function to 3D tube

#version 3.7;
//
global_settings { assumed_gamma 1.0 }

//-------------------------------------------------------------------------------------------------
//-------------------------------------------------------------------------------------------------
//-------------------------------------------------------------------------------------------------
#include "meshmaker.inc"
#include "metals.inc"
#include "math.inc"
//-------------------------------------------------------------------------------------------------

    /* Tube HeartCurve from https://www.frassek.org/:
      HeartCurve and derivatives:
      fx(u) = 16*sin^3(u);
      f'x(u) = 48*sin^2(u)*cos(u);
      fy(u) = 13*cos(u)-5*cos(2*u)-2*cos(3*u)-cos(4*u);
      f'y(u) = -13*sin(u)+10*sin(2*u)+6*sin(3*u)+4*sin(4*u) 
      
      0>=u<=2*pi, 0>=v<=2*pi
    */
    
    #declare rr = 1.00;
    // Parametric function sets for HeartCurve and their derivatives:
    #declare FX = function(u){16*pow(sin(u),3)};
    #declare FdX = function(u){48*pow(sin(u),2)*cos(u)};
    #declare FY = function(u){13*cos(u)-5*cos(2*u)-2*cos(3*u)-cos(4*u)};
    #declare FdY = function(u){-13*sin(u)+10*sin(2*u)+6*sin(3*u)+4*sin(4*u)};

    // Cross section of tube:
    #declare QX = function(v){u};
    #declare QY = function(v){rr*cos(v)};
    #declare QZ = function(v){rr*sin(v)};

    // Rotation angle of cross section of tube:
    #declare PHI = function(u){-atan2(FdX(u),FdY(u)) + pi/2};
   
    #declare F1 = function(u,v){QX(v)*sin(PHI(u)) + FX(u)};
    #declare F2 = function(u,v){QY(v)*cos(PHI(u)) + FY(u)};
    #declare F3 = function(u,v){QZ(v)};
  
//-------------------------------------------------------------------------------------------------
//-------------------------------------------------------------------------------------------------
object {
    Parametric(
      F1, F2, F3,
      <0, 0>, < 2*pi, 2*pi>,
      150,150,"T_HeartCurve_00b.obj"
    )
   
   texture { T_Silver_5C }
   
   rotate< 0,0,0>
   scale< 1,1,1>*0.25
   translate< 0.0,0.0,0 >
} 

camera {
   location <0,0,-20>
   up y
   right x*image_width/image_height
   angle 40
   sky <0,1,0>
   look_at <0,0,0>
}

light_source {
  <-15,0,0>
  color rgb <1,0.5,0.5>
}
light_source {
  <0,-15,0>
  color rgb <0.5,1.0,0.5>
}  
light_source { 
  <0,0,-15>
  color rgb <0.5,0.5,1.0>
}

//--------------------------------------------------------------------------------------------------
//--------------------------------------------------------------------------------------------------
