[Bf-blender-cvs] [d00a64e] hair_system: Properly initialize the effector weights in hair parameters.
Lukas Tönne
noreply at git.blender.org
Sun Oct 5 14:57:00 CEST 2014
Commit: d00a64e7020871ee21d6619ea48a8bd83a7ff075
Author: Lukas Tönne
Date: Sat Oct 4 12:15:18 2014 +0200
Branches: hair_system
https://developer.blender.org/rBd00a64e7020871ee21d6619ea48a8bd83a7ff075
Properly initialize the effector weights in hair parameters.
===================================================================
M source/blender/blenkernel/BKE_hair.h
M source/blender/blenkernel/intern/hair.c
M source/blender/blenkernel/intern/object.c
M source/blender/blenloader/intern/readfile.c
M source/blender/blenloader/intern/writefile.c
M source/blender/modifiers/intern/MOD_hair.c
M source/blender/physics/BPH_mass_spring.h
===================================================================
diff --git a/source/blender/blenkernel/BKE_hair.h b/source/blender/blenkernel/BKE_hair.h
index 38ee91f..22a7f9d 100644
--- a/source/blender/blenkernel/BKE_hair.h
+++ b/source/blender/blenkernel/BKE_hair.h
@@ -36,11 +36,13 @@ struct HairCurve;
struct HairPoint;
struct HairParams;
-struct HairSystem *BKE_hairsys_new(void);
-void BKE_hairsys_free(struct HairSystem *hsys);
-struct HairSystem *BKE_hairsys_copy(struct HairSystem *hsys);
+struct HairSystem *BKE_hair_system_new(void);
+void BKE_hair_system_free(struct HairSystem *hsys);
+struct HairSystem *BKE_hair_system_copy(struct HairSystem *hsys);
-void BKE_hairparams_init(struct HairParams *params);
+void BKE_hair_params_init(struct HairParams *params);
+void BKE_hair_params_free(struct HairParams *params);
+void BKE_hair_params_copy(struct HairParams *to, struct HairParams *from);
void BKE_hairsys_clear(struct HairSystem *hsys);
diff --git a/source/blender/blenkernel/intern/hair.c b/source/blender/blenkernel/intern/hair.c
index 1020e6a..fffe778 100644
--- a/source/blender/blenkernel/intern/hair.c
+++ b/source/blender/blenkernel/intern/hair.c
@@ -39,11 +39,13 @@
#include "BLI_ghash.h"
#include "DNA_hair_types.h"
+#include "DNA_object_force.h"
+#include "BKE_effect.h"
#include "BKE_hair.h"
#include "BKE_mesh_sample.h"
-void BKE_hairparams_init(HairParams *params)
+void BKE_hair_params_init(HairParams *params)
{
params->substeps_forces = 30;
params->substeps_damping = 10;
@@ -51,15 +53,33 @@ void BKE_hairparams_init(HairParams *params)
params->stretch_damping = 10.0f;
params->bend_stiffness = 40.0f;
params->bend_damping = 10.0f;
+
+ params->effector_weights = BKE_add_effector_weights(NULL);
+}
+
+void BKE_hair_params_free(HairParams *params)
+{
+ if (params->effector_weights) {
+ MEM_freeN(params->effector_weights);
+ params->effector_weights = NULL;
+ }
}
-HairSystem *BKE_hairsys_new(void)
+void BKE_hair_params_copy(HairParams *to, HairParams *from)
+{
+ memcpy(to, from, sizeof(HairParams));
+
+ if (from->effector_weights)
+ to->effector_weights = MEM_dupallocN(from->effector_weights);
+}
+
+HairSystem *BKE_hair_system_new(void)
{
HairSystem *hsys = MEM_callocN(sizeof(HairSystem), "hair system");
HairParams *params = &hsys->params;
HairRenderSettings *render = ¶ms->render;
- BKE_hairparams_init(params);
+ BKE_hair_params_init(params);
render->flag = HAIR_RENDER_CLOSE_TIP;
render->num_render_hairs = 100;
render->interpolation_steps = 4;
@@ -73,13 +93,15 @@ HairSystem *BKE_hairsys_new(void)
return hsys;
}
-void BKE_hairsys_free(HairSystem *hsys)
+void BKE_hair_system_free(HairSystem *hsys)
{
+ BKE_hair_params_free(&hsys->params);
+
BKE_hairsys_clear(hsys);
MEM_freeN(hsys);
}
-HairSystem *BKE_hairsys_copy(HairSystem *hsys)
+HairSystem *BKE_hair_system_copy(HairSystem *hsys)
{
int totcurves = hsys->totcurves, i;
HairSystem *thsys = MEM_dupallocN(hsys);
@@ -88,6 +110,8 @@ HairSystem *BKE_hairsys_copy(HairSystem *hsys)
for (i = 0; i < totcurves; ++i)
thsys->curves[i].points = MEM_dupallocN(hsys->curves[i].points);
+ BKE_hair_params_copy(&thsys->params, &hsys->params);
+
thsys->render_iter = NULL;
return thsys;
diff --git a/source/blender/blenkernel/intern/object.c b/source/blender/blenkernel/intern/object.c
index 4b22888..be1f7e6 100644
--- a/source/blender/blenkernel/intern/object.c
+++ b/source/blender/blenkernel/intern/object.c
@@ -3188,7 +3188,7 @@ void BKE_object_sim_pre_step(Scene *scene, Object *ob, float ctime)
if (hmd->solver_data) {
BPH_hair_solver_free(hmd->solver_data);
}
- hmd->solver_data = BPH_hair_solver_create();
+ hmd->solver_data = BPH_hair_solver_create(ob, hsys);
hmd->flag |= MOD_HAIR_SOLVER_DATA_VALID;
BKE_sim_debug_data_clear(hmd->debug_data);
diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c
index 694a4e1..3901add 100644
--- a/source/blender/blenloader/intern/readfile.c
+++ b/source/blender/blenloader/intern/readfile.c
@@ -4605,6 +4605,8 @@ static void direct_link_hair_system(FileData *fd, HairSystem *hsys)
hair->points = newdataadr(fd, hair->points);
}
+ hsys->params.effector_weights = newdataadr(fd, hsys->params.effector_weights);
+
hsys->render_iter = NULL;
}
diff --git a/source/blender/blenloader/intern/writefile.c b/source/blender/blenloader/intern/writefile.c
index 7d8959c..dc35cec 100644
--- a/source/blender/blenloader/intern/writefile.c
+++ b/source/blender/blenloader/intern/writefile.c
@@ -1479,6 +1479,8 @@ static void write_hair_system(WriteData *wd, HairSystem *hsys)
writestruct(wd, DATA, "HairCurve", hsys->totcurves, hsys->curves);
for (hair = hsys->curves, i = 0; i < hsys->totcurves; ++hair, ++i)
writestruct(wd, DATA, "HairPoint", hair->totpoints, hair->points);
+
+ writestruct(wd, DATA, "EffectorWeights", 1, hsys->params.effector_weights);
}
static void write_modifiers(WriteData *wd, ListBase *modbase)
diff --git a/source/blender/modifiers/intern/MOD_hair.c b/source/blender/modifiers/intern/MOD_hair.c
index 8936704..afba175 100644
--- a/source/blender/modifiers/intern/MOD_hair.c
+++ b/source/blender/modifiers/intern/MOD_hair.c
@@ -52,7 +52,7 @@ static void initData(ModifierData *md)
{
HairModifierData *hmd = (HairModifierData *) md;
- hmd->hairsys = BKE_hairsys_new();
+ hmd->hairsys = BKE_hair_system_new();
}
static void freeData(ModifierData *md)
@@ -62,7 +62,7 @@ static void freeData(ModifierData *md)
if (hmd->solver_data)
BPH_hair_solver_free(hmd->solver_data);
- BKE_hairsys_free(hmd->hairsys);
+ BKE_hair_system_free(hmd->hairsys);
BKE_sim_debug_data_free(hmd->debug_data);
}
@@ -73,9 +73,9 @@ static void copyData(ModifierData *md, ModifierData *target)
HairModifierData *thmd = (HairModifierData *) target;
if (thmd->hairsys)
- BKE_hairsys_free(thmd->hairsys);
+ BKE_hair_system_free(thmd->hairsys);
- thmd->hairsys = BKE_hairsys_copy(hmd->hairsys);
+ thmd->hairsys = BKE_hair_system_copy(hmd->hairsys);
thmd->solver_data = NULL;
thmd->debug_data = NULL;
diff --git a/source/blender/physics/BPH_mass_spring.h b/source/blender/physics/BPH_mass_spring.h
index 9fd9892..aa2676f 100644
--- a/source/blender/physics/BPH_mass_spring.h
+++ b/source/blender/physics/BPH_mass_spring.h
@@ -58,7 +58,7 @@ 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);
+struct HairSolverData *BPH_hair_solver_create(struct Object *ob, struct HairSystem *hsys);
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);
More information about the Bf-blender-cvs
mailing list