BlenderDev/Adding a New Space Window

Wikipedia,自由的百科全书

这是Ton Roosendaal写的一篇教程,比较初级。不过我也比较初级,今天刚刚实现了这个程序,想和大家分享一下!

先把效果图贴一下:


Image:AddingANewSpaceWindow.jpg


要成功的加入这个东西,需要以下几步:


makesdna/DNA_space_types.h

在这个文件中,我们定义新的space window的数据结构

代码:


typedef struct SpaceNew {

  SpaceLink *next, *prev;
  int spacetype;
  float blockscale;
  struct ScrArea * area;

} SpaceNew;



这是一个最简单的结构,如果你要加什么东西,自己再加


makesdna/DNA_screen_types.h

加入SPACE_NEW 的枚举,我把它加在SPACE_TIME后面:

代码:


enum {

  SPACE_EMPTY,
  SPACE_VIEW3D,
  SPACE_IPO,
  SPACE_OOPS,
  SPACE_BUTS,
  SPACE_FILE,
  SPACE_IMAGE,      
  SPACE_INFO,
  SPACE_SEQ,
  SPACE_TEXT,
  SPACE_IMASEL,
  SPACE_SOUND,
  SPACE_ACTION,
  SPACE_NLA,
  SPACE_SCRIPT,
  SPACE_TIME,
  SPACE_NEW            //SPACE_NEW

/* SPACE_LOGIC */

};



blenloader/intern/writefile.c

这个文件下有一个write_screens()函数,在这个函数中加入对SPACE_NEW的处理代码,我把它加在对SPACE_TIME的处理之后,基本照抄对SPACE_TIME的处理:


代码:


else if(sl->spacetype==SPACE_TIME){

   writestruct(wd, DATA, "SpaceTime", 1, sl);

}

else if(sl->spacetype==SPACE_NEW){ //对SPACE_TIME的处理,

   writestruct(wd, DATA, "SpaceNew", 1, sl);

}



src/spacetypes.c

在这个文件的spacetype_from_area()的函数中加入对“new space”的处理,也基本照抄对其他space的处理方法:

代码:


case SPACE_TIME: return spacetime_get_type();

case SPACE_NEW: return spacenew_get_type();//加在这里


原文写的是spacetype_from_type(),没有这个函数,应该是写错了


src/space.c

前面我们在spacetypes.c中添加了一个函数 : spacenew_get_type()

在这个文件中,我们要实现这个函数:

代码:


SpaceType *spacenew_get_type(void)

{

   static SpaceType *st= NULL;
   if(!st) {
  st= spacetype_new("New");
  spacetype_set_winfuncs(st, drawtimespace, NULL,
                        winqreadnewspace);
   }
   return st;

}


我把它加在spacetime_get_type()函数之后。

下面,我们应该在*.h文件中加入对这个函数的声明,加在 include/BIF_spacetypes.h 文件中。

代码:


SpaceType *spacenew_get_type(void);


也加载spacetime_get_type的声明之后。

然后我们在space.c文件中的函数:

void newspace(ScrArea *sa, int type)

中加入对"new space"的处理如下:

代码:


else if(type==SPACE_TIME)

  init_timespace(sa);

else if(type==SPACE_NEW) //添加以下两行

  init_newspace(sa);


然后搜索文档,找到 *** SPACE: GENERAL ***

在这一行之上加入对init_newspace的定义,如下

代码:


/* ******** SPACE: NEW ************** */

extern void winqreadnewspace(ScrArea *sa, void *spacedata, BWinEvent *evt);

extern void drawnewspace(ScrArea *sa, void *spacedata);

static void init_newspace(ScrArea *sa)

{

   SpaceNew *snew;


   snew= MEM_callocN(sizeof(SpaceNew), "init newspace");
   BLI_addhead(&sa->spacedata, snew);


   snew->spacetype= SPACE_TIME;
   snew->blockscale= 0.7;

}


这段代码初始化了SpaceNew的结构


include/mydevice.h

在这个文件最后加一个宏定义 #define REDRAWNEW

具体值反正是上面一个值+1

然后再space.c中的allqueue()函数中加入对REDRAWNEW的处理如下:

代码:


case REDRAWNEW:

   if(sa->spacetype==SPACE_NEW) {
  scrarea_queue_headredraw(sa);
  scrarea_queue_winredraw(sa);
   }
   break;



下面的任务是在BL_src工程中加入两个文件drawnew.c和editnew.c,

这两个文件处理NewSpace中的键盘,鼠标等消息,我这里直接把我的这两个文件的代码完全贴出来:

代码:


//drawnew.c

  1. include <math.h>
  1. include <stdio.h>


  1. ifdef HAVE_CONFIG_H
  1. include <config.h>
  1. endif


  1. include "BLI_blenlib.h"
  1. include "BLI_arithb.h"


  1. include "DNA_action_types.h"
  1. include "DNA_ipo_types.h"
  1. include "DNA_object_types.h"
  1. include "DNA_material_types.h"
  1. include "DNA_scene_types.h"
  1. include "DNA_space_types.h"
  1. include "DNA_screen_types.h"


  1. include "BKE_ipo.h"
  1. include "BKE_object.h"
  1. include "BKE_material.h"
  1. include "BKE_utildefines.h"
  1. include "BKE_global.h"


  1. include "BIF_gl.h"
  1. include "BIF_mywindow.h"
  1. include "BIF_screen.h"
  1. include "BIF_resources.h"


  1. include "BSE_drawipo.h"
  1. include "BSE_view.h"
  1. include "BMF_Api.h"


  1. include "blendef.h"



void drawnewspace(ScrArea *sa, void *spacedata)

{

   SpaceTime *snew= sa->spacedata.first;
   float col[3];


   BIF_GetThemeColor3fv(TH_BACK,col);
   glClearColor(col[0],col[1],col[2],0.0);
   glClear(GL_COLOR_BUFFER_BIT);


   myortho2(-0.375,curarea->winx-0.375,-0.375,
           curarea->winy-0.375);


   draw_area_emboss(sa);
   curarea->win_swap = WIN_BACK_OK;

}



代码:


//editnew.c

  1. include <stdlib.h>
  1. include <string.h>
  1. include <math.h>


  1. ifdef HAVE_CONFIG_H
  1. include <config.h>
  1. endif


  1. ifndef WIN32
  1. include <unistd.h>
  1. else
  1. include <io.h>
  1. endif
  1. include "MEM_guardedalloc.h"


  1. include "BLI_blenlib.h"
  1. include "BLI_arithb.h"


  1. include "IMB_imbuf_types.h"


  1. include "DNA_mesh_types.h"
  1. include "DNA_meshdata_types.h"
  1. include "DNA_scene_types.h"
  1. include "DNA_screen_types.h"
  1. include "DNA_userdef_types.h"
  1. include "DNA_space_types.h"
  1. include "DNA_image_types.h"
  1. include "DNA_object_types.h" // only for uvedit_selectionCB() (struct Object)


  1. include "BKE_global.h"
  1. include "BKE_mesh.h"
  1. include "BKE_displist.h"
  1. include "BKE_utildefines.h"


  1. include "BIF_gl.h"
  1. include "BIF_interface.h"
  1. include "BIF_screen.h"
  1. include "BIF_drawimage.h"
  1. include "BIF_editview.h"
  1. include "BIF_space.h"
  1. include "BIF_editsima.h"
  1. include "BIF_toolbox.h"
  1. include "BIF_mywindow.h"
  1. include "BIF_interface.h"


  1. include "BSE_drawipo.h"
  1. include "BSE_edit.h"
  1. include "BSE_trans_types.h"


  1. include "BDR_editobject.h"
  1. include "BDR_unwrapper.h"


  1. include "blendef.h"
  1. include "mydevice.h"


void winqreadnewspace(ScrArea *sa, void *spacedata,

   BWinEvent *evt)

{

   unsigned short event = evt->event;
   if(evt->val){
        if(uiDoBlocks(&sa->uiblocks,event)!=UI_NOTHING)
                 evt->event = 0;
   }
   scrarea_queue_winredraw(sa);

}



src/editscreen.c

在函数 int areawinset(short win) 中记入相应的处理,不过我没有加,因为它需要你的SpaceNew结构中增加对View2D的支持,这个准备今天研究一下.


在 void scrarea_do_headdraw(ScrArea *area) 函数中加入new space 的button处理消息:

代码:

case SPACE_NEW: new_buttons(area); break;



在BLO_src中加入header_new.c文件,并在文件中加入对new_button函数的定义,下面贴出我整个文件的代码:

代码:


  1. include <stdlib.h>
  1. include <string.h>
  1. include <stdio.h>


  1. ifdef HAVE_CONFIG_H
  1. include <config.h>
  1. endif


  1. include "DNA_ID.h"
  1. include "DNA_screen_types.h"
  1. include "DNA_scene_types.h"
  1. include "DNA_space_types.h"
  1. include "DNA_view2d_types.h"
  1. include "DNA_userdef_types.h"


  1. include "BIF_gl.h"
  1. include "BIF_interface.h"
  1. include "BIF_resources.h"
  1. include "BIF_screen.h"
  1. include "BIF_space.h"
  1. include "BIF_toolbox.h"
  1. include "BIF_butspace.h"


  1. include "BKE_global.h"
  1. include "BKE_main.h"


  1. include "BSE_drawipo.h"
  1. include "BSE_drawview.h"
  1. include "BSE_editipo.h"
  1. include "BSE_filesel.h"
  1. include "BSE_headerbuttons.h"
  1. include "BSE_seqaudio.h"
  1. include "BSE_time.h"


  1. include "blendef.h"
  1. include "butspace.h"
  1. include "mydevice.h"


void do_new_buttons(ScrArea *sa, unsigned short event)

{

}


void new_buttons(ScrArea *sa)

{

}


在这个文件中我没有增加任何处理代码,以后再研究一下。


同时我们需要把do_new_button()和new_buttons()两个函数在include/BSE_hreaderbuttons.h文件中声明一下。


然后再src/headerbutton.c 的windowtype_pup()函数中加入:、

strcat(string, "|New Window %x9");


下面你要做的就是编译了,没问题的话应该就能出现开头的那幅图。

这个教程我只是照做了一下,有一些了解了。不过对于space window的进一步了解还需要再研究一下。

Personal tools