[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [17470] branches/projection-paint/source/ blender/src: * clone tool didnt work when the object was not at the center point.

Campbell Barton ideasman42 at gmail.com
Sat Nov 15 17:20:37 CET 2008


Revision: 17470
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=17470
Author:   campbellbarton
Date:     2008-11-15 17:20:37 +0100 (Sat, 15 Nov 2008)

Log Message:
-----------
* clone tool didnt work when the object was not at the center point.
* added clone button to the paint editbuttons (was only in the image window before)
* ctrl+clicking to set the 3d cursor also sets its depth to the face its over (much more useful when cloning and rotating the view)
* support for painting and cloning for tiled textures (for UV's outside 0-1)
* more consistant veriable names, merged image arrays into a ProjectPaintImage type to be less confusing.

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

Modified: branches/projection-paint/source/blender/src/buttons_editing.c
===================================================================
--- branches/projection-paint/source/blender/src/buttons_editing.c	2008-11-15 12:10:16 UTC (rev 17469)
+++ branches/projection-paint/source/blender/src/buttons_editing.c	2008-11-15 16:20:37 UTC (rev 17470)
@@ -6337,9 +6337,15 @@
 		yco= 160;
 
 		uiBlockBeginAlign(block);
-		uiDefButS(block, ROW, B_BRUSHCHANGE, "Draw",		0  ,yco,108,19, &settings->imapaint.tool, 7.0, PAINT_TOOL_DRAW, 0, 0, "Draw brush");
-		uiDefButS(block, ROW, B_BRUSHCHANGE, "Soften",		108 ,yco,106,19, &settings->imapaint.tool, 7.0, PAINT_TOOL_SOFTEN, 0, 0, "Soften brush");
-		uiDefButS(block, ROW, B_BRUSHCHANGE, "Smear",		214,yco,106,19, &settings->imapaint.tool, 7.0, PAINT_TOOL_SMEAR, 0, 0, "Smear brush");	
+		//uiDefButS(block, ROW, B_BRUSHCHANGE, "Draw",		0  ,yco,108,19, &settings->imapaint.tool, 7.0, PAINT_TOOL_DRAW, 0, 0, "Draw brush");
+		//uiDefButS(block, ROW, B_BRUSHCHANGE, "Soften",		108 ,yco,106,19, &settings->imapaint.tool, 7.0, PAINT_TOOL_SOFTEN, 0, 0, "Soften brush");
+		//uiDefButS(block, ROW, B_BRUSHCHANGE, "Smear",		214,yco,106,19, &settings->imapaint.tool, 7.0, PAINT_TOOL_SMEAR, 0, 0, "Smear brush");	
+		
+		uiDefButS(block, ROW, B_SIMABRUSHCHANGE, "Draw",		0  ,yco,80,19, &settings->imapaint.tool, 7.0, PAINT_TOOL_DRAW, 0, 0, "Draw brush");
+		uiDefButS(block, ROW, B_SIMABRUSHCHANGE, "Soften",		80 ,yco,80,19, &settings->imapaint.tool, 7.0, PAINT_TOOL_SOFTEN, 0, 0, "Soften brush");
+		uiDefButS(block, ROW, B_SIMABRUSHCHANGE, "Smear",		160,yco,80,19, &settings->imapaint.tool, 7.0, PAINT_TOOL_SMEAR, 0, 0, "Smear brush");	
+		uiDefButS(block, ROW, B_SIMABRUSHCHANGE, "Clone",		240,yco,80,19, &settings->imapaint.tool, 7.0, PAINT_TOOL_CLONE, 0, 0, "Clone brush, use RMB to drag source image");	
+		
 		uiBlockEndAlign(block);
 		yco -= 30;
 

Modified: branches/projection-paint/source/blender/src/imagepaint.c
===================================================================
--- branches/projection-paint/source/blender/src/imagepaint.c	2008-11-15 12:10:16 UTC (rev 17469)
+++ branches/projection-paint/source/blender/src/imagepaint.c	2008-11-15 16:20:37 UTC (rev 17470)
@@ -167,11 +167,19 @@
 // #define PROJ_BUCKET_CLONE_INIT	1<<1
 
 /* only for readability */
-#define PROJ_BUCKET_LEFT		0
+#define PROJ_BUCKET_LEFT	0
 #define PROJ_BUCKET_RIGHT	1
 #define PROJ_BUCKET_BOTTOM	2
 #define PROJ_BUCKET_TOP		3
 
+typedef struct ProjectPaintImage {
+	Image *ima;
+	ImBuf *ibuf;
+	ImagePaintPartialRedraw *partRedrawRect;
+	struct UndoTile **undoRect; /* only used to build undo tiles after painting */
+	int touch;
+} ProjectPaintImage;
+
 typedef struct ProjectPaintState {
 	Brush *brush;
 	short tool, blend;
@@ -187,51 +195,49 @@
 	MTFace 		   *dm_mtface;
 	
 	/* projection painting only */
-	MemArena *projectArena;			/* use for alocating many pixel structs and link-lists */
-	MemArena *projectArena_mt[BLENDER_MAX_THREADS];		/* Same as above but use for multithreading */
-	LinkNode **projectBuckets;		/* screen sized 2D array, each pixel has a linked list of ProjectPixel's */
-	LinkNode **projectFaces;		/* projectBuckets alligned array linkList of faces overlapping each bucket */
-	char *projectBucketFlags;		/* store if the bucks have been initialized  */
+	MemArena *arena;			/* use for alocating many pixel structs and link-lists */
+	MemArena *arena_mt[BLENDER_MAX_THREADS];		/* Same as above but use for multithreading */
+	LinkNode **bucketRect;				/* screen sized 2D array, each pixel has a linked list of ProjectPixel's */
+	LinkNode **bucketFaces;				/* bucketRect alligned array linkList of faces overlapping each bucket */
+	char *bucketFlags;					/* store if the bucks have been initialized  */
 #ifndef PROJ_DEBUG_NOSEAMBLEED
-	char *projectFaceSeamFlags;		/* store info about faces, if they are initialized etc*/
-	float (*projectFaceSeamUVs)[4][2];	/* expanded UVs for faces to use as seams */
-	LinkNode **projectVertFaces;	/* Only needed for when projectSeamBleed is enabled, use to find UV seams */
+	char *faceSeamFlags;				/* store info about faces, if they are initialized etc*/
+	float (*faceSeamUVs)[4][2];			/* expanded UVs for faces to use as seams */
+	LinkNode **vertFaces;				/* Only needed for when seam_bleed_px is enabled, use to find UV seams */
 #endif
-	int bucketsX;					/* The size of the bucket grid, the grid span's viewMin2D/viewMax2D so you can paint outsize the screen or with 2 brushes at once */
-	int bucketsY;
+	int buckets_x;						/* The size of the bucket grid, the grid span's screen_min/screen_max so you can paint outsize the screen or with 2 brushes at once */
+	int buckets_y;
 	
-	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[PROJ_BOUNDBOX_SQUARED];	/* array of partial redraws */
+	ProjectPaintImage *projImages;
 	
-	int projectImageTotal;			/* size of projectImages array */
+	int image_tot;				/* size of projectImages array */
 	
-	float (*projectVertScreenCos)[4];	/* verts projected into floating point screen space */
+	float (*screenCoords)[4];	/* verts projected into floating point screen space */
 	
 	/* options for projection painting */
-	short projectIsOcclude;			/* Use raytraced occlusion? - ortherwise will paint right through to the back*/
-	short projectIsBackfaceCull;	/* ignore faces with normals pointing away, skips a lot of raycasts if your normals are correctly flipped */
-	short projectIsOrtho;
+	short do_occlude;			/* Use raytraced occlusion? - ortherwise will paint right through to the back*/
+	short do_backfacecull;	/* ignore faces with normals pointing away, skips a lot of raycasts if your normals are correctly flipped */
+	short is_ortho;
 #ifndef PROJ_DEBUG_NOSEAMBLEED
-	float projectSeamBleed;
+	float seam_bleed_px;
 #endif
 	/* clone vars */
-	float cloneOfs[2];
+	float clone_offset[2];
 	
 	
 	float projectMat[4][4];		/* Projection matrix, use for getting screen coords */
 	float viewMat[4][4];
-	float viewDir[3];			/* View vector, use for projectIsBackfaceCull and for ray casting with an ortho viewport  */
+	float viewDir[3];			/* View vector, use for do_backfacecull and for ray casting with an ortho viewport  */
 	
-	float viewMin2D[2];			/* 2D bounds for mesh verts on the screen's plane (screenspace) */
-	float viewMax2D[2]; 
-	float viewWidth;			/* Calculated from viewMin2D & viewMax2D */
-	float viewHeight;
+	float screen_min[2];			/* 2D bounds for mesh verts on the screen's plane (screenspace) */
+	float screen_max[2]; 
+	float screen_width;			/* Calculated from screen_min & screen_max */
+	float screen_height;
 	
 	/* threads */
 	int thread_tot;
-	int min_bucket[2];
-	int max_bucket[2];
+	int bucket_min[2];
+	int bucket_max[2];
 	int context_bucket_x, context_bucket_y; /* must lock threads while accessing these */
 } ProjectPaintState;
 
@@ -294,8 +300,11 @@
 	IMB_rectcpy(tmpibuf, ibuf, 0, 0, tile->x*IMAPAINT_TILE_SIZE,
 		tile->y*IMAPAINT_TILE_SIZE, IMAPAINT_TILE_SIZE, IMAPAINT_TILE_SIZE);
 
-	if(ibuf->rect_float) SWAP(void*, tmpibuf->rect_float, tile->rect)
-	else SWAP(void*, tmpibuf->rect, tile->rect)
+	if(ibuf->rect_float) {
+		SWAP(void*, tmpibuf->rect_float, tile->rect);
+	} else {
+		SWAP(void*, tmpibuf->rect, tile->rect);
+	}
 	
 	if(restore)
 		IMB_rectcpy(ibuf, tmpibuf, tile->x*IMAPAINT_TILE_SIZE,
@@ -443,24 +452,24 @@
 static int project_paint_BucketOffset(ProjectPaintState *ps, float projCo2D[2])
 {
 	/* If we were not dealing with screenspace 2D coords we could simple do...
-	 * ps->projectBuckets[x + (y*ps->bucketsY)] */
+	 * ps->bucketRect[x + (y*ps->buckets_y)] */
 	
 	/* please explain?
-	 * projCo2D[0] - ps->viewMin2D[0]	: zero origin
-	 * ... / ps->viewWidth				: range from 0.0 to 1.0
-	 * ... * ps->bucketsX		: use as a bucket index
+	 * projCo2D[0] - ps->screen_min[0]	: zero origin
+	 * ... / ps->screen_width				: range from 0.0 to 1.0
+	 * ... * ps->buckets_x		: use as a bucket index
 	 *
 	 * Second multiplication does similar but for vertical offset
 	 */
-	return	(	(int)(( (projCo2D[0] - ps->viewMin2D[0]) / ps->viewWidth)  * ps->bucketsX)) + 
-		(	(	(int)(( (projCo2D[1] - ps->viewMin2D[1])  / ps->viewHeight) * ps->bucketsY)) * ps->bucketsX );
+	return	(	(int)(( (projCo2D[0] - ps->screen_min[0]) / ps->screen_width)  * ps->buckets_x)) + 
+		(	(	(int)(( (projCo2D[1] - ps->screen_min[1])  / ps->screen_height) * ps->buckets_y)) * ps->buckets_x );
 }
 
 static int project_paint_BucketOffsetSafe(ProjectPaintState *ps, float projCo2D[2])
 {
 	int bucket_index = project_paint_BucketOffset(ps, projCo2D);
 	
-	if (bucket_index < 0 || bucket_index >= ps->bucketsX*ps->bucketsY) {	
+	if (bucket_index < 0 || bucket_index >= ps->buckets_x*ps->buckets_y) {	
 		return -1;
 	} else {
 		return bucket_index;
@@ -479,7 +488,6 @@
 		w[1]/=wtot;
 		w[2]/=wtot;
 	} else {
-		printf("WATCH oUT ZAREA FACE\n");
 		w[0] = w[1] = w[2] = 1.0/3.0; /* dummy values for zero area face */
 	}
 }
@@ -548,7 +556,7 @@
 
 /* return the topmost face  in screen coords index or -1
  * bucket_index can be -1 if we dont know it to begin with */
-static int screenco_pickface(ProjectPaintState *ps, float pt[2], float w[3], int *side) {
+static int project_paint_PickFace(ProjectPaintState *ps, float pt[2], float w[3], int *side) {
 	LinkNode *node;
 	float w_tmp[3];
 	float *v1, *v2, *v3, *v4;
@@ -563,7 +571,7 @@
 	if (bucket_index==-1)
 		return -1;
 	
-	node = ps->projectFaces[bucket_index];
+	node = ps->bucketFaces[bucket_index];
 	
 	/* we could return 0 for 1 face buckets, as long as this function assumes
 	 * that the point its testing is only every originated from an existing face */
@@ -572,9 +580,9 @@
 		face_index = (int)node->link;
 		mf = ps->dm_mface + face_index;
 		
-		v1 = ps->projectVertScreenCos[mf->v1];
-		v2 = ps->projectVertScreenCos[mf->v2];
-		v3 = ps->projectVertScreenCos[mf->v3];
+		v1 = ps->screenCoords[mf->v1];
+		v2 = ps->screenCoords[mf->v2];
+		v3 = ps->screenCoords[mf->v3];
 		
 		if ( IsectPT2Df(pt, v1, v2, v3) ) {
 			z_depth = tri_depth_2d(v1,v2,v3,pt,w_tmp);
@@ -585,7 +593,7 @@
 				VECCOPY(w, w_tmp);
 			}
 		} else if (mf->v4) {
-			v4 = ps->projectVertScreenCos[mf->v4];
+			v4 = ps->screenCoords[mf->v4];
 			
 			if ( IsectPT2Df(pt, v1, v3, v4) ) {

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list