Adding new Space Window

这是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 为主题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值