[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