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; }

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to