Search code examples
shellcommand-line-argumentspovray

How to pass infomation to POV-Ray from a shell script


How do I pass a variable from a shell script to POV-Ray? My desire would the ability to pass a variable as a command-line argument and then use that value in the .ini file or .pov file

Something like

POV-Ray +pass var=$imageNumber file.pov

And then being able to use var in POV-Ray

I realize that I could edit the .ini and .pov files in the script or use modulus to use the single frame variable as two variables, but both those solutions seem awkward.

I want to generate 1000s of extremely similar scenes. Each scene is exactly the same except that a heightmap uses a different image file as its source. Normally, I would use the animation tools in POV-Ray to generate multiple frames. However, I am already using the animation tools to cycle over a different property in each scene.


Solution

  • For *nix systems, use POV-Ray's file handling system to open the standard-in file in your .pov file

    #fopen STDIN "/dev/stdin" read
    #read (STDIN, var1, var2)
    

    This will read from the standard-in for a comma separated list of POV literals. However, POV-Ray doesn't handle reading from a pipe; Thus, use herestrings (or heredocuments if you must use only sh compatible syntax) to fill stdin for POV-Ray.

    For example, if run in the shell (works for bash):

    povray "example.pov" <<<'"hello","world"'
    

    Will fill the variables var1 and var2 from above with the values "hello" and "world" respectively. Note that quotes must be included around each string value in the list. This is because POV wants POV literals in the 'file' we are passing.

    If you want to use an .ini file instead, just call the .ini file in place of the .pov file and everything will work as expected.

    If you want more or less variable to be passed to the POV file, add or remove variable names from the #read directive and extend or trim the number you are passing to the same length.'

    You can also pass shell variables like this. If foo contains "hello" including the quotes, and "example.pov" is expecting one string in the herestring, then

    povray "example.pov" <<<$foo
    

    will pass hello to the variable in the #read directive.

    Additionally, you can other POV literals than stings, in that case use the relevant POV syntax the that literal type. However, you can't put POV expressions into the herestring. See the wiki page for more information.