这是Ton Roosendaal写的一篇教程,比较初级。不过我也比较初级,今天刚刚实现了这个程序,想和大家分享一下!
先把效果图贴一下:
要成功的加入这个东西,需要以下几步:
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 #include <math.h> #include <stdio.h> #ifdef HAVE_CONFIG_H #include <config.h> #endif #include "BLI_blenlib.h" #include "BLI_arithb.h" #include "DNA_action_types.h" #include "DNA_ipo_types.h" #include "DNA_object_types.h" #include "DNA_material_types.h" #include "DNA_scene_types.h" #include "DNA_space_types.h" #include "DNA_screen_types.h" #include "BKE_ipo.h" #include "BKE_object.h" #include "BKE_material.h" #include "BKE_utildefines.h" #include "BKE_global.h" #include "BIF_gl.h" #include "BIF_mywindow.h" #include "BIF_screen.h" #include "BIF_resources.h" #include "BSE_drawipo.h" #include "BSE_view.h" #include "BMF_Api.h" #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 #include <stdlib.h> #include <string.h> #include <math.h> #ifdef HAVE_CONFIG_H #include <config.h> #endif #ifndef WIN32 #include <unistd.h> #else #include <io.h> #endif #include "MEM_guardedalloc.h" #include "BLI_blenlib.h" #include "BLI_arithb.h" #include "IMB_imbuf_types.h" #include "DNA_mesh_types.h" #include "DNA_meshdata_types.h" #include "DNA_scene_types.h" #include "DNA_screen_types.h" #include "DNA_userdef_types.h" #include "DNA_space_types.h" #include "DNA_image_types.h" #include "DNA_object_types.h" // only for uvedit_selectionCB() (struct Object) #include "BKE_global.h" #include "BKE_mesh.h" #include "BKE_displist.h" #include "BKE_utildefines.h" #include "BIF_gl.h" #include "BIF_interface.h" #include "BIF_screen.h" #include "BIF_drawimage.h" #include "BIF_editview.h" #include "BIF_space.h" #include "BIF_editsima.h" #include "BIF_toolbox.h" #include "BIF_mywindow.h" #include "BIF_interface.h" #include "BSE_drawipo.h" #include "BSE_edit.h" #include "BSE_trans_types.h" #include "BDR_editobject.h" #include "BDR_unwrapper.h" #include "blendef.h" #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函数的定义,下面贴出我整个文件的代码:
代码: |
#include <stdlib.h> #include <string.h> #include <stdio.h> #ifdef HAVE_CONFIG_H #include <config.h> #endif #include "DNA_ID.h" #include "DNA_screen_types.h" #include "DNA_scene_types.h" #include "DNA_space_types.h" #include "DNA_view2d_types.h" #include "DNA_userdef_types.h" #include "BIF_gl.h" #include "BIF_interface.h" #include "BIF_resources.h" #include "BIF_screen.h" #include "BIF_space.h" #include "BIF_toolbox.h" #include "BIF_butspace.h" #include "BKE_global.h" #include "BKE_main.h" #include "BSE_drawipo.h" #include "BSE_drawview.h" #include "BSE_editipo.h" #include "BSE_filesel.h" #include "BSE_headerbuttons.h" #include "BSE_seqaudio.h" #include "BSE_time.h" #include "blendef.h" #include "butspace.h" #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的进一步了解还需要再研究一下。
如果有什么问题,可以回贴指出
我的邮箱: xlvector@gmail.com,发信请以 BlenderCN 为主题。