[Bf-blender-cvs] [8eb8aa49397] blender2.8: Merge branch 'master' into blender2.8

Campbell Barton noreply at git.blender.org
Fri Mar 23 12:06:35 CET 2018


Commit: 8eb8aa49397fb038ffa98dbe5dc4aed86e7b3e94
Author: Campbell Barton
Date:   Fri Mar 23 12:05:55 2018 +0100
Branches: blender2.8
https://developer.blender.org/rB8eb8aa49397fb038ffa98dbe5dc4aed86e7b3e94

Merge branch 'master' into blender2.8

===================================================================



===================================================================

diff --cc source/blender/blenloader/intern/readfile.c
index ac1e20d1e84,e85af67b105..2b2dbb8a53b
--- a/source/blender/blenloader/intern/readfile.c
+++ b/source/blender/blenloader/intern/readfile.c
@@@ -8406,9 -8104,8 +8406,9 @@@ static const char *dataname(short id_co
  		case ID_WO: return "Data from WO";
  		case ID_SCR: return "Data from SCR";
  		case ID_VF: return "Data from VF";
- 		case ID_TXT	: return "Data from TXT";
+ 		case ID_TXT: return "Data from TXT";
  		case ID_SPK: return "Data from SPK";
 +		case ID_LP: return "Data from LP";
  		case ID_SO: return "Data from SO";
  		case ID_NT: return "Data from NT";
  		case ID_BR: return "Data from BR";
diff --cc source/blender/editors/physics/dynamicpaint_ops.c
index e068b898345,86db76bfcd6..6360e6281c8
--- a/source/blender/editors/physics/dynamicpaint_ops.c
+++ b/source/blender/editors/physics/dynamicpaint_ops.c
@@@ -365,9 -357,9 +365,9 @@@ static void dynamicPaint_bakeImageSeque
  	frame = surface->start_frame;
  	orig_frame = scene->r.cfra;
  	scene->r.cfra = (int)frame;
 -	ED_update_for_newframe(job->bmain, scene, 1);
 +	ED_update_for_newframe(job->bmain, scene, job->view_layer, job->depsgraph);
  
- 	/* Init surface	*/
+ 	/* Init surface */
  	if (!dynamicPaint_createUVSurface(scene, surface, job->progress, job->do_update)) {
  		job->success = 0;
  		return;
diff --cc source/blender/editors/sculpt_paint/paint_image.c
index 969bf8f37b1,c6472b258ca..b7cbdfecfe8
--- a/source/blender/editors/sculpt_paint/paint_image.c
+++ b/source/blender/editors/sculpt_paint/paint_image.c
@@@ -52,9 -51,9 +51,8 @@@
  
  #include "BKE_colorband.h"
  #include "BKE_context.h"
 -#include "BKE_depsgraph.h"
  #include "BKE_DerivedMesh.h"
  #include "BKE_brush.h"
- #include "BKE_image.h"
  #include "BKE_main.h"
  #include "BKE_material.h"
  #include "BKE_node.h"
diff --cc source/blender/editors/sculpt_paint/paint_image_proj.c
index 21612339eb5,60fe8555ba2..58c03330256
--- a/source/blender/editors/sculpt_paint/paint_image_proj.c
+++ b/source/blender/editors/sculpt_paint/paint_image_proj.c
@@@ -5396,11 -5384,10 +5396,10 @@@ static int texture_paint_camera_project
  
  	scene->toolsettings->imapaint.flag |= IMAGEPAINT_DRAWING;
  
- 	ED_undo_paint_push_begin(UNDO_PAINT_IMAGE, op->type->name,
- 	                         ED_image_undo_restore, ED_image_undo_free, NULL);
+ 	ED_image_undo_push_begin(op->type->name);
  
  	/* allocate and initialize spatial data structures */
 -	project_paint_begin(&ps, false, 0);
 +	project_paint_begin(C, &ps, false, 0);
  
  	if (ps.dm == NULL) {
  		BKE_brush_size_set(scene, ps.brush, orig_brush_size);
diff --cc source/blender/editors/sculpt_paint/paint_image_undo.c
index 00000000000,b5b64eb3e16..d080c324d6c
mode 000000,100644..100644
--- a/source/blender/editors/sculpt_paint/paint_image_undo.c
+++ b/source/blender/editors/sculpt_paint/paint_image_undo.c
@@@ -1,0 -1,395 +1,396 @@@
+ /*
+  * ***** BEGIN GPL LICENSE BLOCK *****
+  *
+  * This program is free software; you can redistribute it and/or
+  * modify it under the terms of the GNU General Public License
+  * as published by the Free Software Foundation; either version 2
+  * of the License, or (at your option) any later version.
+  *
+  * This program is distributed in the hope that it will be useful,
+  * but WITHOUT ANY WARRANTY; without even the implied warranty of
+  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+  * GNU General Public License for more details.
+  *
+  * along with this program; if not, write to the Free Software Foundation,
+  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+  *
+  * ***** END GPL LICENSE BLOCK *****
+  */
+ 
+ /** \file blender/editors/sculpt_paint/paint_image_undo.c
+  *  \ingroup edsculpt
+  */
+ 
+ #include "MEM_guardedalloc.h"
+ 
+ #include "BLI_math.h"
+ #include "BLI_blenlib.h"
+ #include "BLI_utildefines.h"
+ #include "BLI_threads.h"
+ 
+ #include "DNA_image_types.h"
+ 
+ #include "IMB_imbuf.h"
+ #include "IMB_imbuf_types.h"
+ 
+ #include "BKE_context.h"
 -#include "BKE_depsgraph.h"
+ #include "BKE_image.h"
+ #include "BKE_main.h"
+ 
++#include "DEG_depsgraph.h"
++
+ #include "ED_paint.h"
+ 
+ #include "GPU_draw.h"
+ 
+ #include "paint_intern.h"
+ 
+ typedef struct UndoImageTile {
+ 	struct UndoImageTile *next, *prev;
+ 
+ 	char idname[MAX_ID_NAME];  /* name instead of pointer*/
+ 	char ibufname[IMB_FILENAME_SIZE];
+ 
+ 	union {
+ 		float        *fp;
+ 		unsigned int *uint;
+ 		void         *pt;
+ 	} rect;
+ 
+ 	unsigned short *mask;
+ 
+ 	int x, y;
+ 
+ 	Image *ima;
+ 	short source, use_float;
+ 	char gen_type;
+ 	bool valid;
+ } UndoImageTile;
+ 
+ /* this is a static resource for non-globality,
+  * Maybe it should be exposed as part of the
+  * paint operation, but for now just give a public interface */
+ static SpinLock undolock;
+ 
+ void image_undo_init_locks(void)
+ {
+ 	BLI_spin_init(&undolock);
+ }
+ 
+ void image_undo_end_locks(void)
+ {
+ 	BLI_spin_end(&undolock);
+ }
+ 
+ /* UNDO */
+ typedef enum {
+ 	COPY = 0,
+ 	RESTORE = 1,
+ 	RESTORE_COPY = 2
+ } CopyMode;
+ 
+ static void undo_copy_tile(UndoImageTile *tile, ImBuf *tmpibuf, ImBuf *ibuf, CopyMode mode)
+ {
+ 	if (mode == COPY) {
+ 		/* copy or swap contents of tile->rect and region in ibuf->rect */
+ 		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(float *, tmpibuf->rect_float, tile->rect.fp);
+ 		}
+ 		else {
+ 			SWAP(unsigned int *, tmpibuf->rect, tile->rect.uint);
+ 		}
+ 	}
+ 	else {
+ 		if (mode == RESTORE_COPY) {
+ 			IMB_rectcpy(tmpibuf, ibuf, 0, 0, tile->x * IMAPAINT_TILE_SIZE,
+ 			            tile->y * IMAPAINT_TILE_SIZE, IMAPAINT_TILE_SIZE, IMAPAINT_TILE_SIZE);
+ 		}
+ 		/* swap to the tmpbuf for easy copying */
+ 		if (ibuf->rect_float) {
+ 			SWAP(float *, tmpibuf->rect_float, tile->rect.fp);
+ 		}
+ 		else {
+ 			SWAP(unsigned int *, tmpibuf->rect, tile->rect.uint);
+ 		}
+ 
+ 		IMB_rectcpy(ibuf, tmpibuf, tile->x * IMAPAINT_TILE_SIZE,
+ 		            tile->y * IMAPAINT_TILE_SIZE, 0, 0, IMAPAINT_TILE_SIZE, IMAPAINT_TILE_SIZE);
+ 
+ 		if (mode == RESTORE) {
+ 			if (ibuf->rect_float) {
+ 				SWAP(float *, tmpibuf->rect_float, tile->rect.fp);
+ 			}
+ 			else {
+ 				SWAP(unsigned int *, tmpibuf->rect, tile->rect.uint);
+ 			}
+ 		}
+ 	}
+ }
+ 
+ void *image_undo_find_tile(Image *ima, ImBuf *ibuf, int x_tile, int y_tile, unsigned short **mask, bool validate)
+ {
+ 	ListBase *lb = undo_paint_push_get_list(UNDO_PAINT_IMAGE);
+ 	UndoImageTile *tile;
+ 	short use_float = ibuf->rect_float ? 1 : 0;
+ 
+ 	for (tile = lb->first; tile; tile = tile->next) {
+ 		if (tile->x == x_tile && tile->y == y_tile && ima->gen_type == tile->gen_type && ima->source == tile->source) {
+ 			if (tile->use_float == use_float) {
+ 				if (STREQ(tile->idname, ima->id.name) && STREQ(tile->ibufname, ibuf->name)) {
+ 					if (mask) {
+ 						/* allocate mask if requested */
+ 						if (!tile->mask) {
+ 							tile->mask = MEM_callocN(sizeof(unsigned short) * IMAPAINT_TILE_SIZE * IMAPAINT_TILE_SIZE,
+ 							                         "UndoImageTile.mask");
+ 						}
+ 
+ 						*mask = tile->mask;
+ 					}
+ 					if (validate) {
+ 						tile->valid = true;
+ 					}
+ 					return tile->rect.pt;
+ 				}
+ 			}
+ 		}
+ 	}
+ 
+ 	return NULL;
+ }
+ 
+ void *image_undo_push_tile(
+         Image *ima, ImBuf *ibuf, ImBuf **tmpibuf, int x_tile, int y_tile,
+         unsigned short **mask, bool **valid, bool proj, bool find_prev)
+ {
+ 	ListBase *lb = undo_paint_push_get_list(UNDO_PAINT_IMAGE);
+ 	UndoImageTile *tile;
+ 	int allocsize;
+ 	short use_float = ibuf->rect_float ? 1 : 0;
+ 	void *data;
+ 
+ 	/* check if tile is already pushed */
+ 
+ 	/* in projective painting we keep accounting of tiles, so if we need one pushed, just push! */
+ 	if (find_prev) {
+ 		data = image_undo_find_tile(ima, ibuf, x_tile, y_tile, mask, true);
+ 		if (data) {
+ 			return data;
+ 		}
+ 	}
+ 
+ 	if (*tmpibuf == NULL) {
+ 		*tmpibuf = IMB_allocImBuf(IMAPAINT_TILE_SIZE, IMAPAINT_TILE_SIZE, 32, IB_rectfloat | IB_rect);
+ 	}
+ 
+ 	tile = MEM_callocN(sizeof(UndoImageTile), "UndoImageTile");
+ 	BLI_strncpy(tile->idname, ima->id.name, sizeof(tile->idname));
+ 	tile->x = x_tile;
+ 	tile->y = y_tile;
+ 
+ 	/* add mask explicitly here */
+ 	if (mask) {
+ 		*mask = tile->mask = MEM_callocN(sizeof(unsigned short) * IMAPAINT_TILE_SIZE * IMAPAINT_TILE_SIZE,
+ 		                         "UndoImageTile.mask");
+ 	}
+ 	allocsize = IMAPAINT_TILE_SIZE * IMAPAINT_TILE_SIZE * 4;
+ 	allocsize *= (ibuf->rect_float) ? sizeof(float) : sizeof(char);
+ 	tile->rect.pt = MEM_mapallocN(allocsize, "UndeImageTile.rect");
+ 
+ 	BLI_strncpy(tile->ibufname, ibuf->name, sizeof(tile->ibufname));
+ 
+ 	tile->gen_type = ima->gen_type;
+ 	tile->source = ima->source;
+ 	tile->use_float = use_float;
+ 	tile->valid = true;
+ 	tile->ima = ima;
+ 
+ 	if (valid) {
+ 		*valid = &tile->valid;
+ 	}
+ 	undo_copy_tile(tile, *tmpibuf, ibuf, COPY);
+ 
+ 	if (proj) {
+ 		BLI_spin_lock(&undolock);
+ 	}
+ 	undo_paint_push_count_alloc(UNDO_PAINT_IMAGE, allocsize);
+ 	BLI_addtail(lb, tile);
+ 
+ 	if (proj) {
+ 		BLI_spin_unlock(&undolock);
+ 	}
+ 	return tile->rect.pt;
+ }
+ 
+ void image_undo_remove_masks(void)
+ {
+ 	ListBase *lb = undo_paint_push_get_list(UNDO_PAINT_IMAGE);
+ 	UndoImageTile *tile;
+ 
+ 	for (tile = lb->first; tile; tile = tile->next) {
+ 		if (tile->mask) {
+ 			MEM_freeN(tile->mask);
+ 			tile->mask = NULL;
+ 		}
+ 	}
+ }
+ 
+ static void image_undo_restore_runtime(ListBase *lb)
+ {
+ 	ImBuf *ibuf, *tmpibuf;
+ 	UndoImageTile *tile;
+ 
+ 	tmpibuf = IMB_allocImBuf(IMAPAINT_TILE_SIZE, IMAPAINT_TILE_SIZE, 32,
+ 	                         IB_rectfloat | IB_rect);
+ 
+ 	for (tile = lb->first; tile; tile = tile->next) {
+ 		Image *ima = tile->ima;
+ 		ibuf = BKE_image_acquire_ibuf(ima, NULL, NULL);
+ 
+ 		undo_copy_tile(tile, tmpibuf, ibuf, RESTORE);
+ 
+ 		GPU_free_image(ima); /* force OpenGL reload (maybe partial update will operate better?) */
+ 		if (ibuf->rect_float) {
+ 			ibuf->userflags |= IB_RECT_INVALID; /* force recreate of char rect */
+ 		}
+ 		if (ibuf->mipmap[0]) {
+ 			ibuf->userflags |= IB_MIPMAP_INVALID;  

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list