Render.ru

Slim templates: displacement

#1
Проблема....кто-нть может подсказать, почему после вставки вот этого вот темплейта в .slim файл(в rat/lib/slim/*.slim), Slim перестаёт генерить код. Ну то есть не совсем перестаёт, а просто не пишет код именно для этого темплейта - я даже посмотреть не могу, где ашипка... :(
Это обычный IDgloop, просто переделанный под slim.

// --------- j_displ start ------------
slim 1 extensions pixardb {
extensions joss pxsl {
template displacement IDgloop_J {
description "IDgloop displacement shader demostrating non-linear displacement in PRMan"

parameter float mag {
description "A multiplier for the displacement"
subtype slider
range {0 2 .001}
detail varying
default 0.1
}

parameter float freq {
description "Frequency of displacement"
subtype slider
range {0 100 .001}
detail varying
default 5
}

RSLFunction {
void pxslIDgloop_J (float mag; float freq) {
vector overdist = 0.1;
vector stepsize = mag/freq;
float numsteps = 20;
point Psh = transform ( "object", P ) * freq;

vector dPduN = normalize ( vtransform ( "object", dPdu ) );
vector dPdvN = normalize ( vtransform ( "object", dPdv ) );

point Pou = Psh + ( dPduN * overdist );
point Pov = Psh + ( dPdvN * overdist );

float nz = noise(Psh) - 0.5;
float nzou = noise(Pou) - 0.5;
float nzov = noise(Pov) - 0.5;

float chu = (nz - nzou);
float chv = (nz - nzov);

vector DdPdu = dPduN;
vector DdPdv = dPdvN;

vector step = DdPdu^DdPdv;

float i;
for( i=1; i<numsteps; i+=1 ) {
P -= vtransform("object", "current", step) * nz * stepsize;
DdPdu = normalize (DdPdu+ (step * chu));
DdPdv = normalize (DdPdv+ (step * chv));
step = DdPdu ^ DdPdv;
}
N = normalize ( calculatenormal( P ) );
}
}
}
}
}
// ---------- j_displ end -------------
 
#3
Ну, а в чём неправильность-то? По аналогии с C, если функция - void, то это значит, что возвращаемых параметров вообще нету ведь....? Или тут эти аналогии не канают? ;)

Просто я пытался раскопать правила написания всех этих темплейтов, но дока "рваная" какая-то - об одном написано, о другом - нет.
 
#4
то что функция меняет своей войдовостью таки должно присутствовать в
качестве параметра но скрыто от глаз юзверя...ну типа
parameter float result {
access output
display hidden
}
и заголовок функции соответственно содержать что то типа
void pxslMyFunk (
float blabla;
float blablabla;
output float result;
)
 
#5
Ха...а нету кажеться в слиме механизмов чтобы функция могла менять
глобальные переменные напрямую
(за исключением пожалуй сурфов...там похоже CI OI автоматом
воспринимаются как Ci Oi)...наверное поэтому лайт и дисп тэмплы
написаны в виде динамического RSL
Посмотри на displacement.slim
 
#6
Так ты делаешь RSLFunction, то твой код должен быть аргументом команды output.
 
#7
Проверь, это работает:


slim 1 extensions pixardb {
extensions joss pxsl {
template displacement IDgloop_J {
description "IDgloop displacement shader demostrating non-linear
displacement in PRMan"
parameter float mag {
description "A multiplier for the displacement"
subtype slider
range {0 2 .001}
detail varying
default 0.1
}
parameter float freq {
description "Frequency of displacement"
subtype slider
range {0 100 .001}
detail varying
default 5
}
RSLMain {
output "vector overdist = 0.1;"
output "vector stepsize = [getvar mag]/[getvar freq];"
output "float numsteps = 20;"
output "point Psh = transform ( \"object\", P ) * [getvar freq];"
output "vector dPduN = normalize ( vtransform ( \"object\", dPdu ) );"
output "vector dPdvN = normalize ( vtransform ( \"object\", dPdv ) );"
output "point Pou = Psh + ( dPduN * overdist );"
output "point Pov = Psh + ( dPdvN * overdist );"
output "float nz = noise(Psh) - 0.5;"
output "float nzou = noise(Pou) - 0.5;"
output "float nzov = noise(Pov) - 0.5;"
output "float chu = (nz - nzou);"
output "float chv = (nz - nzov);"
output "vector DdPdu = dPduN;"
output "vector DdPdv = dPdvN;"
output "vector step = DdPdu^DdPdv;"
output "float i;"
output "for( i=1; i<numsteps; i+=1 ) {"
indent
output "P -= vtransform(\"object\", \"current\", step) * nz * stepsize;"
output "DdPdu = normalize (DdPdu+ (step * chu));"
output "DdPdv = normalize (DdPdv+ (step * chv));"
output "step = DdPdu ^ DdPdv;"
exdent
output "}"
output "N = normalize(calculatenormal(P));"
}
}
}
}
 
#8
Нет, нет, нет, секундочку.....RSLFunction - это обычный plain text.
RSLMain - это "output". посмотри на displacements.slim - я сдирал с них _в ноль_ - и всё равно давало ошибку.
 
#9
Короче всё понятно.
Надо всего лишь убить двоих людей - того, что придумал ставить открывающую скобку на той же строке, что и обьявление функции и того, кто написал такой кривой парсер для тэмплейтов. :(

Всё дело было в скобках. :(
 
Сверху