#! /usr/bin/perl

($me = $0) =~ s'.*/'';

$res = "";
$fovy = "";

sub scanopts {
  while(@ARGV) {
    if($ARGV[0] =~ /^-n/) {
	$nowait = shift(@ARGV);

    } elsif($ARGV[0] =~ /^-res/) {
	shift(@ARGV);
	$res = shift(@ARGV) . " " . shift(@ARGV);

    } elsif($ARGV[0] =~ /^-fov/) {
	shift(@ARGV);
	$fovy = shift(@ARGV);

    } elsif($ARGV[0] =~ /^-asp/) {
	shift(@ARGV), shift(@ARGV);

    } elsif($ARGV[0] =~ /^-subcam/) {
	shift(@ARGV);
	@subcams = grep($_ ne "", split(/[\s,]/, shift(@ARGV)));

    } else {
	return;
    }
  }
}

&scanopts();

unless(@ARGV >= 3 && ($ARGV[1].$ARGV[2]) =~ /^\d+$/ && $ARGV[2] >= $ARGV[1]) {
    print STDERR "Usage: $me   [-res XSIZE YSIZE] [-fovy FOVY] [-subcam cam1,cam2,...]  [ stemname  starttime endtime [timestep]
Command partiview to take successive snapshots, varying datatime (\"step\")
and moving along any currently-loaded (rdata) path (\"frame\").
(If no path is loaded, uses current camera position.  Try a slow spin!)
Output images are named stemname.NNNN.png unless stemname includes % sign,
in which case it's taken as a printf format string (including suffix).
Use -subcam to render for one or several subcameras (which must be
defined to partiview too, with e.g.:   'read \$RDATA/params/subcam-params'

Use as e.g., in partiview command box,
     async $me  wow  0.0 10.0 0.2
or   async $me  -subcam hp0,hp1,hp2,hp3,hp4  wow.@.%04d.tif  0 3 0.02
";
    exit(1);
}

$stem = shift(@ARGV);
$min = shift(@ARGV);
$max = shift(@ARGV);

$step = ($ARGV[0] =~ /^\d+$/) ? shift(@ARGV) : 1;

$min = 1 if $min <= 0;

&scanopts();

$stem = "$stem.%04d.png" unless $stem =~ /%/;
$stem =~ s/\%/\@.\%/ if @subcams && $stem !~ /\@/;

$| = 1;

print "{\nwinsize $res\n}\n" if $res;

$set_fovy = "fovy $fovy" if $fovy;

@subcams = ("") unless(@subcams);

while(@subcams) {
    $subcam = shift(@subcams);

    if($subcam ne "") {
	$set_subcam = "subcam $subcam\n";
    }
    ($scstem = $stem) =~ s/\@/$subcam/g;

    $frame = 0;
    for($time = $min; $time <= $max; $time += $step, $frame++) {
  
	print STDERR "=> snapshot -n $frame  $scstem => '", sprintf($scstem,$frame), "'\n";

	print "eval {\n";
	print "eval $set_subcam\n" if $set_subcam;
	print "eval frame $frame\n";	# in case there's an anim path loaded too
	print "eval step $time\n";
	print "eval $set_fovy\n" if $set_fovy;
	print "eval jump - - - - - -\n";  # force update
	$scfile = sprintf($scstem, $frame);
	print "eval snapshot $scfile\n";
	print "eval }\n";

	$set_subcam = "";
	unless($nowait) {
	    $waitcount = 0;
	    while(! -f $scfile) {
		if($waitcount++ == 50) {
		    printf STDERR "Got tired of waiting for $scstem to appear -- giving up!\n", $frame;
		    exit(1);
		}
		select(undef, undef, undef, .333);	# Wait 1/3rd second.
	    }
	    printf STDERR "=> Found $scstem\n", $frame;
	}
    }
}