[Bf-blender-cvs] [73efd29] hair_system: WIP.

Antony Riakiotakis noreply at git.blender.org
Thu Aug 21 17:09:33 CEST 2014


Commit: 73efd29539b2cfa9024b1dcc7ee24c906612576a
Author: Antony Riakiotakis
Date:   Thu Aug 21 16:26:12 2014 +0200
Branches: hair_system
https://developer.blender.org/rB73efd29539b2cfa9024b1dcc7ee24c906612576a

WIP.

Add stub functions to synchronize data between particle system and new
solver.

Only generate new solver if needed in solver step.

Minor fixes and little code for conversion.

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

M	source/blender/blenkernel/intern/object.c
M	source/blender/blenkernel/intern/particle.c
M	source/blender/blenkernel/intern/particle_system.c
M	source/blender/hair/HAIR_capi.cpp
M	source/blender/hair/HAIR_capi.h
M	source/blender/hair/intern/HAIR_scene.cpp
M	source/blender/hair/intern/HAIR_scene.h
M	source/blender/makesrna/intern/rna_particle.c

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

diff --git a/source/blender/blenkernel/intern/object.c b/source/blender/blenkernel/intern/object.c
index 8b3dde9..46c657f 100644
--- a/source/blender/blenkernel/intern/object.c
+++ b/source/blender/blenkernel/intern/object.c
@@ -3128,12 +3128,38 @@ void BKE_object_sim_pre_step(Scene *scene, Object *ob, float ctime)
 			HAIR_solver_set_params(hmd->solver, &hsys->params);
 			
 			if (!hmd->flag & MOD_HAIR_SOLVER_DATA_VALID) {
-				HAIR_solver_build_data(hmd->solver, scene, ob, dm, hsys, ctime);
+				HAIR_solver_build_modifier_data(hmd->solver, scene, ob, dm, hsys, ctime);
 				hmd->flag |= MOD_HAIR_SOLVER_DATA_VALID;
 			}
 			
-			HAIR_solver_update_externals(hmd->solver, scene, ob, dm, hsys, ctime);
+			HAIR_solver_update_modifier_externals(hmd->solver, scene, ob, dm, hsys, ctime);
 		}
+		else if (md->type == eModifierType_ParticleSystem) {
+			ParticleSystem *psys = ((ParticleSystemModifierData *) md)->psys;
+			
+			if (psys->part && psys->part->type == PART_HAIR && psys->flag & PSYS_HAIR_DYNAMICS && psys->particles) {
+				/* This, strictly speaking, is not so correct */
+				DerivedMesh *dm = ob->derivedFinal;
+				
+				if (!psys->solver) {
+					psys->solver = HAIR_solver_new();
+					
+					if (!psys->params) {
+						psys->params = MEM_mallocN(sizeof(HairParams), "particle_system_hair_params");
+						BKE_hairparams_init(psys->params);
+					}
+					
+					HAIR_solver_set_params(psys->solver, psys->params);
+					
+					HAIR_solver_build_particle_data(psys->solver, scene, ob, dm, psys, ctime);
+				}
+				else {
+					HAIR_solver_set_params(psys->solver, psys->params);
+				}
+								
+				HAIR_solver_update_particle_externals(psys->solver, scene, ob, dm, psys, ctime);
+			}
+		}		
 	}
 }
 
diff --git a/source/blender/blenkernel/intern/particle.c b/source/blender/blenkernel/intern/particle.c
index f598c59..2e5d97b 100644
--- a/source/blender/blenkernel/intern/particle.c
+++ b/source/blender/blenkernel/intern/particle.c
@@ -440,6 +440,7 @@ void free_hair(Object *UNUSED(ob), ParticleSystem *psys, int dynamics)
 		psys->hair_out_dm->release(psys->hair_out_dm);
 	psys->hair_out_dm = NULL;
 }
+
 void free_keyed_keys(ParticleSystem *psys)
 {
 	PARTICLE_P;
diff --git a/source/blender/blenkernel/intern/particle_system.c b/source/blender/blenkernel/intern/particle_system.c
index 8a47d24..05df5d3 100644
--- a/source/blender/blenkernel/intern/particle_system.c
+++ b/source/blender/blenkernel/intern/particle_system.c
@@ -4023,12 +4023,7 @@ static void do_hair_dynamics(ParticleSimulationData *sim)
 #endif
 	
 	if (!psys->solver) {
-		psys->solver = HAIR_solver_new();
-		
-		if (!psys->params) {
-			psys->params = MEM_callocN(sizeof(HairParams), "hair_params_particle");
-			BKE_hairparams_init(psys->params);
-		}
+		/* say "bad boy" */
 	}
 
 	/* create a dm from hair vertices */
diff --git a/source/blender/hair/HAIR_capi.cpp b/source/blender/hair/HAIR_capi.cpp
index e2d8dc7..a40f8f3 100644
--- a/source/blender/hair/HAIR_capi.cpp
+++ b/source/blender/hair/HAIR_capi.cpp
@@ -67,7 +67,7 @@ void HAIR_solver_set_params(struct HAIR_Solver *csolver, const struct HairParams
 	solver->params(*params);
 }
 
-void HAIR_solver_build_data(struct HAIR_Solver *csolver, Scene *scene, Object *ob, DerivedMesh *dm, HairSystem *hsys, float time)
+void HAIR_solver_build_modifier_data(struct HAIR_Solver *csolver, Scene *scene, Object *ob, DerivedMesh *dm, HairSystem *hsys, float time)
 {
 	Solver *solver = (Solver *)csolver;
 	RigidBodyWorld *rbw = scene->rigidbody_world;
@@ -83,7 +83,24 @@ void HAIR_solver_build_data(struct HAIR_Solver *csolver, Scene *scene, Object *o
 	data->add_to_world(world, 0xFFFFFFFF);
 }
 
-void HAIR_solver_update_externals(struct HAIR_Solver *csolver, Scene *scene, Object *ob, DerivedMesh *dm, HairSystem *hsys, float time)
+void HAIR_solver_build_particle_data(struct HAIR_Solver *csolver, Scene *scene, Object *ob, DerivedMesh *dm, ParticleSystem *psys, float time)
+{
+	Solver *solver = (Solver *)csolver;
+	RigidBodyWorld *rbw = scene->rigidbody_world;
+	rbDynamicsWorld *world = rbw ? (rbDynamicsWorld *)rbw->physics_world : NULL;
+	
+	if (solver->data())
+		solver->data()->remove_from_world(world);
+	
+	SolverData *data = SceneConverter::build_solver_data(scene, ob, dm, psys, time);
+	solver->set_data(data);
+	
+	// XXX col_groups ?
+	data->add_to_world(world, 0xFFFFFFFF);
+}
+
+
+void HAIR_solver_update_modifier_externals(struct HAIR_Solver *csolver, Scene *scene, Object *ob, DerivedMesh *dm, HairSystem *hsys, float time)
 {
 	Solver *solver = (Solver *)csolver;
 	
@@ -91,6 +108,14 @@ void HAIR_solver_update_externals(struct HAIR_Solver *csolver, Scene *scene, Obj
 	SceneConverter::sync_rigidbody_data(solver->data(), solver->params());
 }
 
+void HAIR_solver_update_particle_externals(struct HAIR_Solver *csolver, struct Scene *scene, struct Object *ob, struct DerivedMesh *dm, struct ParticleSystem *psys, float time)
+{
+	Solver *solver = (Solver *)csolver;
+	
+	SceneConverter::update_solver_data_externals(solver->data(), solver->forces(), scene, ob, dm, psys, time);
+	SceneConverter::sync_rigidbody_data(solver->data(), solver->params());	
+}
+
 void HAIR_solver_rebuild_rigidbodyworld(struct HAIR_Solver *csolver, struct rbDynamicsWorld *world)
 {
 	Solver *solver = (Solver *)csolver;
diff --git a/source/blender/hair/HAIR_capi.h b/source/blender/hair/HAIR_capi.h
index adc6c38..5d036ac 100644
--- a/source/blender/hair/HAIR_capi.h
+++ b/source/blender/hair/HAIR_capi.h
@@ -39,6 +39,8 @@ struct HairSystem;
 struct HairParams;
 struct rbDynamicsWorld;
 
+struct ParticleSystem;
+
 struct HAIR_Solver;
 struct HAIR_SmoothingIteratorFloat3;
 struct HAIR_FrameIterator;
@@ -49,8 +51,10 @@ struct HAIR_SolverDebugPoint;
 struct HAIR_Solver *HAIR_solver_new(void);
 void HAIR_solver_free(struct HAIR_Solver *solver);
 void HAIR_solver_set_params(struct HAIR_Solver *solver, const struct HairParams *params);
-void HAIR_solver_build_data(struct HAIR_Solver *solver, struct Scene *scene, struct Object *ob, struct DerivedMesh *dm, struct HairSystem *hsys, float time);
-void HAIR_solver_update_externals(struct HAIR_Solver *solver, struct Scene *scene, struct Object *ob, struct DerivedMesh *dm, struct HairSystem *hsys, float time);
+void HAIR_solver_build_modifier_data(struct HAIR_Solver *solver, struct Scene *scene, struct Object *ob, struct DerivedMesh *dm, struct HairSystem *hsys, float time);
+void HAIR_solver_build_particle_data(struct HAIR_Solver *solver, struct Scene *scene, struct Object *ob, struct DerivedMesh *dm, struct ParticleSystem *psys, float time);
+void HAIR_solver_update_modifier_externals(struct HAIR_Solver *solver, struct Scene *scene, struct Object *ob, struct DerivedMesh *dm, struct HairSystem *hsys, float time);
+void HAIR_solver_update_particle_externals(struct HAIR_Solver *solver, struct Scene *scene, struct Object *ob, struct DerivedMesh *dm, struct ParticleSystem *psys, float time);
 void HAIR_solver_rebuild_rigidbodyworld(struct HAIR_Solver *solver, struct rbDynamicsWorld *world);
 
 void HAIR_solver_step(struct HAIR_Solver *solver, float time, float timestep);
diff --git a/source/blender/hair/intern/HAIR_scene.cpp b/source/blender/hair/intern/HAIR_scene.cpp
index f8729cd..833f310 100644
--- a/source/blender/hair/intern/HAIR_scene.cpp
+++ b/source/blender/hair/intern/HAIR_scene.cpp
@@ -32,6 +32,7 @@ extern "C" {
 #include "DNA_object_types.h"
 #include "DNA_scene_types.h"
 #include "DNA_rigidbody_types.h"
+#include "DNA_particle_types.h"
 
 #include "BKE_DerivedMesh.h"
 #include "BKE_mesh_sample.h"
@@ -116,6 +117,68 @@ SolverData *SceneConverter::build_solver_data(Scene *scene, Object *ob, DerivedM
 	return data;
 }
 
+SolverData *SceneConverter::build_solver_data(Scene *scene, Object *ob, DerivedMesh *dm, ParticleSystem *psys, float time)
+{
+	HairParams *params = psys->params;
+	HairCurve *hair;
+	int i;
+	
+	if (!dm)
+		return new SolverData(0, 0);
+	
+	Transform mat = Transform(ob->obmat);
+	
+#if 0
+	/* count points */
+	int totpoints = 0;
+	for (hair = hsys->curves, i = 0; i < hsys->totcurves; ++hair, ++i) {
+		totpoints += hair->totpoints;
+	}
+	
+	/* allocate data */
+	SolverData *data = new SolverData(hsys->totcurves, totpoints);
+	Curve *solver_curves = data->curves;
+	Point *solver_points = data->points;
+	
+	data->t0 = data->t1 = time;
+	
+	/* copy scene data to solver data */
+	Point *point = solver_points;
+	for (hair = hsys->curves, i = 0; i < hsys->totcurves; ++hair, ++i) {
+		Curve *curve = solver_curves + i;
+		*curve = Curve(hair->totpoints, point);
+		
+		mesh_sample_eval_transformed(dm, mat, &hair->root, curve->root1.co, curve->root1.nor);
+		normalize_v3_v3(curve->root1.tan, float3(0,0,1) - dot_v3v3(float3(0,0,1), curve->root1.nor) * curve->root1.nor);
+		
+		curve->root0 = curve->root1;
+		
+		curve->avg_rest_length = hair->avg_rest_length;
+		curve->rest_root_normal = float3(hair->rest_nor);
+		curve->rest_root_tangent = float3(hair->rest_tan);
+//		transform_direction(mat, curve->rest_root_normal);
+//		transform_direction(mat, curve->rest_root_tangent);
+		
+		for (int k = 0; k < hair->totpoints; ++k, ++point) {
+			HairPoint *hair_pt = hair->points + k;
+			
+			point->rest_co = transform_point(mat, hair_pt->rest_co);
+			point->radius = hair_pt->radius;
+			
+			point->cur.co = transform_point(mat, hair_pt->co);
+			point->cur.vel = transform_direction(mat, hair_pt->vel);
+		}
+	}
+	/* finalize */
+	data->precompute_rest_bend(params);
+	
+	return data;
+#endif
+	
+	return new SolverData(0, 0);
+}
+
+
 void SceneConverter::update_solver_data_externals(SolverData *data, SolverForces &forces, Scene *scene, Object *ob, DerivedMesh *dm, HairSystem *hsys, float time)
 {
 	int i;
@@ -141,6 +204,33 @@ void SceneConverter::update_solver_data_externals(SolverData *data, SolverForces
 	forces.gravity = float3(scene->physics_settings.gravity);
 }
 
+void SceneConverter::update_solver_data_externals(SolverData *data, SolverForces &forces, Scene *scene, Object *ob, DerivedMesh *dm, ParticleSystem *psys, float time)
+{
+	int i;
+	
+	Transform mat = Transform(ob->obmat);
+	
+	Curve *solver_curves = data->curves;
+	int totcurves = data->totcurves;
+	
+	data->t0 = data->t1;
+	data->t1 = time;
+	
+	
+	for (i = 0; i < totcurves; ++i

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list