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

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

Первый шаг, который необходимо сделать. Это решить что плагин будет делать и как пользователи будут с ним взаимодействовать. Для этого примера мы создадим простую текстуру, которая задаёт простой кирпичный образец.

Сейчас мы скопируем наш основной текстурный плагин в файл cube.c и заполним пробелы.

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

/* 
Описание: Этот плагин является примером текстурного плагина,
который создаёт простой кирпичный образец.

Он требует два значения: размер кирпича и размер прослоек.
Размер кирпича - это рамер каждого кирпича.
Размер прослоек - это размер раствора между кирпичами.

Автор: Кент Майн(mein@cs.umn.edu)
Сайт: http://www.cs.umn.edu/~mein/blender/plugins
Лицензия: Public Domain
Последнее обновление: Tue Oct 21 05:57:13 CDT 2003
*/

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

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

Мы собираемся сохранить этот плагин простым, и у нас есть только единственный тип, который имеет дело с интенсивностью. Для этого нам нужно следующее:

#define NR_TYPES 1
char stnames[NR_TYPES][16]= {"Default"};

Для нашего пользовательского интерфейса нам нужно позволить людям изменять размер кирпича и размер прослойки раствора, также значение интенсивности возвращаются для кирпича и раствора. Для этого нам надо отредактировать varstr и Cast. Структура Cast должна иметь переменную для каждого элемента.

/* Структура для кнопок,
* butcode name default min max Tool tip
*/
VarStruct varstr[]= {
{NUM|FLO, "Brick", .8, 0.1, 1.0, "Size of Cell"},
{NUM|FLO, "Mortar", .1, 0.0, 0.4, "Size of boarder in cell"},
{NUM|FLO, "Brick Int", 1, 0.0, 1.0, "Color of Brick"},
{NUM|FLO, "Mortar Int", 0, 0.0, 1.0, "Color of Mortar"},
};

typedef struct Cast {
float brick,mortar, bricki, mortari;
} Cast;

Теперь нам нужно заполнить функцию plugin_tex_doit, нам всего лишь нужно отобразить на текстуру "сетку", которая будет состоять из кирпичиков и прослоек вдоль нижних граней кирпича. Затем определим внутри  кирпича мы находимся или нет. Следующий код должен это сделать:

int plugin_tex_doit(int stype, Cast *cast, 
float *texvec, float *dxt,
float *dyt) {
int c[3];
float pos[3], cube;

/* установка размера сетки */
cube = cast->brick + cast->mortar;

/* we need to do is determine where we are inside of the current brick. */
c[0] = (int)(texvec[0] / cube);
c[1] = (int)(texvec[1] / cube);
c[2] = (int)(texvec[2] / cube);

pos[0] = ABS(texvec[0] - (c[0] * cube));
pos[1] = ABS(texvec[1] - (c[1] * cube));
pos[2] = ABS(texvec[2] - (c[2] * cube));

/* Определение того, находимся мы в позиции прослойки внутри кирпича или нет. */
if ((pos[0] <= cast->mortar) || (pos[1] <= cast->mortar) ||
(pos[2] <= cast->mortar)) {
result[0] = cast->mortari;
} else {
result[0] = cast->bricki;
}
return 0;
}

Одна вещь на заметку, в заголовочных файлах в plugins/include определена функция ABS . Существуют и другие полезные функции.