[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [17441] branches/projection-paint/source/ blender/src: * use the existing function to only update a part of the image , should increase speed a lot, except when painting on seams from opposite parts of the image.

Campbell Barton ideasman42 at gmail.com
Thu Nov 13 12:30:34 CET 2008


Revision: 17441
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=17441
Author:   campbellbarton
Date:     2008-11-13 12:30:34 +0100 (Thu, 13 Nov 2008)

Log Message:
-----------
* use the existing function to only update a part of the image, should increase speed a lot, except when painting on seams from opposite parts of the image. - can speed this up with multiple boundboxes - TODO.
* use brush spacing and airbrush settings
* draw a circle while in texture paint mode.

Modified Paths:
--------------
    branches/projection-paint/source/blender/src/drawview.c
    branches/projection-paint/source/blender/src/imagepaint.c
    branches/projection-paint/source/blender/src/space.c

Modified: branches/projection-paint/source/blender/src/drawview.c
===================================================================
--- branches/projection-paint/source/blender/src/drawview.c	2008-11-13 10:43:02 UTC (rev 17440)
+++ branches/projection-paint/source/blender/src/drawview.c	2008-11-13 11:30:34 UTC (rev 17441)
@@ -3309,7 +3309,12 @@
 			fdrawXORcirc((float)c[0], (float)c[1], (float)pset->brush[pset->brushtype].size);
 		}
 	}
-
+	if(!G.obedit && OBACT && G.f&G_TEXTUREPAINT && area_is_active_area(v3d->area) && G.scene->toolsettings->imapaint.brush){
+		short c[2];
+		getmouseco_areawin(c);
+		fdrawXORcirc((float)c[0], (float)c[1], (float)G.scene->toolsettings->imapaint.brush->size/2);
+	}
+	
 	if(v3d->persp>1) drawviewborder();
 	if(v3d->flag2 & V3D_FLYMODE) drawviewborder_flymode();
 	

Modified: branches/projection-paint/source/blender/src/imagepaint.c
===================================================================
--- branches/projection-paint/source/blender/src/imagepaint.c	2008-11-13 10:43:02 UTC (rev 17440)
+++ branches/projection-paint/source/blender/src/imagepaint.c	2008-11-13 11:30:34 UTC (rev 17441)
@@ -82,6 +82,8 @@
 #include "BIF_space.h"
 #include "BIF_toolbox.h"
 
+#include "BIF_editview.h" /* only for mouse_cursor - could remove this later */
+
 #include "BSE_drawipo.h"
 #include "BSE_node.h"
 #include "BSE_trans_types.h"
@@ -132,6 +134,10 @@
 	float uv[2];
 } ImagePaintState;
 
+typedef struct ImagePaintPartialRedraw {
+	int x1, y1, x2, y2;
+	int enabled;
+} ImagePaintPartialRedraw;
 
 /* testing options */
 #define PROJ_BUCKET_DIV 128 /* TODO - test other values, this is a guess, seems ok */
@@ -194,6 +200,7 @@
 	
 	Image **projectImages;			/* array of images we are painting onto while, use so we can tag for updates */
 	ImBuf **projectImBufs;			/* array of imbufs we are painting onto while, use so we can get the rect and rect_float quickly */
+	ImagePaintPartialRedraw	*projectPartialRedraws;	/* array of partial redraws */
 	
 	int projectImageTotal;			/* size of projectImages array */
 	
@@ -235,8 +242,10 @@
 
 typedef struct ProjectPixel {
 	float projCo2D[2]; /* the floating point screen projection of this pixel */
+	short x_px, y_px;
 	void *pixel;
-	int image_index;
+	short image_index; /* if anyone wants to paint onto more then 32000 images they can bite me */
+	short flag;
 } ProjectPixel;
 
 typedef struct ProjectPixelClone {
@@ -268,11 +277,6 @@
 	ListBase tiles;
 } UndoElem;
 
-typedef struct ImagePaintPartialRedraw {
-	int x1, y1, x2, y2;
-	int enabled;
-} ImagePaintPartialRedraw;
-
 static ListBase undobase = {NULL, NULL};
 static UndoElem *curundo = NULL;
 static ImagePaintPartialRedraw imapaintpartial = {0, 0, 0, 0, 0};
@@ -592,7 +596,7 @@
 {
 	int i,j,n,m,x1,y1;
 	unsigned char *dataI;
-	float a,b,w,wx,wy[4], outR,outG,outB,outA,*dataF,*outF;
+	float a,b,w,wx,wy[4], outR,outG,outB,outA,*dataF;
 	int do_rect=0, do_float=0;
 
 	if (in == NULL) return;
@@ -983,7 +987,6 @@
 static int uv_image_rect(float uv1[2], float uv2[2], float uv3[2], float uv4[2], int min_px[2], int max_px[2], int x_px, int y_px, int is_quad)
 {
 	float min_uv[2], max_uv[2]; /* UV bounds */
-	int i;
 	
 	INIT_MINMAX2(min_uv, max_uv);
 	
@@ -1251,7 +1254,7 @@
 	return(Inp2f(u,h)/Inp2f(u,u));
 }
 
-static screen_px_from_ortho(
+static void screen_px_from_ortho(
 		ProjectPaintState *ps, float uv[2],
 		float v1co[3], float v2co[3], float v3co[3], /* Screenspace coords */
 		float uv1co[2], float uv2co[2], float uv3co[2],
@@ -1264,7 +1267,7 @@
 	pixelScreenCo[2] = v1co[2]*w[0] + v2co[2]*w[1] + v3co[2]*w[2];	
 }
 
-static screen_px_from_persp(
+static void screen_px_from_persp(
 		ProjectPaintState *ps, float uv[2],
 		float v1co[3], float v2co[3], float v3co[3], /* Worldspace coords */
 		float uv1co[2], float uv2co[2], float uv3co[2],
@@ -1290,7 +1293,7 @@
 /* Only run this function once for new ProjectPixelClone's */
 #define pixel_size 4
 
-static void project_paint_uvpixel_init(ProjectPaintState *ps, int thread_index, ImBuf *ibuf, int x, int y, int bucket_index, int face_index, int image_index, float pixelScreenCo[4])
+static void project_paint_uvpixel_init(ProjectPaintState *ps, int thread_index, ImBuf *ibuf, short x, short y, int bucket_index, int face_index, int image_index, float pixelScreenCo[4])
 {
 	ProjectPixel *projPixel;
 	short size;
@@ -1327,6 +1330,8 @@
 		}
 		
 		VECCOPY2D(projPixel->projCo2D, pixelScreenCo);
+		projPixel->x_px = x;
+		projPixel->y_px = y;
 		
 		/* done with view3d_project_float inline */
 		if (ps->tool==PAINT_TOOL_CLONE) {
@@ -1561,17 +1566,17 @@
 	int min_px[2], max_px[2]; /* UV Bounds converted to int's for pixel */
 	int min_px_tf[2], max_px_tf[2]; /* UV Bounds converted to int's for pixel */
 	int min_px_bucket[2], max_px_bucket[2]; /* Bucket Bounds converted to int's for pixel */
-	float *v1coSS, *v2coSS, *v3coSS, *v4coSS; /* vert co screen-space, these will be assigned to mf->v1,2,3 or mf->v1,3,4 */
-	float *v1co, *v2co, *v3co; /* vert co */
+	float *v1coSS, *v2coSS, *v3coSS; /* vert co screen-space, these will be assigned to mf->v1,2,3 or mf->v1,3,4 */
+	
 	float *vCo[4]; /* vertex screenspace coords */
 	
 	float *uv1co, *uv2co, *uv3co; /* for convenience only, these will be assigned to tf->uv[0],1,2 or tf->uv[0],2,3 */
-	float pixelScreenCo[4], pixelScreenCoXMin[4], pixelScreenCoXMax[4];
-	int i, j;
+	float pixelScreenCo[4];
+	int i;
 	
 	/* vars for getting uvspace bounds */
 	float bucket_bounds_uv[4][2]; /* bucket bounds in UV space so we can init pixels only for this face,  */
-	float w[3];
+	
 	int i1,i2,i3;
 	
 	/* scanlines since quads can have 2 triangles intersecting the same vertical location */
@@ -1668,7 +1673,7 @@
 			/* Now create new UV's for the seam face */
 			float (*outset_uv)[2];
 			float insetCos[4][3]; /* inset face coords.  NOTE!!! ScreenSace for ortho, Worldspace in prespective view */
-			float cent[3];
+
 			float *uv_seam_quad[4];
 			float fac;
 			float *vCoSS[4]; /* vertex screenspace coords */
@@ -1994,19 +1999,6 @@
 #endif
 }
 
-static int BLI_linklist_index(struct LinkNode *list, void *ptr)
-{
-	int index;
-	
-	for (index = 0; list; list= list->next, index++) {
-		if (list->link == ptr)
-			return index;
-	}
-	
-	return -1;
-}
-
-
 static void project_paint_begin( ProjectPaintState *ps, short mval[2])
 {	
 	/* Viewport vars */
@@ -2071,14 +2063,17 @@
 		tot_faceSeamUVMem =			sizeof(float) * ps->dm_totface * 8;
 	}
 #endif
-
+	
+	/* BLI_memarena_new uses calloc */
 	ps->projectArena =
 		BLI_memarena_new(	tot_bucketMem +
 							tot_faceListMem +
 							tot_faceSeamFlagMem +
 							tot_faceSeamUVMem +
 							tot_bucketVertFacesMem + (1<<18));
-	//BLI_memarena_use_calloc(ps->projectArena); ?
+	
+	BLI_memarena_use_calloc(ps->projectArena);
+	
 	ps->projectBuckets = (LinkNode **)BLI_memarena_alloc( ps->projectArena, tot_bucketMem);
 	ps->projectFaces= (LinkNode **)BLI_memarena_alloc( ps->projectArena, tot_faceListMem);
 	
@@ -2091,17 +2086,17 @@
 	}
 #endif
 	
-	memset(ps->projectBuckets,		0, tot_bucketMem);
-	memset(ps->projectFaces,		0, tot_faceListMem);
-	memset(ps->projectBucketFlags,	0, tot_bucketFlagMem);
+	// calloced - memset(ps->projectBuckets,		0, tot_bucketMem);
+	// calloced -  memset(ps->projectFaces,		0, tot_faceListMem);
+	// calloced - memset(ps->projectBucketFlags,	0, tot_bucketFlagMem);
 #ifndef PROJ_DEBUG_NOSEAMBLEED
-	memset(ps->projectFaceSeamFlags,0, tot_faceSeamFlagMem);
+	// calloced - memset(ps->projectFaceSeamFlags,0, tot_faceSeamFlagMem);
 	
-	if (ps->projectSeamBleed > 0.0) {
-		memset(ps->projectVertFaces,	0, tot_bucketVertFacesMem);
+	// calloced - if (ps->projectSeamBleed > 0.0) {
+		// calloced - memset(ps->projectVertFaces,	0, tot_bucketVertFacesMem);
 		/* TODO dosnt need zeroing? */
-		memset(ps->projectFaceSeamUVs,	0, tot_faceSeamUVMem);
-	}
+		// calloced - memset(ps->projectFaceSeamUVs,	0, tot_faceSeamUVMem);
+	// calloced - }
 #endif
 	
 	/* Thread stuff */
@@ -2253,11 +2248,12 @@
 	/* build an array of images we use*/
 	ps->projectImages = BLI_memarena_alloc( ps->projectArena, sizeof(Image *) * ps->projectImageTotal);
 	ps->projectImBufs = BLI_memarena_alloc( ps->projectArena, sizeof(ImBuf *) * ps->projectImageTotal);
+	ps->projectPartialRedraws = BLI_memarena_alloc( ps->projectArena, sizeof(ImagePaintPartialRedraw) * ps->projectImageTotal);
+	// calloced - memset(ps->projectPartialRedraws, 0, sizeof(ImagePaintPartialRedraw) * ps->projectImageTotal);
 	
 	for (node= image_LinkList, i=0; node; node= node->next, i++) {
 		ps->projectImages[i] = node->link;
 		ps->projectImages[i]->id.flag &= ~LIB_DOIT;
-		
 		ps->projectImBufs[i] = BKE_image_get_ibuf(ps->projectImages[i], NULL);
 	}
 	/* we have built the array, discard the linked list */
@@ -2329,7 +2325,7 @@
 
 static void imapaint_dirty_region(Image *ima, ImBuf *ibuf, int x, int y, int w, int h)
 {
-	ImBuf *tmpibuf;
+	ImBuf *tmpibuf = NULL;
 	UndoTile *tile;
 	int srcx= 0, srcy= 0, origx, allocsize;
 
@@ -2356,9 +2352,6 @@
 	h = ((y + h - 1) >> IMAPAINT_TILE_BITS);
 	origx = (x >> IMAPAINT_TILE_BITS);
 	y = (y >> IMAPAINT_TILE_BITS);
-
-	tmpibuf= IMB_allocImBuf(IMAPAINT_TILE_SIZE, IMAPAINT_TILE_SIZE, 32,
-	                        IB_rectfloat|IB_rect, 0);
 	
 	for (; y <= h; y++) {
 		for (x=origx; x <= w; x++) {
@@ -2367,6 +2360,9 @@
 					break;
 
 			if(!tile) {
+				if (tmpibuf==NULL)
+					tmpibuf = IMB_allocImBuf(IMAPAINT_TILE_SIZE, IMAPAINT_TILE_SIZE, 32, IB_rectfloat|IB_rect, 0);
+				
 				tile= MEM_callocN(sizeof(UndoTile), "ImaUndoTile");
 				tile->id= ima->id;
 				tile->x= x;
@@ -2385,14 +2381,15 @@
 	}
 
 	ibuf->userflags |= IB_BITMAPDIRTY;
-
-	IMB_freeImBuf(tmpibuf);
+	
+	if (tmpibuf)
+		IMB_freeImBuf(tmpibuf);
 }
 
 static void imapaint_image_update(Image *image, ImBuf *ibuf, short texpaint)
 {
 	if(ibuf->rect_float)
-		imb_freerectImBuf(ibuf); /* force recreate of char rect */
+		imb_freerectImBuf(ibuf); /* force recreate of char rect */ /* TODO - should just update a portion from imapaintpartial! */
 	if(ibuf->mipmap[0])
 		imb_freemipmapImBuf(ibuf);
 
@@ -2778,15 +2775,56 @@
 	return 0;
 }
 
+static void partial_redraw_array_init(ImagePaintPartialRedraw *pr, int tot)
+{
+	while (tot--) {
+		pr->x1 = 10000000;
+		pr->y1 = 10000000;
+		
+		pr->x2 = -1;
+		pr->y2 = -1;
+		
+		pr->enabled = 1;
+		
+		pr++;
+	}
+}
+
+static void partial_redraw_array_merge(ImagePaintPartialRedraw *pr, ImagePaintPartialRedraw *pr_other, int tot)
+{
+	while (tot--) {
+		pr->x1 = MIN2(pr->x1, pr_other->x1);
+		pr->y1 = MIN2(pr->y1, pr_other->y1);
+		

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list