Render.ru

Как вытащить инфу о Альфе (из скрипта)

#1
Помогите написать скрипт. Если конечно Shake такое умеет.
1. Пробежать по поддиректориям данной директории.
2. Найти все файлы .tga
3. Если в .tga нет альфы , или она белая -> сконвертить в .jpg

Вот вопрос:
!
1.Как узнать есть ли в "fileIn" alpha. И (если она и есть) как узнать если она вся белая(черная)?
!

2. Можно ли через скрипт щейковский лазить по файловой системе, и копировать\удалять файлы (я думаю это через perl делать.)
3. Как вернуть perl`овому скрипту результат выполнения щейкового скрипта.
 
#2
>1.Как узнать есть ли в "fileIn" alpha. И (если она и есть) как узнать если она вся белая(черная)?

Через ColorX перебором, но думается, что это будет медленно.

>2. Можно ли через скрипт щейковский лазить по файловой системе, и копировать\удалять файлы (я думаю это через perl делать.)

Нет, возможно где-то внутри Шейка и есть операторы для работы с файловой системой, но они не документированы. Вот если бы изнутри можно было бы вызвать консоль с перлом, но я не знаю, возможно это или нет.

>3. Как вернуть perl`овому скрипту результат выполнения щейкового скрипта.

Что понимается под результатом? Shake возвращает в консоль либо сообщение об ошибке, либо время рендеринга и номер кадра (если указан параметр -vv)
 
#3
Пробежать, я пробежал, но как сохранить результат не понял.
Ламерский вопрос, но с глобальными переменными я так и не разобрался.
Если не сложно, в кратце раскажи как через colorX правильно не пикселям бегать.
Или напиши где про это что-то написано (а то я от доки пока не в восторге).
 
#4
как через colorX правильно по пикселям бегать?
Извиняюсь за опечатку. Час ночи был..
 
#5
Ну вот мазохистский скрипт :))

Это h-файл

image cycle(
image In=0,
int pwidth=720,
int pheight=576,
)
{
OUT=In;
for (int v=1; v<pheight+1; v++)
{
for (int h=1; h<pwidth+1; h++)
{
OUT=ColorX(OUT, r, g, b, a, h, v)
}
}
return OUT;
}

А вот это примерный UI

nuiPushMenu("Tools");
nuiPushToolBox("SFX");
nuiToolBoxItem("@cycle",cycle());
nuiPopToolBox();
nuiPopMenu();

Но это сущий кошмар!
В данном случае размер кадра 720х576, при запуске этой ноды на моем Dual P4Xeon 2GHz Шейк просто "встал колом" :))

В принципе ColorX работает на попиксельном уровне сам, поэтому тебе нужно просто написать экспрешшен с неким условием для каждого из каналов.

Вот пример ColorX с использованием информации о положении пикселя

ColorX1 = ColorX(0, y<height/3?x/width:(y>(height/3)*2?(abs(x-width))/width:0),
g, b, a, z);
 
#6
image = ColorX( image, rExpr, gExpr, bExpr, aExpr, zExpr);
так у меня в доке написано.
Тогда что это значит...
OUT=ColorX(OUT, r, g, b, a, h, v)
...
Короче вопросов море, а свободное время ожидается только ночью в понедельник.
Спасибо, ситуация проясняется. Буду разбиратся дальше.
 
#7
OUT=ColorX(OUT(имя ноды на входе), r, g, b, a, z (это и так ясно), h, v (это координаты пикселя по горизонтали и вертикали, то есть x и y, так как у меня сделаны два вложенных цикла (надеюсь ты это понял :)), то это имена переменных, которые являются счетчиками циклов).
Вот так, все, в принципе, просто :))
 
#8
Продолжая извращения на тему пикселя-марафона, я доигрался (ну потому что к работе это уже ну никак не относится) до следующего интересного (как мне показалось) результата:

(текст скрипта)

Input = FileIn("//Vovka/D/!projects/shake/new.tga", "Auto", 0,
0);
printf("FileIn : Input\n");

ColorX1 = ColorX(Input, r, g ,b, printf("Alpha is : %f\n",a) , z ); // - тут весь прикол

printf("ColorX : ColorX1\n");

output = FileOut(ColorX1, "//Vovka/D/!projects/shake/test.tga",
"Auto", "as-is");

printf("FileOut : output\n");

На что шейк выдал результат:

FileIn : Input
ColorX : ColorX1
FileOut : output
Alpha is : 0.000000
Alpha is : 0.000000
Alpha is : 0.000000
Alpha is : 0.000000
Alpha is : 0.003922
Alpha is : 0.007843
Alpha is : 0.011765
Alpha is : 0.015686
Alpha is : 0.019608
Alpha is : 0.023529
Alpha is : 0.027451
Alpha is : 0.031373
Alpha is : 0.035294
Alpha is : 0.039216
...
То есть он выполнил создание нодов, а потом запустил експрешин для ColorX...?
Я начинаю понимать что работает он совсем не так, как я себе представлял...

Ваши комментарии? Как это обяснить ?
 
#9
Я уже неделю трахаюсь, ... и нифига.
Проблема: (чисто ради интереса, но всё же.. я спать спокойно не могу :)
1. Есть файл test.tga
2. Если в этом файле есть хоть одна точка в которой alpha > 0.5 то
printf("TRA-TA-TA . It`s not THAT transparent. Bla-blah \n");
Надпись одна, в конце выполнения.

Всем зарание спасибо.
 
#10
Да вы маньяк, батенька, побольше бы таких перцев и недокументированных функций в Shake бы уже не осталось :))
Завтра, будет время (а оно, возможно, будет, так как у меня сейчас сплошной рендеринг :))), попробую накрапать скрипт, заодно попробую накрапать скрипт по поводу твоего вопроса о разделении потоков FileOut по некоему условию (есть на этот счет ряд идей).

Happy hackin' :)))
 
#11
а нафиг делать это скриптами??? проще взять и с нуля написать програмульку, которая тебе всю скевенцию без альфы переведет в джипеги.
 
Сверху