[Bf-blender-cvs] [27b23c3] cycles-ptex-49: Avoid creating new images on Ptex resolution change

Nicholas Bishop noreply at git.blender.org
Tue Feb 10 18:38:36 CET 2015


Commit: 27b23c326e7dce6750cd45f79966ce5a200da3a5
Author: Nicholas Bishop
Date:   Tue Feb 10 18:29:28 2015 +0100
Branches: cycles-ptex-49
https://developer.blender.org/rB27b23c326e7dce6750cd45f79966ce5a200da3a5

Avoid creating new images on Ptex resolution change

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

M	source/blender/blenkernel/intern/bke_ptex.c
M	source/blender/editors/mesh/mesh_data.c

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

diff --git a/source/blender/blenkernel/intern/bke_ptex.c b/source/blender/blenkernel/intern/bke_ptex.c
index 88b8489..a6647c4 100644
--- a/source/blender/blenkernel/intern/bke_ptex.c
+++ b/source/blender/blenkernel/intern/bke_ptex.c
@@ -580,10 +580,13 @@ static BPXImageBuf *bpx_image_buf_wrap_loop_ptex(MLoopPtex *loop_ptex)
 }
 
 /* TODO(nicholasbishop): sync up with code in imb_ptex.c */
-static bool ptex_pack_loops(Image **image, Mesh *me, MLoopPtex *loop_ptex,
+/* TODO(nicholasbishop): should function apart, Image stuff really is
+ * separate from the packing stuff */
+static bool ptex_pack_loops(Image **image_r, Mesh *me, MLoopPtex *loop_ptex,
 							const char *layer_name)
 {
 	BPXImageBuf *bpx_dst;
+	Image *image;
 	const int num_loops = me->totloop;
 	struct BPXPackedLayout *layout = NULL;
 	struct ImBuf *ibuf;
@@ -591,7 +594,7 @@ static bool ptex_pack_loops(Image **image, Mesh *me, MLoopPtex *loop_ptex,
 	BPXTypeDesc type_desc;
 	int i;
 
-	if (!image) {
+	if (!image_r) {
 		return false;
 	}
 
@@ -654,52 +657,56 @@ static bool ptex_pack_loops(Image **image, Mesh *me, MLoopPtex *loop_ptex,
 	// TODO
 	IMB_float_from_rect(ibuf);
 
-	(*image) = BKE_image_add_from_imbuf(ibuf);
-	
-	/* Image now owns the ImBuf */
-	IMB_freeImBuf(ibuf);
-
-	if (*image) {
-		ID *id = &(*image)->id;
-		rename_id(id, layer_name);
-		id_us_min(id);
-		return true;
+	image = *image_r;
+	if (image) {
+		BKE_image_free_buffers(image);
+		BKE_image_assign_ibuf(image, ibuf);
 	}
 	else {
-		return false;
+		image = BKE_image_add_from_imbuf(ibuf);
+
+		rename_id(&image->id, layer_name);
+		id_us_min(&image->id);
+
+		(*image_r) = image;
 	}
+
+	/* Image now owns the ImBuf */
+	IMB_freeImBuf(ibuf);
+
+	return image != NULL;
 }
 
 Image *BKE_ptex_mesh_image_get(struct Object *ob,
 							   const char layer_name[MAX_CUSTOMDATA_LAYER_NAME])
 {
 	Mesh *me = BKE_mesh_from_object(ob);
-	if (me) {
-		MLoopPtex *loop_ptex = CustomData_get_layer_named(&me->ldata,
-														  CD_LOOP_PTEX,
-														  layer_name);
-		if (loop_ptex) {
-			// TODO
-			if (!loop_ptex->image) {
-				// TODO
-				const bool r = ptex_pack_loops(&loop_ptex->image, me,
-											   loop_ptex, layer_name);
-				BLI_assert(r);
-			}
-			else if (loop_ptex->image->tpageflag & IMA_TPAGE_REFRESH) {
-				//mesh_ptex_pack_textures_free(loop_ptex->pack);
-				loop_ptex->image->tpageflag &= ~IMA_TPAGE_REFRESH;
-			}
-			// TODO
+	MLoopPtex *loop_ptex;
+	if (!me) {
+		return NULL;
+	}
 
-			/* if (!loop_ptex->pack->mapping_texture) { */
-			/* 	mesh_ptex_pack_update_textures(loop_ptex->pack); */
-			/* } */
+	loop_ptex = CustomData_get_layer_named(&me->ldata, CD_LOOP_PTEX,
+										   layer_name);
+	if (!loop_ptex) {
+		return NULL;
+	}
 
-			return loop_ptex->image;
-		}
+	if (!loop_ptex->image ||
+		!BKE_image_has_ibuf(loop_ptex->image, NULL))
+	{
+		// TODO
+		const bool r = ptex_pack_loops(&loop_ptex->image, me,
+									   loop_ptex, layer_name);
+		BLI_assert(r);
 	}
-	return NULL;
+	// TODO
+	else if (loop_ptex->image->tpageflag & IMA_TPAGE_REFRESH) {
+		//mesh_ptex_pack_textures_free(loop_ptex->pack);
+		loop_ptex->image->tpageflag &= ~IMA_TPAGE_REFRESH;
+	}
+
+	return loop_ptex->image;
 }
 
 MPtexDataType BKE_ptex_texel_data_type(const MPtexTexelInfo texel_info)
diff --git a/source/blender/editors/mesh/mesh_data.c b/source/blender/editors/mesh/mesh_data.c
index 90dcff7..424b30c 100644
--- a/source/blender/editors/mesh/mesh_data.c
+++ b/source/blender/editors/mesh/mesh_data.c
@@ -876,10 +876,12 @@ static int mesh_ptex_res_change_exec(bContext *C, wmOperator *op)
 {
 	Object *ob = ED_object_context(C);
 	Mesh *me = ob->data;
-	int i;
-
-	MLoopPtex *loop_ptex = CustomData_get_layer(&me->ldata, CD_LOOP_PTEX);
+	const int layer_offset = CustomData_get_active_layer(&me->ldata,
+														 CD_LOOP_PTEX);
+	MLoopPtex *loop_ptex = CustomData_get_layer_n(&me->ldata, CD_LOOP_PTEX,
+												  layer_offset);
 	const PtexResChangeMode mode = RNA_enum_get(op->ptr, "mode");
+	int i;
 
 	for (i = 0; i < me->totpoly; i++) {
 		const MPoly *poly = &me->mpoly[i];
@@ -901,8 +903,7 @@ static int mesh_ptex_res_change_exec(bContext *C, wmOperator *op)
 		}
 	}
 
-	/* TODO, not sure how this will look yet */
-	loop_ptex[0].image = NULL;
+	BKE_ptex_image_mark_for_update(me, layer_offset);
 
 	DAG_id_tag_update(&me->id, 0);
 	WM_main_add_notifier(NC_GEOM | ND_DATA, me);




More information about the Bf-blender-cvs mailing list