BlenderDev/Adding a Floating Panel to a Window

Wikipedia,自由的百科全书

这是Johnny Matthews写的一篇教程,接在我的上一篇文章之后,也是介绍如何在Blender中编码。不知道教程中用的什么版本的Blender,和我的实际操作有一点出入,我下面的是在2.37中试验的结果,效果图见最后。


这篇文章主要讲如何在UI/Image Editor下加一个浮动面板,你如果将窗口切到UI/Image Editor下,按一下N键,会出现一个标题为Properity的面板,按J键则不会有反应,我们实现以下功能,按了J键以后,让Blender显示一个调色板的浮动面板。步骤如下:


1. 为我们的事件添加一个宏定义

在 include/BIF_space.h中,我们定义以下的宏

  1. 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;



然后编译,链接,大功告成。嘿嘿

Image:add_panel.jpg

Personal tools