[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [15223] branches/apricot: svn merge -r15209:HEAD https://svn.blender.org/svnroot/bf-blender/trunk/ blender/

Campbell Barton ideasman42 at gmail.com
Sat Jun 14 20:13:57 CEST 2008


Revision: 15223
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=15223
Author:   campbellbarton
Date:     2008-06-14 20:13:02 +0200 (Sat, 14 Jun 2008)

Log Message:
-----------
svn  merge  -r15209:HEAD https://svn.blender.org/svnroot/bf-blender/trunk/blender/

Modified Paths:
--------------
    branches/apricot/projectfiles_vc7/blender/blenkernel/BKE_blenkernel.vcproj
    branches/apricot/projectfiles_vc7/blender/blenlib/BLI_blenlib.vcproj
    branches/apricot/source/blender/blenkernel/intern/action.c
    branches/apricot/source/blender/blenkernel/intern/modifier.c
    branches/apricot/source/blender/blenkernel/intern/object.c
    branches/apricot/source/blender/blenlib/intern/util.c
    branches/apricot/source/blender/makesdna/DNA_modifier_types.h
    branches/apricot/source/blender/render/intern/source/shadbuf.c
    branches/apricot/source/blender/src/buttons_editing.c
    branches/apricot/source/blender/src/usiblender.c
    branches/apricot/source/gameengine/Converter/BL_ArmatureObject.cpp
    branches/apricot/source/gameengine/Ketsji/KX_GameObject.cpp
    branches/apricot/source/gameengine/Ketsji/KX_SG_NodeRelationships.h
    branches/apricot/source/gameengine/PyDoc/KX_GameObject.py
    branches/apricot/source/gameengine/SceneGraph/SG_Node.cpp
    branches/apricot/source/gameengine/SceneGraph/SG_Node.h
    branches/apricot/source/gameengine/SceneGraph/SG_ParentRelation.h
    branches/apricot/source/gameengine/SceneGraph/SG_Spatial.cpp
    branches/apricot/source/gameengine/SceneGraph/SG_Spatial.h

Modified: branches/apricot/projectfiles_vc7/blender/blenkernel/BKE_blenkernel.vcproj
===================================================================
--- branches/apricot/projectfiles_vc7/blender/blenkernel/BKE_blenkernel.vcproj	2008-06-14 17:31:23 UTC (rev 15222)
+++ branches/apricot/projectfiles_vc7/blender/blenkernel/BKE_blenkernel.vcproj	2008-06-14 18:13:02 UTC (rev 15223)
@@ -345,6 +345,9 @@
 				RelativePath="..\..\..\source\blender\blenkernel\intern\BME_conversions.c">
 			</File>
 			<File
+				RelativePath="..\..\..\source\blender\blenkernel\intern\BME_Customdata.c">
+			</File>
+			<File
 				RelativePath="..\..\..\source\blender\blenkernel\intern\BME_eulers.c">
 			</File>
 			<File
@@ -426,9 +429,6 @@
 				RelativePath="..\..\..\source\blender\blenkernel\intern\ipo.c">
 			</File>
 			<File
-				RelativePath="..\..\..\source\blender\blenkernel\intern\kdop.c">
-			</File>
-			<File
 				RelativePath="..\..\..\source\blender\blenkernel\intern\key.c">
 			</File>
 			<File
@@ -559,6 +559,9 @@
 				RelativePath="..\..\..\source\blender\blenkernel\BKE_bmesh.h">
 			</File>
 			<File
+				RelativePath="..\..\..\source\blender\blenkernel\BKE_bmeshCustomData.h">
+			</File>
+			<File
 				RelativePath="..\..\..\source\blender\blenkernel\BKE_bmfont.h">
 			</File>
 			<File

Modified: branches/apricot/projectfiles_vc7/blender/blenlib/BLI_blenlib.vcproj
===================================================================
--- branches/apricot/projectfiles_vc7/blender/blenlib/BLI_blenlib.vcproj	2008-06-14 17:31:23 UTC (rev 15222)
+++ branches/apricot/projectfiles_vc7/blender/blenlib/BLI_blenlib.vcproj	2008-06-14 18:13:02 UTC (rev 15223)
@@ -347,6 +347,9 @@
 				RelativePath="..\..\..\source\blender\blenlib\intern\BLI_heap.c">
 			</File>
 			<File
+				RelativePath="..\..\..\source\blender\blenlib\intern\BLI_kdopbvh.c">
+			</File>
+			<File
 				RelativePath="..\..\..\source\blender\blenlib\intern\BLI_kdtree.c">
 			</File>
 			<File
@@ -459,6 +462,9 @@
 				RelativePath="..\..\..\source\blender\blenlib\BLI_jitter.h">
 			</File>
 			<File
+				RelativePath="..\..\..\source\blender\blenlib\BLI_kdopbvh.h">
+			</File>
+			<File
 				RelativePath="..\..\..\source\blender\blenlib\BLI_kdtree.h">
 			</File>
 			<File

Modified: branches/apricot/source/blender/blenkernel/intern/action.c
===================================================================
--- branches/apricot/source/blender/blenkernel/intern/action.c	2008-06-14 17:31:23 UTC (rev 15222)
+++ branches/apricot/source/blender/blenkernel/intern/action.c	2008-06-14 18:13:02 UTC (rev 15223)
@@ -290,6 +290,12 @@
 		return;
 	}
 	
+	if (*dst==src) {
+		printf("copy_pose source and target are the same\n");
+		*dst=NULL;
+		return;
+	}
+	
 	outPose= MEM_callocN(sizeof(bPose), "pose");
 	
 	duplicatelist(&outPose->chanbase, &src->chanbase);
@@ -740,6 +746,11 @@
 	const bPoseChannel *schan;
 	bPoseChannel *pchan= pose->chanbase.first;
 
+	if (pose==src) {
+		printf("extract_pose_from_pose source and target are the same\n");
+		return;
+	}
+
 	for (schan=src->chanbase.first; schan; schan=schan->next, pchan= pchan->next) {
 		copy_pose_channel_data(pchan, schan);
 	}
@@ -817,6 +828,12 @@
 		return;
 	}
 
+	if (to==from) {
+		printf("copy_pose_result source and target are the same\n");
+		return;
+	}
+
+
 	for(pchanfrom= from->chanbase.first; pchanfrom; pchanfrom= pchanfrom->next) {
 		pchanto= get_pose_channel(to, pchanfrom->name);
 		if(pchanto) {

Modified: branches/apricot/source/blender/blenkernel/intern/modifier.c
===================================================================
--- branches/apricot/source/blender/blenkernel/intern/modifier.c	2008-06-14 17:31:23 UTC (rev 15222)
+++ branches/apricot/source/blender/blenkernel/intern/modifier.c	2008-06-14 18:13:02 UTC (rev 15223)
@@ -40,6 +40,7 @@
 #include "stdarg.h"
 #include "math.h"
 #include "float.h"
+#include "ctype.h"
 
 #include "BLI_arithb.h"
 #include "BLI_blenlib.h"
@@ -1269,7 +1270,7 @@
 {
 	MirrorModifierData *mmd = (MirrorModifierData*) md;
 
-	mmd->flag |= MOD_MIR_AXIS_X;
+	mmd->flag |= (MOD_MIR_AXIS_X | MOD_MIR_VGROUP);
 	mmd->tolerance = 0.001;
 	mmd->mirror_ob = NULL;
 }
@@ -1308,6 +1309,118 @@
 	}
 }
 
+/* finds the best possible flipped name. For renaming; check for unique names afterwards */
+/* if strip_number: removes number extensions */
+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 occurrance
+		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,
@@ -1321,6 +1434,9 @@
 	int maxVerts = dm->getNumVerts(dm);
 	int maxEdges = dm->getNumEdges(dm);
 	int maxFaces = dm->getNumFaces(dm);
+	int vector_size, j, a, b;
+	bDeformGroup *def, *defb;
+	bDeformGroup **vector_def = NULL;
 	int (*indexMap)[2];
 	float mtx[4][4], imtx[4][4];
 
@@ -1330,6 +1446,21 @@
 
 	result = CDDM_from_template(dm, maxVerts * 2, maxEdges * 2, maxFaces * 2);
 
+
+	if (mmd->flag & MOD_MIR_VGROUP) {
+		/* calculate the number of deformedGroups */
+		for(vector_size = 0, def = ob->defbase.first; def;
+		    def = def->next, vector_size++);
+
+		/* load the deformedGroups for fast access */
+		vector_def =
+		    (bDeformGroup **)MEM_mallocN(sizeof(bDeformGroup*) * vector_size,
+		                                 "group_index");
+		for(a = 0, def = ob->defbase.first; def; def = def->next, a++) {
+			vector_def[a] = def;
+		}
+	}
+
 	if (mmd->mirror_ob) {
 		float obinv[4][4];
 
@@ -1374,16 +1505,48 @@
 			mv->flag |= ME_VERT_MERGED;
 		} else {
 			MVert *mv2 = CDDM_get_vert(result, numVerts);
+			MDeformVert *dvert = NULL;
 
 			DM_copy_vert_data(dm, result, i, numVerts, 1);
 			*mv2 = *mv;
-			numVerts++;
 
 			co[axis] = -co[axis];
 			if (mmd->mirror_ob) {
 				VecMat4MulVecfl(co, imtx, co);
 			}
 			VecCopyf(mv2->co, co);
+
+			if (mmd->flag & MOD_MIR_VGROUP){
+				dvert = DM_get_vert_data(result, numVerts, CD_MDEFORMVERT);
+
+				if (dvert)
+				{
+					for(j = 0; j < dvert[0].totweight; ++j)
+					{
+						char tmpname[32];
+
+						if(dvert->dw[j].def_nr < 0 ||
+						   dvert->dw[j].def_nr >= vector_size)
+							continue;
+
+						def = vector_def[dvert->dw[j].def_nr];
+						strcpy(tmpname, def->name);
+						vertgroup_flip_name(tmpname,0);
+
+						for(b = 0, defb = ob->defbase.first; defb;
+						    defb = defb->next, b++)
+						{
+							if(!strcmp(defb->name, tmpname))
+							{
+								dvert->dw[j].def_nr = b;
+								break;
+							}
+						}
+					}
+				}
+			}
+
+			numVerts++;
 		}
 	}
 
@@ -1467,6 +1630,8 @@
 				 }
 	}
 
+	if (vector_def) MEM_freeN(vector_def);
+
 	MEM_freeN(indexMap);
 
 	CDDM_lower_num_verts(result, numVerts);

Modified: branches/apricot/source/blender/blenkernel/intern/object.c
===================================================================
--- branches/apricot/source/blender/blenkernel/intern/object.c	2008-06-14 17:31:23 UTC (rev 15222)
+++ branches/apricot/source/blender/blenkernel/intern/object.c	2008-06-14 18:13:02 UTC (rev 15223)
@@ -1100,6 +1100,8 @@
 {
 	bPoseChannel *chan;
 	
+	/* note: need to clear obn->pose pointer first, so that copy_pose works (otherwise there's a crash) */
+	obn->pose= NULL;
 	copy_pose(&obn->pose, ob->pose, 1);	/* 1 = copy constraints */
 
 	for (chan = obn->pose->chanbase.first; chan; chan=chan->next){

Modified: branches/apricot/source/blender/blenlib/intern/util.c
===================================================================
--- branches/apricot/source/blender/blenlib/intern/util.c	2008-06-14 17:31:23 UTC (rev 15222)
+++ branches/apricot/source/blender/blenlib/intern/util.c	2008-06-14 18:13:02 UTC (rev 15223)
@@ -905,8 +905,11 @@
 			if (dir[a] == '\\') break;
 			a--;
 		}
-		memmove( dir+a, eind, strlen(eind)+1 );
-		
+		if (a<0) {
+			break;
+		} else {
+			memmove( dir+a, eind, strlen(eind)+1 );
+		}
 	}
 
 	while ( (start = strstr(dir,"\\.\\")) ){
@@ -939,7 +942,11 @@
 			if (dir[a] == '/') break;
 			a--;
 		}
-		memmove( dir+a, eind, strlen(eind)+1 );
+		if (a<0) {
+			break;

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list