// Last edited on 2003-12-12 15:48:17 by stolfi

#declare bz_name = "Cascao"

#include "colors.inc"

#declare A11 = <3,3,0>;
#declare A12 = <3,1,0.5>;
#declare A13 = <3,-1, 0.5>;
#declare A14 = <3,-3, 0>;

#declare A21 = <1,3,0.5>;
#declare A22 = <1,1,2>;
#declare A23 = <1,-1,2>;
#declare A24 = <1,-3,0.5>;

#declare A31 = <-1,3,0.5>;
#declare A32 = <-1,1,1>;
#declare A33 = <-1,-1,1>;
#declare A34 = <-1,-3,0.5>;

#declare A41 = <-3,3,1>;
#declare A42 = <-3,1,1>;
#declare A43 = <-3,-1,1>;
#declare A44 = <-3,-3, 1>;

#declare A =  array[4][4] {
  {A11,A12,A13,A14},
  {A21,A22,A23,A24},
  {A31,A32,A33,A34},
  {A41,A42,A43,A44}
}
  
#declare B11 = <1,0,0>;
#declare B12 = <2,2,0>;
#declare B13 = <3,2,0>;
#declare B14 = <4,2,0>;
                      
#declare B21 = <1,0,0> + 0.0001;
#declare B22 = <2,2.0,-1>;
#declare B23 = <3,2.5,-1>;
#declare B24 = <4,3,-1>;
                      
#declare B31 = <1,0,0> + 0.0002;
#declare B32 = <2,1.5,-2>;
#declare B33 = <3,0.8,-2>;
#declare B34 = <4,1,-2>;
                      
#declare B41 = <1,0,0> + 0.0003;
#declare B42 = <2,1.0,0>;
#declare B43 = <3,0.2,0>;
#declare B44 = <4,0, 0>;

#declare B =  array[4][4] {
  {B11,B12,B13,B14},
  {B21,B22,B23,B24},
  {B31,B32,B33,B34},
  {B41,B42,B43,B44}
}

#macro rtl(pts,cor)
  union{
    bicubic_patch {
      type 1
      flatness 0
      u_steps 4  v_steps 4

      pts[0][0]  pts[0][1]  pts[0][2]  pts[0][3]
      pts[1][0]  pts[1][1]  pts[1][2]  pts[1][3]
      pts[2][0]  pts[2][1]  pts[2][2]  pts[2][3]
      pts[3][0]  pts[3][1]  pts[3][2]  pts[3][3]

      pigment { color rgb cor }
      finish { diffuse 0.30 reflection 0.40*<1,1,1>+0.30*cor ambient 0.00 }
    }
    union {
      sphere {pts[0][0], bz_ball_r}
      sphere {pts[0][1], bz_ball_r}
      sphere {pts[0][2], bz_ball_r}
      sphere {pts[0][3], bz_ball_r}
      sphere {pts[1][0], bz_ball_r}
      sphere {pts[1][1], bz_ball_r}
      sphere {pts[1][2], bz_ball_r}
      sphere {pts[1][3], bz_ball_r}
      sphere {pts[2][0], bz_ball_r}
      sphere {pts[2][1], bz_ball_r}
      sphere {pts[2][2], bz_ball_r}
      sphere {pts[2][3], bz_ball_r}
      sphere {pts[3][0], bz_ball_r}
      sphere {pts[3][1], bz_ball_r}
      sphere {pts[3][2], bz_ball_r}
      sphere {pts[3][3], bz_ball_r}

      cylinder { pts[0][0], pts[0][1], bz_rod_r }
      cylinder { pts[0][1], pts[0][2], bz_rod_r }
      cylinder { pts[0][2], pts[0][3], bz_rod_r }

      cylinder { pts[1][0], pts[1][1], bz_thin_rod_r }
      cylinder { pts[1][1], pts[1][2], bz_thin_rod_r }
      cylinder { pts[1][2], pts[1][3], bz_thin_rod_r }

      cylinder { pts[2][0], pts[2][1], bz_thin_rod_r }
      cylinder { pts[2][1], pts[2][2], bz_thin_rod_r }
      cylinder { pts[2][2], pts[2][3], bz_thin_rod_r }

      cylinder { pts[3][0], pts[3][1], bz_rod_r }
      cylinder { pts[3][1], pts[3][2], bz_rod_r }
      cylinder { pts[3][2], pts[3][3], bz_rod_r }

      cylinder { pts[0][0], pts[1][0], bz_rod_r }
      cylinder { pts[1][0], pts[2][0], bz_rod_r }
      cylinder { pts[2][0], pts[3][0], bz_rod_r }

      cylinder { pts[0][1], pts[1][1], bz_thin_rod_r }
      cylinder { pts[1][1], pts[2][1], bz_thin_rod_r }
      cylinder { pts[2][1], pts[3][1], bz_thin_rod_r }

      cylinder { pts[0][2], pts[1][2], bz_thin_rod_r }
      cylinder { pts[1][2], pts[2][2], bz_thin_rod_r }
      cylinder { pts[2][2], pts[3][2], bz_thin_rod_r }

      cylinder { pts[0][3], pts[1][3], bz_rod_r }
      cylinder { pts[1][3], pts[2][3], bz_rod_r }
      cylinder { pts[2][3], pts[3][3], bz_rod_r }

      texture{
        pigment { color rgb cor }
        finish { diffuse 0.60 ambient 0.20 }
      }
    }  
  }
  
#end

#declare bz_scale = 0.35;
#include "bz-things.inc"

#declare scene = 
  union{
    union{
      object {rtl(A,bz_color_A) scale <0,0.5,0>}
      object {rtl(A,bz_color_B) rotate z*180 translate <-6,0,0> scale <0,0.5,0>}
      object {rtl(B,bz_color_C) scale <0,0.5,0>}
      object {rtl(B,bz_color_D) rotate z*180 translate <-6,0,0> scale <0,0.5,0>}
      translate <3,2,-1>
      rotate 180*y
    }
    // object{ bz_axes }
  }

object{ bz_checker_bg }
object{ scene rotate +60*y translate bz_rite_pos }
object{ scene rotate -90*y translate bz_left_pos }