[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [12514] branches/particles: Update num_dmcache indexes only where needed.

Janne Karhu jhkarh at utu.fi
Wed Nov 7 21:34:35 CET 2007


Revision: 12514
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=12514
Author:   jhk
Date:     2007-11-07 21:34:35 +0100 (Wed, 07 Nov 2007)

Log Message:
-----------
Update num_dmcache indexes only where needed.
Child particles from faces use the final dm always.
Missing include for softbody.h.
Space conversion between global - object - hair spaces is now better and clearer.
Edited hair works now properly under changing subsurf level.
Changed the path visualization bspline button to somewhere it's not locked when hair is set editable.

Modified Paths:
--------------
    branches/particles/projectfiles_vc7/blender/blenkernel/BKE_blenkernel.vcproj
    branches/particles/source/blender/blenkernel/BKE_particle.h
    branches/particles/source/blender/blenkernel/intern/particle.c
    branches/particles/source/blender/blenkernel/intern/particle_system.c
    branches/particles/source/blender/blenkernel/intern/softbody.c
    branches/particles/source/blender/makesdna/DNA_particle_types.h
    branches/particles/source/blender/src/buttons_object.c
    branches/particles/source/blender/src/editparticle.c
    branches/particles/source/blender/src/transform_conversions.c

Modified: branches/particles/projectfiles_vc7/blender/blenkernel/BKE_blenkernel.vcproj
===================================================================
--- branches/particles/projectfiles_vc7/blender/blenkernel/BKE_blenkernel.vcproj	2007-11-07 18:52:23 UTC (rev 12513)
+++ branches/particles/projectfiles_vc7/blender/blenkernel/BKE_blenkernel.vcproj	2007-11-07 20:34:35 UTC (rev 12514)
@@ -85,6 +85,7 @@
 				ProgramDataBaseFileName="..\..\..\..\build\msvc_7\source\blender\blenkernel\debug\"
 				WarningLevel="4"
 				SuppressStartupBanner="TRUE"
+				Detect64BitPortabilityProblems="TRUE"
 				DebugInformationFormat="3"
 				CompileAs="0"/>
 			<Tool

Modified: branches/particles/source/blender/blenkernel/BKE_particle.h
===================================================================
--- branches/particles/source/blender/blenkernel/BKE_particle.h	2007-11-07 18:52:23 UTC (rev 12513)
+++ branches/particles/source/blender/blenkernel/BKE_particle.h	2007-11-07 20:34:35 UTC (rev 12514)
@@ -45,6 +45,7 @@
 struct Object;
 struct Group;
 struct ListBase;
+struct LinkNode;
 
 struct BakeKey;
 struct IpoCurve;
@@ -216,6 +217,8 @@
 int psys_get_particle_state(struct Object *ob, struct ParticleSystem *psys, int p, struct ParticleKey *state, int allways);
 
 /* particle_system.c */
+void psys_calc_dmfaces(struct Object *ob, struct DerivedMesh *dm, struct ParticleSystem *psys);
+
 int psys_count_keyed_targets(struct Object *ob, struct ParticleSystem *psys);
 void psys_get_reactor_target(struct Object *ob, struct ParticleSystem *psys, Object **target_ob, struct ParticleSystem **target_psys);
 
@@ -227,11 +230,13 @@
 /* ----------- functions needed only inside particlesystem ------------ */
 /* particle.c */
 void psys_key_to_object(struct Object *ob, struct ParticleKey *key, float imat[][4]);
-void psys_key_to_geometry(struct DerivedMesh *dm, struct ParticleData *pa, struct ParticleKey *key);
-void psys_key_from_geometry(struct DerivedMesh *dm, struct ParticleData *pa, struct ParticleKey *key);
-void psys_geometry_mat(struct DerivedMesh *dm, struct ParticleData *pa, float mat[][4]);
-void psys_vec_to_geometry(struct DerivedMesh *dm, struct ParticleData *pa, float *vec);
-void psys_vec_from_geometry(struct DerivedMesh *dm, struct ParticleData *pa, float *vec);
+//void psys_key_to_geometry(struct DerivedMesh *dm, struct ParticleData *pa, struct ParticleKey *key);
+//void psys_key_from_geometry(struct DerivedMesh *dm, struct ParticleData *pa, struct ParticleKey *key);
+//void psys_face_mat(struct DerivedMesh *dm, struct ParticleData *pa, float mat[][4]);
+void psys_vec_rot_to_face(struct DerivedMesh *dm, struct ParticleData *pa, float *vec);
+//void psys_vec_rot_from_face(struct DerivedMesh *dm, struct ParticleData *pa, float *vec);
+void psys_mat_hair_to_object(struct DerivedMesh *dm, int deform_only, short from, struct ParticleData *pa, float hairmat[][4]);
+void psys_mat_hair_to_global(struct Object *ob, struct DerivedMesh *dm, int deform_only, short from, struct ParticleData *pa, float hairmat[][4]);
 
 struct KDTreeNode *alloc_kdtree(int nodes);
 struct KDTreeNode *copy_kdtree(struct KDTreeNode *from);
@@ -255,15 +260,6 @@
 
 int psys_particle_dm_face_lookup(struct DerivedMesh *dm, int index, float *fuv, struct LinkNode *node);
 
-/* particle_edit.c */
-//void pe_free_edit_path(struct ParticleSystem *psys);
-//void pe_iterate_lengths(struct ParticleSystem *psys);
-//void pe_apply_lengths(struct ParticleSystem *psys);
-//void pe_deflect_emitter(struct ParticleSystem *psys);
-//void pe_recalc_wcos(struct Object *ob, struct ParticleSystem *psys);
-//void pe_create_edit_path(struct Object *ob, struct ParticleSystem *psys, int init);
-//void undo_particle_clear(struct ParticleSystem *psys);
-
 #define PSYS_EC_EFFECTOR	1
 #define PSYS_EC_DEFLECT		2
 #define PSYS_EC_PARTICLE	4

Modified: branches/particles/source/blender/blenkernel/intern/particle.c
===================================================================
--- branches/particles/source/blender/blenkernel/intern/particle.c	2007-11-07 18:52:23 UTC (rev 12513)
+++ branches/particles/source/blender/blenkernel/intern/particle.c	2007-11-07 20:34:35 UTC (rev 12514)
@@ -782,7 +782,7 @@
 This is slow, can be optimized but only for many lookups, return the face lookup index*/
 int psys_particle_dm_face_lookup(DerivedMesh *dm, int index, float *fuv, struct LinkNode *node)
 {
-	MFace *mface=dm->getFaceData(dm,index,CD_MFACE);
+	MFace *mface = dm->getFaceData(dm,index,CD_MFACE);
 	int *origindex, *oi, totface, dmface_index;
 	OrigSpaceFace *osface=dm->getFaceDataArray(dm, CD_ORIGSPACE);
 	origindex = oi = dm->getFaceDataArray(dm, CD_ORIGINDEX);
@@ -802,7 +802,7 @@
 	if (node) { /* we have a linked list of faces that we use, faster! */
 		OrigSpaceFace *osface_node;
 		for(;node;node=node->next) {
-			dmface_index = (int *)node->link;
+			dmface_index = (int)node->link;
 			osface_node = osface + dmface_index;
 			if ( mface->v4 ) { /* check that this intersects - Its possible this misses :/ - could also check its not between */
 				if (IsectPQ2Df(fuv, osface_node->uv[0], osface_node->uv[1], osface_node->uv[2], osface_node->uv[3])) {
@@ -813,6 +813,7 @@
 			}
 		}
 	} else { /* if we have no node, try every face */
+		mface = dm->getFaceDataArray(dm,CD_MFACE);
 		for (dmface_index=0; dmface_index<totface; dmface_index++, oi++, mface++, osface++) {
 					//printf("\tTesting dm_index:%i orig_index:%i looking for %i fuv(%f, %f)\n", i, *oi, index, fuv[0], fuv[1]);
 			if (*oi == index) {
@@ -1612,7 +1613,7 @@
 			cpa_fuv = cpa->fuv;
 			cpa_from = PART_FROM_FACE;
 
-			psys_particle_on_emitter(deform_only, psmd,cpa_from,cpa_num,-1,temp_fuv,orco,0,0,0);
+			psys_particle_on_emitter(deform_only, psmd,cpa_from,cpa_num,cpa_num,temp_fuv,orco,0,0,0);
 
 			/* we need to save the actual root position of the child for positioning it accurately to the surface of the emitter */
 			VECCOPY(cpa_1st,orco);
@@ -1631,7 +1632,7 @@
 			cpa_num=pa->num;
 			cpa_fuv=pa->fuv;
 
-			psys_particle_on_emitter(deform_only, psmd,cpa_from,cpa_num,-1,cpa_fuv,orco,0,0,0);
+			psys_particle_on_emitter(deform_only, psmd,cpa_from,cpa_num,cpa_num,cpa_fuv,orco,0,0,0);
 		}
 
 		/* correct child ipo timing */
@@ -1852,10 +1853,11 @@
 	float birthtime = 0.0, dietime = 0.0;
 	float t, time, keytime, dfra = 1.0, frs_sec = G.scene->r.frs_sec;
 	float col[3] = {0.5f, 0.5f, 0.5f};
-	float prev_tangent[3];
+	float prev_tangent[3], hairmat[4][4];
 	int k,i;
 	int steps = (int)pow(2.0, (double)psys->part->draw_step);
 	int totpart = psys->totpart;
+	int deform_only;
 	char nosel[4], sel[4];
 	float sel_col[3];
 	float nosel_col[3];
@@ -1864,6 +1866,8 @@
 	if((psys->flag & PSYS_HAIR_DONE)==0 && (psys->flag & PSYS_KEYED)==0)
 		return;
 
+	deform_only = modifiers_isDeformedOnly(ob);
+
 	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){
@@ -1927,6 +1931,8 @@
 
 			birthtime = hkey[0]->time;
 			dietime = hkey[0][pa->totkey-1].time;
+
+			psys_mat_hair_to_global(ob, psmd->dm, deform_only, psys->part->from, pa, hairmat);
 		}
 
 		if(soft){
@@ -2020,8 +2026,7 @@
 				VecMulf(result.vel, frs_sec / dfra);
 			}
 			else if(soft==NULL) { /* softbody and keyed are allready in global space */
-				psys_vec_from_geometry(psmd->dm, pa, result.co);
-				Mat4MulVecfl(ob->obmat, result.co);
+				Mat4MulVecfl(hairmat, result.co);
 			}
 			
 
@@ -2174,7 +2179,8 @@
 	VECSUB(key->vel,key->vel,key->co);
 	QuatMul(key->rot,q,key->rot);
 }
-#if 0
+
+/*
 void psys_key_to_geometry(DerivedMesh *dm, ParticleData *pa, ParticleKey *key)
 {
 	float q[4], v1[3], v2[3], v3[3];
@@ -2220,9 +2226,9 @@
 
 	QuatMul(key->rot,q,key->rot);
 }
-#endif
+*/
 
-void psys_vec_to_geometry(DerivedMesh *dm, ParticleData *pa, float *vec)
+void psys_vec_rot_to_face(DerivedMesh *dm, ParticleData *pa, float *vec)//to_geometry(DerivedMesh *dm, ParticleData *pa, float *vec)
 {
 	float q[4], v1[3], v2[3], v3[3];
 	/*
@@ -2249,12 +2255,12 @@
 
 	QuatInv(q);
 
-	VECSUB(vec,vec,v1);
+	//VECSUB(vec,vec,v1);
 
 	QuatMulVecf(q, vec);
 }
 
-void psys_vec_from_geometry(DerivedMesh *dm, ParticleData *pa, float *vec)
+static void psys_vec_rot_from_face(DerivedMesh *dm, ParticleData *pa, float *vec)//from_geometry(DerivedMesh *dm, ParticleData *pa, float *vec)
 {
 	float q[4], v1[3], v2[3], v3[3];
 	/*
@@ -2278,17 +2284,11 @@
 
 	QuatMulVecf(q, vec);
 
-	VECADD(vec,vec,v1);
+	//VECADD(vec,vec,v1);
 }
-void psys_geometry_mat(DerivedMesh *dm, ParticleData *pa, float mat[][4])
+static void psys_face_mat(DerivedMesh *dm, ParticleData *pa, float mat[][4])
 {
 	float q[4], v1[3], v2[3], v3[3];
-	/*
-	dm->getVertCo(dm,pa->verts[0],v1);
-	dm->getVertCo(dm,pa->verts[1],v2);
-	dm->getVertCo(dm,pa->verts[2],v3);
-	*/
-	/* replace with this */
 	MFace *mface;
 	int i; // = psys_particle_dm_face_lookup(dm, pa->num, pa->fuv, (LinkNode*)NULL);
 	i = pa->num_dmcache==-1 ? pa->num : pa->num_dmcache;
@@ -2301,13 +2301,26 @@
 	dm->getVertCo(dm,mface->v3,v3);
 	/* done */
 	
-	
 	triatoquat(v1, v2, v3, q);
 
 	QuatToMat4(q,mat);
+}
+void psys_mat_hair_to_object(DerivedMesh *dm, int deform_only, short from, ParticleData *pa, float hairmat[][4])
+{
+	float vec[3];
 
-	VECCOPY(mat[3],v1);
+	psys_face_mat(dm, pa, hairmat);
+	psys_particle_on_dm(dm, deform_only, from, pa->num, pa->num_dmcache, pa->fuv, vec, 0, 0, 0);
+	VECCOPY(hairmat[3],vec);
 }
+void psys_mat_hair_to_global(Object *ob, DerivedMesh *dm, int deform_only, short from, ParticleData *pa, float hairmat[][4])
+{
+	float facemat[4][4];
+
+	psys_mat_hair_to_object(dm, deform_only, from, pa, facemat);
+
+	Mat4MulMat4(hairmat, ob->obmat, facemat);
+}
 /************************************************/
 /*			ParticleSettings handling			*/
 /************************************************/
@@ -2730,7 +2743,7 @@
 
 	float t, real_t, dfra, keytime;
 	float orco[3];
-	float imat[4][4], cpa_1st[3];
+	float imat[4][4], hairmat[4][4], cpa_1st[3];
 	float pa_clump = 0.0, pa_kink = 0.0;
 	int totparent = 0;
 	int totpart = psys->totpart;
@@ -2828,8 +2841,8 @@
 			,keys, keytime, state);
 
 		if((pa->flag & PARS_REKEY)==0) {
-			psys_vec_from_geometry(psmd->dm, pa, state->co);
-			Mat4MulVecfl(ob->obmat, state->co);
+			psys_mat_hair_to_global(ob, psmd->dm, deform_only, part->from, pa, hairmat);
+			Mat4MulVecfl(hairmat, state->co);
 
 			if(psys->effectors.first && (part->flag & PART_CHILD_GUIDE)==0) {

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list