Adding a Floating Panel to a Window

本文介绍如何在Blender 2.37版本中通过编码方式添加自定义浮动面板,并实现快捷键调用的功能。文章详细展示了修改源代码的具体步骤,包括宏定义、消息处理、面板代码编写及快捷键设置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这是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;

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值