Reference:Shell Command Options
Pre_Scene_Command= s |
Set command before entire scene |
Pre_Frame_Command= s |
Set command before each frame |
Post_Scene_Command= s |
Set command after entire scene |
Post_Frame_Command= s |
Set command after each frame |
User_Abort_Command= s |
Set command when user aborts POV-Ray |
Fatal_Error_Command= s |
Set command when POV-Ray has fatal error |
Note: No +
or -
switches are available for
these options. They cannot be used from the command line. They may only be
used from INI files.
POV-Ray offers you the opportunity to shell-out to the operating system at several key points to execute another program or batch file. Usually this is used to manage files created by the internal animation loop however the shell commands are available for any scene. The string s is a single line of text which is passed to the operating system to execute a program. For example
Post_Scene_Command=tga2gif -d -m myfile
would use the utility tga2gif
with the -D
and
-M
parameters to convert myfile.tga
to
myfile.gif
after the scene had finished rendering.
Note: Individual platforms may provide means of preventing shell-outs from occurring. For example, the Windows version provides a menu command to turn shell-outs off (which is the default setting for that platform). The reason for this (along with file I/O restrictions) is to attempt to prevent untrusted INI files from doing harm to your system.
String Substitution in Shell Commands
It could get cumbersome to change the Post_Scene_Command
every time you changed scene names. POV-Ray can substitute various values
into a command string for you. For example:
Post_Scene_Command=tga2gif -d -m %s
POV-Ray will substitute the %s
with the scene name in the
command. The scene name is the Input_File_Name
or
+I
setting with any drive, directory and extension removed. For
example:
Input_File_Name=c:\povray3\scenes\waycool.pov
is stripped down to the scene name waycool
which results
in...
Post_Scene_Command=tga2gif -d -m waycool
In an animation it may be necessary to have the exact output file name
with the frame number included. The string %o
will substitute
the output file name. Suppose you want to save your output files in a zip
archive using the utility program pkzip
. You could do...
Post_Frame_Command=pkzip -m %s %o
After rendering frame 12 of myscene.pov
POV-Ray would shell
to the operating system with
pkzip -m myscene mysce012.tga
The -M
switch in pkzip
moves
mysce012.tga
to myscene.zip
and removes it from the
directory. Note that %o
includes frame numbers only when in an
animation loop. During the Pre_Scene_Command
and
Post_Scene_Command
there is no frame number so the original,
unnumbered Output_File_Name
is used. Any
User_Abort_Command
or Fatal_Error_Command
not inside the
loop will similarly give an unnumbered %o
substitution.
Here is the complete list of substitutions available for a command string.
%o |
Output file name with extension and embedded frame number if any |
%s |
Scene name derived by stripping path and ext from input name |
%n |
Frame number of this frame |
%k |
Clock value of this frame |
%h |
Height of image in pixels |
%w |
Width of image in pixels |
%% |
A single % sign. |
Shell Command Sequencing
Here is the sequence of events in an animation loop. Non-animated scenes work the exact same way except there is no loop.
- Process all INI file keywords and command line switches just once.
- Open any text output streams and do Create_INI if any.
- Execute Pre_Scene_Command if any.
- Loop through frames (or just do once on non-animation).
- Execute Pre_Frame_Command if any.
- Parse entire scene file, open output file and read settings, turn on display, render the frame, destroy all objects, textures etc., close output file, close display.
- Execute Post_Frame_Command if any.
- Repeat above steps until all frames are done.
- Execute Post_Scene_Command if any.
- Finish
If the user interrupts processing the User_Abort_Command
, if
any, is executed. User aborts can only occur during the parsing and rendering
parts of step (4b) above. If a fatal error occurs that POV-Ray notices the
Fatal_Error_Command
, if any, is executed. Sometimes an
unforeseen bug or memory error could cause a total crash of the program in
which case there is no chance to shell out. Fatal errors can occur just about
anywhere including during the processing of switches or INI files. If a fatal
error occurs before POV-Ray has read the Fatal_Error_Command
string then obviously no shell can occur.
Note: The entire scene is re-parsed for every frame. Future versions of POV-Ray may allow you to hold over parts of a scene from one frame to the next but for now it starts from scratch every time.
Note: The Pre_Frame_Command
occurs before the
scene is parsed. You might use this to call some custom scene generation utility
before each frame. This utility could rewrite your .pov
or .inc
files if needed. Perhaps you will want to generate new
.gif
or .tga
files for image maps or height fields on each frame.
Shell Command Return Actions
Pre_Scene_Return= s |
Set pre scene return actions |
Pre_Frame_Return= s |
Set pre frame return actions |
Post_Scene_Return= s |
Set post scene return actions |
Post_Frame_Return= s |
Set post frame return actions |
User_Abort_Return= s |
Set user abort return actions |
Fatal_Error_Return= s |
Set fatal return actions |
Note: No +
or -
switches are available for
these options. They cannot be used from the command line. They may only be
used from INI files.
Most operating systems allow application programs to return an error code if something goes wrong. When POV-Ray executes a shell command it can make use of this error code returned from the shell process and take some appropriate action if the code is zero or non-zero. POV-Ray itself returns such codes. It returns 0 for success, 1 for fatal error and 2 for user abort.
The actions are designated by a single letter in the different
..._Return
=s options. The possible actions are:
I |
ignore the code |
S |
skip one step |
A |
all steps skipped |
Q |
quit POV-Ray immediately |
U |
generate a user abort in POV-Ray |
F |
generate a fatal error in POV-Ray |
For example if your Pre_Frame_Command
calls a program which
generates your height field data and that utility fails then it will return a
non-zero code. We would probably want POV-Ray to abort as well. The option
Pre_Frame_Return=F
will cause POV-Ray to do a fatal abort if the
Pre_Frame_Command
returns a non-zero code.
Sometimes a non-zero code from the external process is a good thing. Suppose
you want to test if a frame has already been rendered. You could use the
S
action to skip this frame if the file is already rendered.
Most utilities report an error if the file is not found. For example the
command...
pkzip -V myscene mysce012.tga
tells pkzip you want to view the catalog of myscene.zip
for
the file mysce012.tga
. If the file is not in the archive
pkzip
returns a non-zero code.
However we want to skip if the file is found. Therefore we need to reverse
the action so it skips on zero and does not skip on non-zero. To reverse
the zero vs. non-zero triggering of an action precede it with a
"-
" sign (note a "!
" will also
work since it is used in many programming languages as a negate
operator).
Pre_Frame_Return=S
will skip if the code shows error
(non-zero) and will proceed normally on no error (zero).
Pre_Frame_Return=-S
will skip if there is no error (zero) and will
proceed normally if there is an error (non-zero).
The default for all shells is I
which means that the return
action is ignored no matter what. POV-Ray simply proceeds with whatever it
was doing before the shell command. The other actions depend upon the
context. You may want to refer back to the animation loop sequence chart in
the previous section Shell Command Sequencing. The action for
each shell is as follows.
On return from any User_Abort_Command
:
If there is an action triggered...
Specified Action: | Results: |
F |
Turn this user abort into a fatal error. |
S , A , Q , or U |
Proceed with the user abort. |
On return from any Fatal_Error_Command
:
POV-Ray will proceed with the fatal error no matter what. It will exit POV-Ray with error code 1.
On return from any Pre_Scene_Command
, Pre_Frame_Command
, Post_Frame_Command
or Post_Scene_Commands
:
If there is an action triggered...
Specified Action: | Results: |
F |
Turn this user abort into a fatal error. |
U |
Generate a user abort. |
Q |
Quit POV-Ray immediately. Acts as though POV-Ray never really ran. |
On return from a Pre_Scene_Command
:
If there is an action triggered...
Specified Action: | Results: |
S |
Skip rendering all frames. Acts as though the scene completed all frames normally. Note: See the chart, this means skip #4 |
A |
Skip all scene activity. Works exactly like Do no further shells, not even a Note: See the chart, this means skip #6 |
On return from a Pre_Frame_Command
:
If there is an action triggered...
Specified Action: | Results: |
S |
Skip only this frame. Acts as though this frame never existed. Note: See the chart, this means skip #4b, #4c but loop back as needed in #4d |
A |
Skip rendering this frame and all remaining frames. Acts as though the scene completed all frames normally. Note: See the chart, this means skip the rest of #4 and proceed at #5 |
On return from a Post_Frame_Command
:
If there is an action triggered...
Specified Action: | Results: |
S or A |
Skip all remaining frames. Acts as though the scene completed all frames normally. Note: See the chart, this means skip the rest of #4 and proceed at #5 |
On return from any Post_Scene_Command
:
If there is an action triggered and you have specified S
or A
then no special action occurs. This is the same as I
for this shell command.