forked from bartvdbraak/blender
2.5
New: Custom region draw callbacks. For Martin: an example is now in space_view3d/view3d_edit.c On middlemouse rotate view, it draws a small square in center. It works likes this: #include "ED_space_api.h" handle= ED_region_draw_cb_activate(region->type, drawfunc, type) and to stop it: ED_region_draw_cb_exit(region->type, handle) drawfunc is of type (const bContext *C, ARegion *ar) currently it gets called only as type REGION_DRAW_POST, later we can add more (PRE, POST_XRAY, POST_2D, etc). For correct usage, these calls should return leaving view transform unaltered.
This commit is contained in:
parent
c7fa55eebd
commit
2fe5005bbb
@ -115,6 +115,9 @@ typedef struct ARegionType {
|
||||
/* return context data */
|
||||
int (*context)(const struct bContext *, const void *, struct bContextDataResult *);
|
||||
|
||||
/* custom drawing callbacks */
|
||||
ListBase drawcalls;
|
||||
|
||||
/* hardcoded constraints, smaller than these values region is not visible */
|
||||
int minsizex, minsizey;
|
||||
/* default keymaps to add */
|
||||
|
@ -52,6 +52,11 @@ static ListBase spacetypes= {NULL, NULL};
|
||||
/* not SpaceType itself */
|
||||
static void spacetype_free(SpaceType *st)
|
||||
{
|
||||
ARegionType *art;
|
||||
|
||||
for(art= st->regiontypes.first; art; art= art->next)
|
||||
BLI_freelistN(&art->drawcalls);
|
||||
|
||||
BLI_freelistN(&st->regiontypes);
|
||||
}
|
||||
|
||||
|
@ -29,6 +29,9 @@
|
||||
#ifndef ED_SPACE_API_H
|
||||
#define ED_SPACE_API_H
|
||||
|
||||
struct ARegionType;
|
||||
struct bContext;
|
||||
|
||||
/* the pluginnable API for export to editors */
|
||||
|
||||
/* calls for registering default spaces */
|
||||
@ -54,5 +57,14 @@ void ED_spacetype_sequencer(void);
|
||||
void ED_file_init(void);
|
||||
void ED_file_exit(void);
|
||||
|
||||
#define REGION_DRAW_PRE 1
|
||||
#define REGION_DRAW_POST 0
|
||||
|
||||
void *ED_region_draw_cb_activate(struct ARegionType *,
|
||||
void (*draw)(const struct bContext *, struct ARegion *),
|
||||
int type);
|
||||
void ED_region_draw_cb_draw(const struct bContext *, struct ARegion *, int);
|
||||
void ED_region_draw_cb_exit(struct ARegionType *, void *);
|
||||
|
||||
#endif /* ED_SPACE_API_H */
|
||||
|
||||
|
@ -123,7 +123,60 @@ void ED_spacetypes_keymap(wmWindowManager *wm)
|
||||
}
|
||||
}
|
||||
|
||||
/* ****************************** space template *********************** */
|
||||
/* ********************** custom drawcall api ***************** */
|
||||
|
||||
/* type */
|
||||
#define REGION_DRAW_PRE 1
|
||||
#define REGION_DRAW_POST 0
|
||||
|
||||
typedef struct RegionDrawCB {
|
||||
struct RegionDrawCB *next, *prev;
|
||||
|
||||
void (*draw)(const struct bContext *, struct ARegion *);
|
||||
|
||||
int type;
|
||||
|
||||
} RegionDrawCB;
|
||||
|
||||
void *ED_region_draw_cb_activate(ARegionType *art,
|
||||
void (*draw)(const struct bContext *, struct ARegion *),
|
||||
int type)
|
||||
{
|
||||
RegionDrawCB *rdc= MEM_callocN(sizeof(RegionDrawCB), "RegionDrawCB");
|
||||
|
||||
BLI_addtail(&art->drawcalls, rdc);
|
||||
rdc->draw= draw;
|
||||
rdc->type= type;
|
||||
|
||||
return rdc;
|
||||
}
|
||||
|
||||
void ED_region_draw_cb_exit(ARegionType *art, void *handle)
|
||||
{
|
||||
RegionDrawCB *rdc;
|
||||
|
||||
for(rdc= art->drawcalls.first; rdc; rdc= rdc->next) {
|
||||
if(rdc==(RegionDrawCB *)handle) {
|
||||
BLI_remlink(&art->drawcalls, rdc);
|
||||
MEM_freeN(rdc);
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void ED_region_draw_cb_draw(const bContext *C, ARegion *ar, int type)
|
||||
{
|
||||
RegionDrawCB *rdc;
|
||||
|
||||
for(rdc= ar->type->drawcalls.first; rdc; rdc= rdc->next) {
|
||||
if(rdc->type==type)
|
||||
rdc->draw(C, ar);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
/* ********************* space template *********************** */
|
||||
|
||||
/* allocate and init some vars */
|
||||
static SpaceLink *xxx_new(const bContext *C)
|
||||
|
@ -181,15 +181,6 @@ static SpaceLink *view3d_duplicate(SpaceLink *sl)
|
||||
return (SpaceLink *)v3dn;
|
||||
}
|
||||
|
||||
static void view3d_main_area_draw(const bContext *C, ARegion *ar)
|
||||
{
|
||||
/* draw entirely, view changes should be handled here */
|
||||
ScrArea *sa= CTX_wm_area(C);
|
||||
View3D *v3d= sa->spacedata.first; /* XXX get from region */
|
||||
|
||||
drawview3dspace(CTX_wm_screen(C), CTX_data_scene(C), ar, v3d);
|
||||
}
|
||||
|
||||
/* add handlers, stuff you only do once or on area/region changes */
|
||||
static void view3d_main_area_init(wmWindowManager *wm, ARegion *ar)
|
||||
{
|
||||
|
@ -51,6 +51,7 @@
|
||||
#include "BLI_rand.h"
|
||||
|
||||
#include "BKE_anim.h"
|
||||
#include "BKE_context.h"
|
||||
#include "BKE_customdata.h"
|
||||
#include "BKE_image.h"
|
||||
#include "BKE_ipo.h"
|
||||
@ -76,6 +77,7 @@
|
||||
#include "ED_keyframing.h"
|
||||
#include "ED_mesh.h"
|
||||
#include "ED_screen.h"
|
||||
#include "ED_space_api.h"
|
||||
#include "ED_util.h"
|
||||
#include "ED_types.h"
|
||||
|
||||
@ -1835,10 +1837,11 @@ static CustomDataMask get_viewedit_datamask(bScreen *screen)
|
||||
return mask;
|
||||
}
|
||||
|
||||
|
||||
|
||||
void drawview3dspace(bScreen *screen, Scene *scene, ARegion *ar, View3D *v3d)
|
||||
void view3d_main_area_draw(const bContext *C, ARegion *ar)
|
||||
{
|
||||
Scene *scene= CTX_data_scene(C);
|
||||
ScrArea *sa= CTX_wm_area(C);
|
||||
View3D *v3d= sa->spacedata.first; /* XXX get from region */
|
||||
Scene *sce;
|
||||
Base *base;
|
||||
Object *ob;
|
||||
@ -1846,7 +1849,7 @@ void drawview3dspace(bScreen *screen, Scene *scene, ARegion *ar, View3D *v3d)
|
||||
Object *obact = OBACT;
|
||||
|
||||
/* from now on all object derived meshes check this */
|
||||
v3d->customdata_mask= get_viewedit_datamask(screen);
|
||||
v3d->customdata_mask= get_viewedit_datamask(CTX_wm_screen(C));
|
||||
|
||||
/* update all objects, ipos, matrices, displists, etc. Flags set by depgraph or manual,
|
||||
no layer check here, gets correct flushed */
|
||||
@ -1999,12 +2002,7 @@ void drawview3dspace(bScreen *screen, Scene *scene, ARegion *ar, View3D *v3d)
|
||||
view3d_update_depths(ar, v3d);
|
||||
}
|
||||
|
||||
if(G.moving) {
|
||||
// BIF_drawConstraint();
|
||||
// if(obedit || (G.f & G_PARTICLEEDIT))
|
||||
// BIF_drawPropCircle(); // only editmode and particles have proportional edit
|
||||
// BIF_drawSnap();
|
||||
}
|
||||
ED_region_draw_cb_draw(C, ar, REGION_DRAW_POST);
|
||||
|
||||
// REEB_draw();
|
||||
|
||||
|
@ -69,6 +69,7 @@
|
||||
#include "RNA_access.h"
|
||||
#include "RNA_define.h"
|
||||
|
||||
#include "ED_space_api.h"
|
||||
#include "ED_screen.h"
|
||||
#include "ED_types.h"
|
||||
|
||||
@ -96,6 +97,7 @@ typedef struct ViewOpsData {
|
||||
int origx, origy, oldx, oldy;
|
||||
int origkey;
|
||||
|
||||
void *vh; // XXX temp
|
||||
} ViewOpsData;
|
||||
|
||||
#define TRACKBALLSIZE (1.1)
|
||||
@ -362,6 +364,10 @@ static int viewrotate_modal(bContext *C, wmOperator *op, wmEvent *event)
|
||||
default:
|
||||
if(event->type==vod->origkey && event->val==0) {
|
||||
|
||||
if(vod->vh) {
|
||||
ED_region_draw_cb_exit(CTX_wm_region(C)->type, vod->vh);
|
||||
ED_region_tag_redraw(CTX_wm_region(C));
|
||||
}
|
||||
MEM_freeN(vod);
|
||||
op->customdata= NULL;
|
||||
|
||||
@ -372,6 +378,12 @@ static int viewrotate_modal(bContext *C, wmOperator *op, wmEvent *event)
|
||||
return OPERATOR_RUNNING_MODAL;
|
||||
}
|
||||
|
||||
static void vh_draw(const bContext *C, ARegion *ar)
|
||||
{
|
||||
glColor3ub(100, 200, 100);
|
||||
glRectf(-0.2, -0.2, 0.2, 0.2);
|
||||
}
|
||||
|
||||
static int viewrotate_invoke(bContext *C, wmOperator *op, wmEvent *event)
|
||||
{
|
||||
ViewOpsData *vod;
|
||||
@ -380,6 +392,8 @@ static int viewrotate_invoke(bContext *C, wmOperator *op, wmEvent *event)
|
||||
viewops_data(C, op, event);
|
||||
vod= op->customdata;
|
||||
|
||||
vod->vh= ED_region_draw_cb_activate(CTX_wm_region(C)->type, vh_draw, REGION_DRAW_POST);
|
||||
|
||||
/* switch from camera view when: */
|
||||
if(vod->v3d->persp != V3D_PERSP) {
|
||||
|
||||
|
@ -33,6 +33,7 @@
|
||||
/* internal exports only */
|
||||
|
||||
struct bScreen;
|
||||
struct ARegion;
|
||||
struct BoundBox;
|
||||
struct Object;
|
||||
struct DerivedMesh;
|
||||
@ -64,7 +65,7 @@ typedef struct ViewDepths {
|
||||
#define IS_CLIPPED 12000
|
||||
|
||||
/* view3d_header.c */
|
||||
void view3d_header_buttons(const struct bContext *C, ARegion *ar);
|
||||
void view3d_header_buttons(const struct bContext *C, struct ARegion *ar);
|
||||
|
||||
/* view3d_ops.c */
|
||||
void view3d_operatortypes(void);
|
||||
@ -83,7 +84,7 @@ void VIEW3D_OT_render_border(struct wmOperatorType *ot);
|
||||
void VIEW3D_OT_drawtype(struct wmOperatorType *ot);
|
||||
|
||||
/* drawobject.c */
|
||||
void draw_object(Scene *scene, ARegion *ar, View3D *v3d, Base *base, int flag);
|
||||
void draw_object(Scene *scene, struct ARegion *ar, View3D *v3d, Base *base, int flag);
|
||||
int draw_glsl_material(Scene *scene, Object *ob, View3D *v3d, int dt);
|
||||
void drawcircball(int mode, float *cent, float rad, float tmat[][4]);
|
||||
void draw_object_instance(Scene *scene, View3D *v3d, Object *ob, int dt, int outline);
|
||||
@ -97,17 +98,17 @@ int draw_armature(Scene *scene, View3D *v3d, Base *base, int dt, int flag);
|
||||
void draw_mesh_textured(Scene *scene, View3D *v3d, Object *ob, struct DerivedMesh *dm, int faceselect);
|
||||
|
||||
/* view3d_draw.c */
|
||||
void drawview3dspace(struct bScreen *screen, Scene *scene, ARegion *ar, View3D *v3d);
|
||||
void draw_depth(Scene *scene, ARegion *ar, View3D *v3d, int (* func)(void *));
|
||||
void view3d_main_area_draw(const struct bContext *C, struct ARegion *ar);
|
||||
void draw_depth(Scene *scene, struct ARegion *ar, View3D *v3d, int (* func)(void *));
|
||||
void view3d_clr_clipping(void);
|
||||
void view3d_set_clipping(View3D *v3d);
|
||||
void add_view3d_after(View3D *v3d, Base *base, int type, int flag);
|
||||
void make_axis_color(char *col, char *col2, char axis);
|
||||
void calc_viewborder(Scene *scene, ARegion *ar, View3D *v3d, rctf *viewborder_r);
|
||||
void calc_viewborder(Scene *scene, struct ARegion *ar, View3D *v3d, rctf *viewborder_r);
|
||||
|
||||
void circf(float x, float y, float rad);
|
||||
void circ(float x, float y, float rad);
|
||||
void view3d_update_depths(ARegion *ar, View3D *v3d);
|
||||
void view3d_update_depths(struct ARegion *ar, View3D *v3d);
|
||||
|
||||
/* view3d_select.c */
|
||||
void VIEW3D_OT_select(struct wmOperatorType *ot);
|
||||
@ -130,19 +131,19 @@ void view3d_operator_needs_opengl(const struct bContext *C);
|
||||
|
||||
int boundbox_clip(View3D *v3d, float obmat[][4], struct BoundBox *bb);
|
||||
|
||||
void view3d_project_short_clip(ARegion *ar, View3D *v3d, float *vec, short *adr, float projmat[4][4], float wmat[4][4]);
|
||||
void view3d_project_short_noclip(ARegion *ar, float *vec, short *adr, float mat[4][4]);
|
||||
void view3d_project_float(ARegion *a, float *vec, float *adr, float mat[4][4]);
|
||||
void view3d_project_short_clip(struct ARegion *ar, View3D *v3d, float *vec, short *adr, float projmat[4][4], float wmat[4][4]);
|
||||
void view3d_project_short_noclip(struct ARegion *ar, float *vec, short *adr, float mat[4][4]);
|
||||
void view3d_project_float(struct ARegion *a, float *vec, float *adr, float mat[4][4]);
|
||||
void view3d_get_object_project_mat(View3D *v3d, struct Object *ob, float pmat[4][4], float vmat[4][4]);
|
||||
void view3d_project_float(ARegion *ar, float *vec, float *adr, float mat[4][4]);
|
||||
void view3d_project_float(struct ARegion *ar, float *vec, float *adr, float mat[4][4]);
|
||||
|
||||
int get_view3d_viewplane(View3D *v3d, int winxi, int winyi, rctf *viewplane, float *clipsta, float *clipend, float *pixsize);
|
||||
|
||||
void initlocalview(Scene *scene, ARegion *ar, View3D *v3d);
|
||||
void initlocalview(Scene *scene, struct ARegion *ar, View3D *v3d);
|
||||
void restore_localviewdata(View3D *vd);
|
||||
void endlocalview(Scene *scene, ScrArea *sa);
|
||||
|
||||
void centerview(ARegion *ar, View3D *v3d);
|
||||
void centerview(struct ARegion *ar, View3D *v3d);
|
||||
|
||||
void smooth_view(struct bContext *C, Object *, Object *, float *ofs, float *quat, float *dist, float *lens);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user