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

Ton Roosendaal ton at blender.org
Thu Jan 1 20:18:08 CET 2009


Revision: 18220
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=18220
Author:   ton
Date:     2009-01-01 20:18:03 +0100 (Thu, 01 Jan 2009)

Log Message:
-----------
2.5

- View3D backbuffer select is back ("occlusion select").
  It doesn't use the old 'afterqueue' yet, which ensured backbuffers
  to draw immediate after swapbuffers. Will with that.

Modified Paths:
--------------
    branches/blender2.5/blender/source/blender/editors/include/ED_mesh.h
    branches/blender2.5/blender/source/blender/editors/include/ED_view3d.h
    branches/blender2.5/blender/source/blender/editors/mesh/editmesh_mods.c
    branches/blender2.5/blender/source/blender/editors/space_view3d/drawobject.c
    branches/blender2.5/blender/source/blender/editors/space_view3d/view3d_draw.c
    branches/blender2.5/blender/source/blender/editors/space_view3d/view3d_intern.h
    branches/blender2.5/blender/source/blender/editors/space_view3d/view3d_select.c

Modified: branches/blender2.5/blender/source/blender/editors/include/ED_mesh.h
===================================================================
--- branches/blender2.5/blender/source/blender/editors/include/ED_mesh.h	2009-01-01 19:03:40 UTC (rev 18219)
+++ branches/blender2.5/blender/source/blender/editors/include/ED_mesh.h	2009-01-01 19:18:03 UTC (rev 18220)
@@ -123,10 +123,10 @@
 
 void		mouse_mesh(struct bContext *C, short mval[2], short extend);
 int			EM_check_backbuf(unsigned int index);
-int			EM_mask_init_backbuf_border(struct View3D *v3d, short mcords[][2], short tot, short xmin, short ymin, short xmax, short ymax);
+int			EM_mask_init_backbuf_border(struct ViewContext *vc, short mcords[][2], short tot, short xmin, short ymin, short xmax, short ymax);
 void		EM_free_backbuf(void);
-int			EM_init_backbuf_border(struct View3D *v3d, short xmin, short ymin, short xmax, short ymax);
-int			EM_init_backbuf_circle(struct View3D *v3d, short xs, short ys, short rads);
+int			EM_init_backbuf_border(struct ViewContext *vc, short xmin, short ymin, short xmax, short ymax);
+int			EM_init_backbuf_circle(struct ViewContext *vc, short xs, short ys, short rads);
 
 
 #endif /* ED_MESH_H */

Modified: branches/blender2.5/blender/source/blender/editors/include/ED_view3d.h
===================================================================
--- branches/blender2.5/blender/source/blender/editors/include/ED_view3d.h	2009-01-01 19:03:40 UTC (rev 18219)
+++ branches/blender2.5/blender/source/blender/editors/include/ED_view3d.h	2009-01-01 19:18:03 UTC (rev 18220)
@@ -38,6 +38,7 @@
 struct EditVert;
 struct EditEdge;
 struct EditFace;
+struct ImBuf;
 
 float *give_cursor(Scene *scene, View3D *v3d);
 
@@ -68,7 +69,10 @@
 int view3d_test_clipping(struct View3D *v3d, float *vec);
 void view3d_align_axis_to_vector(struct View3D *v3d, int axisidx, float vec[3]);
 
+/* backbuffer select and draw support */
+struct ImBuf *view3d_read_backbuf(struct ViewContext *vc, short xmin, short ymin, short xmax, short ymax);
+unsigned int view3d_sample_backbuf_rect(struct ViewContext *vc, short mval[2], int size, unsigned int min, unsigned int max, int *dist, short strict, unsigned int (*indextest)(unsigned int index));
+unsigned int view3d_sample_backbuf(struct ViewContext *vc, int x, int y);
 
-
 #endif /* ED_VIEW3D_H */
 

Modified: branches/blender2.5/blender/source/blender/editors/mesh/editmesh_mods.c
===================================================================
--- branches/blender2.5/blender/source/blender/editors/mesh/editmesh_mods.c	2009-01-01 19:03:40 UTC (rev 18219)
+++ branches/blender2.5/blender/source/blender/editors/mesh/editmesh_mods.c	2009-01-01 19:18:03 UTC (rev 18220)
@@ -91,9 +91,6 @@
 
 #include "BLO_sys_types.h" // for intptr_t support
 
-static void *read_backbuf() {return NULL;}
-static int sample_backbuf_rect() {return 0;}
-static int sample_backbuf() {return 0;}
 static void BIF_undo_push() {}
 static void waitcursor() {}
 static void error() {}
@@ -191,17 +188,17 @@
 
 /* reads rect, and builds selection array for quick lookup */
 /* returns if all is OK */
-int EM_init_backbuf_border(View3D *v3d, short xmin, short ymin, short xmax, short ymax)
+int EM_init_backbuf_border(ViewContext *vc, short xmin, short ymin, short xmax, short ymax)
 {
 	struct ImBuf *buf;
 	unsigned int *dr;
 	int a;
 	
-	if(G.obedit==NULL || v3d->drawtype<OB_SOLID || (v3d->flag & V3D_ZBUF_SELECT)==0) return 0;
-	if(em_vertoffs==0) return 0;
+	if(G.obedit==NULL || vc->v3d->drawtype<OB_SOLID || (vc->v3d->flag & V3D_ZBUF_SELECT)==0) return 0;
 	
-	buf= read_backbuf(xmin, ymin, xmax, ymax);
+	buf= view3d_read_backbuf(vc, xmin, ymin, xmax, ymax);
 	if(buf==NULL) return 0;
+	if(em_vertoffs==0) return 0;
 
 	dr = buf->rect;
 	
@@ -238,7 +235,7 @@
    - grab again and compare
    returns 'OK' 
 */
-int EM_mask_init_backbuf_border(View3D *v3d, short mcords[][2], short tot, short xmin, short ymin, short xmax, short ymax)
+int EM_mask_init_backbuf_border(ViewContext *vc, short mcords[][2], short tot, short xmin, short ymin, short xmax, short ymax)
 {
 	unsigned int *dr, *drm;
 	struct ImBuf *buf, *bufmask;
@@ -249,11 +246,11 @@
 		if(FACESEL_PAINT_TEST);
 		else return 0;
 	}
-	else if(v3d->drawtype<OB_SOLID || (v3d->flag & V3D_ZBUF_SELECT)==0) return 0;
+	else if(vc->v3d->drawtype<OB_SOLID || (vc->v3d->flag & V3D_ZBUF_SELECT)==0) return 0;
 
 	if(em_vertoffs==0) return 0;
 	
-	buf= read_backbuf(xmin, ymin, xmax, ymax);
+	buf= view3d_read_backbuf(vc, xmin, ymin, xmax, ymax);
 	if(buf==NULL) return 0;
 
 	dr = buf->rect;
@@ -280,7 +277,7 @@
 	glDrawBuffer(GL_BACK);
 	
 	/* grab mask */
-	bufmask= read_backbuf(xmin, ymin, xmax, ymax);
+	bufmask= view3d_read_backbuf(vc, xmin, ymin, xmax, ymax);
 	drm = bufmask->rect;
 	if(bufmask==NULL) return 0; /* only when mem alloc fails, go crash somewhere else! */
 	
@@ -299,7 +296,7 @@
 }
 
 /* circle shaped sample area */
-int EM_init_backbuf_circle(View3D *v3d, short xs, short ys, short rads)
+int EM_init_backbuf_circle(ViewContext *vc, short xs, short ys, short rads)
 {
 	struct ImBuf *buf;
 	unsigned int *dr;
@@ -311,12 +308,12 @@
 		if(FACESEL_PAINT_TEST);
 		else return 0;
 	}
-	else if(v3d->drawtype<OB_SOLID || (v3d->flag & V3D_ZBUF_SELECT)==0) return 0;
+	else if(vc->v3d->drawtype<OB_SOLID || (vc->v3d->flag & V3D_ZBUF_SELECT)==0) return 0;
 	if(em_vertoffs==0) return 0;
 	
 	xmin= xs-rads; xmax= xs+rads;
 	ymin= ys-rads; ymax= ys+rads;
-	buf= read_backbuf(xmin, ymin, xmax, ymax);
+	buf= view3d_read_backbuf(vc, xmin, ymin, xmax, ymax);
 	if(buf==NULL) return 0;
 
 	dr = buf->rect;
@@ -393,8 +390,8 @@
 		unsigned int index;
 		EditVert *eve;
 		
-		if(strict) index = sample_backbuf_rect(vc->mval, 50, em_wireoffs, 0xFFFFFF, &distance, strict, findnearestvert__backbufIndextest); 
-		else index = sample_backbuf_rect(vc->mval, 50, em_wireoffs, 0xFFFFFF, &distance, 0, NULL); 
+		if(strict) index = view3d_sample_backbuf_rect(vc, vc->mval, 50, em_wireoffs, 0xFFFFFF, &distance, strict, findnearestvert__backbufIndextest); 
+		else index = view3d_sample_backbuf_rect(vc, vc->mval, 50, em_wireoffs, 0xFFFFFF, &distance, 0, NULL); 
 		
 		eve = BLI_findlink(&vc->em->verts, index-1);
 		
@@ -496,7 +493,7 @@
 
 	if(vc->v3d->drawtype>OB_WIRE && (vc->v3d->flag & V3D_ZBUF_SELECT)) {
 		int distance;
-		unsigned int index = sample_backbuf_rect(vc->mval, 50, em_solidoffs, em_wireoffs, &distance,0, NULL);
+		unsigned int index = view3d_sample_backbuf_rect(vc, vc->mval, 50, em_solidoffs, em_wireoffs, &distance,0, NULL);
 		EditEdge *eed = BLI_findlink(&vc->em->edges, index-1);
 
 		if (eed && distance<*dist) {
@@ -559,7 +556,7 @@
 {
 
 	if(vc->v3d->drawtype>OB_WIRE && (vc->v3d->flag & V3D_ZBUF_SELECT)) {
-		unsigned int index = sample_backbuf(vc->mval[0], vc->mval[1]);
+		unsigned int index = view3d_sample_backbuf(vc, vc->mval[0], vc->mval[1]);
 		EditFace *efa = BLI_findlink(&vc->em->faces, index-1);
 
 		if (efa) {

Modified: branches/blender2.5/blender/source/blender/editors/space_view3d/drawobject.c
===================================================================
--- branches/blender2.5/blender/source/blender/editors/space_view3d/drawobject.c	2009-01-01 19:03:40 UTC (rev 18219)
+++ branches/blender2.5/blender/source/blender/editors/space_view3d/drawobject.c	2009-01-01 19:18:03 UTC (rev 18220)
@@ -5363,7 +5363,7 @@
 	dm->release(dm);
 }
 
-void draw_object_backbufsel(Scene *scene, View3D *v3d, EditMesh *em, Object *ob)
+void draw_object_backbufsel(Scene *scene, View3D *v3d, Object *ob)
 {
 
 	wmMultMatrix(ob->obmat);
@@ -5374,6 +5374,8 @@
 	switch( ob->type) {
 	case OB_MESH:
 		if(ob==G.obedit) {
+			Mesh *me= ob->data;
+			EditMesh *em= me->edit_mesh;
 			DerivedMesh *dm = editmesh_get_derived_cage(em, CD_MASK_BAREMESH);
 
 			EM_init_index_arrays(em, 1, 1, 1);

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-01 19:03:40 UTC (rev 18219)
+++ branches/blender2.5/blender/source/blender/editors/space_view3d/view3d_draw.c	2009-01-01 19:18:03 UTC (rev 18220)
@@ -71,6 +71,7 @@
 #include "WM_api.h"
 
 #include "ED_keyframing.h"
+#include "ED_mesh.h"
 #include "ED_screen.h"
 #include "ED_util.h"
 #include "ED_types.h"
@@ -1037,6 +1038,239 @@
 	
 }
 
+/* *********************** backdraw for selection *************** */
+
+void backdrawview3d(Scene *scene, ARegion *ar, View3D *v3d)
+{
+	struct Base *base;
+
+/*for 2.43 release, don't use glext and just define the constant.
+  this to avoid possibly breaking platforms before release.*/
+#ifndef GL_MULTISAMPLE_ARB
+	#define GL_MULTISAMPLE_ARB	0x809D
+#endif
+
+#ifdef GL_MULTISAMPLE_ARB
+	int m;
+#endif
+
+	if(G.f & G_VERTEXPAINT || G.f & G_WEIGHTPAINT || G.f & G_TEXTUREPAINT);
+	else if(G.obedit && v3d->drawtype>OB_WIRE && (v3d->flag & V3D_ZBUF_SELECT));
+	else {
+		v3d->flag &= ~V3D_NEEDBACKBUFDRAW;
+		return;
+	}
+
+	if( !(v3d->flag & V3D_NEEDBACKBUFDRAW) ) return;
+
+//	if(test) {
+//		if(qtest()) {
+//			addafterqueue(ar->win, BACKBUFDRAW, 1);
+//			return;
+//		}
+//	}
+
+	/* Disable FSAA for backbuffer selection.  
+	
+	Only works if GL_MULTISAMPLE_ARB is defined by the header
+	file, which is should be for every OS that supports FSAA.*/
+
+#ifdef GL_MULTISAMPLE_ARB
+	m = glIsEnabled(GL_MULTISAMPLE_ARB);
+	if (m) glDisable(GL_MULTISAMPLE_ARB);
+#endif
+
+	if(v3d->drawtype > OB_WIRE) v3d->zbuf= TRUE;
+//	ar->win_swap &= ~WIN_BACK_OK;
+	
+	glDisable(GL_DITHER);
+
+	glClearColor(0.0, 0.0, 0.0, 0.0); 
+	if(v3d->zbuf) {
+		glEnable(GL_DEPTH_TEST);
+		glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+	}
+	else {
+		glClear(GL_COLOR_BUFFER_BIT);
+		glDisable(GL_DEPTH_TEST);
+	}
+	
+	if(v3d->flag & V3D_CLIPPING)
+		view3d_set_clipping(v3d);
+	
+	G.f |= G_BACKBUFSEL;
+	
+	base= (G.scene->basact);
+	if(base && (base->lay & v3d->lay)) {
+		draw_object_backbufsel(scene, v3d, base->object);
+	}
+
+	v3d->flag &= ~V3D_NEEDBACKBUFDRAW;
+
+	G.f &= ~G_BACKBUFSEL;
+	v3d->zbuf= FALSE; 
+	glDisable(GL_DEPTH_TEST);
+	glEnable(GL_DITHER);
+
+	if(v3d->flag & V3D_CLIPPING)
+		view3d_clr_clipping();
+
+#ifdef GL_MULTISAMPLE_ARB
+	if (m) glEnable(GL_MULTISAMPLE_ARB);
+#endif
+
+	/* it is important to end a view in a transform compatible with buttons */
+//	persp(PERSP_WIN);  // set ortho
+
+}
+
+void check_backbuf(ViewContext *vc)
+{
+	if(vc->v3d->flag & V3D_NEEDBACKBUFDRAW)
+		backdrawview3d(vc->scene, vc->ar, vc->v3d);
+}
+

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list