[Bf-blender-cvs] [a6998f1] alembic: Force calculation function for strands (only gravity atm).

Lukas Tönne noreply at git.blender.org
Thu Apr 2 16:39:58 CEST 2015


Commit: a6998f132a8030bed1a1462442b9edd43e7f1cc1
Author: Lukas Tönne
Date:   Thu Apr 2 15:03:06 2015 +0200
Branches: alembic
https://developer.blender.org/rBa6998f132a8030bed1a1462442b9edd43e7f1cc1

Force calculation function for strands (only gravity atm).

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

M	source/blender/blenkernel/intern/cache_library.c
M	source/blender/physics/BPH_mass_spring.h
M	source/blender/physics/intern/BPH_mass_spring.cpp

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

diff --git a/source/blender/blenkernel/intern/cache_library.c b/source/blender/blenkernel/intern/cache_library.c
index 81501ab..7ab67c1 100644
--- a/source/blender/blenkernel/intern/cache_library.c
+++ b/source/blender/blenkernel/intern/cache_library.c
@@ -572,7 +572,7 @@ static void hairsim_copy(HairSimCacheModifier *UNUSED(md), HairSimCacheModifier
 {
 }
 
-static void hairsim_process(HairSimCacheModifier *hsmd, CacheProcessContext *UNUSED(ctx), CacheProcessData *data, int frame, int UNUSED(frame_prev))
+static void hairsim_process(HairSimCacheModifier *hsmd, CacheProcessContext *ctx, CacheProcessData *data, int frame, int frame_prev)
 {
 	struct DupliCacheIterator *iter = BKE_dupli_cache_iter_new(data->dupcache);
 	for (; BKE_dupli_cache_iter_valid(iter); BKE_dupli_cache_iter_next(iter)) {
@@ -590,7 +590,7 @@ static void hairsim_process(HairSimCacheModifier *hsmd, CacheProcessContext *UNU
 			numsprings = strands->totverts - strands->totcurves;
 			solver_data = BPH_mass_spring_solver_create(strands->totverts, numsprings);
 			
-			BPH_strands_solve(strands, solver_data, &hsmd->sim_params, (float)frame, NULL);
+			BPH_strands_solve(strands, solver_data, &hsmd->sim_params, (float)frame, (float)frame_prev, ctx->scene, NULL);
 			
 			BPH_mass_spring_solver_free(solver_data);
 		}
diff --git a/source/blender/physics/BPH_mass_spring.h b/source/blender/physics/BPH_mass_spring.h
index fdd0eb7..91014d6 100644
--- a/source/blender/physics/BPH_mass_spring.h
+++ b/source/blender/physics/BPH_mass_spring.h
@@ -57,7 +57,7 @@ void BKE_cloth_solver_set_positions(struct ClothModifierData *clmd);
 
 bool BPH_cloth_solver_get_texture_data(struct Object *ob, struct ClothModifierData *clmd, struct VoxelData *vd);
 
-bool BPH_strands_solve(struct Strands *strands, struct Implicit_Data *id, struct StrandSimParams *params, float timestep, struct ListBase *effectors);
+bool BPH_strands_solve(struct Strands *strands, struct Implicit_Data *id, struct StrandSimParams *params, float frame, float frame_prev, struct Scene *scene, struct ListBase *effectors);
 
 #ifdef __cplusplus
 }
diff --git a/source/blender/physics/intern/BPH_mass_spring.cpp b/source/blender/physics/intern/BPH_mass_spring.cpp
index 79d813b..a65be4d 100644
--- a/source/blender/physics/intern/BPH_mass_spring.cpp
+++ b/source/blender/physics/intern/BPH_mass_spring.cpp
@@ -1120,12 +1120,84 @@ bool BPH_cloth_solver_get_texture_data(Object *UNUSED(ob), ClothModifierData *cl
 
 /* ========================================================================= */
 
-bool BPH_strands_solve(Strands *strands, Implicit_Data *id, StrandSimParams *params, float timestep, ListBase *effectors)
+/* Collect forces and derivatives:  F, dFdX, dFdV */
+static void strands_calc_force(Strands *strands, StrandSimParams *params, Implicit_Data *data, float UNUSED(frame), Scene *scene, ListBase *effectors, float step)
+{
+	unsigned int numverts = strands->totverts;
+	
+	int i = 0;
+//	float drag = params->Cvi * 0.01f; /* viscosity of air scaled in percent */
+	float gravity[3] = {0.0f, 0.0f, 0.0f};
+	
+#if 1
+	/* global acceleration (gravitation) */
+	if (scene->physics_settings.flag & PHYS_GLOBAL_GRAVITY) {
+		/* scale gravity force */
+//		mul_v3_v3fl(gravity, scene->physics_settings.gravity, 0.001f * params->effector_weights->global_gravity);
+		copy_v3_v3(gravity, scene->physics_settings.gravity);
+	}
+	for (i = 0; i < numverts; i++) {
+		float mass = 1.0f; // TODO
+		BPH_mass_spring_force_gravity(data, i, mass, gravity);
+	}
+#endif
+
+#if 0
+	BPH_mass_spring_force_drag(data, 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);
+		}
+
+		ClothHairData *hairdata = clmd->hairdata;
+		
+		vert = cloth->verts;
+		for (i = 0; i < cloth->numverts; i++, vert++) {
+			if (hairdata) {
+				ClothHairData *hair = &hairdata[i];
+				BPH_mass_spring_force_vertex_wind(data, i, hair->radius, winvec);
+			}
+			else
+				BPH_mass_spring_force_vertex_wind(data, i, 1.0f, winvec);
+		}
+
+		MEM_freeN(winvec);
+	}
+#endif
+	
+#if 0
+	// calculate spring forces
+	for (LinkNode *link = cloth->springs; link; link = link->next) {
+		ClothSpring *spring = (ClothSpring *)link->link;
+		// only handle active springs
+		if (!(spring->flags & CLOTH_SPRING_FLAG_DEACTIVATE))
+			cloth_calc_spring_force(clmd, spring, step);
+	}
+#endif
+}
+
+bool BPH_strands_solve(Strands *strands, Implicit_Data *id, StrandSimParams *params, float frame, float frame_prev, Scene *scene, ListBase *effectors)
 {
 	if (params->timescale == 0.0f || params->substeps < 1)
 		return false;
 	
-	float tf = params->timescale * timestep;
+	float tf = (frame - frame_prev) * params->timescale;
 	float dt = tf / params->substeps;
 	int numverts = strands->totverts;
 	
@@ -1138,6 +1210,11 @@ bool BPH_strands_solve(Strands *strands, Implicit_Data *id, StrandSimParams *par
 //		clmd->solver_result = (ClothSolverResult *)MEM_callocN(sizeof(ClothSolverResult), "cloth solver result");
 //	cloth_clear_result(clmd);
 	
+	/* initialize solver data */
+	for (i = 0; i < numverts; i++) {
+		BPH_mass_spring_set_motion_state(id, i, strands->state[i].co, strands->state[i].vel);
+	}
+	
 #if 0
 	if (clmd->sim_parms->flags & CLOTH_SIMSETTINGS_FLAG_GOAL) { /* do goal stuff */
 		for (i = 0; i < numverts; i++) {
@@ -1152,7 +1229,7 @@ bool BPH_strands_solve(Strands *strands, Implicit_Data *id, StrandSimParams *par
 	}
 #endif
 	
-	for (step; step < tf; step += dt) {
+	for (step = 0.0f; step < tf; step += dt) {
 		ImplicitSolverResult result;
 		
 #if 0
@@ -1171,7 +1248,7 @@ bool BPH_strands_solve(Strands *strands, Implicit_Data *id, StrandSimParams *par
 		BPH_mass_spring_clear_forces(id);
 		
 		// calculate forces
-//		cloth_calc_force(clmd, frame, effectors, step);
+		strands_calc_force(strands, params, id, frame, scene, effectors, step);
 		
 		// calculate new velocity and position
 		BPH_mass_spring_solve_velocities(id, dt, &result);
@@ -1212,7 +1289,7 @@ bool BPH_strands_solve(Strands *strands, Implicit_Data *id, StrandSimParams *par
 		step += dt;
 	}
 	
-	/* copy results back to cloth data */
+	/* copy results back to strand data */
 	for (i = 0; i < numverts; i++) {
 		BPH_mass_spring_get_motion_state(id, i, strands->state[i].co, strands->state[i].vel);
 	}




More information about the Bf-blender-cvs mailing list