// Last edited on 2013-12-11 05:56:09 by stolfilocal
// Processed by remove-cam-lights

background{ color rgb < 0.75, 0.80, 0.85 > }

#declare tx_joint =
  texture{
    pigment{ color rgb < 1, 0.5, 0 > }
    finish{ diffuse 0.8 ambient 0.2 specular 0.5 roughness 0.005 }
  }

#declare tx_red =
  texture{
    pigment{ color rgb < 1, 0, 0 > }
    finish{ diffuse 0.8 ambient 0.2 specular 0.5 roughness 0.005 }
  }

#declare tx_green =
  texture{
    pigment{ color rgb < 0, 1, 0 > }
    finish{ diffuse 0.8 ambient 0.2 specular 0.5 roughness 0.005 }
  }

#declare tx_blue =
  texture{
    pigment{ color rgb < 0, 0, 1 > }
    finish{ diffuse 0.8 ambient 0.2 specular 0.5 roughness 0.005 }
  }

#declare tx_vidro =
  texture{
    pigment{ color rgb < 0.85, 0.95, 1.00 > filter 0.70 }
    finish{ diffuse 0.03 reflection 0.25 ambient 0.02 specular 0.25 roughness 0.005 }
  }

#declare tx_espelho =
  texture{
    pigment{ color rgb < 1.00, 0.50, 0.50 > }
    finish{ diffuse 0.4 reflection 0.5*< 1.00, 1.00, 1.00 > ambient 0.1 }
  }

#declare tx_xadrez =
  texture{
    pigment{ checker color rgb < 1.0, 1.0, 1.0 >, color rgb < 0.0, 0.0, 0.0 > }
    finish{ diffuse 0.9 ambient 0.1 }
    scale 2.5
  }

#declare raio_roda = 0.5;
#declare raio_joint = 0.25;

#include "retalho.inc"

#declare A = array[4][4];
#declare A[0][0] = <3,-1,2.5>;
#declare A[0][1] = <2.5,-1,3>;
#declare A[0][2] = <2,-1,3>;
#declare A[0][3] = <1.5,-1,2.5>;

#declare A[1][0] = <3,-0.5,2.5>;
#declare A[1][1] = <2.5,-0.5,3>;
#declare A[1][2] = <2,-0.5,3>;
#declare A[1][3] = <1.5,-0.5,2.5>;

#declare A[2][0] = <3,0.5,2.5>;
#declare A[2][1] = <2.5,0.5,3>;
#declare A[2][2] = <2,0.5,3>;
#declare A[2][3] = <1.5,0.5,2.5>;

#declare A[3][0] = <3,1,2.5>;
#declare A[3][1] = <2.5,1,3>;
#declare A[3][2] = <2,1,3>;
#declare A[3][3] = <1.5,1,2.5>;

#declare C = array[4][4];
#declare C[0][0] = <3,-1,2.5>;
#declare C[0][1] = <2.5,-1,2>;
#declare C[0][2] = <2,-1,2>;
#declare C[0][3] = <1.5,-1,2.5>;

#declare C[1][0] = <3,-0.5,2.5>;
#declare C[1][1] = <2.5,-0.5,2>;
#declare C[1][2] = <2,-0.5,2>;
#declare C[1][3] = <1.5,-0.5,2.5>;

#declare C[2][0] = <3,0.5,2.5>;
#declare C[2][1] = <2.5,0.5,2>;
#declare C[2][2] = <2,0.5,2>;
#declare C[2][3] = <1.5,0.5,2.5>;

#declare C[3][0] = <3,1,2.5>;
#declare C[3][1] = <2.5,1,2>;
#declare C[3][2] = <2,1,2>;
#declare C[3][3] = <1.5,1,2.5>;

#declare B = array[4][4];
#declare B[0][0] =  A[3][0];
#declare B[0][1] =  A[3][1];
#declare B[0][2] =  A[3][2];
#declare B[0][3] =  A[3][3];

#declare B[1][0] = <3,1, 2.75>;
#declare B[1][1] = <2.5,1, 2.75>;
#declare B[1][2] = <2,1, 2.75>;
#declare B[1][3] = <1.5,1, 2.75>;

#declare B[2][0] = <3,1, 2.25>;
#declare B[2][1] = <2.5,1, 2.25>;
#declare B[2][2] = <2,1, 2.25>;
#declare B[2][3] = <1.5,1, 2.25>;

#declare B[3][0] = C[3][0];
#declare B[3][1] = C[3][1];
#declare B[3][2] = C[3][2];
#declare B[3][3] = C[3][3];

#declare D = array[4][4];
#declare D[0][0] =  A[0][0];
#declare D[0][1] =  A[0][1];
#declare D[0][2] =  A[0][2];
#declare D[0][3] =  A[0][3];

#declare D[1][0] = <3,-1, 2.75>;
#declare D[1][1] = <2.5,-1, 2.75>;
#declare D[1][2] = <2,-1, 2.75>;
#declare D[1][3] = <1.5,-1, 2.75>;

#declare D[2][0] = <3,-1, 2.25>;
#declare D[2][1] = <2.5,-1, 2.25>;
#declare D[2][2] = <2,-1, 2.25>;
#declare D[2][3] = <1.5,-1, 2.25>;

#declare D[3][0] = C[0][0];
#declare D[3][1] = C[0][1];
#declare D[3][2] = C[0][2];
#declare D[3][3] = C[0][3];

#declare roda =
        disc
        {
                <0, 0, 0>,
                <0, 1, 0>,
                raio_roda
                texture{tx_red}
        }

#declare joint =
        cylinder
        {
                <0, 0, 0>,
                <0, 0, 1.5>,
                raio_joint
                texture{tx_joint}
        }

#declare chao =
  box{ <-20,-20,-1>, <+20,+20,0> }

#macro castelo(p, tr, scal, semente)
        #local t1 = tr + <0, 0, 1>;
        #local p1 = p + 1;
        #local r = rand(semente);
        #if (r >= 0.5)
                #local s1 = 1.22*scal;
        #else
                #local s1 = 1.1*scal;
        #end
        #if (p < 4)
                object{base translate tr scale scal}
                castelo(p1, t1, s1, semente)
        #else
                object{base translate tr scale s1}
        #end
#end

#macro retalhoA()
                object{ retalho(
                                                        A[0][0], A[0][1], A[0][2], A[0][3],
                                                        A[1][0], A[1][1], A[1][2], A[1][3],
                                                        A[2][0], A[2][1], A[2][2], A[2][3],
                                                        A[3][0], A[3][1], A[3][2], A[3][3],
                                                        0,
                                                        tx_vidro,
                                                        tx_blue
                                                )
                }
#end

#macro retalhoC()
                object{ retalho(
                                                        C[0][0], C[0][1], C[0][2], C[0][3],
                                                        C[1][0], C[1][1], C[1][2], C[1][3],
                                                        C[2][0], C[2][1], C[2][2], C[2][3],
                                                        C[3][0], C[3][1], C[3][2], C[3][3],
                                                        0,
                                                        tx_vidro,
                                                        tx_blue
                                                )
                }
#end

#macro retalhoBD()
        union{
                object{ retalho(
                                                        B[0][0], B[0][1], B[0][2], B[0][3],
                                                        B[1][0], B[1][1], B[1][2], B[1][3],
                                                        B[2][0], B[2][1], B[2][2], B[2][3],
                                                        B[3][0], B[3][1], B[3][2], B[3][3],
                                                        0,
                                                        tx_vidro,
                                                        tx_blue
                                                )
                }
                object{ retalho(
                                                        D[0][0], D[0][1], D[0][2], D[0][3],
                                                        D[1][0], D[1][1], D[1][2], D[1][3],
                                                        D[2][0], D[2][1], D[2][2], D[2][3],
                                                        D[3][0], D[3][1], D[3][2], D[3][3],
                                                        0,
                                                        tx_vidro,
                                                        tx_blue
                                                )
                }
        }
#end

#include "eixos.inc"

union{
                object{ eixos(20.00)}
                object{ roda  translate <2, 0, 0.5>}
                object{ joint translate <2, 0, 1.0>}
                retalhoA()
                retalhoC()
                retalhoBD()

}

#include "camlight.inc"
#declare centro_cena = < 2.50, 0.200, 2.50 >;
#declare raio_cena = 6.0;
#declare dir_camera = < 4, 7, 4>;
#declare dist_camera = 10;
#declare intens_luz = 1.00;
camlight(centro_cena, raio_cena, dir_camera, dist_camera , z, intens_luz)