// Case -- Rollkiste mit Metallbeschlaegen
// (C) 1998 Christian Perle

#include "colors.inc"
#include "textures.inc"

#declare TotalCam = camera {
  location -20*z
  direction 2.2*z
  look_at 0*z
  rotate <25, 35, 0>
}

#declare CloseUpCam = camera {
  location <0, 10, -10>
  direction 10*z
  look_at <1.6, 1.4, -2>
}

camera { TotalCam } 
//camera { CloseUpCam } 

light_source { <100, 100, -200> color White }
light_source { <-50, 100, -100> color Gray70 }

background { color Gray50 }

#declare Eps = 1e-4

#declare Linewidth = 0.04
#declare TGrid = texture {
  pigment {
    gradient z
    color_map {
      [0 color green .5]
      [Linewidth color White]
      [1-Linewidth color White]
      [1 color green .5]
    }
  }
}
texture {
  pigment {
    gradient x
    color_map {
      [0 color green .5]
      [Linewidth color Clear]
      [1-Linewidth color Clear]
      [1 color green .5]
    }
  }
}

#declare WandTex = pigment {
  crackle scale 1/10
  color_map {
    [0 color Gray30]
    [1 color Gray10]
  }
}

#declare Rad = union {
  cylinder {
    -.5*z, .5*z, 1.2
    pigment {
      gradient z scale 1/8
      color_map {
        [0 color Gray10]
        [0.5 color Gray30]
        [1 color Gray10]
      }
    }
  }
  union {
    cylinder { -.55*z, .55*z, .7 }
    torus { .7, .125 rotate 90*x translate -.425*z }
    torus { .7, .125 rotate 90*x translate .425*z }
    texture { Chrome_Metal }
  }
}

#declare RGeh = intersection {
  union {
    intersection {
      difference {
	cylinder { -.7*x, .7*x, .5 }
	cylinder { -(.7+Eps)*x, (.7+Eps)*x, .4 }
      }
      box { <-(.7+Eps), 0, -.5>, <.7+Eps, .5, 0> }
    }
    intersection {
      difference {
	cylinder { -.7*x, .7*x, .5 }
	cylinder { -(.7+Eps)*x, (.7+Eps)*x, .4 }
      }
      box { <-(.7+Eps), 0, -.5>, <.7+Eps, .5, 0> }
      scale <1, 1, -1>
      translate 1*z
    }
    box { <-.7, .4, 0>, <.7, .5, 1> }
    box { <-.7, -1.2, -.5>, <.7, 0, -.4> }
    box { <-.7, -1.2, 1.4>, <.7, 0, 1.5> }
  }
  box { <-.7, -1.2, -(.5+Eps)>, <1, 1, 1.5+Eps> rotate 30*z }
  texture { Chrome_Metal }
  translate -.5*z
}

// Rad mit Gehaeuse
#declare Rad_RGeh = union {
  object { RGeh }
  cylinder {
    -1.05*z, 1.05*z, .1
    texture { Chrome_Metal }
    translate <.1, -1, 0>
  }
  object {
    Rad
    scale <.9, .9, 1.2>
    translate <.1, -1, 0>
  }
}

#declare Ecke = intersection {
  difference {
    difference {
      box { -1, 1 }
      box { -(1+Eps), .8 }
      rotate 45*z
      rotate -degrees(asin(sqrt(1/3)))*x
    }
    cylinder { <0, -2, .5>, <0, 1, -1.85>, .7 }
    cylinder { <0, -2, .5>, <0, 1, -1.85>, .7 rotate 120*y }
    cylinder { <0, -2, .5>, <0, 1, -1.85>, .7 rotate 240*y }
    cylinder { <0, -2, .5>, <0, 1, 1.2>, .1 }
    cylinder { <0, -2, .5>, <0, 1, 1.2>, .1 rotate 120*y }
    cylinder { <0, -2, .5>, <0, 1, 1.2>, .1 rotate 240*y }
  }
  box { <-3, 0, -3>, <3, 3, 3> }
  rotate degrees(asin(sqrt(1/3)))*x
  rotate -45*z
}

// Eckstueck fuer vordere, linke, untere Ecke
#declare EckStueck = union {
  object { Ecke }
  difference {
    sphere { .6, .685 }
    box { -1, .8 }
  }
  scale -1 translate .55
}

// Wanddicke
#declare Dicke = .2
#declare SeitenWand = box {
  <-3, 0, -Dicke>, <3, 3, Dicke>
}

// Strebendicke
#declare SDicke = .1
#declare SeitenStrebe = union {
  cylinder {
    -(3-Dicke)*x, (3-Dicke)*x, SDicke
    scale <1, 1, SDicke>
    translate -SDicke*y
  }
  cylinder {
    -(3-Dicke)*x, (3-Dicke)*x, SDicke
    scale <1, SDicke, 1>
    translate SDicke*z
  }
}

#declare Seiten4Strebe = union {
  object {
    SeitenStrebe scale <1.02, 1, 1>
    translate <0, 0, -(2+Dicke)>
  }
  object {
    SeitenStrebe scale <1.02, 1, 1>
    rotate 180*y translate <0, 0, 2+Dicke>
  }
  object {
    SeitenStrebe scale <.78, 1, 1>
    rotate 90*y translate <-3, 0, 0>
  }
  object {
    SeitenStrebe scale <.78, 1, 1>
    rotate -90*y translate <3, 0, 0>
  }
}

#declare HoehenStrebe = union {
  cylinder {
    0*y, 3*y, SDicke
    scale <1, 1, SDicke>
    translate -SDicke*z
  }
  cylinder {
    0*y, 3*y, SDicke
    scale <SDicke, 1, 1>
    translate -SDicke*x
  }
}

// Mini-Eckstueck fuer vordere, linke, obere Ecke
#declare MiniEck = difference {
  box { -1, 1 }
  box { -(1+Eps), .85 }
  cylinder { <-(1+Eps), -.5, -.5>, <(1+Eps), -.5, -.5>, .15 }
  cylinder { <-(1+Eps), .2, .1>, <(1+Eps), .2, .1>, .15 }
  cylinder { <-.5, -(1+Eps), -.5>, <-.5, (1+Eps), -.5>, .15 }
  cylinder { <.2, -(1+Eps), .1>, <.2, (1+Eps), .1>, .15 }
  cylinder { <-.5, -.5, -(1+Eps)>, <-.5, -.5, (1+Eps)>, .15 }
  cylinder { <.2, .1, -(1+Eps)>, <.2, .1, (1+Eps)>, .15 }
  scale <-1, 1, -1>
}

// Aussparung fuer die Schloesser
#declare SchlossTeil = union {
  box { <-1, -1, -.4>, <1, 1, .4> }
  cylinder { <-1, -1, 0>, <-1, 1, 0>, .4 }
  cylinder { <1, -1, 0>, <1, 1, 0>, .4 }
  cylinder { <-1, -1, 0>, <1, -1, 0>, .4 }
  cylinder { <-1, 1, 0>, <1, 1, 0>, .4 }
  sphere { <-1, -1, 0>, .4 }
  sphere { <1, -1, 0>, .4 }
  sphere { <1, 1, 0>, .4 }
  sphere { <-1, 1, 0>, .4 }
  scale <1, 1.2, 1>
}

// Schlossoberteil
#declare SchlossOben = intersection {
  sphere { 0, 1 }
  box { <-(1+Eps), 0, -(1+Eps)>, 1+Eps }
  scale <1/3, 1/4, 1/9>
}

#declare SchlossUnter = difference {
  cylinder { <0, 0, 0>, <0, -.5, 0>, 1 }
  cylinder { <0, -.25, -(1+Eps)>, <0, -.25, 1+Eps>, .07 }
  scale <1/3, 1, 1/9>
}

// Scharnier
#declare Scharnier = union {
  cylinder { -1.5*x, -1.1*x, .4 }
  cylinder { -.9*x, .9*x, .4 }
  cylinder { 1.1*x, 1.5*x, .4 }
}

#declare UnterTeil = union {
  difference {
    union {
      union {
	object { SeitenWand translate -2*z }
	object { SeitenWand translate 2*z }
	object { SeitenWand scale <2/3, 1, 1> rotate 90*y translate -(3-Dicke)*x }
	object { SeitenWand scale <2/3, 1, 1> rotate 90*y translate (3-Dicke)*x }
	box { <-(3-Dicke), 0, -2>, <3-Dicke, Dicke, 2> }
	pigment { WandTex }
      }
      union {
	object { Seiten4Strebe translate 3.04*y }
	object { Seiten4Strebe rotate 180*x }
	object { HoehenStrebe translate <-2.95, 0, -2.1> }
	object { HoehenStrebe rotate 90*y translate <-2.95, 0, 2.1> }
	object { HoehenStrebe rotate 180*y translate <2.95, 0, 2.1> }
	object { HoehenStrebe rotate 270*y translate <2.95, 0, -2.1> }
	texture { Chrome_Metal }
      }
      union {
	object { EckStueck scale 1/2 translate <-(3-Dicke), 0, -2> }
	object { EckStueck scale 1/2 rotate -90*y translate <3-Dicke, 0, -2> }
	object { EckStueck scale 1/2 rotate 90*y translate <-(3-Dicke), 0, 2> }
	object { EckStueck scale 1/2 rotate 180*y translate <3-Dicke, 0, 2> }
	object { MiniEck scale .2 translate <-2.87, 2.88, -2.04> }
	object { MiniEck scale .2 rotate 90*y translate <-2.87, 2.88, 2.04> }
	object { MiniEck scale .2 rotate 180*y translate <2.87, 2.88, 2.04> }
	object { MiniEck scale .2 rotate 270*y translate <2.87, 2.88, -2.04> }
	texture { Chrome_Metal }
      }
    }
    union {
      object { SchlossTeil scale 1/3 translate <-1.6, 2.8, -2.2> }
      object { SchlossTeil scale 1/3 translate <1.6, 2.8, -2.2> }
      texture { Chrome_Metal }
    }
  }
  union {
    object { SchlossUnter translate <-1.6, 3, -2.1> }
    object { SchlossUnter translate <1.6, 3, -2.1> }
    object { Scharnier scale .3 translate <-1.6, 3, 2.2> }
    object { Scharnier scale .3 translate <1.6, 3, 2.2> }
    texture { Chrome_Metal }
  }
}

#declare OberTeil = union {
  difference {
    union {
      union {
	union {
	  object { SeitenWand translate -2*z }
	  object { SeitenWand translate 2*z }
	  object { SeitenWand scale <2/3, 1, 1> rotate 90*y translate -(3-Dicke)*x }
	  object { SeitenWand scale <2/3, 1, 1> rotate 90*y translate (3-Dicke)*x }
	  scale <1, .3, 1>
	}
	box { <-(3-Dicke), .9-Dicke, -2>, <3-Dicke, .9, 2> }
	pigment { WandTex }
      }
      union {
	object { Seiten4Strebe translate .94*y }
	object { Seiten4Strebe rotate 180*x }
	object {
	  HoehenStrebe scale <1, .3, 1>
	  translate <-2.95, 0, -2.1> 
	}
	object {
	  HoehenStrebe scale <1, .3, 1>
	  rotate 90*y translate <-2.95, 0, 2.1>
	}
	object {
	  HoehenStrebe scale <1, .3, 1>
	  rotate 180*y translate <2.95, 0, 2.1>
	}
	object {
	  HoehenStrebe scale <1, .3, 1>
	  rotate 270*y translate <2.95, 0, -2.1>
	}
	texture { Chrome_Metal }
      }
      union {
	object {
	  EckStueck scale 1/2
	  scale <1, -1, 1>
	  translate <-(3-Dicke), .75, -2>
	}
	object {
	  EckStueck scale 1/2
	  scale <1, -1, 1> rotate -90*y
	  translate <3-Dicke, .75, -2>
	}
	object {
	  EckStueck scale 1/2
	  scale <1, -1, 1> rotate 90*y
	  translate <-(3-Dicke), .75, 2>
	}
	object {
	  EckStueck scale 1/2
	  scale <1, -1, 1> rotate 180*y
	  translate <3-Dicke, .75, 2>
	}
	texture { Chrome_Metal }
      }
    }
    union {
      object { SchlossTeil scale 1/3 translate <-1.6, -.2, -2.2> }
      object { SchlossTeil scale 1/3 translate <1.6, -.2, -2.2> }
      texture { Chrome_Metal }
    }
  }
  union {
    object { SchlossOben translate <-1.6, 0, -2.1> }
    object { SchlossOben translate <1.6, 0, -2.1> }
    texture { Chrome_Metal }
  }
  translate -2*z
}


// Das komplette Case
#declare RotRad1 = <0, 0, 0>
#declare RotRad2 = <0, 180+20, 0>
#declare RotRad3 = <0, 0, 0>
#declare RotRad4 = <0, 180+20, 0>
#declare RotOberTeil = <12, 0, 0>
#declare Case = union {
  object { UnterTeil }
  object { Rad_RGeh scale .4 rotate RotRad1 translate <2.1, -.22, 1.6> }
  object { Rad_RGeh scale .4 rotate RotRad2 translate <-2.1, -.22, 1.6> }
  object { Rad_RGeh scale .4 rotate RotRad3 translate <2.1, -.22, -1.6> }
  object { Rad_RGeh scale .4 rotate RotRad4 translate <-2.1, -.22, -1.6> }
  object {
    OberTeil rotate RotOberTeil
    translate <0, 3, 2>
  }
}

object { Case translate -1.6*y }

plane { y, -2.75 texture { TGrid } }