这是Johnny Matthews写的一篇教程,接在我的上一篇文章之后,也是介绍如何在Blender中编码。不知道教程中用的什么版本的Blender,和我的实际操作有一点出入,我下面的是在2.37中试验的结果,效果图见最后。
这篇文章主要讲如何在UI/Image Editor下加一个浮动面板,你如果将窗口切到UI/Image Editor下,按一下N键,会出现一个标题为Properity的面板,按J键则不会有反应,我们实现以下功能,按了J键以后,让Blender显示一个调色板的浮动面板。步骤如下:
1. 为我们的事件添加一个宏定义
在 include/BIF_space.h中,我们定义以下的宏
#define IMAGE_HANDLE_PAINT 31
在2.37版本中,这个宏已经被定义,所以就不要定义了
2. 增加一个对消息的处理
在drawimage.c文件中找到image_blockhandlers函数,在原来的英文教程中,说这个函数中有这样一段代码:
for(a=0; a<SPACE_MAXHANDLER; a+=2) {
switch(sima->blockhandler[a]) {
case IMAGE_HANDLER_PROPERTIES:
image_panel_properties(sima->blockhandler[a+1]);
break;
}
/* clear action value for event */
sima->blockhandler[a+1]= 0;
}
要把它加一段对IMAGE_HANDLER_PAINT的处理,如下:
for(a=0; a<SPACE_MAXHANDLER; a+=2) {
switch(sima->blockhandler[a]) {
case IMAGE_HANDLER_PROPERTIES:
image_panel_properties(sima->blockhandler[a+1]);
break;
case IMAGE_HANDLER_PAINT:
image_panel_paint(sima->blockhandler[a+1]);
break;
}
/* clear action value for event */
sima->blockhandler[a+1]= 0;
}
但是在我的代码中已经是加了以后的结果了,所以就不要动了。
3. 为面板添加代码
下面我们添加显示这个面板的代码,为此我们在drawimage.c中找到
image_panel_paint函数,这个函数现在只是为了显示按了N键以后的面板,我们加一段,我把添加好以后的整个函数贴出来,如下:
static void image_panel_paint(short cntrl) // IMAGE_HANDLER_PROPERTIES
{
extern VPaint Gvp;
/* from vpaint - this was copied from the paint panel*/
static float hsv[3], old[3]; // used as temp mem for picker
uiBlock *block;
block= uiNewBlock(&curarea->uiblocks, "image_panel_paint",
UI_EMBOSS, UI_HELV, curarea->win);
uiPanelControl(UI_PNL_SOLID | UI_PNL_CLOSE | cntrl);
uiSetPanelHandler(IMAGE_HANDLER_PAINT);
// for close and esc
if(uiNewPanel(curarea, block, "Paint", "Image",
10, 230, 318, 204)==0)
return;
//xlvector add
uiBlockBeginAlign(block);
uiDefButF(block,NUMSLI,0,"R ",979,160,194,19,&Gvp.r,
0.0,1.0,B_VPCOLSLI,0,
"Yhe amount of red used for painting");
uiDefButF(block,NUMSLI,0,"G ",979,140,194,19,&Gvp.g,
0.0,1.0,B_VPCOLSLI,0,
"Yhe amount of green used for painting");
uiDefButF(block,NUMSLI,0,"B ",979,120,194,19,&Gvp.b,
0.0,1.0,B_VPCOLSLI,0,
"Yhe amount of yellow used for painting");
uiBlockEndAlign(block);
uiDefButF(block,NUMSLI,0,"Opacity ",979,100,194,19,&Gvp.a,
0.0,1.0,B_VPCOLSLI,0,
"Yhe amount of pressure used for painting");
uiDefButF(block,NUMSLI,0,"Size ",979,80,194,19,&Gvp.a,
0.0,1.0,B_VPCOLSLI,0,
"Yhe amount of size used for painting");
uiDefButF(block,COL,B_VPCOLSLI,"",1176,100,28,80,&(Gvp.r),
0,0,0,0,"");
uiBlockPickerButtons(block, &Gvp.r, hsv, old, 'f', B_NOP);
/* 'f' is for floating panel */
uiBlockBeginAlign(block);
uiDefButF(block, NUM, B_NOP, "A: ", 180+12+24,160,80,20, &Gvp.a, 0.0, 1.0, 0, 0,
"The amount of pressure on the brush");
uiDefButF(block, NUM, B_NOP, "Size ", 180+12+24,140,80,20, &Gvp.size, 2.0, 64.0, 0, 0,
"The size of the brush");
}
4. 加一个快捷键
最后我们只要加一个快捷键,让面板显示出来
在space.c文件中找到 winqreadimagespace函数,在switch语句中加入:
case JKEY:
if(G.qual==0){
add_blockhandler(curarea,IMAGE_HANDLER_PAINT,0);
scrarea_queue_winredraw(curarea);
}
break;