2.5
authorTon Roosendaal <ton@blender.org>
Fri, 9 Jan 2009 15:04:52 +0000 (15:04 +0000)
committerTon Roosendaal <ton@blender.org>
Fri, 9 Jan 2009 15:04:52 +0000 (15:04 +0000)
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.

source/blender/blenkernel/BKE_screen.h
source/blender/blenkernel/intern/screen.c
source/blender/editors/include/ED_space_api.h
source/blender/editors/space_api/spacetypes.c
source/blender/editors/space_view3d/space_view3d.c
source/blender/editors/space_view3d/view3d_draw.c
source/blender/editors/space_view3d/view3d_edit.c
source/blender/editors/space_view3d/view3d_intern.h

index 04b27f7bf3c057ef08bd091b15f3bcb2249dfd38..7604dc8170b5605dded61ba10c4aa6937b8786c2 100644 (file)
@@ -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 */
index b46d4af8887bcdc242bc65e60c0a36fa9bf40931..fd15c69e775af9a4ccd9e4e8d60c25cea2f8d46f 100644 (file)
@@ -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);
 }
 
index b705c050aa3a4cfbeb616e4c0802f0b78c95c281..20b1e2b5499c8202406170dadc5bf50183f09e66 100644 (file)
@@ -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 */
 
index 325227a2fc5246e33890264eac90e1e909fb8323..8ed9bb10fd5430c83ffab1dc0d76dba202e8b77a 100644 (file)
@@ -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)
index 8ac672eb260f3a3b1c314706dabd14a0ccdd0683..675fbc5aab293920a45e904510933943c842ad40 100644 (file)
@@ -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)
 {
index 48fb6d7670355f758842b4f0c9fd1a444a295248..4fc64782fe891c687723a441e6914ffc29c410e5 100644 (file)
@@ -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();
        
index 666bb2974951ffe86ce634462c15f4d460dfab0e..90bc976f0155e962a82311bd58127b5aa29053d2 100644 (file)
@@ -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) {
 
index 7fb17071e717b67c533c49c9ace1b29e6ec60205..8fc00ffd538a7c2906cb7678e555475857db7518 100644 (file)
@@ -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);