#!/usr/bin/perl -w
use RenderMan;

sub rgb2hsv {
    my ($r, $g, $b) = @_;
    my ($min, $max, $delta, $h, $s, $v);
    $min=min($r, $g, $b);
    $max=max($r, $g, $b);
    $v=$max;
    $delta=$max-$min;
    if ($delta == 0) {
	$s=0; 
	$h=-1; # undefined, so what... 
    } else {
	$s=$delta/$max;
	if ($r == $max) {
	    $h = ($g - $b)/$delta;
	} elsif ($g == $max) {
	    $h = 2 + ($b - $r)/$delta;
	} else {
	    $h = 4 + ($r - $g)/$delta;
	}
	$h *= 60;
	$h += 360 if $h < 0;
    }
    return ($h, $s, $v);
}

sub hsv2rgb {
    my ($h, $s, $v) = @_;
    my ($i, $f, $p, $q, $t);
    if ($s == 0) {
	$r = $b = $g = $v;
    } else {
	$h /= 60;
	$i = int $h;
	$f = $h - $i;
	$p = $v * (1 - $s);
	$q = $v * (1 - $s * $f);
	$t = $v * (1 - $s * (1 - $f));
      SWITCH: {
	  if ($i == 0) {
	      $r = $v;
	      $g = $t;
	      $b = $p;
	      last SWITCH;
	  }
	  if ($i == 1) {
	      $r = $q;
	      $g = $v;
	      $b = $p;
	      last SWITCH;
	  }
	  if ($i == 2) {
	      $r = $p;
	      $g = $v;
	      $b = $t;
	      last SWITCH;
	  }
	  if ($i == 3) {
	      $r = $p;
	      $g = $q;
	      $b = $v;
	      last SWITCH;
	  }
	  if ($i == 4) {
	      $r = $t;
	      $g = $p;
	      $b = $v;
	      last SWITCH;
	  }
	  $r = $v;
	  $g = $p;
	  $b = $q;
      } 
    }
    return ($r, $g, $b);
}
		   
sub min {
    my ($i, $m);
    $m=$_[0];
    for ($i=1; $i <= $#_; $i++) {
	$m = $_[$i] if ($m > $_[$i]);
    }
    return $m;
}

sub max {
    my ($i, $m);
    $m=$_[0];
    for ($i=1; $i <= $#_; $i++) {
	$m=$_[$i] if ($m < $_[$i]);
    }
    return $m;
}

Begin();
for ($fr=1; $fr<=181; $fr++) {
  $fn = sprintf ("%02d", $fr);
  FrameBegin($fr);
    Display("rgb216-".$fn.".tif", "file", "rgb");
    Format(300, 300, 1);
    LightSource(RI_DISTANTLIGHT, { "intensity" => 2, "lightcolor" => [1,1,1],
                                   "from" => [0,100,-100], "to" => [0,0,0]} );
    LightSource(RI_DISTANTLIGHT, { "intensity" => 1, "lightcolor" => [1,1,1],
                                   "from" => [100,-100,-100], "to" => [0,0,0]} );
    Projection(RI_PERSPECTIVE, { "fov" => 6.5 });
    Sides(1);
    Translate(0, 0, 40);
    WorldBegin();
      Rotate ($fr -81 , 1, 0, 0);
      Rotate ( 4* ($fr-1), 0, 1 ,0);
#      AttributeBegin();
#        Rotate (-90, 1, 0, 0);
#        Surface("LGParquetPlank");
#        Disk(-1.25, 2, 360);
#      AttributeEnd();
      Surface("plastic");
      for ($r = 0; $r <= 1; $r += .2) {
        for ($g = 0; $g <= 1; $g += .2) {
	  for ($b = 0; $b <= 1; $b += .2) {
	      ($h, $s, $v) = rgb2hsv($r, $g, $b);
	      AttributeBegin();
                Rotate ($h, 0, 1, 0);
                Translate (2*$s * $v, 2*$v-1, 0);
                Color ($r, $g, $b);
                Sphere(.1, -.1, .1, 360);
              AttributeEnd();
	  }
        }
      }
    WorldEnd();
  FrameEnd();
}
End();
		




