[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