Ну и задачки ты перед собой ставиш!!!
Это всереьез пахнет програмированием,
а я к сожалению в нем слаб
(так... бабушка в детстве сказки на бэйсике читала...)
Просто совет:
Не страдай "глобальной универсализацией".
Времени уходит много а результат сомнителен.
Я раньше тоже пытался городить "универсальные вэсчи",
а потом выяснялось, что "вэсчь универсальна" толко для
того случая, для которого она городилась.
То что ты хочеш сделать можно сделать
и вручную причем за 1 мин. 18 сек.
Камера не видет объект с 135 по 616 кадр
- так просто заанимируй visibility и в rib он не войдет.
Нужен rib архив - сгенери, обдери. Уйдет не более 18.45 сек.
Нужно передать параметры в архив - выреж из него ту часть
где параметры объявляются, вставь ее в RibBox и используй Tcl/Tk экспрэшн
для передачи параметров из майки, а в конце пропиши ReadArchive. Поидее
в ribе они встанут встык. Содержимое бокса может выглядеть примерно так:
AttributeBegin
Surface "FalseGrass" "Kd" \[[mattr "Control.Ambience" $f]\]
ReadArchive "MyGrass.rib"
А сам архив содержит в себе:
ShadingInterpolation "smooth"
NuPatch 4 4 [0 0 0 0 1 1 1 1] 0 1 4 4 [0 0 0 0 1 1 1 1] 0 1 "Pw" [-6 -3.67382e-016 6 1
-6 -1.22461e-016 2 1 -6 1.22461e-016 -2 1 -6 3.67382e-016 -6 1
-2 -3.67382e-016 6 1 -2 -1.22461e-016 2 1 -2 1.22461e-016 -2 1
-2 3.67382e-016 -6 1 2 -3.67382e-016 6 1 2 -1.22461e-016 2 1
2 1.22461e-016 -2 1 2 3.67382e-016 -6 1 6 -3.67382e-016 6 1
6 -1.22461e-016 2 1 6 1.22461e-016 -2 1 6 3.67382e-016 -6 1]
AttributeEnd
Хотя это только предположение, я не проверял, нужды пока небыло.
А вот чего сейчас действительно нехватает MTOR так это метаболов....
Хотя это можно было бы реализовать давольно таки просто:
Написать MetaMaker.mel который сканил бы сцену на предмет наличия NURBS сфер с
префиксом "meta_" в имени и генерил из них риб архив Blobby.rib
с RiBlobby примитивами, учитывая при этом радиусы сфер, цвет и "сосисочность"
основанную на скейле.
Далее сделать риббокс в котором прописать:
[clientcmd "source MetaMaker.mel"]
ReadArchive "Blobby.rib"
Но на все это моих знаний пока нехватает.
Может кто займется?
По поводу ShadeTree:
Вот те "грязный" рецепт перезаточки (ибо я слаб в програмировании и Perl
ассоциируется у меня впервую очередь с кашей)
У меня Shadetree & Renderman стоят на D:\
1. В d:\shadetree\bin\ сделай PRMan.cfg в котором пропиши:
unsetenv STREE_LIB
setenv STREE_LIB D:\SHADETREE\prman
2. Запусти Config.exe и выбери PRMan после чего сделай теплый рестарт.
3. Продупли содержимое d:\shadetree\bmrt в диру d:\shadetree\prman
4. Откомпили testcheckered.sl (d:\shadetree\prman\lib\src\) и
слей результат в d:\pixar\PhotoRealistic RenderMan\lib\shaders\
5. Далее лезь в D:\shadetree\prman\bin\ и внеси изменения
В os.pl замени slc на slo
В stree.pl замени slc на shader
и вот те полностью мой измененный rendrit :
#!/usr/sbin/perl
# renderit - render a test image
#
# $1 - the temporary shader's name
# $2 - render count
#
# Assumes main program left us two files:
#
# $STREE_WORKDIR/$1 - shader source
# $STREE_RENOPT - render options file containing env variables
#
# Take the source file the main program left for us in $1, push it into the
# tmp directory ($STREE_RENDERDIR) along with the other stuff we need,
# compile and render, then remove the tmp directory when done.
#
# VERS DATE AUTHOR COMMENTS
# ---- -------- ----------------- ----------------------------------
# 1.00 06/01/98 erco@cinegrfx.com perl(1) 4.0 implementation
#
$| = 1;
$G_{PROGNAME} = "renderit";
require "$ENV{STREE_LIB}/bin/stree.pl";
require "$ENV{STREE_LIB}/bin/makerib.pl";
# # # # # #
## ## # # # ## #
# # # # # # # # #
# # ##### # # ##
# # # # # # #
# MAIN
{
# INITIALIZE $STREE_{} VARIABLES
# Load in render options, etc.
#
&InitVars($ARGV[0], $ARGV[1]);
# HANDLE SPECIAL CASE: STREE_INTERLACE
local($interlacearg) =
( $STREE_{INTERLACE} eq "off" ) ? "" : "-d $STREE_{INTERLACE}";
print STDERR "*** INTERLACEARG=$interlacearg INTERLACE=$STREE_{INTERLACE}\n";
# HANDLE SIGNALS TO REMOVE TEST DIR WE CREATE
$SIG{'INT'} = 'CleanupTrap';
$SIG{'TERM'} = 'CleanupTrap';
$SIG{'BREAK'} = 'CleanupTrap'; # NT
# MAKE TEST DIRECTORY
# Move the shader in there, and enter the directory.
#
mkdir($STREE_{RENDERDIR}, 0777);
chdir($STREE_{RENDERDIR});
# RENAME SHADER -> SL FILE
{
local($from) = "../$STREE_{SHADER}";
local($to) = "./$STREE_{SHADERSRC}";
unless ( &Move($from, $to) )
{ &Fail("Move($from, $to): $!", 1); }
}
# IS THIS A CUSTOM RENDER?
if ( $STREE_{CUSTOMREN_FLAG} == 1 )
{
&CustomRender($STREE_{SHADER}, $STREE_{RENDER_COUNT});
&MyExit(0);
}
print <<"EOF";
RENDER ----------------------------------------------------------
RENDER Shader Filename: $STREE_{SHADERSRC}
RENDER Shading Rate: $STREE_{SHADERATE}
RENDER Resolution: $STREE_{RES}
RENDER Object Rot: $STREE_{OBJ_ROTX},$STREE_{OBJ_ROTY},$STREE_{OBJ_ROTZ}
RENDER Light Rot: $STREE_{LIGHT_ROTX},$STREE_{LIGHT_ROTY},$STREE_{LIGHT_ROTZ}
RENDER Samples: $STREE_{SAMPLES}
RENDER Zoom: $STREE_{ZOOM}
RENDER ----------------------------------------------------------
EOF
# COMPILE SHADER
# Current directory must be where shader lives
#
&Compile($STREE_{SHADER}, $STREE_{SHADERSRC}, $STREE_{SHADEROBJ});
# RENDER TEST FRAME
# If a range of frames is specified, do them all.
#
if ( $STREE_{SFRM} == $STREE_{EFRM} )
{
# MAKE A RIB FILE FOR FRAME #1
$STREE_{FRAME} = 1;
&MakeRib("./test.rib", $STREE_{OUTFILE});
# RENDER IMAGE
# Either to screen or file.
#
print STDERR "--- RENDER ---\n";
&Banner("test.rib");
&Copy("test.rib", "$STREE_{TMPDIR}");
if ( $G_os eq "irix" )
{
local ($cmd) = "/bin/nice -19 timex " .
"prman " .
"test.rib";
print STDERR "Executing: $cmd\n";
local ($err) = (system($cmd) >> 8);
}
else
{
local ($cmd) = "prman " .
"test.rib";
print STDERR "Executing: $cmd\n";
local ($err) = (system($cmd) >> 8);
}
# NOTE: Ignore EXIT 2 since killing the dspyserver
# will generate that errorcode (a common thing to do)
#
print STDERR "EXIT=$err\n";
&MyExit(0);
}
else
{
local ($pathname);
local ($ext);
if ( $STREE_{OUTFILE} eq "screen" )
{
local($msg) =
"UNSUPPORTED:\n".
"\tRender animated sequence to 'screen' currently unsupported.".
"\tPlease specify a filename in Render Options Editor ".
"-> Output Image Type\n";
&Fail($msg, 1);
}
# PARSE OUT FILENAME EXTENSION
if ( $STREE_{OUTFILE} =~ /^(.*)\.(\S+)$/ )
{ $pathname = $1; $ext = $2; }
else
{ $pathname = $1; $ext = ".sgi"; }
# FRAME LOOP
for ($STREE_{FRAME} = $STREE_{SFRM};
$STREE_{FRAME} <= $STREE_{EFRM};
$STREE_{FRAME}++ )
{
local($outfilename) =
sprintf("%s.%04d.%s", $pathname, $STREE_{FRAME}, $ext);
local($date) = &GetDate();
print <<"EOF";
------------------------------------------------------------------------------
Working on frame $STREE_{FRAME} of $STREE_{EFRM} - $date
Writing to $outfilename
EOF
&Banner(sprintf("%04d", $STREE_{FRAME}));
# MAKE CUSTOM RIB FILE
# Sticks in render options and test shader
#
&MakeRib("./test.rib", $outfilename);
# RENDER IMAGE
# Either to screen or file.
#
print STDERR "--- RENDER ---\n";
local ($cmd);
if ( $G_os eq "irix" )
{
$cmd = "/bin/nice -19 timex prman " .
"test.rib";
}
else
{
print STDERR "*** INTERLACEARG2=$interlacearg\n";
$cmd = "prman " .
"test.rib";
}
print STDERR "Executing: $cmd\n";
local ($err) = (system($cmd) >> 8);
# NOTE: Ignore EXIT 2 since killing the dspyserver
# will generate that errorcode (a common thing to do)
#
}
&Banner("done");
# GO 'DING' WHEN DONE RENDERING RANGE OF FRAMES
&Success();
}
#NOTREACHED#
&MyExit(0);
}
# CUSTOM RENDER SCRIPT
sub CustomRender
{
local($args) = join(" ", @_);
# PREFIX WITH STREE_LIB IF NO LEADING '/'
if ( $STREE_{CUSTOMREN} !~ m%^[/.]% )
{ $STREE_{CUSTOMREN} = "$STREE_{LIB}/$STREE_{CUSTOMREN}"; }
# INVOKE USER'S RENDER SCRIPT, AND EXIT
# Let the user do all the error handling/messages
#
print <<"EOF";
-------------- C U S T O M R E N D E R --------------
Executing: $STREE_{CUSTOMREN} $args
cwd: $STREE_{RENDERDIR}
---------------------------------------------------------
EOF
&Run("$STREE_{CUSTOMREN} $args", "Custom Render Failed.", 1);
}
# CLEANUP TMP FILES
sub MyExit
{
local($exit) = @_;
# CHDIR SOMEWHERE SAFE, THEN BLOW THE TMP FILES
chdir("$STREE_{WORKDIR}/..");
&RemoveDir($STREE_{RENDERDIR});
print STDERR
"\nrenderit: " . (($exit==0)?"DONE":"FAIL") . " - [EXIT $exit]\n";
exit($exit);
}
# INTERRUPT HANDLER: CLEANUP JUNK
# $1 is signal name
#
sub CleanupTrap
{
local($sig) = @_;
print STDERR "\nrenderit: caught signal $sig. Cleaning up.\n";
&MyExit(1);
}
----------------------------------------------------------
6. В stree.def найди строку ext.compiledshader .slc и замени на .slo
Обычно я просто делаю File-Export-Compiled Shader туда куда мне надо.
Те Surface экзамплы которые используют прикомпеленный дисплэйс
рендерятся без дисплэйса пока ты не перекомпилиш их и не продублиш
результат в стандартных шейдэрах кажется. Я точно непомню давно это
было но я как то заставил их работать вместе c PRMan.
И вообще если поковырять его основательно (особенно stree.def и makerib.pl)
то можно заточить его как угодно и под что угодно.
Например добавить кучу своих объектов для рендера.
Будут проблемы свисти но у меня все работает как часы.
(навсякий случай все скрипты кинул)