[Bf-blender-cvs] [b7abaf1] gooseberry: Apply shape keys directly to the hair key data, instead of only applying to the hair dynamics input DM.

Lukas Tönne noreply at git.blender.org
Wed Jan 28 17:36:07 CET 2015


Commit: b7abaf151f7c1a90a57bf314f6b29d8b58589192
Author: Lukas Tönne
Date:   Wed Jan 28 17:34:46 2015 +0100
Branches: gooseberry
https://developer.blender.org/rBb7abaf151f7c1a90a57bf314f6b29d8b58589192

Apply shape keys directly to the hair key data, instead of only applying
to the hair dynamics input DM.

Also this calculation has to happen before caching paths, otherwise
there is a 1-update lag because parent paths still use old values.

===================================================================

M	source/blender/blenkernel/intern/particle.c
M	source/blender/blenkernel/intern/particle_system.c

===================================================================

diff --git a/source/blender/blenkernel/intern/particle.c b/source/blender/blenkernel/intern/particle.c
index 8b821bc..d3f5664 100644
--- a/source/blender/blenkernel/intern/particle.c
+++ b/source/blender/blenkernel/intern/particle.c
@@ -2501,8 +2501,6 @@ void psys_cache_paths(ParticleSimulationData *sim, float cfra)
 	float length, vec[3];
 	float *vg_effector = NULL;
 	float *vg_length = NULL, pa_length = 1.0f;
-	float *shapekey_data, *shapekey;
-	int totshapekey;
 
 	/* we don't have anything valid to create paths from so let's quit here */
 	if ((psys->flag & PSYS_HAIR_DONE || psys->flag & PSYS_KEYED || psys->pointcache) == 0)
@@ -2534,8 +2532,6 @@ void psys_cache_paths(ParticleSimulationData *sim, float cfra)
 		DM_ensure_tessface(psmd->dm);
 	}
 
-	shapekey = shapekey_data = BKE_key_evaluate_particles(sim->ob, sim->psys, &totshapekey);
-
 	/*---first main loop: create all actual particles' paths---*/
 	LOOP_PARTICLES {
 		if (!psys->totchild) {
@@ -2600,23 +2596,6 @@ void psys_cache_paths(ParticleSimulationData *sim, float cfra)
 			copy_v3_v3(ca->col, col);
 		}
 
-		if (part->type == PART_HAIR) {
-			HairKey *hkey;
-			
-			for (k = 0, hkey = pa->hair; k < pa->totkey; ++k, ++hkey) {
-				float co[3];
-				if (shapekey) {
-					copy_v3_v3(co, shapekey);
-					shapekey += 3;
-				}
-				else {
-					copy_v3_v3(co, hkey->co);
-				}
-				
-				mul_v3_m4v3(hkey->world_co, hairmat, co);
-			}
-		}
-
 		/*--modify paths and calculate rotation & velocity--*/
 
 		if (!(psys->flag & PSYS_GLOBAL_HAIR)) {
@@ -2684,9 +2663,6 @@ void psys_cache_paths(ParticleSimulationData *sim, float cfra)
 
 	if (vg_length)
 		MEM_freeN(vg_length);
-
-	if (shapekey_data)
-		MEM_freeN(shapekey_data);
 }
 void psys_cache_edit_paths(Scene *scene, Object *ob, PTCacheEdit *edit, float cfra)
 {
diff --git a/source/blender/blenkernel/intern/particle_system.c b/source/blender/blenkernel/intern/particle_system.c
index edfb79e..0465415 100644
--- a/source/blender/blenkernel/intern/particle_system.c
+++ b/source/blender/blenkernel/intern/particle_system.c
@@ -3447,7 +3447,14 @@ static void hair_step(ParticleSimulationData *sim, float cfra)
 	ParticleSystem *psys = sim->psys;
 	ParticleSettings *part = psys->part;
 	PARTICLE_P;
+	PARTICLE_PSMD;
 	float disp = psys_get_current_display_percentage(psys);
+	float *shapekey_data = NULL, *shapekey;
+	int totshapekey;
+
+	if (part->type == PART_HAIR) {
+		shapekey = shapekey_data = BKE_key_evaluate_particles(sim->ob, sim->psys, &totshapekey);
+	}
 
 	LOOP_PARTICLES {
 		pa->size = part->size;
@@ -3458,8 +3465,35 @@ static void hair_step(ParticleSimulationData *sim, float cfra)
 			pa->flag |= PARS_NO_DISP;
 		else
 			pa->flag &= ~PARS_NO_DISP;
+
+		if (part->type == PART_HAIR) {
+			float hairmat[4][4];
+			HairKey *hkey;
+			int k;
+			
+			psys_mat_hair_to_global(sim->ob, psmd->dm, psys->part->from, pa, hairmat);
+			
+			/* update world coordinates and calculate shapekey result if needed */
+			for (k = 0, hkey = pa->hair; k < pa->totkey; ++k, ++hkey) {
+				const float *co;
+				if (shapekey) {
+					co = shapekey;
+					shapekey += 3;
+					
+					copy_v3_v3(hkey->co, co);
+				}
+				else {
+					co = hkey->co;
+				}
+				
+				mul_v3_m4v3(hkey->world_co, hairmat, co);
+			}
+		}
 	}
 
+	if (shapekey_data)
+		MEM_freeN(shapekey_data);
+
 	if (psys->recalc & PSYS_RECALC_RESET) {
 		/* need this for changing subsurf levels */
 		psys_calc_dmcache(sim->ob, sim->psmd->dm, psys);




More information about the Bf-blender-cvs mailing list