[Bf-blender-cvs] [673f302] hair_system: Effector force fields for new hair system.

Lukas Tönne noreply at git.blender.org
Mon Oct 6 09:56:38 CEST 2014


Commit: 673f302cb0c6691f8dac665e51f317146171ea43
Author: Lukas Tönne
Date:   Mon Oct 6 09:56:15 2014 +0200
Branches: hair_system
https://developer.blender.org/rB673f302cb0c6691f8dac665e51f317146171ea43

Effector force fields for new hair system.

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

M	source/blender/physics/intern/BPH_mass_spring.cpp

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

diff --git a/source/blender/physics/intern/BPH_mass_spring.cpp b/source/blender/physics/intern/BPH_mass_spring.cpp
index 730be33..96604b8 100644
--- a/source/blender/physics/intern/BPH_mass_spring.cpp
+++ b/source/blender/physics/intern/BPH_mass_spring.cpp
@@ -735,7 +735,7 @@ struct HairSolverData {
 	Implicit_Data *id; /* internal solver data */
 	
 	/* externals (updated for every step) */
-	float gravity[3];
+	Scene *scene;
 	ListBase *effectors;
 };
 
@@ -794,16 +794,13 @@ void BPH_hair_solver_free(HairSolverData *data)
 
 void BPH_hair_solver_set_externals(HairSolverData *data, Scene *scene, Object *ob, DerivedMesh *dm, EffectorWeights *effector_weights)
 {
+	data->scene = scene;
 	data->effectors = pdInitEffectors(scene, ob, NULL, effector_weights, true);
-	
-	if (scene->physics_settings.flag & PHYS_GLOBAL_GRAVITY)
-		copy_v3_v3(data->gravity, scene->physics_settings.gravity);
-	else
-		zero_v3(data->gravity);
 }
 
 void BPH_hair_solver_clear_externals(HairSolverData *data)
 {
+	data->scene = NULL;
 	pdEndEffectors(&data->effectors);
 }
 
@@ -932,6 +929,45 @@ static void hair_calc_spring_force(HairSolverData *data, Object *ob, HairSystem
 	}
 }
 
+static void hair_calc_effector_force(HairSolverData *data, Object *ob, HairSystem *hsys, float time, SimDebugData *debug_data)
+{
+	if (!data->effectors)
+		return;
+	
+	int totpoints = 0;
+	HairCurve *curve = hsys->curves;
+	for (int i = 0; i < hsys->totcurves; ++i, ++curve)
+		totpoints += curve->totpoints;
+	
+	/* cache per-vertex forces to avoid redundant calculation */
+	float (*winvec)[3] = (float (*)[3])MEM_callocN(sizeof(float) * 3 * totpoints, "effector forces");
+	
+	int ktot = 0;
+	curve = hsys->curves;
+	for (int i = 0; i < hsys->totcurves; ++i, ++curve) {
+		HairPoint *point = curve->points;
+		for (int k = 0; k < curve->totpoints; ++k, ++point, ++ktot) {
+			float x[3], v[3];
+			EffectedPoint epoint;
+			
+			BPH_mass_spring_get_motion_state(data->id, ktot, x, v);
+			pd_point_from_loc(data->scene, x, v, ktot, &epoint);
+			pdDoEffectors(data->effectors, NULL, hsys->params.effector_weights, &epoint, winvec[ktot], NULL);
+		}
+	}
+	
+	ktot = 0;
+	curve = hsys->curves;
+	for (int i = 0; i < hsys->totcurves; ++i, ++curve) {
+		HairPoint *point = curve->points;
+		for (int k = 0; k < curve->totpoints - 1; ++k, ++point, ++ktot) {
+			BPH_mass_spring_force_edge_wind(data->id, ktot, ktot + 1, winvec);
+		}
+	}
+	
+	MEM_freeN(winvec);
+}
+
 static void hair_calc_force(HairSolverData *data, Object *ob, HairSystem *hsys, float time, SimDebugData *debug_data)
 {
 	HairParams *params = &hsys->params;
@@ -939,7 +975,11 @@ static void hair_calc_force(HairSolverData *data, Object *ob, HairSystem *hsys,
 #ifdef CLOTH_FORCE_GRAVITY
 	/* global acceleration (gravitation) */
 	float gravity[3];
-	mul_v3_v3fl(gravity, data->gravity, params->effector_weights->global_gravity);
+	if (data->scene->physics_settings.flag & PHYS_GLOBAL_GRAVITY)
+		copy_v3_v3(gravity, data->scene->physics_settings.gravity);
+	else
+		zero_v3(gravity);
+	mul_v3_fl(gravity, params->effector_weights->global_gravity);
 	BPH_mass_spring_force_gravity(data->id, gravity);
 #endif
 	
@@ -950,37 +990,8 @@ static void hair_calc_force(HairSolverData *data, Object *ob, HairSystem *hsys,
 	BPH_mass_spring_force_drag(data->id, drag);
 #endif
 	
-#if 0
 	/* handle external forces like wind */
-	if (effectors) {
-		/* cache per-vertex forces to avoid redundant calculation */
-		float (*winvec)[3] = (float (*)[3])MEM_callocN(sizeof(float) * 3 * numverts, "effector forces");
-		for (i = 0; i < cloth->numverts; i++) {
-			float x[3], v[3];
-			EffectedPoint epoint;
-			
-			BPH_mass_spring_get_motion_state(data, i, x, v);
-			pd_point_from_loc(clmd->scene, x, v, i, &epoint);
-			pdDoEffectors(effectors, NULL, clmd->sim_parms->effector_weights, &epoint, winvec[i], NULL);
-		}
-		
-		for (i = 0; i < cloth->numfaces; i++) {
-			MFace *mf = &mfaces[i];
-			BPH_mass_spring_force_face_wind(data, mf->v1, mf->v2, mf->v3, mf->v4, winvec);
-		}
-
-		/* Hair has only edges */
-		if (cloth->numfaces == 0) {
-			for (LinkNode *link = cloth->springs; link; link = link->next) {
-				ClothSpring *spring = (ClothSpring *)link->link;
-				if (spring->type == CLOTH_SPRING_TYPE_STRUCTURAL)
-					BPH_mass_spring_force_edge_wind(data, spring->ij, spring->kl, winvec);
-			}
-		}
-
-		MEM_freeN(winvec);
-	}
-#endif
+	hair_calc_effector_force(data, ob, hsys, time, debug_data);
 	
 	hair_calc_spring_force(data, ob, hsys, time, debug_data);
 }




More information about the Bf-blender-cvs mailing list