[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [26024] trunk/blender: - particle drawing was using invalid memory with weights.

Campbell Barton ideasman42 at gmail.com
Fri Jan 15 18:28:01 CET 2010


Revision: 26024
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=26024
Author:   campbellbarton
Date:     2010-01-15 18:28:00 +0100 (Fri, 15 Jan 2010)

Log Message:
-----------
- particle drawing was using invalid memory with weights.
- particle set weight operator (Shift + K) and from the menu.
- mirror vertex groups operator can also flip weight group names.

a number of utility functions for weight groups added
 int *get_defgroup_flip_map(struct Object *ob);
 void flip_vertexgroup_name (char *name_r, const char *name, int strip_number); // moved from modifier.c 
 void copy_defvert (struct MDeformVert *dvert_r, const struct MDeformVert *dvert);
 void flip_defvert (struct MDeformVert *dvert, int *flip_map);

Modified Paths:
--------------
    trunk/blender/release/scripts/ui/space_view3d.py
    trunk/blender/source/blender/blenkernel/BKE_deform.h
    trunk/blender/source/blender/blenkernel/intern/deform.c
    trunk/blender/source/blender/blenkernel/intern/modifier.c
    trunk/blender/source/blender/blenkernel/intern/particle.c
    trunk/blender/source/blender/editors/mesh/editmesh_mods.c
    trunk/blender/source/blender/editors/object/object_intern.h
    trunk/blender/source/blender/editors/object/object_ops.c
    trunk/blender/source/blender/editors/object/object_vgroup.c
    trunk/blender/source/blender/editors/physics/particle_edit.c
    trunk/blender/source/blender/editors/physics/physics_intern.h
    trunk/blender/source/blender/editors/physics/physics_ops.c

Modified: trunk/blender/release/scripts/ui/space_view3d.py
===================================================================
--- trunk/blender/release/scripts/ui/space_view3d.py	2010-01-15 17:23:16 UTC (rev 26023)
+++ trunk/blender/release/scripts/ui/space_view3d.py	2010-01-15 17:28:00 UTC (rev 26024)
@@ -186,7 +186,9 @@
             props.constraint_axis = (False, False, True)
             props.constraint_orientation = 'LOCAL'
 
+            layout.operator("object.vertex_group_mirror")
 
+
 class VIEW3D_MT_snap(bpy.types.Menu):
     bl_label = "Snap"
 
@@ -898,6 +900,7 @@
             layout.operator("particle.subdivide")
 
         layout.operator("particle.rekey")
+        layout.operator("particle.weight_set")
 
         layout.separator()
 

Modified: trunk/blender/source/blender/blenkernel/BKE_deform.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_deform.h	2010-01-15 17:23:16 UTC (rev 26023)
+++ trunk/blender/source/blender/blenkernel/BKE_deform.h	2010-01-15 17:28:00 UTC (rev 26024)
@@ -44,11 +44,16 @@
 struct bDeformGroup *copy_defgroup (struct bDeformGroup *ingroup);
 struct bDeformGroup *get_named_vertexgroup (Object *ob, char *name);
 int get_defgroup_num (struct Object *ob, struct bDeformGroup *dg);
+int *get_defgroup_flip_map(struct Object *ob);
 int get_named_vertexgroup_num (Object *ob, const char *name);
 void unique_vertexgroup_name (struct bDeformGroup *dg, struct Object *ob);
+void flip_vertexgroup_name (char *name_r, const char *name, int strip_number);
 
 float deformvert_get_weight(const struct MDeformVert *dvert, int group_num);
 float vertexgroup_get_vertex_weight(const struct MDeformVert *dvert, int index, int group_num);
 
+void copy_defvert (struct MDeformVert *dvert_r, const struct MDeformVert *dvert);
+void flip_defvert (struct MDeformVert *dvert, int *flip_map);
+
 #endif
 

Modified: trunk/blender/source/blender/blenkernel/intern/deform.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/deform.c	2010-01-15 17:23:16 UTC (rev 26023)
+++ trunk/blender/source/blender/blenkernel/intern/deform.c	2010-01-15 17:28:00 UTC (rev 26024)
@@ -34,6 +34,7 @@
 
 #include <string.h>
 #include <math.h>
+#include "ctype.h"
 
 #include "MEM_guardedalloc.h"
 
@@ -95,6 +96,36 @@
 	return outgroup;
 }
 
+void copy_defvert (MDeformVert *dvert_r, const MDeformVert *dvert)
+{
+	if(dvert_r->totweight == dvert->totweight) {
+		if(dvert->totweight)
+			memcpy(dvert_r->dw, dvert->dw, dvert->totweight * sizeof(MDeformWeight));
+	}
+	else {
+		if(dvert_r->dw)
+			MEM_freeN(dvert_r->dw);
+
+		if(dvert->totweight)
+			dvert_r->dw= MEM_dupallocN(dvert->dw);
+		else
+			dvert_r->dw= NULL;
+
+		dvert_r->totweight = dvert->totweight;
+	}
+}
+
+void flip_defvert (MDeformVert *dvert, int *flip_map)
+{
+	MDeformWeight *dw;
+	int i;
+
+	for(dw= dvert->dw, i=0; i<dvert->totweight; dw++, i++)
+		if(flip_map[dw->def_nr] >= 0)
+			dw->def_nr= flip_map[dw->def_nr];
+}
+
+
 bDeformGroup *get_named_vertexgroup (Object *ob, char *name)
 {
 	/* return a pointer to the deform group with this name
@@ -167,6 +198,36 @@
     
 }
 
+/* note, must be freed */
+int *get_defgroup_flip_map(Object *ob)
+{
+	bDeformGroup *dg;
+	int totdg= BLI_countlist(&ob->defbase);
+
+	if(totdg==0) {
+		return NULL;
+	}
+	else {
+		char name[sizeof(dg->name)];
+		int i, flip_num, *map= MEM_mallocN(totdg * sizeof(int), "get_defgroup_flip_map");
+		memset(map, -1, totdg * sizeof(int));
+
+		for (dg=ob->defbase.first, i=0; dg; dg=dg->next, i++) {
+			if(map[i] == -1) { /* may be calculated previously */
+				flip_vertexgroup_name(name, dg->name, 0);
+				if(strcmp(name, dg->name)) {
+					flip_num= get_named_vertexgroup_num(ob, name);
+					if(flip_num > -1) {
+						map[i]= flip_num;
+						map[flip_num]= i; /* save an extra lookup */
+					}
+				}
+			}
+		}
+		return map;
+	}
+}
+
 void unique_vertexgroup_name (bDeformGroup *dg, Object *ob)
 {
 	bDeformGroup *curdef;
@@ -221,6 +282,121 @@
 	}	
 }
 
+
+/* finds the best possible flipped name. For renaming; check for unique names afterwards */
+/* if strip_number: removes number extensions */
+void flip_vertexgroup_name (char *name_r, const char *name, int strip_number)
+{
+	int     len;
+	char    prefix[sizeof((bDeformGroup *)NULL)->name]={""};   /* The part before the facing */
+	char    suffix[sizeof((bDeformGroup *)NULL)->name]={""};   /* The part after the facing */
+	char    replace[sizeof((bDeformGroup *)NULL)->name]={""};  /* The replacement string */
+	char    number[sizeof((bDeformGroup *)NULL)->name]={""};   /* The number extension string */
+	char    *index=NULL;
+
+	len= strlen(name);
+	if(len<3) return; // we don't do names like .R or .L
+
+	/* We first check the case with a .### extension, let's find the last period */
+	if(isdigit(name[len-1])) {
+		index= strrchr(name, '.'); // last occurrence
+		if (index && isdigit(index[1]) ) { // doesnt handle case bone.1abc2 correct..., whatever!
+			if(strip_number==0)
+				strcpy(number, index);
+			*index= 0;
+			len= strlen(name);
+		}
+	}
+
+	strcpy (prefix, name);
+
+#define IS_SEPARATOR(a) ((a)=='.' || (a)==' ' || (a)=='-' || (a)=='_')
+
+	/* first case; separator . - _ with extensions r R l L  */
+	if( IS_SEPARATOR(name[len-2]) ) {
+		switch(name[len-1]) {
+			case 'l':
+				prefix[len-1]= 0;
+				strcpy(replace, "r");
+				break;
+			case 'r':
+				prefix[len-1]= 0;
+				strcpy(replace, "l");
+				break;
+			case 'L':
+				prefix[len-1]= 0;
+				strcpy(replace, "R");
+				break;
+			case 'R':
+				prefix[len-1]= 0;
+				strcpy(replace, "L");
+				break;
+		}
+	}
+	/* case; beginning with r R l L , with separator after it */
+	else if( IS_SEPARATOR(name[1]) ) {
+		switch(name[0]) {
+			case 'l':
+				strcpy(replace, "r");
+				strcpy(suffix, name+1);
+				prefix[0]= 0;
+				break;
+			case 'r':
+				strcpy(replace, "l");
+				strcpy(suffix, name+1);
+				prefix[0]= 0;
+				break;
+			case 'L':
+				strcpy(replace, "R");
+				strcpy(suffix, name+1);
+				prefix[0]= 0;
+				break;
+			case 'R':
+				strcpy(replace, "L");
+				strcpy(suffix, name+1);
+				prefix[0]= 0;
+				break;
+		}
+	}
+	else if(len > 5) {
+		/* hrms, why test for a separator? lets do the rule 'ultimate left or right' */
+		index = BLI_strcasestr(prefix, "right");
+		if (index==prefix || index==prefix+len-5) {
+			if(index[0]=='r')
+				strcpy (replace, "left");
+			else {
+				if(index[1]=='I')
+					strcpy (replace, "LEFT");
+				else
+					strcpy (replace, "Left");
+			}
+			*index= 0;
+			strcpy (suffix, index+5);
+		}
+		else {
+			index = BLI_strcasestr(prefix, "left");
+			if (index==prefix || index==prefix+len-4) {
+				if(index[0]=='l')
+					strcpy (replace, "right");
+				else {
+					if(index[1]=='E')
+						strcpy (replace, "RIGHT");
+					else
+						strcpy (replace, "Right");
+				}
+				*index= 0;
+				strcpy (suffix, index+4);
+			}
+		}
+	}
+
+#undef IS_SEPARATOR
+
+	sprintf (name_r, "%s%s%s%s", prefix, replace, suffix, number);
+}
+
+
+
 float deformvert_get_weight(const struct MDeformVert *dvert, int group_num)
 {
 	if(dvert)

Modified: trunk/blender/source/blender/blenkernel/intern/modifier.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/modifier.c	2010-01-15 17:23:16 UTC (rev 26023)
+++ trunk/blender/source/blender/blenkernel/intern/modifier.c	2010-01-15 17:28:00 UTC (rev 26024)
@@ -39,7 +39,6 @@
 #include "stdarg.h"
 #include "math.h"
 #include "float.h"
-#include "ctype.h"
 
 #include "BLI_math.h"
 #include "BLI_blenlib.h"
@@ -1801,118 +1800,6 @@
 	}
 }
 
-/* finds the best possible flipped name. For renaming; check for unique names afterwards */
-/* if strip_number: removes number extensions */
-static void vertgroup_flip_name (char *name, int strip_number)
-{
-	int     len;
-	char    prefix[128]={""};   /* The part before the facing */
-	char    suffix[128]={""};   /* The part after the facing */
-	char    replace[128]={""};  /* The replacement string */
-	char    number[128]={""};   /* The number extension string */
-	char    *index=NULL;
-
-	len= strlen(name);
-	if(len<3) return; // we don't do names like .R or .L
-
-	/* We first check the case with a .### extension, let's find the last period */
-	if(isdigit(name[len-1])) {
-		index= strrchr(name, '.'); // last occurrence
-		if (index && isdigit(index[1]) ) { // doesnt handle case bone.1abc2 correct..., whatever!
-			if(strip_number==0) 
-				strcpy(number, index);
-			*index= 0;
-			len= strlen(name);
-		}
-	}
-
-	strcpy (prefix, name);
-
-#define IS_SEPARATOR(a) ((a)=='.' || (a)==' ' || (a)=='-' || (a)=='_')
-
-	/* first case; separator . - _ with extensions r R l L  */
-	if( IS_SEPARATOR(name[len-2]) ) {
-		switch(name[len-1]) {
-			case 'l':
-				prefix[len-1]= 0;
-				strcpy(replace, "r");
-				break;
-			case 'r':
-				prefix[len-1]= 0;
-				strcpy(replace, "l");
-				break;
-			case 'L':
-				prefix[len-1]= 0;
-				strcpy(replace, "R");
-				break;
-			case 'R':
-				prefix[len-1]= 0;
-				strcpy(replace, "L");
-				break;
-		}
-	}
-	/* case; beginning with r R l L , with separator after it */
-	else if( IS_SEPARATOR(name[1]) ) {
-		switch(name[0]) {
-			case 'l':
-				strcpy(replace, "r");
-				strcpy(suffix, name+1);
-				prefix[0]= 0;
-				break;
-			case 'r':
-				strcpy(replace, "l");
-				strcpy(suffix, name+1);
-				prefix[0]= 0;
-				break;
-			case 'L':
-				strcpy(replace, "R");
-				strcpy(suffix, name+1);
-				prefix[0]= 0;
-				break;
-			case 'R':
-				strcpy(replace, "L");
-				strcpy(suffix, name+1);
-				prefix[0]= 0;
-				break;
-		}
-	}
-	else if(len > 5) {
-		/* hrms, why test for a separator? lets do the rule 'ultimate left or right' */
-		index = BLI_strcasestr(prefix, "right");
-		if (index==prefix || index==prefix+len-5) {
-			if(index[0]=='r') 
-				strcpy (replace, "left");
-			else {
-				if(index[1]=='I') 
-					strcpy (replace, "LEFT");
-				else
-					strcpy (replace, "Left");
-			}
-			*index= 0;
-			strcpy (suffix, index+5);
-		}
-		else {
-			index = BLI_strcasestr(prefix, "left");
-			if (index==prefix || index==prefix+len-4) {
-				if(index[0]=='l') 
-					strcpy (replace, "right");
-				else {
-					if(index[1]=='E') 
-						strcpy (replace, "RIGHT");
-					else
-						strcpy (replace, "Right");
-				}
-				*index= 0;
-				strcpy (suffix, index+4);
-			}
-		}
-	}
-
-#undef IS_SEPARATOR
-
-	sprintf (name, "%s%s%s%s", prefix, replace, suffix, number);
-}
-
 static DerivedMesh *doMirrorOnAxis(MirrorModifierData *mmd,
 		Object *ob,
 		DerivedMesh *dm,

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list