[Bf-blender-cvs] [1d6ba6f] hair_system: Precomputation of rest "bend" vectors in the solver data.
Lukas Tönne
noreply at git.blender.org
Tue Jul 29 15:47:43 CEST 2014
Commit: 1d6ba6fa4b0f55e99cd2bdd383fd44212f81bf47
Author: Lukas Tönne
Date: Tue Jul 29 14:27:59 2014 +0200
Branches: hair_system
https://developer.blender.org/rB1d6ba6fa4b0f55e99cd2bdd383fd44212f81bf47
Precomputation of rest "bend" vectors in the solver data.
These vectors determine the bending amount of the hair, by giving a
fixed reference from the rest position. The same calculation is done
for the state vectors in every step, but the precomputation saves
roughly half of the cost by avoiding a useless loop over the rest data.
===================================================================
M source/blender/hair/HAIR_capi.cpp
M source/blender/hair/intern/HAIR_curve.h
M source/blender/hair/intern/HAIR_solver.cpp
M source/blender/hair/intern/HAIR_solver.h
===================================================================
diff --git a/source/blender/hair/HAIR_capi.cpp b/source/blender/hair/HAIR_capi.cpp
index 438eb02..a30ee0e 100644
--- a/source/blender/hair/HAIR_capi.cpp
+++ b/source/blender/hair/HAIR_capi.cpp
@@ -90,6 +90,9 @@ void HAIR_solver_init(struct HAIR_Solver *csolver, Scene *scene, Object *ob, Hai
point->cur.vel = transform_direction(mat, hair_pt->vel);
}
}
+
+ /* finalize */
+ solver->prepare_data();
}
void HAIR_solver_step(struct HAIR_Solver *csolver, float timestep)
diff --git a/source/blender/hair/intern/HAIR_curve.h b/source/blender/hair/intern/HAIR_curve.h
index f5d4850..c267759 100644
--- a/source/blender/hair/intern/HAIR_curve.h
+++ b/source/blender/hair/intern/HAIR_curve.h
@@ -46,6 +46,7 @@ struct Point {
State next;
float3 rest_co;
+ float3 rest_bend;
HAIR_CXX_CLASS_ALLOC(Point)
};
diff --git a/source/blender/hair/intern/HAIR_solver.cpp b/source/blender/hair/intern/HAIR_solver.cpp
index 539204c..be2c38c 100644
--- a/source/blender/hair/intern/HAIR_solver.cpp
+++ b/source/blender/hair/intern/HAIR_solver.cpp
@@ -25,6 +25,7 @@
*/
#include "HAIR_math.h"
+#include "HAIR_smoothing.h"
#include "HAIR_solver.h"
HAIR_NAMESPACE_BEGIN
@@ -61,6 +62,47 @@ SolverData::~SolverData()
delete[] points;
}
+static float3 calc_bend(const Frame &frame, const float3 &co0, const float3 &co1)
+{
+ float3 dir;
+ normalize_v3_v3(dir, co1 - co0);
+ return float3(dot_v3_v3(dir, frame.normal), dot_v3_v3(dir, frame.tangent), dot_v3_v3(dir, frame.cotangent));
+}
+
+void SolverData::precompute_rest_bend()
+{
+ Curve *curve;
+ int i;
+
+ for (curve = curves, i = 0; i < totcurves; ++curve, ++i) {
+ Point *pt0, *pt1;
+
+ if (curve->totpoints >= 2) {
+ pt0 = &curve->points[0];
+ pt1 = &curve->points[1];
+ }
+ else if (curve->totpoints >= 1) {
+ pt0 = pt1 = &curve->points[0];
+ }
+ else
+ continue;
+
+ FrameIterator iter(1.0f / curve->totpoints, 0.1f, curve->totpoints, pt0->rest_co, pt1->rest_co);
+
+ pt0->rest_bend = calc_bend(iter.frame(), pt0->rest_co, pt1->rest_co);
+
+ Point *pt = pt1;
+ while (iter.valid()) {
+ Point *next_pt = &curve->points[iter.cur()];
+
+ pt->rest_bend = calc_bend(iter.frame(), pt->rest_co, next_pt->rest_co);
+
+ iter.next(next_pt->rest_co);
+ pt = next_pt;
+ }
+ }
+}
+
SolverForces::SolverForces()
{
@@ -87,6 +129,14 @@ void Solver::init_data(int totcurves, int totpoints)
}
}
+void Solver::prepare_data()
+{
+ if (!m_data)
+ return;
+
+ m_data->precompute_rest_bend();
+}
+
void Solver::free_data()
{
if (m_data) {
diff --git a/source/blender/hair/intern/HAIR_solver.h b/source/blender/hair/intern/HAIR_solver.h
index 09798e2..940d661 100644
--- a/source/blender/hair/intern/HAIR_solver.h
+++ b/source/blender/hair/intern/HAIR_solver.h
@@ -47,6 +47,8 @@ struct SolverData {
int totcurves;
int totpoints;
+ void precompute_rest_bend();
+
HAIR_CXX_CLASS_ALLOC(SolverData)
};
@@ -67,6 +69,7 @@ public:
SolverForces &forces() { return m_forces; }
void init_data(int totcurves, int totpoints);
+ void prepare_data();
void free_data();
SolverData *data() const { return m_data; }
More information about the Bf-blender-cvs
mailing list