[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