[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [27865] trunk/blender: * Assign weight from bones in weight paint mode now respects paint face

Brecht Van Lommel brecht at blender.org
Tue Mar 30 14:01:18 CEST 2010


Revision: 27865
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=27865
Author:   blendix
Date:     2010-03-30 14:01:17 +0200 (Tue, 30 Mar 2010)

Log Message:
-----------
* Assign weight from bones in weight paint mode now respects paint face
  mask, also avoid making vertex groups if they will not be filled.
* Add back image pin option in image editor header.
* Fix deep shadow not respecting Cast Buffer Shadows option.
* Tangent space normal map baking should work again now.
* Fix a problem with particle duplis, due to own bugfix for #20350,
  the problem for that seems to be in dupliverts, not particles.
* Fix external multires data link getting lost on exiting editmode.

(commits 27776,27777,27830,27840,27841,27862 by Brecht from render25 branch)

Modified Paths:
--------------
    trunk/blender/release/scripts/ui/space_image.py
    trunk/blender/source/blender/blenkernel/intern/anim.c
    trunk/blender/source/blender/blenkernel/intern/customdata.c
    trunk/blender/source/blender/editors/armature/editarmature.c
    trunk/blender/source/blender/editors/armature/meshlaplacian.c
    trunk/blender/source/blender/makesrna/intern/rna_space.c
    trunk/blender/source/blender/render/extern/include/RE_raytrace.h
    trunk/blender/source/blender/render/intern/raytrace/rayobject.cpp
    trunk/blender/source/blender/render/intern/source/rayshade.c
    trunk/blender/source/blender/render/intern/source/rendercore.c
    trunk/blender/source/blender/render/intern/source/zbuf.c

Modified: trunk/blender/release/scripts/ui/space_image.py
===================================================================
--- trunk/blender/release/scripts/ui/space_image.py	2010-03-30 11:49:07 UTC (rev 27864)
+++ trunk/blender/release/scripts/ui/space_image.py	2010-03-30 12:01:17 UTC (rev 27865)
@@ -276,6 +276,7 @@
                 sub.menu("IMAGE_MT_uvs")
 
         layout.template_ID(sima, "image", new="image.new")
+        layout.prop(sima, "image_pin", text="")
 
         # uv editing
         if show_uvedit:

Modified: trunk/blender/source/blender/blenkernel/intern/anim.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/anim.c	2010-03-30 11:49:07 UTC (rev 27864)
+++ trunk/blender/source/blender/blenkernel/intern/anim.c	2010-03-30 12:01:17 UTC (rev 27865)
@@ -1073,7 +1073,7 @@
 	ParticleCacheKey *cache;
 	float ctime, pa_time, scale = 1.0f;
 	float tmat[4][4], mat[4][4], pamat[4][4], vec[3], size=0.0;
-	float (*obmat)[4], (*oldobmat)[4], recurs_mat[4][4];
+	float (*obmat)[4], (*oldobmat)[4];
 	int lay, a, b, counter, hair = 0;
 	int totpart, totchild, totgroup=0, pa_num;
 
@@ -1090,10 +1090,6 @@
 	if(!psys_check_enabled(par, psys))
 		return;
 	
-	/* particles are already in world space, don't want the object mat twice */
-	if(par_space_mat)
-		mul_m4_m4m4(recurs_mat, psys->imat, par_space_mat);
-
 	ctime = bsystem_time(scene, par, (float)scene->r.cfra, 0.0);
 
 	totpart = psys->totpart;
@@ -1237,7 +1233,7 @@
 					mul_m4_m4m4(tmat, oblist[b]->obmat, pamat);
 					mul_mat3_m4_fl(tmat, size*scale);
 					if(par_space_mat)
-						mul_m4_m4m4(mat, tmat, recurs_mat);
+						mul_m4_m4m4(mat, tmat, par_space_mat);
 					else
 						copy_m4_m4(mat, tmat);
 
@@ -1263,7 +1259,7 @@
 					VECADD(tmat[3], tmat[3], vec);
 
 				if(par_space_mat)
-					mul_m4_m4m4(mat, tmat, recurs_mat);
+					mul_m4_m4m4(mat, tmat, par_space_mat);
 				else
 					copy_m4_m4(mat, tmat);
 

Modified: trunk/blender/source/blender/blenkernel/intern/customdata.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/customdata.c	2010-03-30 11:49:07 UTC (rev 27864)
+++ trunk/blender/source/blender/blenkernel/intern/customdata.c	2010-03-30 12:01:17 UTC (rev 27865)
@@ -848,7 +848,7 @@
 {
 	const LayerTypeInfo *typeInfo;
 	CustomDataLayer *layer, *newlayer;
-	int i, type, number = 0, lasttype = -1, lastactive = 0, lastrender = 0, lastclone = 0, lastmask = 0;
+	int i, type, number = 0, lasttype = -1, lastactive = 0, lastrender = 0, lastclone = 0, lastmask = 0, lastflag = 0;
 
 	for(i = 0; i < source->totlayer; ++i) {
 		layer = &source->layers[i];
@@ -863,15 +863,16 @@
 			lastclone = layer->active_clone;
 			lastmask = layer->active_mask;
 			lasttype = type;
+			lastflag = layer->flag;
 		}
 		else
 			number++;
 
-		if(layer->flag & CD_FLAG_NOCOPY) continue;
+		if(lastflag & CD_FLAG_NOCOPY) continue;
 		else if(!((int)mask & (int)(1 << (int)type))) continue;
 		else if(number < CustomData_number_of_layers(dest, type)) continue;
 
-		if((alloctype == CD_ASSIGN) && (layer->flag & CD_FLAG_NOFREE))
+		if((alloctype == CD_ASSIGN) && (lastflag & CD_FLAG_NOFREE))
 			newlayer = customData_add_layer__internal(dest, type, CD_REFERENCE,
 				layer->data, totelem, layer->name);
 		else
@@ -883,6 +884,7 @@
 			newlayer->active_rnd = lastrender;
 			newlayer->active_clone = lastclone;
 			newlayer->active_mask = lastmask;
+			newlayer->flag |= lastflag & (CD_FLAG_EXTERNAL|CD_FLAG_IN_MEMORY);
 		}
 	}
 }
@@ -892,6 +894,9 @@
 {
 	memset(dest, 0, sizeof(*dest));
 
+	if(source->external)
+		dest->external= MEM_dupallocN(source->external);
+
 	CustomData_merge(source, dest, mask, alloctype, totelem);
 }
 

Modified: trunk/blender/source/blender/editors/armature/editarmature.c
===================================================================
--- trunk/blender/source/blender/editors/armature/editarmature.c	2010-03-30 11:49:07 UTC (rev 27864)
+++ trunk/blender/source/blender/editors/armature/editarmature.c	2010-03-30 12:01:17 UTC (rev 27865)
@@ -4573,20 +4573,23 @@
 	 *      pointers to bDeformGroups, all with names
 	 *      of skinnable bones.
 	 */
-	bDeformGroup ***hgroup, *defgroup;
+	bDeformGroup ***hgroup, *defgroup= NULL;
 	int a, segments;
 	struct { Object *armob; void *list; int heat; } *data= datap;
+	int wpmode = (ob->mode & OB_MODE_WEIGHT_PAINT);
+	bArmature *arm= data->armob->data;
 
-	if (!(ob->mode & OB_MODE_WEIGHT_PAINT) || !(bone->flag & BONE_HIDDEN_P)) {
+	if (!wpmode || !(bone->flag & BONE_HIDDEN_P)) {
 	   if (!(bone->flag & BONE_NO_DEFORM)) {
 			if (data->heat && data->armob->pose && get_pose_channel(data->armob->pose, bone->name))
 				segments = bone->segments;
 			else
 				segments = 1;
+
+			if(!wpmode || ((arm->layer & bone->layer) && (bone->flag & BONE_SELECTED)))
+				if (!(defgroup = defgroup_find_name(ob, bone->name)))
+					defgroup = ED_vgroup_add_name(ob, bone->name);
 			
-			if (!(defgroup = defgroup_find_name(ob, bone->name)))
-				defgroup = ED_vgroup_add_name(ob, bone->name);
-			
 			if (data->list != NULL) {
 				hgroup = (bDeformGroup ***) &data->list;
 				
@@ -4711,7 +4714,7 @@
 	selected = MEM_callocN(numbones*sizeof(int), "selected");
 
 	for (j=0; j < numbones; ++j) {
-		   bone = bonelist[j];
+		bone = bonelist[j];
 		dgroup = dgrouplist[j];
 		
 		/* handle bbone */
@@ -4759,7 +4762,7 @@
 			selected[j] = 1;
 		
 		/* find flipped group */
-		if (mirror) {
+		if (dgroup && mirror) {
 			char name[32];
 			
 			BLI_strncpy(name, dgroup->name, 32);

Modified: trunk/blender/source/blender/editors/armature/meshlaplacian.c
===================================================================
--- trunk/blender/source/blender/editors/armature/meshlaplacian.c	2010-03-30 11:49:07 UTC (rev 27864)
+++ trunk/blender/source/blender/editors/armature/meshlaplacian.c	2010-03-30 12:01:17 UTC (rev 27865)
@@ -618,13 +618,24 @@
 	LaplacianSystem *sys;
 	MFace *mface;
 	float solution, weight;
-	int *vertsflipped = NULL;
+	int *vertsflipped = NULL, *mask= NULL;
 	int a, totface, j, bbone, firstsegment, lastsegment, thrownerror = 0;
 
-	/* count triangles */
+	/* count triangles and create mask */
+	if(me->editflag & ME_EDIT_PAINT_MASK)
+		mask= MEM_callocN(sizeof(int)*me->totvert, "heat_bone_weighting mask");
+
 	for(totface=0, a=0, mface=me->mface; a<me->totface; a++, mface++) {
 		totface++;
 		if(mface->v4) totface++;
+
+		if(mask && (mface->flag & ME_FACE_SEL)) {
+			mask[mface->v1]= 1;
+			mask[mface->v2]= 1;
+			mask[mface->v3]= 1;
+			if(mface->v4)
+				mask[mface->v4]= 1;
+		}
 	}
 
 	/* create laplacian */
@@ -661,6 +672,9 @@
 		/* clear weights */
 		if(bbone && firstsegment) {
 			for(a=0; a<me->totvert; a++) {
+				if(mask && !mask[a])
+					continue;
+
 				ED_vgroup_vert_remove(ob, dgrouplist[j], a);
 				if(vertsflipped && dgroupflip[j] && vertsflipped[a] >= 0)
 					ED_vgroup_vert_remove(ob, dgroupflip[j], vertsflipped[a]);
@@ -679,6 +693,9 @@
 		if(laplacian_system_solve(sys)) {
 			/* load solution into vertex groups */
 			for(a=0; a<me->totvert; a++) {
+				if(mask && !mask[a])
+					continue;
+
 				solution= laplacian_system_get_solution(a);
 				
 				if(bbone) {
@@ -723,6 +740,9 @@
 		/* remove too small vertex weights */
 		if(bbone && lastsegment) {
 			for(a=0; a<me->totvert; a++) {
+				if(mask && !mask[a])
+					continue;
+
 				weight= ED_vgroup_vert_weight(ob, dgrouplist[j], a);
 				weight= heat_limit_weight(weight);
 				if(weight <= 0.0f)
@@ -740,6 +760,7 @@
 
 	/* free */
 	if(vertsflipped) MEM_freeN(vertsflipped);
+	if(mask) MEM_freeN(mask);
 
 	heat_system_free(sys);
 

Modified: trunk/blender/source/blender/makesrna/intern/rna_space.c
===================================================================
--- trunk/blender/source/blender/makesrna/intern/rna_space.c	2010-03-30 11:49:07 UTC (rev 27864)
+++ trunk/blender/source/blender/makesrna/intern/rna_space.c	2010-03-30 12:01:17 UTC (rev 27865)
@@ -1221,6 +1221,7 @@
 	prop= RNA_def_property(srna, "image_pin", PROP_BOOLEAN, PROP_NONE);
 	RNA_def_property_boolean_sdna(prop, NULL, "pin", 0);
 	RNA_def_property_ui_text(prop, "Image Pin", "Display current image regardless of object selection");
+	RNA_def_property_ui_icon(prop, ICON_UNPINNED, 1);
 	RNA_def_property_update(prop, NC_SPACE|ND_SPACE_IMAGE, NULL);
 
 	prop= RNA_def_property(srna, "sample_histogram", PROP_POINTER, PROP_NONE);

Modified: trunk/blender/source/blender/render/extern/include/RE_raytrace.h
===================================================================
--- trunk/blender/source/blender/render/extern/include/RE_raytrace.h	2010-03-30 11:49:07 UTC (rev 27864)
+++ trunk/blender/source/blender/render/extern/include/RE_raytrace.h	2010-03-30 12:01:17 UTC (rev 27865)
@@ -201,6 +201,7 @@
 #define RE_SKIP_VLR_NEIGHBOUR			(1 << 1)
 #define RE_SKIP_VLR_RENDER_CHECK		(1 << 2)
 #define RE_SKIP_VLR_NON_SOLID_MATERIAL	(1 << 3)
+#define RE_SKIP_VLR_BAKE_CHECK			(1 << 4)
 
 /* TODO use: FLT_MAX? */
 #define RE_RAYTRACE_MAXDIST	1e33

Modified: trunk/blender/source/blender/render/intern/raytrace/rayobject.cpp
===================================================================
--- trunk/blender/source/blender/render/intern/raytrace/rayobject.cpp	2010-03-30 11:49:07 UTC (rev 27864)
+++ trunk/blender/source/blender/render/intern/raytrace/rayobject.cpp	2010-03-30 12:01:17 UTC (rev 27865)
@@ -165,6 +165,11 @@
 		return 0;
 }
 
+static inline int vlr_check_bake(Isect *is, ObjectInstanceRen* obi, VlakRen *vlr)
+{
+	return (obi->obr->ob != is->userdata);
+}
+
 static inline int rayface_check_cullface(RayFace *face, Isect *is)
 {
 	float nor[3];
@@ -189,17 +194,24 @@
 	if(is->orig.ob == face->ob && is->orig.face == face->face)
 		return 0;
 		
-
+	/* check if we should intersect this face */
 	if(is->skip & RE_SKIP_VLR_RENDER_CHECK)
 	{
 		if(vlr_check_intersect(is, (ObjectInstanceRen*)face->ob, (VlakRen*)face->face ) == 0)
 			return 0;
 	}
-	if(is->skip & RE_SKIP_VLR_NON_SOLID_MATERIAL)
+	else if(is->skip & RE_SKIP_VLR_NON_SOLID_MATERIAL)
 	{
+		if(vlr_check_intersect(is, (ObjectInstanceRen*)face->ob, (VlakRen*)face->face ) == 0)
+			return 0;
 		if(vlr_check_intersect_solid(is, (ObjectInstanceRen*)face->ob, (VlakRen*)face->face) == 0)
 			return 0;
 	}
+	else if(is->skip & RE_SKIP_VLR_BAKE_CHECK) {
+		if(vlr_check_bake(is, (ObjectInstanceRen*)face->ob, (VlakRen*)face->face ) == 0)
+			return 0;
+	}
+
 	if(is->skip & RE_SKIP_CULLFACE)
 	{
 		if(rayface_check_cullface(face, is) == 0)


@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list