[Bf-blender-cvs] [8a4e1c7] hair_system: Reimport code from new solver to particles. Result is crappy and positions are not updated very well, but it's a start.

Antony Riakiotakis noreply at git.blender.org
Fri Aug 22 16:36:53 CEST 2014


Commit: 8a4e1c7b50ae6487d608e3437e76aa828d3dacd9
Author: Antony Riakiotakis
Date:   Fri Aug 22 15:37:53 2014 +0200
Branches: hair_system
https://developer.blender.org/rB8a4e1c7b50ae6487d608e3437e76aa828d3dacd9

Reimport code from new solver to particles. Result is crappy
and positions are not updated very well, but it's a start.

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

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

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

diff --git a/source/blender/blenkernel/intern/object.c b/source/blender/blenkernel/intern/object.c
index d4346aa..7b8bfb4 100644
--- a/source/blender/blenkernel/intern/object.c
+++ b/source/blender/blenkernel/intern/object.c
@@ -3191,6 +3191,11 @@ void BKE_object_sim_tick(Scene *UNUSED(scene), Object *ob, float ctime, float ti
 				HAIR_solver_step_debug(hmd->solver, ctime, timestep, imat, hmd->debug_data);
 			}
 		}
+		else if (md->type == eModifierType_ParticleSystem) {
+			ParticleSystem *psys = ((ParticleSystemModifierData *) md)->psys;
+			
+			HAIR_solver_step(psys->solver, ctime, timestep);
+		}
 	}
 }
 
diff --git a/source/blender/blenkernel/intern/particle.c b/source/blender/blenkernel/intern/particle.c
index 2e5d97b..dbd852b 100644
--- a/source/blender/blenkernel/intern/particle.c
+++ b/source/blender/blenkernel/intern/particle.c
@@ -392,7 +392,7 @@ void BKE_particlesettings_free(ParticleSettings *part)
 	}
 }
 
-void free_hair(Object *UNUSED(ob), ParticleSystem *psys, int dynamics)
+void free_hair(Object *UNUSED(ob), ParticleSystem *psys, int UNUSED(dynamics))
 {
 	PARTICLE_P;
 
diff --git a/source/blender/blenkernel/intern/particle_system.c b/source/blender/blenkernel/intern/particle_system.c
index 05df5d3..9ee9413 100644
--- a/source/blender/blenkernel/intern/particle_system.c
+++ b/source/blender/blenkernel/intern/particle_system.c
@@ -56,6 +56,7 @@
 #include "DNA_object_force.h"
 #include "DNA_object_types.h"
 #include "DNA_curve_types.h"
+#include "DNA_rigidbody_types.h"
 #include "DNA_scene_types.h"
 #include "DNA_texture_types.h"
 #include "DNA_listBase.h"
@@ -4022,10 +4023,6 @@ static void do_hair_dynamics(ParticleSimulationData *sim)
 	}
 #endif
 	
-	if (!psys->solver) {
-		/* say "bad boy" */
-	}
-
 	/* create a dm from hair vertices */
 	LOOP_PARTICLES
 		totpoint += pa->totkey;
@@ -4120,6 +4117,9 @@ static void do_hair_dynamics(ParticleSimulationData *sim)
 	psys->hair_out_dm = CDDM_copy(dm);
 	psys->hair_out_dm->getVertCos(psys->hair_out_dm, deformedVerts);
 
+	if (psys->solver) {
+		HAIR_solver_get_derived_verts(psys->solver, psys, deformedVerts);				
+	}
 	//clothModifier_do(psys->clmd, sim->scene, sim->ob, dm, deformedVerts);
 
 	CDDM_apply_vert_coords(psys->hair_out_dm, deformedVerts);
@@ -4154,6 +4154,11 @@ static void hair_step(ParticleSimulationData *sim, float cfra)
 		psys_calc_dmcache(sim->ob, sim->psmd->dm, psys);
 
 		if (psys->solver) {
+			RigidBodyWorld *rbw = sim->scene->rigidbody_world;
+						
+			if (rbw)
+				HAIR_solver_remove_from_rigidbodyworld(psys->solver, rbw->physics_world);
+
 			HAIR_solver_free(psys->solver);
 			psys->solver = NULL;
 		}
diff --git a/source/blender/hair/HAIR_capi.cpp b/source/blender/hair/HAIR_capi.cpp
index 87dc4e2..88f6f6b 100644
--- a/source/blender/hair/HAIR_capi.cpp
+++ b/source/blender/hair/HAIR_capi.cpp
@@ -282,3 +282,9 @@ void HAIR_frame_iter_next(struct HAIR_FrameIterator *citer)
 	
 	iter->next();
 }
+
+void HAIR_solver_get_derived_verts(struct HAIR_Solver *csolver, ParticleSystem *psys, float (*vertCoords)[3])
+{
+	Solver *solver = (Solver *)csolver;
+	SceneConverter::apply_solver_data(solver->data(), psys, vertCoords);
+}
diff --git a/source/blender/hair/HAIR_capi.h b/source/blender/hair/HAIR_capi.h
index 3179e37..96d2d45 100644
--- a/source/blender/hair/HAIR_capi.h
+++ b/source/blender/hair/HAIR_capi.h
@@ -59,6 +59,9 @@ void HAIR_solver_update_modifier_externals(struct HAIR_Solver *solver, struct Sc
 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_remove_from_rigidbodyworld(struct HAIR_Solver *solver, struct rbDynamicsWorld *world);
+/* get the final object space vertex data from the solver */
+void HAIR_solver_get_derived_verts(struct HAIR_Solver *solver, struct ParticleSystem *psys, float (*vertCoords)[3]);
+
 
 void HAIR_solver_step(struct HAIR_Solver *solver, float time, float timestep);
 void HAIR_solver_step_debug(struct HAIR_Solver *csolver, float time, float timestep,
diff --git a/source/blender/hair/intern/HAIR_scene.cpp b/source/blender/hair/intern/HAIR_scene.cpp
index d12e2f9..ed5768b 100644
--- a/source/blender/hair/intern/HAIR_scene.cpp
+++ b/source/blender/hair/intern/HAIR_scene.cpp
@@ -255,8 +255,9 @@ SolverData *SceneConverter::build_solver_data(Scene *scene, Object *ob, DerivedM
 			continue;
 		}
 		
-		/* send to world space (normal should be sent as well ) */
+		/* send to world space (normal matrix should be changed to inverse transpose here) */
 		transform_point(mat, curve->root1.co);
+		transform_direction(mat, curve->root1.nor);
 		
 		//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);
@@ -364,7 +365,14 @@ void SceneConverter::update_solver_data_externals(SolverData *data, SolverForces
 		Curve *curve = solver_curves + i;
 		
 		curve->root0 = curve->root1;
-		//mesh_sample_eval_transformed(dm, mat, &hcurve->root, curve->root1.co, curve->root1.nor);
+
+		if (!solver_evaluate_root_location(psys, pa, dm, curve->root1.co, curve->root1.nor)) {
+			continue;
+		}
+
+		/* send to world space (normal matrix should be changed to inverse transpose here) */
+		transform_point(mat, curve->root1.co);
+		transform_direction(mat, 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);
 	}
@@ -397,6 +405,24 @@ void SceneConverter::apply_solver_data(SolverData *data, Scene *scene, Object *o
 	}
 }
 
+void SceneConverter::apply_solver_data(SolverData *data, ParticleSystem *psys, float (*vertCoords)[3])
+{
+	int i, k, pc = 0;
+	
+	for (i = 0; i < data->totcurves; i++) {
+		int part_pc = pc;
+		ParticleData *pa = psys->particles + i;
+		
+		for (k = 0; k < pa->totkey; k++) {
+			copy_v3_v3(vertCoords[part_pc + k + 1], (data->points + pc)->cur.co.data());
+			pc++;
+		}
+		
+		copy_v3_v3(vertCoords[part_pc], (data->points + part_pc)->cur.co.data());
+	}
+}
+
+
 void SceneConverter::sync_rigidbody_data(SolverData *data, const HairParams &params)
 {
 	/* sync settings */
diff --git a/source/blender/hair/intern/HAIR_scene.h b/source/blender/hair/intern/HAIR_scene.h
index f995871..7a24dab 100644
--- a/source/blender/hair/intern/HAIR_scene.h
+++ b/source/blender/hair/intern/HAIR_scene.h
@@ -47,6 +47,7 @@ struct SceneConverter {
 	static void update_solver_data_externals(SolverData *data, SolverForces &force, Scene *scene, Object *ob, DerivedMesh *dm, ParticleSystem *hsys, float time);
 	
 	static void apply_solver_data(SolverData *data, Scene *scene, Object *ob, HairSystem *hsys);
+	static void apply_solver_data(SolverData *data, ParticleSystem *psys, float (*vertCoords)[3]);
 	
 	static void sync_rigidbody_data(SolverData *data, const HairParams &params);
 };




More information about the Bf-blender-cvs mailing list