[Bf-blender-cvs] [4c77dbe] hair_system: Set up the main API of the mass spring solver for hair.

Lukas Tönne noreply at git.blender.org
Sun Oct 5 14:56:34 CEST 2014


Commit: 4c77dbece61aea35563fed318e6fcdc3e7c5a2e2
Author: Lukas Tönne
Date:   Wed Sep 24 14:12:58 2014 +0200
Branches: hair_system
https://developer.blender.org/rB4c77dbece61aea35563fed318e6fcdc3e7c5a2e2

Set up the main API of the mass spring solver for hair.

===================================================================

M	source/blender/blenkernel/intern/object.c
M	source/blender/blenkernel/intern/rigidbody_objects.c
M	source/blender/makesdna/DNA_hair_types.h
M	source/blender/modifiers/CMakeLists.txt
M	source/blender/modifiers/intern/MOD_hair.c
M	source/blender/physics/BPH_mass_spring.h

===================================================================

diff --git a/source/blender/blenkernel/intern/object.c b/source/blender/blenkernel/intern/object.c
index abff0ab..58f97af 100644
--- a/source/blender/blenkernel/intern/object.c
+++ b/source/blender/blenkernel/intern/object.c
@@ -113,6 +113,8 @@
 #include "BKE_camera.h"
 #include "BKE_image.h"
 
+#include "BPH_mass_spring.h"
+
 #ifdef WITH_MOD_FLUID
 #include "LBM_fluidsim.h"
 #endif
@@ -3177,22 +3179,33 @@ void BKE_object_sim_pre_step(Scene *scene, Object *ob, float ctime)
 		if (md->type == eModifierType_Hair) {
 			HairModifierData *hmd = (HairModifierData*) md;
 			HairSystem *hsys = hmd->hairsys;
-			DerivedMesh *dm = ob->derivedFinal;
+			DerivedMesh *dm = ob->derivedFinal; // XXX TODO this should be more flexible, use modifier position in the stack?
 			
-			if (!hmd->solver_data) {
-				hmd->solver_data = HAIR_solver_new();
-				hmd->flag &= ~MOD_HAIR_SOLVER_DATA_VALID;
+			if (!hmd->solver_data || !(hmd->flag & MOD_HAIR_SOLVER_DATA_VALID)) {
+				if (hmd->solver_data) {
+					BPH_hair_solver_free(hmd->solver_data);
+				}
+				hmd->solver_data = BPH_hair_solver_create();
+				
+				hmd->flag |= MOD_HAIR_SOLVER_DATA_VALID;
+				BKE_sim_debug_data_clear(hmd->debug_data);
 			}
 			
-			HAIR_solver_set_params(hmd->solver_data, &hsys->params);
+			BPH_hair_solver_set_externals(hmd->solver_data, scene, ob, dm, hsys->params.effector_weights);
 			
-			if (!hmd->flag & MOD_HAIR_SOLVER_DATA_VALID) {
-				HAIR_solver_build_modifier_data(hmd->solver_data, scene, ob, dm, hsys, ctime);
-				BKE_sim_debug_data_clear(hmd->debug_data);
-				hmd->flag |= MOD_HAIR_SOLVER_DATA_VALID;
-			}
+			BPH_hair_solver_set_positions(hmd->solver_data, scene, ob, hmd->hairsys);
 			
-			HAIR_solver_update_modifier_externals(hmd->solver_data, scene, ob, dm, hsys, ctime);
+			if (!(hmd->debug_flag & MOD_HAIR_DEBUG_SHOW)) {
+				if (hmd->debug_data) {
+					BKE_sim_debug_data_free(hmd->debug_data);
+					hmd->debug_data = NULL;
+				}
+			}
+			else {
+				if (!hmd->debug_data) {
+					hmd->debug_data = BKE_sim_debug_data_new();
+				}
+			}
 		}
 	}
 }
@@ -3204,24 +3217,9 @@ void BKE_object_sim_tick(Scene *UNUSED(scene), Object *ob, float ctime, float ti
 	for (md = ob->modifiers.first; md; md = md->next) {
 		if (md->type == eModifierType_Hair) {
 			HairModifierData *hmd = (HairModifierData*) md;
+			HairSystem *hsys = hmd->hairsys;
 			
-			if (!(hmd->debug_flag & MOD_HAIR_DEBUG_SHOW)) {
-				if (hmd->debug_data) {
-					BKE_sim_debug_data_free(hmd->debug_data);
-					hmd->debug_data = NULL;
-				}
-				
-				HAIR_solver_step(hmd->solver_data, ctime, timestep);
-			}
-			else {
-				float imat[4][4];
-				invert_m4_m4(imat, ob->obmat);
-				
-				if (!hmd->debug_data)
-					hmd->debug_data = BKE_sim_debug_data_new();
-				
-				HAIR_solver_step_debug(hmd->solver_data, ctime, timestep, imat, hmd->debug_data);
-			}
+			BPH_hair_solve(hmd->solver_data, &hsys->params, ctime, timestep, hmd->debug_data);
 		}
 	}
 }
@@ -3233,7 +3231,10 @@ void BKE_object_sim_post_step(Scene *scene, Object *ob, float UNUSED(ctime))
 	for (md = ob->modifiers.first; md; md = md->next) {
 		if (md->type == eModifierType_Hair) {
 			HairModifierData *hmd = (HairModifierData*) md;
-			HAIR_solver_apply(hmd->solver_data, scene, ob, hmd->hairsys);
+			
+			BPH_hair_solver_free_effectors(hmd->solver_data);
+			
+			BPH_hair_solver_apply_positions(hmd->solver_data, scene, ob, hmd->hairsys);
 		}
 	}
 }
diff --git a/source/blender/blenkernel/intern/rigidbody_objects.c b/source/blender/blenkernel/intern/rigidbody_objects.c
index c248882..cc3f47d 100644
--- a/source/blender/blenkernel/intern/rigidbody_objects.c
+++ b/source/blender/blenkernel/intern/rigidbody_objects.c
@@ -52,8 +52,6 @@
 #include "BKE_object.h"
 #include "BKE_rigidbody.h"
 
-#include "HAIR_capi.h"
-
 /* ------------------------ */
 /* Main Simulation Sync */
 
@@ -257,14 +255,13 @@ static void rigidbody_object_build_components(Scene *UNUSED(scene), RigidBodyWor
 	if (!ob)
 		return;
 	
+#if 0 /* unused */
 	for (md = ob->modifiers.first; md; md = md->next) {
 		if (md->type == eModifierType_Hair) {
 			HairModifierData *hmd = (HairModifierData*) md;
-			
-			if (rebuild && hmd->solver_data)
-				HAIR_solver_rebuild_rigidbodyworld(hmd->solver_data, rbw->physics_world);
 		}
 	}
+#endif
 }
 
 void BKE_rigidbody_objects_build(Scene *scene, struct RigidBodyWorld *rbw, bool rebuild)
diff --git a/source/blender/makesdna/DNA_hair_types.h b/source/blender/makesdna/DNA_hair_types.h
index f98ff27..6d67ee6 100644
--- a/source/blender/makesdna/DNA_hair_types.h
+++ b/source/blender/makesdna/DNA_hair_types.h
@@ -93,6 +93,8 @@ typedef struct HairParams {
 	float margin;
 	int pad;
 	
+	struct EffectorWeights *effector_weights;
+	
 	HairRenderSettings render;
 } HairParams;
 
diff --git a/source/blender/modifiers/CMakeLists.txt b/source/blender/modifiers/CMakeLists.txt
index e300469..057a702 100644
--- a/source/blender/modifiers/CMakeLists.txt
+++ b/source/blender/modifiers/CMakeLists.txt
@@ -33,6 +33,7 @@ set(INC
 	../makesdna
 	../makesrna
 	../bmesh
+	../physics
 	../render/extern/include
 	../../../intern/elbeem/extern
 	../../../intern/guardedalloc
diff --git a/source/blender/modifiers/intern/MOD_hair.c b/source/blender/modifiers/intern/MOD_hair.c
index ed48725..8936704 100644
--- a/source/blender/modifiers/intern/MOD_hair.c
+++ b/source/blender/modifiers/intern/MOD_hair.c
@@ -41,6 +41,8 @@
 #include "BKE_modifier.h"
 #include "BKE_scene.h"
 
+#include "BPH_mass_spring.h"
+
 #include "depsgraph_private.h"
 
 #include "MOD_util.h"
@@ -58,7 +60,7 @@ static void freeData(ModifierData *md)
 	HairModifierData *hmd = (HairModifierData *) md;
 	
 	if (hmd->solver_data)
-		HAIR_solver_free(hmd->solver_data);
+		BPH_hair_solver_free(hmd->solver_data);
 	
 	BKE_hairsys_free(hmd->hairsys);
 	
diff --git a/source/blender/physics/BPH_mass_spring.h b/source/blender/physics/BPH_mass_spring.h
index 166d040..9fd9892 100644
--- a/source/blender/physics/BPH_mass_spring.h
+++ b/source/blender/physics/BPH_mass_spring.h
@@ -34,6 +34,14 @@ extern "C" {
 
 struct Implicit_Data;
 struct ClothModifierData;
+struct DerivedMesh;
+struct EffectorWeights;
+struct HairSolverData;
+struct HairSystem;
+struct HairParams;
+struct Object;
+struct Scene;
+struct SimDebugData;
 
 typedef enum eMassSpringSolverStatus {
 	BPH_SOLVER_SUCCESS              = (1 << 0),
@@ -50,6 +58,16 @@ void BPH_cloth_solver_free(struct ClothModifierData *clmd);
 int BPH_cloth_solve(struct Object *ob, float frame, struct ClothModifierData *clmd, struct ListBase *effectors);
 void BKE_cloth_solver_set_positions(struct ClothModifierData *clmd);
 
+struct HairSolverData *BPH_hair_solver_create(void);
+void BPH_hair_solver_free(struct HairSolverData *data);
+
+void BPH_hair_solver_set_externals(struct HairSolverData *data, struct Scene *scene, struct Object *ob, struct DerivedMesh *dm, struct EffectorWeights *effector_weights);
+void BPH_hair_solver_free_effectors(struct HairSolverData *data);
+
+void BPH_hair_solver_set_positions(struct HairSolverData *data, struct Scene *scene, struct Object *ob, struct HairSystem *hsys);
+void BPH_hair_solve(struct HairSolverData *data, struct HairParams *params, float time, float timestep, struct SimDebugData *debug_data);
+void BPH_hair_solver_apply_positions(struct HairSolverData *data, struct Scene *scene, struct Object *ob, struct HairSystem *hsys);
+
 bool implicit_hair_volume_get_texture_data(struct Object *UNUSED(ob), struct ClothModifierData *clmd, struct ListBase *UNUSED(effectors), struct VoxelData *vd);
 
 #ifdef __cplusplus




More information about the Bf-blender-cvs mailing list