[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