[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [13178] branches/cloth/blender/source/ blender: svn merge -r 13148:13177 https://svn.blender.org/svnroot/ bf-blender/trunk/blender + fixed one crash on enabling deflection

Daniel Genrich daniel.genrich at gmx.net
Wed Jan 9 13:05:25 CET 2008


Revision: 13178
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=13178
Author:   genscher
Date:     2008-01-09 13:04:54 +0100 (Wed, 09 Jan 2008)

Log Message:
-----------
svn merge -r 13148:13177 https://svn.blender.org/svnroot/bf-blender/trunk/blender + fixed one crash on enabling deflection

Modified Paths:
--------------
    branches/cloth/blender/source/blender/blenkernel/BKE_softbody.h
    branches/cloth/blender/source/blender/blenkernel/SConscript
    branches/cloth/blender/source/blender/blenkernel/intern/anim.c
    branches/cloth/blender/source/blender/blenkernel/intern/particle_system.c
    branches/cloth/blender/source/blender/blenkernel/intern/softbody.c
    branches/cloth/blender/source/blender/blenloader/intern/readfile.c
    branches/cloth/blender/source/blender/include/BIF_editaction.h
    branches/cloth/blender/source/blender/include/BSE_node.h
    branches/cloth/blender/source/blender/makesdna/DNA_action_types.h
    branches/cloth/blender/source/blender/makesdna/DNA_node_types.h
    branches/cloth/blender/source/blender/makesdna/DNA_object_force.h
    branches/cloth/blender/source/blender/nodes/intern/CMP_nodes/CMP_blur.c
    branches/cloth/blender/source/blender/nodes/intern/CMP_nodes/CMP_curves.c
    branches/cloth/blender/source/blender/render/intern/source/convertblender.c
    branches/cloth/blender/source/blender/src/buttons_object.c
    branches/cloth/blender/source/blender/src/drawnode.c
    branches/cloth/blender/source/blender/src/drawobject.c
    branches/cloth/blender/source/blender/src/editaction.c
    branches/cloth/blender/source/blender/src/editipo.c
    branches/cloth/blender/source/blender/src/editnode.c
    branches/cloth/blender/source/blender/src/editparticle.c
    branches/cloth/blender/source/blender/src/header_action.c
    branches/cloth/blender/source/blender/src/header_node.c
    branches/cloth/blender/source/blender/src/toolbox.c

Modified: branches/cloth/blender/source/blender/blenkernel/BKE_softbody.h
===================================================================
--- branches/cloth/blender/source/blender/blenkernel/BKE_softbody.h	2008-01-09 00:25:51 UTC (rev 13177)
+++ branches/cloth/blender/source/blender/blenkernel/BKE_softbody.h	2008-01-09 12:04:54 UTC (rev 13178)
@@ -41,6 +41,7 @@
 	float origS[3], origE[3], origT[3], pos[3], vec[3], force[3];
 	float goal;
 	float prevpos[3], prevvec[3], prevdx[3], prevdv[3]; /* used for Heun integration */
+    float impdv[3],impdx[3];
     int nofsprings; int *springs;
 	float choke;
 	float colball;

Modified: branches/cloth/blender/source/blender/blenkernel/SConscript
===================================================================
--- branches/cloth/blender/source/blender/blenkernel/SConscript	2008-01-09 00:25:51 UTC (rev 13177)
+++ branches/cloth/blender/source/blender/blenkernel/SConscript	2008-01-09 12:04:54 UTC (rev 13178)
@@ -9,6 +9,7 @@
 incs += ' #/intern/iksolver/extern ../blenloader ../quicktime'
 incs += ' #/extern/bullet2/src'
 incs += ' #/intern/bmfont'
+incs += ' #/intern/opennl/extern'
 
 incs += ' ' + env['BF_OPENGL_INC']
 incs += ' ' + env['BF_ZLIB_INC']

Modified: branches/cloth/blender/source/blender/blenkernel/intern/anim.c
===================================================================
--- branches/cloth/blender/source/blender/blenkernel/intern/anim.c	2008-01-09 00:25:51 UTC (rev 13177)
+++ branches/cloth/blender/source/blender/blenkernel/intern/anim.c	2008-01-09 12:04:54 UTC (rev 13178)
@@ -47,6 +47,7 @@
 #include "DNA_key_types.h"
 #include "DNA_mesh_types.h"
 #include "DNA_meshdata_types.h"
+#include "DNA_modifier_types.h"
 #include "DNA_object_types.h"
 #include "DNA_particle_types.h"
 #include "DNA_scene_types.h"
@@ -76,7 +77,7 @@
 
 #define MAX_DUPLI_RECUR 4
 
-static void object_duplilist_recursive(ID *id, Object *ob, ListBase *duplilist, float (*par_space_mat)[][4], int level);
+static void object_duplilist_recursive(ID *id, Object *ob, ListBase *duplilist, float par_space_mat[][4], int level);
 
 void free_path(Path *path)
 {
@@ -327,7 +328,7 @@
 			
 			if(go->ob->transflag & OB_DUPLI) {
 				Mat4CpyMat4(dob->ob->obmat, dob->mat);
-				object_duplilist_recursive((ID *)group, go->ob, lb, &ob->obmat, level+1);
+				object_duplilist_recursive((ID *)group, go->ob, lb, ob->obmat, level+1);
 				Mat4CpyMat4(dob->ob->obmat, dob->omat);
 			}
 		}
@@ -412,12 +413,12 @@
 		float tmpmat[4][4];
 		Mat4CpyMat4(tmpmat, vdd->ob->obmat);
 		Mat4CpyMat4(vdd->ob->obmat, obmat); /* pretend we are really this mat */
-		object_duplilist_recursive((ID *)vdd->id, vdd->ob, vdd->lb, &obmat, vdd->level+1);
+		object_duplilist_recursive((ID *)vdd->id, vdd->ob, vdd->lb, obmat, vdd->level+1);
 		Mat4CpyMat4(vdd->ob->obmat, tmpmat);
 	}
 }
 
-static void vertex_duplilist(ListBase *lb, ID *id, Object *par, float (*par_space_mat)[][4], int level)
+static void vertex_duplilist(ListBase *lb, ID *id, Object *par, float par_space_mat[][4], int level)
 {
 	Object *ob, *ob_iter;
 	Base *base = NULL;
@@ -473,11 +474,11 @@
 					/* par_space_mat - only used for groups so we can modify the space dupli's are in
 					   when par_space_mat is NULL ob->obmat can be used instead of ob__obmat
 					*/
-					if (par_space_mat) {
-						Mat4MulMat4(vdd.obmat, ob->obmat, *par_space_mat);
-					} else {
+					if(par_space_mat)
+						Mat4MulMat4(vdd.obmat, ob->obmat, par_space_mat);
+					else
 						Mat4CpyMat4(vdd.obmat, ob->obmat);
-					}
+
 					vdd.id= id;
 					vdd.level= level;
 					vdd.lb= lb;
@@ -512,7 +513,7 @@
 	dm->release(dm);
 }
 
-static void face_duplilist(ListBase *lb, ID *id, Object *par, float (*par_space_mat)[][4], int level)
+static void face_duplilist(ListBase *lb, ID *id, Object *par, float par_space_mat[][4], int level)
 {
 	Object *ob, *ob_iter;
 	Base *base = NULL;
@@ -583,11 +584,10 @@
 					/* par_space_mat - only used for groups so we can modify the space dupli's are in
 					   when par_space_mat is NULL ob->obmat can be used instead of ob__obmat
 					*/
-					if (par_space_mat) {
-						Mat4MulMat4(ob__obmat, ob->obmat, *par_space_mat);
-					} else {
+					if(par_space_mat)
+						Mat4MulMat4(ob__obmat, ob->obmat, par_space_mat);
+					else
 						Mat4CpyMat4(ob__obmat, ob->obmat);
-					}
 					
 					Mat3CpyMat4(imat, ob->parentinv);
 						
@@ -638,7 +638,7 @@
 							float tmpmat[4][4];
 							Mat4CpyMat4(tmpmat, ob->obmat);
 							Mat4CpyMat4(ob->obmat, obmat); /* pretend we are really this mat */
-							object_duplilist_recursive((ID *)id, ob, lb, &ob->obmat, level+1);
+							object_duplilist_recursive((ID *)id, ob, lb, ob->obmat, level+1);
 							Mat4CpyMat4(ob->obmat, tmpmat);
 						}
 					}
@@ -660,17 +660,46 @@
 	dm->release(dm);
 }
 
-static void new_particle_duplilist(ListBase *lb, ID *id, Object *par, ParticleSystem *psys, int level)
+static void particle_dupli_path_rotation(Object *ob, ParticleSettings *part, ParticleSystemModifierData *psmd, ParticleData *pa, ChildParticle *cpa, ParticleCacheKey *cache, float mat[][4], float *scale)
 {
+	float loc[3], nor[3], vec[3], side[3], len;
+
+	VecSubf(vec, (cache+cache->steps-1)->co, cache->co);
+	len= Normalize(vec);
+
+	if(pa)
+		psys_particle_on_emitter(ob,psmd,part->from,pa->num,pa->num_dmcache,pa->fuv,pa->foffset,loc,nor,0,0,0,0);
+	else
+		psys_particle_on_emitter(ob, psmd,
+			(part->childtype == PART_CHILD_FACES)? PART_FROM_FACE: PART_FROM_PARTICLE,
+			cpa->num,DMCACHE_ISCHILD,cpa->fuv,cpa->foffset,loc,nor,0,0,0,0);
+	
+	Crossf(side, nor, vec);
+	Normalize(side);
+	Crossf(nor, vec, side);
+
+	Mat4One(mat);
+	VECCOPY(mat[0], vec);
+	VECCOPY(mat[1], side);
+	VECCOPY(mat[2], nor);
+
+	*scale= len;
+}
+
+static void new_particle_duplilist(ListBase *lb, ID *id, Object *par, float par_space_mat[][4], ParticleSystem *psys, int level)
+{
 	GroupObject *go;
-	Object *ob, **oblist=0;
+	Object *ob=0, **oblist=0;
 	ParticleSettings *part;
 	ParticleData *pa;
 	ParticleKey state;
-	float ctime, pa_time;
-	float tmat[4][4], mat[3][3], obrotmat[3][3], parotmat[3][3], size=0.0;
+	ParticleCacheKey *cache;
+	ParticleSystemModifierData *psmd;
+	float ctime, pa_time, scale = 1.0f;
+	float tmat[4][4], mat[4][4], obrotmat[4][4], pamat[4][4], size=0.0;
+	float obmat[4][4], (*obmatlist)[4][4]=0;
 	float xvec[3] = {-1.0, 0.0, 0.0}, *q;
-	int lay, a, k, step_nbr = 0, counter;
+	int lay, a, b, k, step_nbr = 0, counter, hair = 0;
 	int totpart, totchild, totgroup=0, pa_num;
 
 	if(psys==0) return;
@@ -678,9 +707,8 @@
 	/* simple preventing of too deep nested groups */
 	if(level>MAX_DUPLI_RECUR) return;
 	
-	if (GS(id->name)!=ID_SCE) return; /* No support for groups YET! TODO */
-	
 	part=psys->part;
+	psmd= psys_get_modifier(par, psys);
 
 	if(part==0) return;
 
@@ -700,6 +728,9 @@
 		else
 			step_nbr = 0;
 
+		if(psys->flag & PSYS_HAIR_DONE)
+			hair= (totchild == 0 || psys->childcache) && psys->pathcache;
+
 		psys->lattice = psys_get_lattice(par, psys);
 
 		if(part->draw_as==PART_DRAW_GR) {
@@ -712,10 +743,17 @@
 			}
 
 			oblist= MEM_callocN(totgroup*sizeof(Object *), "dupgroup object list");
+			obmatlist= MEM_callocN(totgroup*sizeof(float)*4*4, "dupgroup obmat list");
 			go= part->dup_group->gobject.first;
-			for(a=0; a<totgroup; a++, go=go->next)
+			for(a=0; a<totgroup; a++, go=go->next) {
 				oblist[a]=go->ob;
+				Mat4CpyMat4(obmatlist[a], go->ob->obmat);
+			}
 		}
+		else {
+			ob = part->dup_ob;
+			Mat4CpyMat4(obmat, ob->obmat);
+		}
 
 		if(totchild==0 || part->draw & PART_DRAW_PARENT)
 			a=0;
@@ -724,7 +762,8 @@
 
 		for(pa=psys->particles,counter=0; a<totpart+totchild; a++,pa++,counter++) {
 			if(a<totpart) {
-				if(pa->flag & (PARS_UNEXIST+PARS_NO_DISP)) continue;
+				if(pa->flag & (PARS_UNEXIST+PARS_NO_DISP))
+					continue;
 
 				pa_num=pa->num;
 
@@ -742,61 +781,91 @@
 
 			if(part->draw_as==PART_DRAW_GR) {
 				if(part->draw&PART_DRAW_RAND_GR)
-					ob = oblist[BLI_rand() % totgroup];
+					b= BLI_rand() % totgroup;
 				else if(part->from==PART_FROM_PARTICLE)
-					ob = oblist[pa_num % totgroup];
+					b= pa_num % totgroup;
 				else
-					ob = oblist[a % totgroup];
+					b= a % totgroup;
+
+				ob = oblist[b];
+				Mat4CpyMat4(obmat, obmatlist[b]);
 			}
-			else
-				ob = part->dup_ob;
 
 			for(k=0; k<=step_nbr; k++, counter++) {
-				if(step_nbr) {
+				if(hair) {
+					if(a < totpart) {
+						cache = psys->pathcache[a];
+						particle_dupli_path_rotation(par, part, psmd, pa, 0, cache, pamat, &scale);
+					}
+					else {
+						ChildParticle *cpa= psys->child+(a-totpart);
+						cache = psys->childcache[a-totpart];
+						particle_dupli_path_rotation(par, part, psmd, 0, cpa, cache, pamat, &scale);
+					}
+
+					VECCOPY(pamat[3], cache->co);
+				}
+				else if(step_nbr) {
 					state.time = (float)k / (float)step_nbr;
 					psys_get_particle_on_path(par, psys, a, &state, 0);
+
+					QuatToMat4(state.rot, pamat);
+					VECCOPY(pamat[3], state.co);
+					pamat[3][3]= 1.0f;
 				}
 				else {
 					state.time = -1.0;
 					if(psys_get_particle_state(par, psys, a, &state, 0) == 0)
 						continue;
+
+					QuatToMat4(state.rot, pamat);
+					VECCOPY(pamat[3], state.co);
+					pamat[3][3]= 1.0f;
 				}
 
-				QuatToMat3(state.rot, parotmat);
-
 				if(part->draw_as==PART_DRAW_GR && psys->part->draw & PART_DRAW_WHOLE_GR) {
-					for(go= part->dup_group->gobject.first; go; go= go->next) {
+					for(go= part->dup_group->gobject.first, b=0; go; go= go->next, b++) {
 
-						Mat4CpyMat4(tmat, go->ob->obmat);
-						Mat4MulMat43(tmat, go->ob->obmat, parotmat);
-						Mat4MulFloat3((float *)tmat, size);
+						Mat4MulMat4(tmat, obmatlist[b], pamat);
+						Mat4MulFloat3((float *)tmat, size*scale);
+						if(par_space_mat)
+							Mat4MulMat4(mat, tmat, par_space_mat);
+						else
+							Mat4CpyMat4(mat, tmat);
 
-						VECADD(tmat[3], go->ob->obmat[3], state.co);
-
-						new_dupli_object(lb, go->ob, tmat, par->lay, counter, OB_DUPLIPARTS);
+						new_dupli_object(lb, go->ob, mat, par->lay, counter, OB_DUPLIPARTS);
 					}
 				}
 				else {
 					/* to give ipos in object correct offset */
 					where_is_object_time(ob, ctime-pa_time);
 					
-					q = vectoquat(xvec, ob->trackflag, ob->upflag);
-					QuatToMat3(q, obrotmat);
+					if(!hair) {
+						q = vectoquat(xvec, ob->trackflag, ob->upflag);
+						QuatToMat4(q, obrotmat);
+						obrotmat[3][3]= 1.0f;
 
-					Mat3MulMat3(mat, parotmat, obrotmat);
-					Mat4CpyMat4(tmat, ob->obmat);
-					Mat4MulMat43(tmat, ob->obmat, mat);
-					Mat4MulFloat3((float *)tmat, size);

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list