[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [25688] trunk/blender: Changes to Brush texture workflow

Matt Ebb matt at mke3.net
Sun Jan 3 09:37:18 CET 2010


Revision: 25688
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=25688
Author:   broken
Date:     2010-01-03 09:37:18 +0100 (Sun, 03 Jan 2010)

Log Message:
-----------
Changes to Brush texture workflow

This changes how textures are accessed from Brushes, with the intention of simplifying 
the workflow, and reducing the amount of clicking. Rather than the previous texture slots 
(which didn't work as a stack anyway), brushes now have a single texture linked. Rather 
than taking time having to set up your slots in advance, you can now select and change 
textures directly as you sculpt/paint on the fly. For complex brushes, node textures can 
be used, or for fast access, it's easy to make a duplicate of your brush with the texture 
you like and assign a hotkey.

Brush textures can now be chosen from a new Textures panel in the brush tool 
properties - click on the thumbnail to open a texture selector. This is done using a new 
variation on the ID template - the number of rows and columns to display in the popup 
can be customised in the UI scripts.

Modified Paths:
--------------
    trunk/blender/release/scripts/ui/properties_texture.py
    trunk/blender/release/scripts/ui/space_view3d_toolbar.py
    trunk/blender/source/blender/blenkernel/intern/brush.c
    trunk/blender/source/blender/blenkernel/intern/texture.c
    trunk/blender/source/blender/blenloader/intern/readfile.c
    trunk/blender/source/blender/blenloader/intern/writefile.c
    trunk/blender/source/blender/editors/include/UI_interface.h
    trunk/blender/source/blender/editors/include/UI_interface_icons.h
    trunk/blender/source/blender/editors/interface/interface.c
    trunk/blender/source/blender/editors/interface/interface_icons.c
    trunk/blender/source/blender/editors/interface/interface_intern.h
    trunk/blender/source/blender/editors/interface/interface_layout.c
    trunk/blender/source/blender/editors/interface/interface_regions.c
    trunk/blender/source/blender/editors/interface/interface_templates.c
    trunk/blender/source/blender/editors/interface/interface_widgets.c
    trunk/blender/source/blender/editors/sculpt_paint/paint_image.c
    trunk/blender/source/blender/editors/sculpt_paint/sculpt.c
    trunk/blender/source/blender/editors/space_buttons/buttons_context.c
    trunk/blender/source/blender/editors/space_buttons/space_buttons.c
    trunk/blender/source/blender/editors/space_outliner/outliner.c
    trunk/blender/source/blender/editors/space_view3d/view3d_toolbar.c
    trunk/blender/source/blender/makesdna/DNA_brush_types.h
    trunk/blender/source/blender/makesrna/intern/rna_brush.c
    trunk/blender/source/blender/makesrna/intern/rna_ui_api.c
    trunk/blender/source/blender/windowmanager/intern/wm_operators.c

Modified: trunk/blender/release/scripts/ui/properties_texture.py
===================================================================
--- trunk/blender/release/scripts/ui/properties_texture.py	2010-01-03 05:49:56 UTC (rev 25687)
+++ trunk/blender/release/scripts/ui/properties_texture.py	2010-01-03 08:37:18 UTC (rev 25688)
@@ -87,13 +87,15 @@
     def draw(self, context):
         layout = self.layout
 
+        space = context.space_data
         tex = context.texture
         wide_ui = context.region.width > narrowui
         idblock = context_tex_datablock(context)
+        tex_collection = space.pin_id == None and type(idblock) != bpy.types.Brush
 
-        space = context.space_data
+        
 
-        if idblock:
+        if tex_collection:
             row = layout.row()
 
             row.template_list(idblock, "textures", idblock, "active_texture_index", rows=2)
@@ -101,24 +103,31 @@
             col = row.column(align=True)
             col.operator("texture.slot_move", text="", icon='TRIA_UP').type = 'UP'
             col.operator("texture.slot_move", text="", icon='TRIA_DOWN').type = 'DOWN'
-
-
+        
         if wide_ui:
             split = layout.split(percentage=0.65)
-            if idblock:
-                split.template_ID(idblock, "active_texture", new="texture.new")
-            elif tex:
-                split.template_ID(space, "pin_id")
+            col = split.column()
         else:
-            layout.template_ID(idblock, "active_texture", new="texture.new")
-
+            col = layout.column()
+            
+        if tex_collection:
+            col.template_ID(idblock, "active_texture", new="texture.new")
+        elif idblock:
+            col.template_ID(idblock, "texture", new="texture.new")
+        
+        if space.pin_id:
+            col.template_ID(space, "pin_id")
+        
+        if wide_ui:
+            col = split.column()
+        
         if (not space.pin_id) and (
             context.sculpt_object or
             context.vertex_paint_object or
             context.weight_paint_object or
             context.texture_paint_object):
 
-            split.prop(space, "brush_texture", text="Brush", toggle=True)
+            col.prop(space, "brush_texture", text="Brush", toggle=True)
 
         if tex:
             layout.prop(tex, "use_nodes")
@@ -268,6 +277,10 @@
     bl_label = "Influence"
 
     def poll(self, context):
+        idblock = context_tex_datablock(context)
+        if type(idblock) == bpy.types.Brush:
+            return False
+    
         return context.texture_slot
 
     def draw(self, context):

Modified: trunk/blender/release/scripts/ui/space_view3d_toolbar.py
===================================================================
--- trunk/blender/release/scripts/ui/space_view3d_toolbar.py	2010-01-03 05:49:56 UTC (rev 25687)
+++ trunk/blender/release/scripts/ui/space_view3d_toolbar.py	2010-01-03 08:37:18 UTC (rev 25688)
@@ -624,6 +624,29 @@
             #row.prop(brush, "jitter", slider=True)
             #row.prop(brush, "use_jitter_pressure", toggle=True, text="")
 
+
+class VIEW3D_PT_tools_brush_texture(PaintPanel):
+    bl_label = "Texture"
+    bl_default_closed = True
+
+    def poll(self, context):
+        settings = self.paint_settings(context)
+        return (settings and settings.brush and (context.sculpt_object or
+                             context.texture_paint_object))
+
+    def draw(self, context):
+        layout = self.layout
+
+        settings = self.paint_settings(context)
+        brush = settings.brush
+        tex_slot = brush.texture_slot
+        
+        col = layout.column()
+        
+        col.template_ID_preview(brush, "texture", new="texture.new", rows=2, cols=4)
+        
+        col.row().prop(tex_slot, "map_mode", expand=True)
+        
 class VIEW3D_PT_tools_brush_tool(PaintPanel):
     bl_label = "Tool"
     bl_default_closed = True
@@ -975,6 +998,7 @@
 bpy.types.register(VIEW3D_PT_tools_posemode)
 bpy.types.register(VIEW3D_PT_tools_posemode_options)
 bpy.types.register(VIEW3D_PT_tools_brush)
+bpy.types.register(VIEW3D_PT_tools_brush_texture)
 bpy.types.register(VIEW3D_PT_tools_brush_tool)
 bpy.types.register(VIEW3D_PT_tools_brush_stroke)
 bpy.types.register(VIEW3D_PT_tools_brush_curve)

Modified: trunk/blender/source/blender/blenkernel/intern/brush.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/brush.c	2010-01-03 05:49:56 UTC (rev 25687)
+++ trunk/blender/source/blender/blenkernel/intern/brush.c	2010-01-03 08:37:18 UTC (rev 25688)
@@ -100,19 +100,11 @@
 Brush *copy_brush(Brush *brush)
 {
 	Brush *brushn;
-	MTex *mtex;
-	int a;
 	
 	brushn= copy_libblock(brush);
 
-	for(a=0; a<MAX_MTEX; a++) {
-		mtex= brush->mtex[a];
-		if(mtex) {
-			brushn->mtex[a]= MEM_dupallocN(mtex);
-			if(mtex->tex) id_us_plus((ID*)mtex->tex);
-		}
-	}
-
+	if(brush->mtex.tex) id_us_plus((ID*)brush->mtex.tex);
+	
 	brushn->curve= curvemapping_copy(brush->curve);
 
 	/* enable fake user by default */
@@ -127,17 +119,8 @@
 /* not brush itself */
 void free_brush(Brush *brush)
 {
-	MTex *mtex;
-	int a;
-
-	for(a=0; a<MAX_MTEX; a++) {
-		mtex= brush->mtex[a];
-		if(mtex) {
-			if(mtex->tex) mtex->tex->id.us--;
-			MEM_freeN(mtex);
-		}
-	}
-
+	if(brush->mtex.tex) brush->mtex.tex->id.us--;
+	
 	curvemapping_free(brush->curve);
 }
 
@@ -295,8 +278,8 @@
 
 static MTex *brush_active_texture(Brush *brush)
 {
-	if(brush && brush->texact >= 0)
-		return brush->mtex[brush->texact];
+	if(brush)
+		return &brush->mtex;
 	return NULL;
 }
 
@@ -304,8 +287,7 @@
 {
 	ID *idtest, *id=NULL;
 
-	if(brush->mtex[brush->texact])
-		id= (ID *)brush->mtex[brush->texact]->tex;
+	id= (ID *)brush->mtex.tex;
 
 	idtest= (ID*)BLI_findlink(&G.main->tex, nr-1);
 	if(idtest==0) { /* new tex */
@@ -316,13 +298,7 @@
 	if(idtest!=id) {
 		brush_texture_delete(brush);
 
-		if(brush->mtex[brush->texact]==NULL) {
-			brush->mtex[brush->texact]= add_mtex();
-			brush->mtex[brush->texact]->r = 1.0f;
-			brush->mtex[brush->texact]->g = 1.0f;
-			brush->mtex[brush->texact]->b = 1.0f;
-		}
-		brush->mtex[brush->texact]->tex= (Tex*)idtest;
+		brush->mtex.tex= (Tex*)idtest;
 		id_us_plus(idtest);
 
 		return 1;
@@ -333,16 +309,10 @@
 
 int brush_texture_delete(Brush *brush)
 {
-	if(brush->mtex[brush->texact]) {
-		if(brush->mtex[brush->texact]->tex)
-			brush->mtex[brush->texact]->tex->id.us--;
-		MEM_freeN(brush->mtex[brush->texact]);
-		brush->mtex[brush->texact]= NULL;
+	if(brush->mtex.tex)
+		brush->mtex.tex->id.us--;
 
-		return 1;
-	}
-
-	return 0;
+	return 1;
 }
 
 int brush_clone_image_set_nr(Brush *brush, int nr)
@@ -383,7 +353,7 @@
 /* Brush Sampling */
 void brush_sample_tex(Brush *brush, float *xy, float *rgba)
 {
-	MTex *mtex= brush->mtex[brush->texact];
+	MTex *mtex= &brush->mtex;
 
 	if (mtex && mtex->tex) {
 		float co[3], tin, tr, tg, tb, ta;
@@ -741,7 +711,7 @@
 {
 	Brush *brush= painter->brush;
 	BrushPainterCache *cache= &painter->cache;
-	MTex *mtex= brush->mtex[brush->texact];
+	MTex *mtex= &brush->mtex;
 	int size;
 	short flt;
 
@@ -976,7 +946,7 @@
 unsigned int *brush_gen_texture_cache(Brush *br, int half_side)
 {
 	unsigned int *texcache = NULL;
-	MTex *mtex = br->mtex[br->texact];
+	MTex *mtex = &br->mtex;
 	TexResult texres;
 	int hasrgb, ix, iy;
 	int side = half_side * 2;

Modified: trunk/blender/source/blender/blenkernel/intern/texture.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/texture.c	2010-01-03 05:49:56 UTC (rev 25687)
+++ trunk/blender/source/blender/blenkernel/intern/texture.c	2010-01-03 08:37:18 UTC (rev 25688)
@@ -703,11 +703,9 @@
 	}
 	br= G.main->brush.first;
 	while(br) {
-		for(a=0; a<MAX_MTEX; a++) {
-			if(br->mtex[a] && br->mtex[a]->tex==tex) {
-				if(br->id.lib) lib= 1;
-				else local= 1;
-			}
+		if(br->mtex.tex==tex) {
+			if(br->id.lib) lib= 1;
+			else local= 1;
 		}
 		br= br->id.next;
 	}
@@ -762,13 +760,11 @@
 		}
 		br= G.main->brush.first;
 		while(br) {
-			for(a=0; a<MAX_MTEX; a++) {
-				if(br->mtex[a] && br->mtex[a]->tex==tex) {
-					if(br->id.lib==0) {
-						br->mtex[a]->tex= texn;
-						texn->id.us++;
-						tex->id.us--;
-					}
+			if(br->mtex.tex==tex) {
+				if(br->id.lib==0) {
+					br->mtex.tex= texn;
+					texn->id.us++;
+					tex->id.us--;
 				}
 			}
 			br= br->id.next;
@@ -904,10 +900,6 @@
 		*mtex_ar=		((Lamp *)id)->mtex;
 		if(act) *act=	(((Lamp *)id)->texact);
 		break;
-	case ID_BR:
-		*mtex_ar=		((Brush *)id)->mtex;
-		if(act) *act=	(((Brush *)id)->texact);
-		break;
 	default:
 		*mtex_ar = NULL;
 		if(act) *act=	0;
@@ -932,9 +924,6 @@
 	case ID_LA:
 		((Lamp *)id)->texact= act;
 		break;
-	case ID_BR:
-		((Brush *)id)->texact= act;
-		break;
 	}
 }
 
@@ -1016,35 +1005,18 @@
 
 Tex *give_current_brush_texture(Brush *br)
 {
-	MTex *mtex= NULL;
-	Tex *tex= NULL;
-
-	if(br) {
-		mtex= br->mtex[(int)(br->texact)];
-		if(mtex) tex= mtex->tex;
-	}
-
-	return tex;
+	return br->mtex.tex;
 }
 
 void set_current_brush_texture(Brush *br, Tex *newtex)
 {
-	int act= br->texact;
+	if(br->mtex.tex)
+		id_us_min(&br->mtex.tex->id);
 
-	if(br->mtex[act] && br->mtex[act]->tex)
-		id_us_min(&br->mtex[act]->tex->id);
-
 	if(newtex) {
-		if(!br->mtex[act])
-			br->mtex[act]= add_mtex();
-		
-		br->mtex[act]->tex= newtex;
+		br->mtex.tex= newtex;
 		id_us_plus(&newtex->id);
 	}
-	else if(br->mtex[act]) {
-		MEM_freeN(br->mtex[act]);
-		br->mtex[act]= NULL;
-	}
 }
 
 /* ------------------------------------------------------------------------- */

Modified: trunk/blender/source/blender/blenloader/intern/readfile.c
===================================================================
--- trunk/blender/source/blender/blenloader/intern/readfile.c	2010-01-03 05:49:56 UTC (rev 25687)
+++ trunk/blender/source/blender/blenloader/intern/readfile.c	2010-01-03 08:37:18 UTC (rev 25688)
@@ -1532,23 +1532,14 @@
 static void lib_link_brush(FileData *fd, Main *main)
 {
 	Brush *brush;
-	MTex *mtex;
-	int a;
 	
 	/* only link ID pointers */
 	for(brush= main->brush.first; brush; brush= brush->id.next) {
 		if(brush->id.flag & LIB_NEEDLINK) {
 			brush->id.flag -= LIB_NEEDLINK;
 
+			brush->mtex.tex= newlibadr_us(fd, brush->id.lib, brush->mtex.tex);
 			brush->clone.image= newlibadr_us(fd, brush->id.lib, brush->clone.image);
-			
-			for(a=0; a<MAX_MTEX; a++) {
-				mtex= brush->mtex[a];
-				if(mtex)
-					mtex->tex= newlibadr_us(fd, brush->id.lib, mtex->tex);
-			}
-
-			brush->clone.image= newlibadr_us(fd, brush->id.lib, brush->clone.image);
 		}
 	}
 }
@@ -1556,11 +1547,7 @@

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list