1. Пользоваться форумом на планшетах и телефонах стало удобнее благодаря Tapatalk

Slim templates: displacement

Тема в разделе "RenderMan", создана пользователем -, 2 сен 2002.

Модераторы: Moderator.
  1. Guest

    Проблема....кто-нть может подсказать, почему после вставки вот этого вот темплейта в .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 -------------
     
  2. Guest

    Дык функция войдовая а output параметра нема.
     
  3. Guest

    Ну, а в чём неправильность-то? По аналогии с C, если функция - void, то это значит, что возвращаемых параметров вообще нету ведь....? Или тут эти аналогии не канают? ;)

    Просто я пытался раскопать правила написания всех этих темплейтов, но дока "рваная" какая-то - об одном написано, о другом - нет.
     
  4. Guest

    то что функция меняет своей войдовостью таки должно присутствовать в
    качестве параметра но скрыто от глаз юзверя...ну типа
    parameter float result {
    access output
    display hidden
    }
    и заголовок функции соответственно содержать что то типа
    void pxslMyFunk (
    float blabla;
    float blablabla;
    output float result;
    )
     
  5. Guest

    Ха...а нету кажеться в слиме механизмов чтобы функция могла менять
    глобальные переменные напрямую
    (за исключением пожалуй сурфов...там похоже CI OI автоматом
    воспринимаются как Ci Oi)...наверное поэтому лайт и дисп тэмплы
    написаны в виде динамического RSL
    Посмотри на displacement.slim
     
  6. Guest

    Так ты делаешь RSLFunction, то твой код должен быть аргументом команды output.
     
  7. Guest

    Проверь, это работает:


    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. Guest

    Нет, нет, нет, секундочку.....RSLFunction - это обычный plain text.
    RSLMain - это "output". посмотри на displacements.slim - я сдирал с них _в ноль_ - и всё равно давало ошибку.
     
  9. Guest

    Короче всё понятно.
    Надо всего лишь убить двоих людей - того, что придумал ставить открывающую скобку на той же строке, что и обьявление функции и того, кто написал такой кривой парсер для тэмплейтов. :(

    Всё дело было в скобках. :(
     
Модераторы: Moderator.

Поделиться этой страницей