[Bf-blender-cvs] [ec81d2b] soc-2013-paint: * Correct icon for strength space attenuation. * Finish data ensurance code for texture paint. On entering projective texture paint mode, a uv layer, material and diffuse slot will be generated to paint on if they are missing.

Antony Riakiotakis noreply at git.blender.org
Wed Mar 12 17:22:23 CET 2014


Commit: ec81d2bd1d0c382b239251ac068512b71d1b30de
Author: Antony Riakiotakis
Date:   Wed Mar 12 14:47:28 2014 +0200
https://developer.blender.org/rBec81d2bd1d0c382b239251ac068512b71d1b30de

* Correct icon for strength space attenuation.
* Finish data ensurance code for texture paint. On entering projective texture
paint mode, a uv layer, material and diffuse slot will be generated to paint
on if they are missing.

I am not totally happy with how the paint images are cached on the material.
It may be better to store in a per object paint session or toolsetting imapaint
struct. Still this works.

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

M	release/scripts/startup/bl_ui/space_image.py
M	release/scripts/startup/bl_ui/space_view3d_toolbar.py
M	source/blender/blenkernel/BKE_blender.h
M	source/blender/blenkernel/intern/material.c
M	source/blender/blenloader/intern/versioning_270.c
M	source/blender/editors/sculpt_paint/paint_image.c
M	source/blender/editors/sculpt_paint/paint_image_proj.c
M	source/blender/editors/sculpt_paint/paint_intern.h
M	source/blender/editors/sculpt_paint/paint_ops.c
M	source/blender/makesdna/DNA_scene_types.h
M	source/blender/makesrna/intern/rna_sculpt_paint.c

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

diff --git a/release/scripts/startup/bl_ui/space_image.py b/release/scripts/startup/bl_ui/space_image.py
index 69852ae..c21b737 100644
--- a/release/scripts/startup/bl_ui/space_image.py
+++ b/release/scripts/startup/bl_ui/space_image.py
@@ -763,10 +763,7 @@ class IMAGE_PT_paint(Panel, ImagePaintPanel):
             row = col.row(align=True)
 
             if capabilities.has_space_attenuation:
-                if brush.use_space_attenuation:
-                    row.prop(brush, "use_space_attenuation", toggle=True, text="", icon='LOCKED')
-                else:
-                    row.prop(brush, "use_space_attenuation", toggle=True, text="", icon='UNLOCKED')
+                row.prop(brush, "use_space_attenuation", toggle=True, icon_only=True)
 
             self.prop_unified_strength(row, context, brush, "strength", slider=True, text="Strength")
             self.prop_unified_strength(row, context, brush, "use_pressure_strength")
diff --git a/release/scripts/startup/bl_ui/space_view3d_toolbar.py b/release/scripts/startup/bl_ui/space_view3d_toolbar.py
index 518dfcd..b97f950 100644
--- a/release/scripts/startup/bl_ui/space_view3d_toolbar.py
+++ b/release/scripts/startup/bl_ui/space_view3d_toolbar.py
@@ -955,10 +955,7 @@ class VIEW3D_PT_tools_brush(Panel, View3DPaintPanel):
             row = col.row(align=True)
             
             if capabilities.has_space_attenuation:
-                if brush.use_space_attenuation:
-                    row.prop(brush, "use_space_attenuation", toggle=True, text="", icon='LOCKED')
-                else:
-                    row.prop(brush, "use_space_attenuation", toggle=True, text="", icon='UNLOCKED')
+                row.prop(brush, "use_space_attenuation", toggle=True, icon_only=True)
 
             self.prop_unified_strength(row, context, brush, "strength", text="Strength")
             self.prop_unified_strength(row, context, brush, "use_pressure_strength")
@@ -1057,11 +1054,11 @@ class VIEW3D_PT_layers_projectpaint(View3DPanel, Panel):
             col.template_list("TEXTURE_UL_texpaintslots", "", mat, "texture_paint_slots", mat, "active_paint_texture_index", rows=2)
             #col.label("Only slots with UV mapping and image textures are available")
             
-            col.operator_menu_enum("paint.add_layer", "type")
+            col.operator_menu_enum("paint.add_texture_paint_slot", "type")
         
         row = col.row(align=True)
-        row.prop(settings, "new_layer_xresolution")
-        row.prop(settings, "new_layer_yresolution")
+        row.prop(settings, "new_slot_xresolution")
+        row.prop(settings, "new_slot_yresolution")
 
 
 class VIEW3D_PT_tools_brush_overlay(Panel, View3DPaintPanel):
diff --git a/source/blender/blenkernel/BKE_blender.h b/source/blender/blenkernel/BKE_blender.h
index 415a912..3eb2fab 100644
--- a/source/blender/blenkernel/BKE_blender.h
+++ b/source/blender/blenkernel/BKE_blender.h
@@ -42,7 +42,7 @@ extern "C" {
  * and keep comment above the defines.
  * Use STRINGIFY() rather than defining with quotes */
 #define BLENDER_VERSION         270
-#define BLENDER_SUBVERSION      0
+#define BLENDER_SUBVERSION      1
 /* 262 was the last editmesh release but it has compatibility code for bmesh data */
 #define BLENDER_MINVERSION      262
 #define BLENDER_MINSUBVERSION   0
diff --git a/source/blender/blenkernel/intern/material.c b/source/blender/blenkernel/intern/material.c
index 85ba444..9ee2c83 100644
--- a/source/blender/blenkernel/intern/material.c
+++ b/source/blender/blenkernel/intern/material.c
@@ -1306,6 +1306,8 @@ void refresh_texpaint_image_cache(Material *ma)
 	if (!ma)
 		return;
 
+	ma->texpaintima = NULL;
+
 	for(mtex = ma->mtex; i < MAX_MTEX; i++, mtex++) {
 		if (get_mtex_slot_valid_texpaint(*mtex)) {
 			if (index++ == ma->texactpaint) {
diff --git a/source/blender/blenloader/intern/versioning_270.c b/source/blender/blenloader/intern/versioning_270.c
index 30d8bf4..6ddd0d2 100644
--- a/source/blender/blenloader/intern/versioning_270.c
+++ b/source/blender/blenloader/intern/versioning_270.c
@@ -109,4 +109,12 @@ void blo_do_versions_270(FileData *fd, Library *UNUSED(lib), Main *main)
 			}
 		}
 	}
+
+	if (!MAIN_VERSION_ATLEAST(main, 270, 1)) {
+		Scene *sce;
+		for (sce = main->scene.first; sce; sce = sce->id.next) {
+			sce->toolsettings->imapaint.new_slot_xresolution = 1024;
+			sce->toolsettings->imapaint.new_slot_yresolution = 1024;
+		}
+	}
 }
diff --git a/source/blender/editors/sculpt_paint/paint_image.c b/source/blender/editors/sculpt_paint/paint_image.c
index de53186..5f6cdb9 100644
--- a/source/blender/editors/sculpt_paint/paint_image.c
+++ b/source/blender/editors/sculpt_paint/paint_image.c
@@ -1388,13 +1388,61 @@ static int texture_paint_toggle_poll(bContext *C)
 	return 1;
 }
 
+
+/* Make sure that active object has a material, and assign UVs and image layers (TODO) if they do not exist */
+void paint_proj_mesh_data_ensure(bContext *C, Object *ob)
+{
+	Mesh *me;
+	int layernum;
+	bool add_material = false;
+
+	/* no material, add one */
+	if (ob->totcol == 0) {
+		add_material = true;
+	}
+	else {
+		/* there may be material slots but they may be empty, check */
+		bool has_material = false;
+		int i;
+
+		for (i = 1; i < ob->totcol + 1; i++) {
+			Material *ma = give_current_material(ob, i);
+			if (ma) {
+				has_material = true;
+				refresh_texpaint_image_cache(ma);
+				if (!ma->texpaintima) {
+					proj_paint_add_slot(C, MAP_COL, ma);
+					refresh_texpaint_image_cache(ma);
+				}
+			}
+		}
+
+		if (!has_material)
+			add_material = true;
+	}
+
+	if (add_material) {
+		Material *ma = BKE_material_add(CTX_data_main(C), "Material");
+		/* no material found, just assign to first slot */
+		assign_material(ob, ma, 1, BKE_MAT_ASSIGN_USERPREF);
+		proj_paint_add_slot(C, MAP_COL, ma);
+		refresh_texpaint_image_cache(ma);
+	}
+
+	me = BKE_mesh_from_object(ob);
+	layernum = CustomData_number_of_layers(&me->pdata, CD_MTEXPOLY);
+
+	if (layernum == 0) {
+		ED_mesh_uv_texture_add(me, "UVMap", true);
+	}
+}
+
 static int texture_paint_toggle_exec(bContext *C, wmOperator *op)
 {
 	Scene *scene = CTX_data_scene(C);
 	Object *ob = CTX_data_active_object(C);
 	const int mode_flag = OB_MODE_TEXTURE_PAINT;
 	const bool is_mode_set = (ob->mode & mode_flag) != 0;
-	Mesh *me;
 
 	if (!is_mode_set) {
 		if (!ED_object_mode_compat_set(C, ob, mode_flag, op->reports)) {
@@ -1402,8 +1450,6 @@ static int texture_paint_toggle_exec(bContext *C, wmOperator *op)
 		}
 	}
 
-	me = BKE_mesh_from_object(ob);
-
 	if (ob->mode & mode_flag) {
 		ob->mode &= ~mode_flag;
 
@@ -1414,20 +1460,10 @@ static int texture_paint_toggle_exec(bContext *C, wmOperator *op)
 		toggle_paint_cursor(C, 0);
 	}
 	else {
-		/* Make sure that active object has a material, and assign UVs and image layers (TODO) if they do not exist */
-
-		/* no material, add one */
-		if (ob->totcol == 0) {
-			Material *ma = BKE_material_add(CTX_data_main(C), "Material");
-			assign_material(ob, ma, 1, BKE_MAT_ASSIGN_USERPREF);
-		}
+		paint_proj_mesh_data_ensure(C, ob);
 
 		ob->mode |= mode_flag;
 
-		if (me->mtface == NULL)
-			me->mtface = CustomData_add_layer(&me->fdata, CD_MTFACE, CD_DEFAULT,
-			                                  NULL, me->totface);
-
 		BKE_paint_init(&scene->toolsettings->imapaint.paint, PAINT_CURSOR_TEXTURE_PAINT);
 
 		if (U.glreslimit != 0)
diff --git a/source/blender/editors/sculpt_paint/paint_image_proj.c b/source/blender/editors/sculpt_paint/paint_image_proj.c
index 60ffee1..711b25e 100644
--- a/source/blender/editors/sculpt_paint/paint_image_proj.c
+++ b/source/blender/editors/sculpt_paint/paint_image_proj.c
@@ -4448,7 +4448,9 @@ static void project_state_init(bContext *C, Object *ob, ProjPaintState *ps, int
 void *paint_proj_new_stroke(bContext *C, Object *ob, const float mouse[2], int mode)
 {
 	ProjPaintState *ps = MEM_callocN(sizeof(ProjPaintState), "ProjectionPaintState");
-	refresh_object_texpaint_images(ob);
+
+	paint_proj_mesh_data_ensure(C, ob);
+
 	project_state_init(C, ob, ps, mode);
 
 	if (ps->tool == PAINT_TOOL_CLONE && mode == BRUSH_STROKE_INVERT) {
@@ -4746,28 +4748,29 @@ static EnumPropertyItem layer_type_items[] = {
 	{0, NULL, 0, NULL, NULL}
 };
 
-static int texture_paint_add_layer_exec(bContext *C, wmOperator *op)
+bool proj_paint_add_slot(bContext *C, int type, Material *ma)
 {
-	Material *ma;
 	Object *ob = CTX_data_active_object(C);
 	float color[4] = {0.0, 0.0, 0.0, 1.0};
 	int i;
 	ImagePaintSettings *imapaint = &CTX_data_tool_settings(C)->imapaint;
-	int width = imapaint->new_layer_xresolution;
-	int height = imapaint->new_layer_yresolution;
-
-	int type = RNA_enum_get(op->ptr, "type");
+	int width;
+	int height;
 
 	if (!ob)
-		return OPERATOR_CANCELLED;
+		return false;
 
-	/* unlikely, but just in case */
-	if (width * height == 0) {
-		BKE_report(op->reports, RPT_ERROR, "New layer dimensions need to be greater than 0");
-		return OPERATOR_CANCELLED;
-	}
+	/* should not be allowed, but just in case */
+	if (imapaint->new_slot_xresolution == 0)
+		imapaint->new_slot_xresolution = 1024;
+	if (imapaint->new_slot_yresolution == 0)
+		imapaint->new_slot_yresolution = 1024;
 
-	ma = give_current_material(ob, ob->actcol);
+	width = imapaint->new_slot_xresolution;
+	height = imapaint->new_slot_yresolution;
+
+	if (!ma)
+		ma = give_current_material(ob, ob->actcol);
 
 	if (ma) {
 		MTex *mtex = add_mtex_id(&ma->id, -1);
@@ -4798,7 +4801,7 @@ static int texture_paint_add_layer_exec(bContext *C, wmOperator *op)
 
 				if (prop) {
 					/* when creating new ID blocks, use is already 1, but RNA
-				     * pointer se also increases user, so this compensates it */
+					 * pointer se also increases user, so this compensates it */
 					mtex->tex->id.us--;
 
 					RNA_id_pointer_create(&mtex->tex->id, &idptr);
@@ -4817,7 +4820,7 @@ static int texture_paint_add_layer_exec(bContext *C, wmOperator *op)
 
 				if (prop) {
 					/* when creating new ID blocks, use is already 1, but RNA
-				     * pointer se also increases user, so this compensates it */
+					 * pointer se also increases user, so this compensates it */
 					ima->id.us--;
 
 					RNA_id_pointer_create(&ima->id, &idptr);
@@ -4830,22 +4833,29 @@ static int texture_paint_add_layer_exec(b

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list