[Bf-blender-cvs] [d5be72b] alembic: Nicer iterator for looping over strand edges directly.
Lukas Tönne
noreply at git.blender.org
Tue Apr 7 18:18:58 CEST 2015
Commit: d5be72b05f6be3e0a7d126d7f43bef386d532811
Author: Lukas Tönne
Date: Tue Apr 7 18:12:04 2015 +0200
Branches: alembic
https://developer.blender.org/rBd5be72b05f6be3e0a7d126d7f43bef386d532811
Nicer iterator for looping over strand edges directly.
Avoids the ugly construct with vertex iterators that have to drag an
extra 'prev' iterator along.
===================================================================
M source/blender/blenkernel/BKE_strands.h
M source/blender/physics/intern/BPH_mass_spring.cpp
===================================================================
diff --git a/source/blender/blenkernel/BKE_strands.h b/source/blender/blenkernel/BKE_strands.h
index 1ce3c57..7462e18 100644
--- a/source/blender/blenkernel/BKE_strands.h
+++ b/source/blender/blenkernel/BKE_strands.h
@@ -140,4 +140,47 @@ BLI_INLINE size_t BKE_strand_vertex_iter_vertex_offset(Strands *strands, StrandV
return iter->vertex - strands->verts;
}
+
+typedef struct StrandEdgeIterator {
+ int index, tot;
+ StrandsVertex *vertex0, *vertex1;
+ StrandsMotionState *state0, *state1;
+} StrandEdgeIterator;
+
+BLI_INLINE void BKE_strand_edge_iter_init(StrandEdgeIterator *iter, StrandIterator *strand_iter)
+{
+ iter->tot = strand_iter->curve->numverts - 1;
+ iter->index = 0;
+ iter->vertex0 = strand_iter->verts;
+ iter->state0 = strand_iter->state;
+ iter->vertex1 = strand_iter->verts + 1;
+ iter->state1 = strand_iter->state + 1;
+}
+
+BLI_INLINE bool BKE_strand_edge_iter_valid(StrandEdgeIterator *iter)
+{
+ return iter->index < iter->tot;
+}
+
+BLI_INLINE void BKE_strand_edge_iter_next(StrandEdgeIterator *iter)
+{
+ ++iter->vertex0;
+ ++iter->vertex1;
+ if (iter->state0) {
+ ++iter->state0;
+ ++iter->state1;
+ }
+ ++iter->index;
+}
+
+BLI_INLINE size_t BKE_strand_edge_iter_vertex0_offset(Strands *strands, StrandEdgeIterator *iter)
+{
+ return iter->vertex0 - strands->verts;
+}
+
+BLI_INLINE size_t BKE_strand_edge_iter_vertex1_offset(Strands *strands, StrandEdgeIterator *iter)
+{
+ return iter->vertex1 - strands->verts;
+}
+
#endif /* __BKE_STRANDS_H__ */
diff --git a/source/blender/physics/intern/BPH_mass_spring.cpp b/source/blender/physics/intern/BPH_mass_spring.cpp
index 53f3718..5c1aa6c 100644
--- a/source/blender/physics/intern/BPH_mass_spring.cpp
+++ b/source/blender/physics/intern/BPH_mass_spring.cpp
@@ -1197,6 +1197,28 @@ static void strands_setup_constraints(Strands *strands, Implicit_Data *data, Col
#endif
}
+/* calculates internal forces for a single strand curve */
+static void strands_calc_curve_stretch_forces(Strands *strands, HairSimParams *params, Implicit_Data *data, StrandIterator *it_strand)
+{
+ StrandEdgeIterator it_edge;
+
+ for (BKE_strand_edge_iter_init(&it_edge, it_strand); BKE_strand_edge_iter_valid(&it_edge); BKE_strand_edge_iter_next(&it_edge)) {
+ int vi = BKE_strand_edge_iter_vertex0_offset(strands, &it_edge);
+ int vj = BKE_strand_edge_iter_vertex1_offset(strands, &it_edge);
+ float restlen = len_v3v3(it_edge.vertex0->co, it_edge.vertex1->co);
+
+ float stiffness = params->stretch_stiffness;
+ float damping = stiffness * params->stretch_damping;
+ BPH_mass_spring_force_spring_linear(data, vi, vj, restlen, stiffness, damping, true, 0.0f, NULL, NULL, NULL);
+ }
+}
+
+/* calculates internal forces for a single strand curve */
+static void strands_calc_curve_forces(Strands *strands, HairSimParams *params, Implicit_Data *data, StrandIterator *it_strand)
+{
+ strands_calc_curve_stretch_forces(strands, params, data, it_strand);
+}
+
/* Collect forces and derivatives: F, dFdX, dFdV */
static void strands_calc_force(Strands *strands, HairSimParams *params, Implicit_Data *data, float UNUSED(frame), Scene *scene, ListBase *effectors)
{
@@ -1258,22 +1280,7 @@ static void strands_calc_force(Strands *strands, HairSimParams *params, Implicit
/* spring forces */
StrandIterator it_strand;
for (BKE_strand_iter_init(&it_strand, strands); BKE_strand_iter_valid(&it_strand); BKE_strand_iter_next(&it_strand)) {
- StrandVertexIterator it_vert, it_vert_prev;
- BKE_strand_vertex_iter_init(&it_vert, &it_strand);
- if (BKE_strand_vertex_iter_valid(&it_vert)) {
- it_vert_prev = it_vert;
- BKE_strand_vertex_iter_next(&it_vert);
- for (; BKE_strand_vertex_iter_valid(&it_vert); it_vert_prev = it_vert, BKE_strand_vertex_iter_next(&it_vert)) {
-
- int vi = BKE_strand_vertex_iter_vertex_offset(strands, &it_vert);
- int vj = BKE_strand_vertex_iter_vertex_offset(strands, &it_vert_prev);
- float restlen = len_v3v3(it_vert.vertex->co, it_vert_prev.vertex->co);
-
- float stiffness = params->stretch_stiffness;
- float damping = stiffness * params->stretch_damping;
- BPH_mass_spring_force_spring_linear(data, vi, vj, restlen, stiffness, damping, true, 0.0f, NULL, NULL, NULL);
- }
- }
+ strands_calc_curve_forces(strands, params, data, &it_strand);
}
}
More information about the Bf-blender-cvs
mailing list