[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 = &params->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