Skip to content
Snippets Groups Projects
timesnapper 2.74 KiB
Newer Older
  • Learn to ignore specific revisions
  • #! /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;
    	}
        }
    }