[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [12444] branches/particles/source/blender: -A possible fix for a crash with keyed particles (possible because I wasn' t able to reproduce error even before the fix).

Janne Karhu jhkarh at utu.fi
Wed Oct 31 18:25:42 CET 2007


Revision: 12444
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=12444
Author:   jhk
Date:     2007-10-31 18:25:41 +0100 (Wed, 31 Oct 2007)

Log Message:
-----------
-A possible fix for a crash with keyed particles (possible because I wasn't able to reproduce error even before the fix).
-Scaling and rotating crashed in particle mode. Now they work again, but the transform center is still drawn wrong.

Modified Paths:
--------------
    branches/particles/source/blender/blenkernel/intern/particle.c
    branches/particles/source/blender/include/transform.h
    branches/particles/source/blender/src/transform.c
    branches/particles/source/blender/src/transform_conversions.c

Modified: branches/particles/source/blender/blenkernel/intern/particle.c
===================================================================
--- branches/particles/source/blender/blenkernel/intern/particle.c	2007-10-31 16:28:07 UTC (rev 12443)
+++ branches/particles/source/blender/blenkernel/intern/particle.c	2007-10-31 17:25:41 UTC (rev 12444)
@@ -1776,6 +1776,10 @@
 	float sel_col[3];
 	float nosel_col[3];
 
+	/* we don't have anything valid to create paths from so let's quit here */
+	if((psys->flag & PSYS_HAIR_DONE)==0 && (psys->flag & PSYS_KEYED)==0)
+		return;
+
 	if(G.rendering)
 		steps = (int)pow(2.0, (double)psys->part->ren_step);
 	else if(ob==OBACT && psys->edit && G.f & G_PARTICLEEDIT && psys->flag&PSYS_CURRENT){

Modified: branches/particles/source/blender/include/transform.h
===================================================================
--- branches/particles/source/blender/include/transform.h	2007-10-31 16:28:07 UTC (rev 12443)
+++ branches/particles/source/blender/include/transform.h	2007-10-31 17:25:41 UTC (rev 12444)
@@ -269,8 +269,7 @@
 	#define TD_VERSE_VERT		64
 #endif
 #define TD_TIMEONLY			128
-#define TD_ROTSIZE			256 /* used for rotating particle velocity vector */
-#define TD_NO_EXT			512	/* ext abused for bake key timing */
+#define TD_NO_EXT			256	/* ext abused for particle key timing */
 
 /* transsnap->status */
 #define SNAP_ON			1

Modified: branches/particles/source/blender/src/transform.c
===================================================================
--- branches/particles/source/blender/src/transform.c	2007-10-31 16:28:07 UTC (rev 12443)
+++ branches/particles/source/blender/src/transform.c	2007-10-31 17:25:41 UTC (rev 12444)
@@ -1965,11 +1965,6 @@
 			Mat3MulSerie(fmat, td->mtx, mat, td->smtx, 0, 0, 0, 0, 0);
 			Mat3ToQuat(fmat, quat);	// Actual transform
 
-			if(td->flag & TD_ROTSIZE){
-				VECCOPY(td->ext->size,td->ext->isize);
-				QuatMulVecf(quat, td->ext->size);
-			}
-
 			if(td->ext->quat){
 				QuatMul(td->ext->quat, quat, td->ext->iquat);
 
@@ -2052,11 +2047,6 @@
 			if(td->flag & TD_USEQUAT) {
 				Mat3MulSerie(fmat, td->mtx, mat, td->smtx, 0, 0, 0, 0, 0);
 				Mat3ToQuat(fmat, quat);	// Actual transform
-
-				if(td->flag & TD_ROTSIZE){
-					VECCOPY(td->ext->size,td->ext->isize);
-					QuatMulVecf(quat, td->ext->size);
-				}
 				
 				QuatMul(td->ext->quat, quat, td->ext->iquat);
 				/* this function works on end result */

Modified: branches/particles/source/blender/src/transform_conversions.c
===================================================================
--- branches/particles/source/blender/src/transform_conversions.c	2007-10-31 16:28:07 UTC (rev 12443)
+++ branches/particles/source/blender/src/transform_conversions.c	2007-10-31 17:25:41 UTC (rev 12444)
@@ -1361,37 +1361,26 @@
 {
 	TransData *td = NULL;
 	TransDataExtension *tx;
-	Base *base=BASACT;
-	Object *ob=OBACT;
-	ParticleSystem *spsys=0, *psys=PE_get_current(ob);
-	ParticleSystemModifierData *psmd=0;
-	ParticleData *pa=0;
+	Base *base = BASACT;
+	Object *ob = OBACT;
+	ParticleSystem *spsys=0, *psys = PE_get_current(ob);
+	ParticleSystemModifierData *psmd = NULL;
+	ParticleData *pa = NULL;
 	ParticleEdit *edit;
 	ParticleEditKey *key;
 	float mat[4][4], imat[4][4], tmat[4][4];
 	int i,k, totpart;
-	int count=0, countsel=0;
+	int count = 0, countsel = 0;
 	int propmode = t->flag & T_PROP_EDIT;
-	int key_space=0, soft=0;
+	int key_space = 0, soft = 0;
 
-	if(psys==0 || G.scene->selectmode==SCE_SELECT_PATH) return;
+	if(psys==NULL || G.scene->selectmode==SCE_SELECT_PATH) return;
 
-	//key_space=bsys->key_space;
+	psmd = psys_get_modifier(ob,psys);
+	pa = psys->particles;
 
-	psmd= psys_get_modifier(ob,psys);
-	pa= psys->particles;
-
-	//if(psys->soft){
-	//	sbsys = DB_find_bsys(&ob->bakeable, bsys->soft);
-	//	if((sbsys->flag&BSYS_DONE && (sbsys->flag&BSYS_AUTOBAKE)==0)
-	//		|| (sbsys->flag & BSYS_HAS_START && sbsys->flag & BSYS_EDIT_START))
-	//		key_space=sbsys->key_space;
-	//	else
-	//		sbsys=0;
-	//}
-
-	edit=psys->edit;
-	totpart=psys->totpart;
+	edit = psys->edit;
+	totpart = psys->totpart;
 	base->flag |= BA_HAS_RECALC_DATA;
 
 	for(i=0, pa=psys->particles; i<totpart; i++, pa++){
@@ -1410,9 +1399,13 @@
 	
 	if(propmode) t->total = count;
 	else t->total = countsel;
-	td = t->data= MEM_callocN(t->total*sizeof(TransData), "TransObData(Bake EditMode)");
-	tx = t->ext = MEM_callocN(t->total*sizeof(TransDataExtension), "Bake_TransExtension");
+	td = t->data = MEM_callocN(t->total * sizeof(TransData), "TransObData(Particle Mode)");
 
+	if(t->mode == TFM_BAKE_TIME)
+		tx = t->ext = MEM_callocN(t->total * sizeof(TransDataExtension), "Particle_TransExtension");
+	else
+		tx = t->ext = NULL;
+
 	Mat4One(mat);
 	Mat4One(imat);
 
@@ -1429,65 +1422,45 @@
 		Mat4Invert(imat,mat);
 
 		for(k=0, key=edit->keys[i]; k<pa->totkey; k++, key++){
-			if((key->flag&PEK_HIDE)==0 && (propmode || key->flag&PEK_SELECT)){
-				//if(sbsys)
-				//	td->loc= EB_nearest_key(sbsys,bsys->bp_key_index[i]+k)->co;
-				//else
-					td->loc= key->co;
+			if((key->flag & PEK_HIDE)==0 && (propmode || key->flag & PEK_SELECT)) {
+				
+				td->loc = key->co;
 
 				VECCOPY(td->iloc, td->loc);
 
 				VECCOPY(td->center, td->loc);
 
-				//tx->size = key->vel;
-				//VECCOPY(tx->isize, key->vel);
+				if(key->flag & PEK_SELECT) td->flag |= TD_SELECTED;
 
-				//td->flag = TD_USEQUAT;
+				Mat3CpyMat4(td->mtx, mat);
+				Mat3CpyMat4(td->smtx, imat);
 
-				if(key->flag&PEK_SELECT) td->flag |= TD_SELECTED;
-
-				Mat3CpyMat4(td->mtx,mat);
-				Mat3CpyMat4(td->smtx,imat);
-
-				/* apply rotation to velocity vector */
-				//if(edit->flag & PE_ROT_VEL)
-				//	td->flag |= TD_ROTSIZE;
-
-				/* don't apply rotations to particle rotation */
-				//if((edit->flag & PE_ROT_ROT)==0)
-				//	td->protectflag |= OB_LOCK_ROTX|OB_LOCK_ROTY|OB_LOCK_ROTZ;
-
 				/* don't allow moving roots */
-				if(k==0 && edit->flag&PE_LOCK_FIRST)
+				if(k==0 && edit->flag & PE_LOCK_FIRST)
 					td->protectflag |= OB_LOCK_LOC;
 
-				td->ext=tx;
-				td->tdi=0;
-				if(t->mode == TFM_BAKE_TIME){
-					td->val=key->time;
-					td->ival=*(key->time);
+				td->ext = tx;
+				td->tdi = NULL;
+				if(t->mode == TFM_BAKE_TIME) {
+					td->val = key->time;
+					td->ival = *(key->time);
 					/* abuse size and quat for min/max values */
 					td->flag |= TD_NO_EXT;
-					if(k==0) tx->size=0;
-					else tx->size=(key-1)->time;
+					if(k==0) tx->size = 0;
+					else tx->size = (key - 1)->time;
 
-					if(k==pa->totkey-1) tx->quat=0;
-					else tx->quat=(key+1)->time;
+					if(k == pa->totkey - 1) tx->quat = 0;
+					else tx->quat = (key + 1)->time;
 				}
-				else if(key->rot){
-					tx->quat = key->rot;
-					QUATCOPY(tx->iquat,tx->quat);
-				}
 
-				tx->rot=0;
-
 				td++;
-				tx++;
+				if(tx)
+					tx++;
 				tail++;
 			}
 		}
 		if (propmode && head != tail)
-			calc_distanceCurveVerts(head, tail-1);
+			calc_distanceCurveVerts(head, tail - 1);
 	}
 }
 /* ********************* mesh ****************** */





More information about the Bf-blender-cvs mailing list