[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [18431] branches/blender2.5/blender/source /blender: 2.5

Ton Roosendaal ton at blender.org
Fri Jan 9 16:04:52 CET 2009


Revision: 18431
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=18431
Author:   ton
Date:     2009-01-09 16:04:52 +0100 (Fri, 09 Jan 2009)

Log Message:
-----------
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.

Modified Paths:
--------------
    branches/blender2.5/blender/source/blender/blenkernel/BKE_screen.h
    branches/blender2.5/blender/source/blender/blenkernel/intern/screen.c
    branches/blender2.5/blender/source/blender/editors/include/ED_space_api.h
    branches/blender2.5/blender/source/blender/editors/space_api/spacetypes.c
    branches/blender2.5/blender/source/blender/editors/space_view3d/space_view3d.c
    branches/blender2.5/blender/source/blender/editors/space_view3d/view3d_draw.c
    branches/blender2.5/blender/source/blender/editors/space_view3d/view3d_edit.c
    branches/blender2.5/blender/source/blender/editors/space_view3d/view3d_intern.h

Modified: branches/blender2.5/blender/source/blender/blenkernel/BKE_screen.h
===================================================================
--- branches/blender2.5/blender/source/blender/blenkernel/BKE_screen.h	2009-01-09 13:55:45 UTC (rev 18430)
+++ branches/blender2.5/blender/source/blender/blenkernel/BKE_screen.h	2009-01-09 15:04:52 UTC (rev 18431)
@@ -115,6 +115,9 @@
 	/* 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 */

Modified: branches/blender2.5/blender/source/blender/blenkernel/intern/screen.c
===================================================================
--- branches/blender2.5/blender/source/blender/blenkernel/intern/screen.c	2009-01-09 13:55:45 UTC (rev 18430)
+++ branches/blender2.5/blender/source/blender/blenkernel/intern/screen.c	2009-01-09 15:04:52 UTC (rev 18431)
@@ -52,6 +52,11 @@
 /* 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);
 }
 

Modified: branches/blender2.5/blender/source/blender/editors/include/ED_space_api.h
===================================================================
--- branches/blender2.5/blender/source/blender/editors/include/ED_space_api.h	2009-01-09 13:55:45 UTC (rev 18430)
+++ branches/blender2.5/blender/source/blender/editors/include/ED_space_api.h	2009-01-09 15:04:52 UTC (rev 18431)
@@ -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_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 */
 

Modified: branches/blender2.5/blender/source/blender/editors/space_api/spacetypes.c
===================================================================
--- branches/blender2.5/blender/source/blender/editors/space_api/spacetypes.c	2009-01-09 13:55:45 UTC (rev 18430)
+++ branches/blender2.5/blender/source/blender/editors/space_api/spacetypes.c	2009-01-09 15:04:52 UTC (rev 18431)
@@ -123,8 +123,61 @@
 	}
 }
 
-/* ****************************** 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)
 {

Modified: branches/blender2.5/blender/source/blender/editors/space_view3d/space_view3d.c
===================================================================
--- branches/blender2.5/blender/source/blender/editors/space_view3d/space_view3d.c	2009-01-09 13:55:45 UTC (rev 18430)
+++ branches/blender2.5/blender/source/blender/editors/space_view3d/space_view3d.c	2009-01-09 15:04:52 UTC (rev 18431)
@@ -181,15 +181,6 @@
 	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)
 {

Modified: branches/blender2.5/blender/source/blender/editors/space_view3d/view3d_draw.c
===================================================================
--- branches/blender2.5/blender/source/blender/editors/space_view3d/view3d_draw.c	2009-01-09 13:55:45 UTC (rev 18430)
+++ branches/blender2.5/blender/source/blender/editors/space_view3d/view3d_draw.c	2009-01-09 15:04:52 UTC (rev 18431)
@@ -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 @@
 	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 @@
 	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 @@
 		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();
 	

Modified: branches/blender2.5/blender/source/blender/editors/space_view3d/view3d_edit.c
===================================================================
--- branches/blender2.5/blender/source/blender/editors/space_view3d/view3d_edit.c	2009-01-09 13:55:45 UTC (rev 18430)
+++ branches/blender2.5/blender/source/blender/editors/space_view3d/view3d_edit.c	2009-01-09 15:04:52 UTC (rev 18431)
@@ -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 @@
 	int origx, origy, oldx, oldy;
 	int origkey;
 
+	void *vh; // XXX temp
 } ViewOpsData;
 
 #define TRACKBALLSIZE  (1.1)
@@ -362,6 +364,10 @@
 		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 @@
 	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 @@
 	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) {
 

Modified: branches/blender2.5/blender/source/blender/editors/space_view3d/view3d_intern.h
===================================================================
--- branches/blender2.5/blender/source/blender/editors/space_view3d/view3d_intern.h	2009-01-09 13:55:45 UTC (rev 18430)
+++ branches/blender2.5/blender/source/blender/editors/space_view3d/view3d_intern.h	2009-01-09 15:04:52 UTC (rev 18431)
@@ -33,6 +33,7 @@
 /* internal exports only */
 
 struct bScreen;
+struct ARegion;
 struct BoundBox;
 struct Object;
 struct DerivedMesh;
@@ -64,7 +65,7 @@
 #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_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 @@
 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);

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list