[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [12808] trunk/blender/source/blender:

Brecht Van Lommel brechtvanlommel at pandora.be
Thu Dec 6 18:43:47 CET 2007


Revision: 12808
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=12808
Author:   blendix
Date:     2007-12-06 18:43:47 +0100 (Thu, 06 Dec 2007)

Log Message:
-----------

Particles
=========

- Normalize strand coordinates over the length of the strand, not
  cut off when with e.g. length texture control.
- Weight paint and particle mode x-mirror now works with deformation
  and shape keys active.
- X-ray is now disabled in particle mode, messed up depth tests.

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/BKE_particle.h
    trunk/blender/source/blender/blenkernel/intern/DerivedMesh.c
    trunk/blender/source/blender/blenkernel/intern/particle.c
    trunk/blender/source/blender/render/intern/source/convertblender.c
    trunk/blender/source/blender/render/intern/source/renderdatabase.c
    trunk/blender/source/blender/src/drawobject.c
    trunk/blender/source/blender/src/editparticle.c
    trunk/blender/source/blender/src/meshtools.c

Modified: trunk/blender/source/blender/blenkernel/BKE_particle.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_particle.h	2007-12-06 14:22:22 UTC (rev 12807)
+++ trunk/blender/source/blender/blenkernel/BKE_particle.h	2007-12-06 17:43:47 UTC (rev 12808)
@@ -265,6 +265,7 @@
 //void psys_vec_rot_from_face(struct DerivedMesh *dm, struct ParticleData *pa, float *vec);
 void psys_mat_hair_to_object(struct Object *ob, struct DerivedMesh *dm, short from, struct ParticleData *pa, float hairmat[][4]);
 void psys_mat_hair_to_global(struct Object *ob, struct DerivedMesh *dm, short from, struct ParticleData *pa, float hairmat[][4]);
+void psys_mat_hair_to_orco(struct Object *ob, struct DerivedMesh *dm, short from, struct ParticleData *pa, float hairmat[][4]);
 
 float *psys_cache_vgroup(struct DerivedMesh *dm, struct ParticleSystem *psys, int vgroup);
 void psys_get_texture(struct Object *ob, struct Material *ma, struct ParticleSystemModifierData *psmd, struct ParticleSystem *psys, struct ParticleData *pa, struct ParticleTexture *ptex, int event);

Modified: trunk/blender/source/blender/blenkernel/intern/DerivedMesh.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/DerivedMesh.c	2007-12-06 14:22:22 UTC (rev 12807)
+++ trunk/blender/source/blender/blenkernel/intern/DerivedMesh.c	2007-12-06 17:43:47 UTC (rev 12808)
@@ -2482,7 +2482,7 @@
 		ob->derivedFinal->getMinMax(ob->derivedFinal, min, max);
 
 		if(!ob->bb)
-			ob->bb= MEM_mallocN(sizeof(BoundBox), "bb");
+			ob->bb= MEM_callocN(sizeof(BoundBox), "bb");
 		boundbox_set_from_min_max(ob->bb, min, max);
 
 		ob->derivedFinal->needsFree = 0;
@@ -2520,7 +2520,7 @@
 	em->derivedFinal->getMinMax(em->derivedFinal, min, max);
 
 	if(!G.obedit->bb)
-		G.obedit->bb= MEM_mallocN(sizeof(BoundBox), "bb");
+		G.obedit->bb= MEM_callocN(sizeof(BoundBox), "bb");
 	boundbox_set_from_min_max(G.obedit->bb, min, max);
 
 	em->derivedFinal->needsFree = 0;

Modified: trunk/blender/source/blender/blenkernel/intern/particle.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/particle.c	2007-12-06 14:22:22 UTC (rev 12807)
+++ trunk/blender/source/blender/blenkernel/intern/particle.c	2007-12-06 17:43:47 UTC (rev 12808)
@@ -2240,33 +2240,52 @@
 	Crossf(mat[0], mat[1], mat[2]);
 }
 
-static void psys_face_mat(DerivedMesh *dm, ParticleData *pa, float mat[][4])
+static void psys_face_mat(DerivedMesh *dm, ParticleData *pa, float mat[][4], int orco)
 {
 	float v1[3], v2[3], v3[3];
 	MFace *mface;
 	OrigSpaceFace *osface;
+	float (*orcodata)[3];
 
 	int i = pa->num_dmcache==DMCACHE_NOTFOUND ? pa->num : pa->num_dmcache;
 	
 	if (i==-1 || i >= dm->getNumFaces(dm)) { Mat4One(mat); return; }
+
 	mface=dm->getFaceData(dm,i,CD_MFACE);
 	osface=dm->getFaceData(dm,i,CD_ORIGSPACE);
 	
-	dm->getVertCo(dm,mface->v1,v1);
-	dm->getVertCo(dm,mface->v2,v2);
-	dm->getVertCo(dm,mface->v3,v3);
+	if(orco && (orcodata=dm->getVertDataArray(dm, CD_ORCO))) {
+		VECCOPY(v1, orcodata[mface->v1]);
+		VECCOPY(v2, orcodata[mface->v2]);
+		VECCOPY(v3, orcodata[mface->v3]);
+	}
+	else {
+		dm->getVertCo(dm,mface->v1,v1);
+		dm->getVertCo(dm,mface->v2,v2);
+		dm->getVertCo(dm,mface->v3,v3);
+	}
 
 	triatomat(v1, v2, v3, (osface)? osface->uv: NULL, mat);
 }
+
 void psys_mat_hair_to_object(Object *ob, DerivedMesh *dm, short from, ParticleData *pa, float hairmat[][4])
 {
 	float vec[3];
 
-	psys_face_mat(dm, pa, hairmat);
+	psys_face_mat(dm, pa, hairmat, 0);
 	psys_particle_on_dm(ob, dm, from, pa->num, pa->num_dmcache, pa->fuv, pa->foffset, vec, 0, 0, 0, 0, 0);
 	VECCOPY(hairmat[3],vec);
 }
 
+void psys_mat_hair_to_orco(Object *ob, DerivedMesh *dm, short from, ParticleData *pa, float hairmat[][4])
+{
+	float vec[3], orco[3];
+
+	psys_face_mat(dm, pa, hairmat, 1);
+	psys_particle_on_dm(ob, dm, from, pa->num, pa->num_dmcache, pa->fuv, pa->foffset, vec, 0, 0, 0, orco, 0);
+	VECCOPY(hairmat[3],orco);
+}
+
 /*
 void psys_key_to_geometry(DerivedMesh *dm, ParticleData *pa, ParticleKey *key)
 {
@@ -2319,7 +2338,7 @@
 {
 	float mat[4][4];
 
-	psys_face_mat(dm, pa, mat);
+	psys_face_mat(dm, pa, mat, 0);
 	Mat4Transp(mat); /* cheap inverse for rotation matrix */
 	Mat4Mul3Vecfl(mat, vec);
 }

Modified: trunk/blender/source/blender/render/intern/source/convertblender.c
===================================================================
--- trunk/blender/source/blender/render/intern/source/convertblender.c	2007-12-06 14:22:22 UTC (rev 12807)
+++ trunk/blender/source/blender/render/intern/source/convertblender.c	2007-12-06 17:43:47 UTC (rev 12808)
@@ -1734,7 +1734,7 @@
 	StrandRen *strand=0;
 	RNG *rng= 0;
 	float loc[3],loc1[3],loc0[3],vel[3],mat[4][4],nmat[3][3],co[3],nor[3],time;
-	float *orco=0,*surfnor=0,*uvco=0;
+	float *orco=0,*surfnor=0,*uvco=0, strandlen=0.0f, curlen=0.0f;
 	float hasize, pa_size, pa_time, r_tilt, cfra=bsystem_time(ob,(float)CFRA,0.0);
 	float loc_tex[3], size_tex[3], adapt_angle=0.0, adapt_pix=0.0, random;
 	int i, a, k, max_k=0, totpart, totvlako, totverto, totuv=0, override_uv=-1;
@@ -2043,6 +2043,7 @@
 			orco[2] = (orco[2]-loc_tex[2])/size_tex[2];
 		}
 
+		/* surface normal shading setup */
 		if(ma->mode_l & MA_STR_SURFDIFF) {
 			Mat3MulVecfl(nmat, nor);
 			surfnor= nor;
@@ -2050,7 +2051,8 @@
 		else
 			surfnor= NULL;
 
-		if(strandbuf) { /* strand render */
+		/* strand render setup */
+		if(strandbuf) {
 			strand= RE_findOrAddStrand(re, re->totstrand++);
 			strand->buffer= strandbuf;
 			strand->vert= svert;
@@ -2073,9 +2075,17 @@
 			}
 		}
 
+		/* strandco computation setup */
+		if(path_nbr) {
+			strandlen= 0.0f;
+			curlen= 0.0f;
+			for(k=1; k<=path_nbr; k++)
+				if(k<=max_k)
+					strandlen += VecLenf((cache+k-1)->co, (cache+k)->co);
+		}
+
 		for(k=0; k<=path_nbr; k++){
 			if(path_nbr){
-				time=(float)k/(float)path_nbr;
 				if(k<=max_k){
 					//bti->convert_bake_key(bsys,cache+k,0,(void*)&state);
 					//copy_particle_key(&state,cache+k,0);
@@ -2084,6 +2094,10 @@
 				}
 				else
 					continue;	
+
+				if(k > 0)
+					curlen += VecLenf((cache+k-1)->co, (cache+k)->co);
+				time= curlen/strandlen;
 			}
 			else{
 				time=0.0f;

Modified: trunk/blender/source/blender/render/intern/source/renderdatabase.c
===================================================================
--- trunk/blender/source/blender/render/intern/source/renderdatabase.c	2007-12-06 14:22:22 UTC (rev 12807)
+++ trunk/blender/source/blender/render/intern/source/renderdatabase.c	2007-12-06 17:43:47 UTC (rev 12808)
@@ -548,11 +548,11 @@
 			float **uv= node->uv;
 			int size= (n+1)*256;
 
-			node->uv= MEM_callocN(size*sizeof(MCol*), "Strand uv");
+			node->uv= MEM_callocN(size*sizeof(float*), "Strand uv");
 
 			if(uv) {
 				size= node->totuv*256;
-				memcpy(node->uv, uv, size*sizeof(MCol*));
+				memcpy(node->uv, uv, size*sizeof(float*));
 				MEM_freeN(uv);
 			}
 

Modified: trunk/blender/source/blender/src/drawobject.c
===================================================================
--- trunk/blender/source/blender/src/drawobject.c	2007-12-06 14:22:22 UTC (rev 12807)
+++ trunk/blender/source/blender/src/drawobject.c	2007-12-06 17:43:47 UTC (rev 12808)
@@ -4706,10 +4706,13 @@
 
 	/* xray delay? */
 	if((flag & DRAW_PICKING)==0 && (base->flag & OB_FROMDUPLI)==0) {
-		/* xray and transp are set when it is drawing the 2nd/3rd pass */
-		if(!G.vd->xray && !G.vd->transp && (ob->dtx & OB_DRAWXRAY)) {
-			add_view3d_after(G.vd, base, V3D_XRAY);
-			return;
+		/* don't do xray in particle mode, need the z-buffer */
+		if(!(G.f & G_PARTICLEEDIT)) {
+			/* xray and transp are set when it is drawing the 2nd/3rd pass */
+			if(!G.vd->xray && !G.vd->transp && (ob->dtx & OB_DRAWXRAY)) {
+				add_view3d_after(G.vd, base, V3D_XRAY);
+				return;
+			}
 		}
 	}
 

Modified: trunk/blender/source/blender/src/editparticle.c
===================================================================
--- trunk/blender/source/blender/src/editparticle.c	2007-12-06 14:22:22 UTC (rev 12807)
+++ trunk/blender/source/blender/src/editparticle.c	2007-12-06 17:43:47 UTC (rev 12808)
@@ -546,7 +546,7 @@
 
 	/* insert particles into kd tree */
 	LOOP_PARTICLES(i,pa) {
-		psys_mat_hair_to_object(ob, psmd->dm, psys->part->from, pa, mat);
+		psys_mat_hair_to_orco(ob, psmd->dm, psys->part->from, pa, mat);
 		VECCOPY(co, pa->hair[0].co);
 		Mat4MulVecfl(mat, co);
 		BLI_kdtree_insert(tree, i, co, NULL);
@@ -559,7 +559,7 @@
 		edit->mirror_cache= MEM_callocN(sizeof(int)*totpart, "PE mirror cache");
 
 	LOOP_PARTICLES(i,pa) {
-		psys_mat_hair_to_object(ob, psmd->dm, psys->part->from, pa, mat);
+		psys_mat_hair_to_orco(ob, psmd->dm, psys->part->from, pa, mat);
 		VECCOPY(co, pa->hair[0].co);
 		Mat4MulVecfl(mat, co);
 		co[0]= -co[0];
@@ -628,8 +628,8 @@
 	}
 
 	/* mirror positions and tags */
-	psys_mat_hair_to_object(ob, dm, psys->part->from, pa, mat);
-	psys_mat_hair_to_object(ob, dm, psys->part->from, mpa, mmat);
+	psys_mat_hair_to_orco(ob, dm, psys->part->from, pa, mat);
+	psys_mat_hair_to_orco(ob, dm, psys->part->from, mpa, mmat);
 	Mat4Invert(immat, mmat);
 
 	hkey=pa->hair;

Modified: trunk/blender/source/blender/src/meshtools.c
===================================================================
--- trunk/blender/source/blender/src/meshtools.c	2007-12-06 14:22:22 UTC (rev 12807)
+++ trunk/blender/source/blender/src/meshtools.c	2007-12-06 17:43:47 UTC (rev 12808)
@@ -686,7 +686,7 @@
 	
 }
 
-static long mesh_octree_find_index(MocNode **bt, MVert *mvert, float *co)
+static long mesh_octree_find_index(MocNode **bt, float (*orco)[3], MVert *mvert, float *co)
 {
 	float *vec;
 	int a;
@@ -697,7 +697,12 @@
 	for(a=0; a<MOC_NODE_RES; a++) {
 		if((*bt)->index[a]) {
 			/* does mesh verts and editmode, code looks potential dangerous, octree should really be filled OK! */
-			if(mvert) {
+			if(orco) {
+				vec= orco[(*bt)->index[a]-1];
+				if(FloatCompare(vec, co, MOC_THRESH))
+					return (*bt)->index[a]-1;
+			}
+			else if(mvert) {
 				vec= (mvert+(*bt)->index[a]-1)->co;
 				if(FloatCompare(vec, co, MOC_THRESH))
 					return (*bt)->index[a]-1;
@@ -711,85 +716,117 @@
 		else return -1;
 	}
 	if( (*bt)->next)
-		return mesh_octree_find_index(&(*bt)->next, mvert, co);
+		return mesh_octree_find_index(&(*bt)->next, orco, mvert, co);
 	
 	return -1;
 }
 
+static struct {
+	MocNode **table;
+	float offs[3], div[3];
+	float (*orco)[3];

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list