Написание плагина последовательности

Относится к Blender v2.31

В этом разделе мы напишем базовый плагин последовательности, а затем попробуем его использовать. В основе плагина последовательности лежат несколько значений; 1-3 входных буфера изображения и другая информация, а  в выводе  результирующий буфер избражения.

Все файлы необходимые для разработки плагина, также как и несколько примеров могут быть найдены в каталоге blender/plugins. Вы можете также получить множество плагинов отсюда:  http://www.cs.umn.edu/~mein/blender/plugins

Спецификации:

Относится к Blender v2.31

ImBuf image structure

Структура ImBuf всегда содержит 32 битные ABGR данные.

Эта структура всегда соответствует размеру, указанному в значениях x и y.

Взаимодействие с пользователем

 Blender не может определить сколько ввходных значений плагин ожидает, поэтому для пользователя возможно прикреплять только одно значение для плагина, который ожидает два. По этой причине важно всегда проверять буферы, которые используются вашими плагинами, чтобы убедиться, что они допустимы. Плагин последовательности также должен включать текстовый ярлык, описывающий количество входных значений в кнопочном интерфейсе.

Базовый плагин последовательности:

#include "plugin.h"
char name[24]= "";

/* структура кнопок,
* butcode name default min max 0
*/

VarStruct varstr[]= {
{ LABEL, "In: X strips", 0.0, 0.0, 0.0, ""},
};


/* структура cast для ввода в главную функцию doit
Varstr и Cast должны иметь одинаковые соответственные переменные */

typedef struct Cast {
int dummy; /* потому что это кнопка типа 'label'*/
} Cast;

/* cfra: текущий кадр */

float cfra;

void plugin_seq_doit(Cast *, float, float, int, int,
ImBuf *, ImBuf *, ImBuf *, ImBuf *);

int plugin_seq_getversion(void) {
return B_PLUGIN_VERSION;
}

void plugin_but_changed(int but) {
}

void plugin_init() {
}

void plugin_getinfo(PluginInfo *info) {
info->name= name;
info->nvars= sizeof(varstr)/sizeof(VarStruct);
info->cfra= &cfra;

info->varstr= varstr;

info->init= plugin_init;
info->seq_doit= (SeqDoit) plugin_seq_doit;
info->callback= plugin_but_changed;
}

void plugin_seq_doit(Cast *cast, float facf0, float facf1, int xo, int yo,
ImBuf *ibuf1, ImBuf *ibuf2, ImBuf *outbuf, ImBuf *use) {
char *in1= (char *)ibuf1->rect;
char *out=(char *)outbuf->rect;

}

Наши модификации:

Первый шаг, который необходимо сделать. Это решить что плагин будет делать и как пользователи будут с ним взаимодействовать.  Для этого примера мы создадим простой фильтр, у которого будет иметь полосу прокрутки для интенсивности от 0 до 255. Если любое значение R,G, или B компоненты пиксела в исходном изображении меньше чем выбранная нами интенсивность. Будет возвращаться чёрный и альфа на полную. Сейчас мы скопируем наш базовый плагин в файл impfilt.c и дополним его.

Хорошая идея добавлять коментарии. Сперва сообщите пользователям что плагин делает, где они могут получить копию, с кем они должны связаться, чтобы сообщить об ошибке или пожеланиях, и лицензионные ограничениях. Используя коментарии, убедитесь в том, что вы используете коментарии  такого типа /* */. Плагины и некоторые компиляторы C  не допускают кометарии типа //.

/*
Описание: Этот плагин является примером плагина последовательности,
который фильтрует вывод, который ниже интенсивности пикселов.
Я использовал одно вводное значение.
Автор: Кент Мейн (mein@cs.umn.edu)
Сайт: http://www.cs.umn.edu/~mein/blender/plugins
Лицензия: Public Domain
Последнее обновление: Sun Sep 7 23:41:35 CDT 2003
*/

Далее нам нужно заполнить имя, необходимо сохранить то имя, которое имеет файл с исходным кодом на C, описанный ранее, менее 23 знаков, без пробелов и в нижнем регистре.

char 
name[24]= "simpfilt.c";

Cast и varstr должны соответсвовать друг другу. Нам нужет один слайдер, поэтому мы сделаем
следущее:

varStruct varstr[]= {
{ LABEL, "In: 1 strips", 0.0, 0.0, 0.0, ""},
{ NUM|INT, "Intensity", 10.0, 0.0, 255.0, "Значение порога"},
};

typedef struct Cast {
int dummy; /* т.к. это 'label' */
int intensity;
} Cast;

Сейчас нам нужно заполнить функцию plugin_seq_doit. Нам нужно всего лишь
пройти по пикселам и если значение RGB меньше интенсивности установить выходной пиксел
в : 0,0,0,255 иначе оставить входные значения без изменений.

int x,y;

for(y=0;y cast->intensity) &&
(in1[1] > cast->intensity) &&
(in1[2] > cast->intensity)) {
out[0] = out[1] = out[2] = 0;
out[3] = 255;
} else {
out[0] = in1[0];
out[1] = in1[1];
out[2] = in1[2];
out[3] = in1[3];
}
}
}

Вот мы и закончили simpfilt.c

Компиляция:

  Относится к Blender v2.31

Скрипт bmake  - это простая утилита, которая поможет в компиляции и разработке плагинов, её можно найти в подкаталоге plugins/ в корневом каталоге Blender'а. Она вызывается командой bmake (plugin_name.c) , после чего она попытаеся привязаться к нужным библиотекам и скомпилировать определённый файл на C соответственно вашей системе. Если вы пытаетесь разрабатывать плагины на Windows машине bmake не будет работать. Вы можете попытаться скомпилировать плагин используя указанное ниже (программу lcc), принимая на себя размещение плагина в каталоге c:\blender\plugins. Это пример того, как вы могли бы скомпилировать текстурный плагин sweep.c. Откройте командную строку DOS и сделайте следующее:

(Примечание: вы должны проверить, что каталог lcc\bin в ходит в переменную окружения PATH)

 

 cd c:\blender\plugins\sequence\sweep
lcc -Ic:\blender\plugins\include sweep.c
lcclnk -DLL sweep.obj c:\blender\plugins\include\seq.def
implib sweep.dll

Если ваша версия lcc не содержит файл implib, то комманда будет выглядеть так:

 cd c:\blender\plugins\sequence\sweep
lcc c:\blender\plugins\include sweep.c
lcclnk -dll -nounderscores sweep.obj c:\blender\plugins\include\seq.def