Cleanup: Removed the unnecessary cloth solver abstraction (there is only

one solver anyway), and split some particle cloth functions for clarity.

Conflicts:
	source/blender/blenkernel/BKE_particle.h
	source/blender/blenkernel/intern/particle_system.c
	source/blender/blenloader/intern/versioning_270.c
	source/blender/makesdna/DNA_particle_types.h
	source/blender/makesrna/intern/rna_particle.c
This commit is contained in:
Lukas Tönne 2015-01-19 18:39:41 +01:00
parent 0b0acb6124
commit 4a16242e60
3 changed files with 111 additions and 126 deletions

@ -249,25 +249,5 @@ void cloth_parallel_transport_hair_frame(float mat[3][3], const float dir_old[3]
////////////////////////////////////////////////
/* This enum provides the IDs for our solvers. */
// only one available in the moment
typedef enum {
CM_IMPLICIT = 0,
} CM_SOLVER_ID;
/* This structure defines how to call the solver.
*/
typedef struct {
const char *name;
CM_SOLVER_ID id;
int ( *init ) (struct Object *ob, struct ClothModifierData *clmd );
int ( *solver ) (struct Object *ob, float framenr, struct ClothModifierData *clmd, struct ListBase *effectors );
void ( *free ) (struct ClothModifierData *clmd );
}
CM_SOLVER_DEF;
#endif

@ -51,15 +51,6 @@
// #include "PIL_time.h" /* timing for debug prints */
/* Our available solvers. */
// 255 is the magic reserved number, so NEVER try to put 255 solvers in here!
// 254 = MAX!
static CM_SOLVER_DEF solvers [] =
{
{ "Implicit", CM_IMPLICIT, BPH_cloth_solver_init, BPH_cloth_solve, BPH_cloth_solver_free },
// { "Implicit C++", CM_IMPLICITCPP, implicitcpp_init, implicitcpp_solver, implicitcpp_free },
};
/* ********** cloth engine ******* */
/* Prototypes for internal functions.
*/
@ -419,8 +410,7 @@ static int do_step_cloth(Object *ob, ClothModifierData *clmd, DerivedMesh *resul
// TIMEIT_START(cloth_step)
/* call the solver. */
if (solvers [clmd->sim_parms->solver_type].solver)
ret = solvers[clmd->sim_parms->solver_type].solver(ob, framenr, clmd, effectors);
ret = BPH_cloth_solve(ob, framenr, clmd, effectors);
// TIMEIT_END(cloth_step)
@ -615,10 +605,7 @@ void cloth_free_modifier(ClothModifierData *clmd )
if ( cloth ) {
// If our solver provides a free function, call it
if ( solvers [clmd->sim_parms->solver_type].free ) {
solvers [clmd->sim_parms->solver_type].free ( clmd );
}
BPH_cloth_solver_free(clmd);
// Free the verts.
if ( cloth->verts != NULL )
@ -684,10 +671,7 @@ void cloth_free_modifier_extern(ClothModifierData *clmd )
if (G.debug_value > 0)
printf("cloth_free_modifier_extern in\n");
// If our solver provides a free function, call it
if ( solvers [clmd->sim_parms->solver_type].free ) {
solvers [clmd->sim_parms->solver_type].free ( clmd );
}
BPH_cloth_solver_free(clmd);
// Free the verts.
if ( cloth->verts != NULL )
@ -965,9 +949,7 @@ static int cloth_from_object(Object *ob, ClothModifierData *clmd, DerivedMesh *d
}
// init our solver
if ( solvers [clmd->sim_parms->solver_type].init ) {
solvers [clmd->sim_parms->solver_type].init ( ob, clmd );
}
BPH_cloth_solver_init(ob, clmd);
if (!first)
BKE_cloth_solver_set_positions(clmd);

@ -4040,30 +4040,32 @@ static MDeformVert *hair_set_pinning(MDeformVert *dvert, float weight)
return dvert;
}
static void do_hair_dynamics(ParticleSimulationData *sim)
static void hair_create_input_dm(ParticleSimulationData *sim, int totpoint, int totedge, DerivedMesh **r_dm, ClothHairRoot **r_roots)
{
ParticleSystem *psys = sim->psys;
DerivedMesh *dm = psys->hair_in_dm;
MVert *mvert = NULL;
MEdge *medge = NULL;
MDeformVert *dvert = NULL;
DerivedMesh *dm;
ClothHairRoot *roots;
MVert *mvert;
MEdge *medge;
MDeformVert *dvert;
HairKey *key;
PARTICLE_P;
int totpoint = 0;
int totedge;
int k;
int k, hair_index;
float hairmat[4][4];
float (*deformedVerts)[3];
float max_length;
bool realloc_roots;
if (!psys->clmd) {
psys->clmd = (ClothModifierData*)modifier_new(eModifierType_Cloth);
psys->clmd->sim_parms->goalspring = 0.0f;
psys->clmd->sim_parms->vel_damping = 1.0f;
psys->clmd->sim_parms->flags |= CLOTH_SIMSETTINGS_FLAG_GOAL|CLOTH_SIMSETTINGS_FLAG_NO_SPRING_COMPRESS;
psys->clmd->coll_parms->flags &= ~CLOTH_COLLSETTINGS_FLAG_SELF;
psys->clmd->coll_parms->flags |= CLOTH_COLLSETTINGS_FLAG_POINTS;
dm = *r_dm;
if (!dm) {
*r_dm = dm = CDDM_new(totpoint, totedge, 0, 0, 0);
DM_add_vert_layer(dm, CD_MDEFORMVERT, CD_CALLOC, NULL);
}
mvert = CDDM_get_verts(dm);
medge = CDDM_get_edges(dm);
dvert = DM_get_vert_data_layer(dm, CD_MDEFORMVERT);
roots = *r_roots;
if (!roots) {
*r_roots = roots = MEM_mallocN(sizeof(ClothHairRoot) * totpoint, "hair roots");
}
/* calculate maximum segment length */
@ -4076,48 +4078,16 @@ static void do_hair_dynamics(ParticleSimulationData *sim)
}
}
/* create a dm from hair vertices */
LOOP_PARTICLES
totpoint += pa->totkey;
totedge = totpoint;
totpoint += psys->totpart;
realloc_roots = false; /* whether hair root info array has to be reallocated */
if (dm && (totpoint != dm->getNumVerts(dm) || totedge != dm->getNumEdges(dm))) {
dm->release(dm);
dm = psys->hair_in_dm = NULL;
realloc_roots = true;
}
if (!dm) {
dm = psys->hair_in_dm = CDDM_new(totpoint, totedge, 0, 0, 0);
DM_add_vert_layer(dm, CD_MDEFORMVERT, CD_CALLOC, NULL);
realloc_roots = true;
}
if (!psys->clmd->roots || realloc_roots) {
if (psys->clmd->roots)
MEM_freeN(psys->clmd->roots);
psys->clmd->roots = MEM_mallocN(sizeof(ClothHairRoot) * totpoint, "hair roots");
}
mvert = CDDM_get_verts(dm);
medge = CDDM_get_edges(dm);
dvert = DM_get_vert_data_layer(dm, CD_MDEFORMVERT);
psys->clmd->sim_parms->vgroup_mass = 1;
/* make vgroup for pin roots etc.. */
psys->particles->hair_index = 1;
hair_index = 1;
LOOP_PARTICLES {
float root_mat[4][4];
bool use_hair = psys_hair_use_simulation(pa, max_length);
bool use_hair;
if (p)
pa->hair_index = (pa-1)->hair_index + (pa-1)->totkey + 1;
pa->hair_index = hair_index;
use_hair = psys_hair_use_simulation(pa, max_length);
psys_mat_hair_to_object(sim->ob, sim->psmd->dm, psys->part->from, pa, hairmat);
mul_m4_m4m4(root_mat, sim->ob->obmat, hairmat);
@ -4125,26 +4095,28 @@ static void do_hair_dynamics(ParticleSimulationData *sim)
for (k=0, key=pa->hair; k<pa->totkey; k++,key++) {
ClothHairRoot *root;
float *co, *co_next;
co = key->co;
co_next = (key+1)->co;
/* create fake root before actual root to resist bending */
if (k==0) {
float temp[3];
root = &psys->clmd->roots[pa->hair_index - 1];
copy_v3_v3(root->loc, root_mat[3]);
copy_m3_m4(root->rot, root_mat);
sub_v3_v3v3(temp, key->co, (key+1)->co);
copy_v3_v3(mvert->co, key->co);
add_v3_v3v3(mvert->co, mvert->co, temp);
add_v3_v3v3(mvert->co, co, co);
sub_v3_v3(mvert->co, co_next);
mul_m4_v3(hairmat, mvert->co);
mvert++;
medge->v1 = pa->hair_index - 1;
medge->v2 = pa->hair_index;
medge++;
dvert = hair_set_pinning(dvert, 1.0f);
mvert++;
medge++;
}
/* store root transform in cloth data */
@ -4152,14 +4124,12 @@ static void do_hair_dynamics(ParticleSimulationData *sim)
copy_v3_v3(root->loc, root_mat[3]);
copy_m3_m4(root->rot, root_mat);
copy_v3_v3(mvert->co, key->co);
copy_v3_v3(mvert->co, co);
mul_m4_v3(hairmat, mvert->co);
mvert++;
if (k) {
medge->v1 = pa->hair_index + k - 1;
medge->v2 = pa->hair_index + k;
medge++;
}
/* roots and disabled hairs should be 1.0, the rest can be anything from 0.0 to 1.0 */
@ -4167,20 +4137,73 @@ static void do_hair_dynamics(ParticleSimulationData *sim)
dvert = hair_set_pinning(dvert, key->weight);
else
dvert = hair_set_pinning(dvert, 1.0f);
mvert++;
if (k)
medge++;
}
hair_index += pa->totkey + 1;
}
}
static void do_hair_dynamics(ParticleSimulationData *sim)
{
ParticleSystem *psys = sim->psys;
PARTICLE_P;
int totpoint;
int totedge;
float (*deformedVerts)[3];
bool realloc_roots;
if (!psys->clmd) {
psys->clmd = (ClothModifierData*)modifier_new(eModifierType_Cloth);
psys->clmd->sim_parms->goalspring = 0.0f;
psys->clmd->sim_parms->vel_damping = 1.0f;
psys->clmd->sim_parms->flags |= CLOTH_SIMSETTINGS_FLAG_GOAL|CLOTH_SIMSETTINGS_FLAG_NO_SPRING_COMPRESS;
psys->clmd->coll_parms->flags &= ~CLOTH_COLLSETTINGS_FLAG_SELF;
psys->clmd->coll_parms->flags |= CLOTH_COLLSETTINGS_FLAG_POINTS;
}
/* count simulated points */
totpoint = 0;
totedge = 0;
LOOP_PARTICLES {
/* "out" dm contains all hairs */
totedge += pa->totkey;
totpoint += pa->totkey + 1; /* +1 for virtual root point */
}
realloc_roots = false; /* whether hair root info array has to be reallocated */
if (psys->hair_in_dm) {
DerivedMesh *dm = psys->hair_in_dm;
if (totpoint != dm->getNumVerts(dm) || totedge != dm->getNumEdges(dm)) {
dm->release(dm);
psys->hair_in_dm = NULL;
realloc_roots = true;
}
}
if (psys->hair_in_dm || !psys->clmd->roots || realloc_roots) {
if (psys->clmd->roots) {
MEM_freeN(psys->clmd->roots);
psys->clmd->roots = NULL;
}
}
hair_create_input_dm(sim, totpoint, totedge, &psys->hair_in_dm, &psys->clmd->roots);
if (psys->hair_out_dm)
psys->hair_out_dm->release(psys->hair_out_dm);
psys->clmd->point_cache = psys->pointcache;
psys->clmd->sim_parms->effector_weights = psys->part->effector_weights;
deformedVerts = MEM_mallocN(sizeof(*deformedVerts) * dm->getNumVerts(dm), "do_hair_dynamics vertexCos");
psys->hair_out_dm = CDDM_copy(dm);
deformedVerts = MEM_mallocN(sizeof(*deformedVerts) * psys->hair_in_dm->getNumVerts(psys->hair_in_dm), "do_hair_dynamics vertexCos");
psys->hair_out_dm = CDDM_copy(psys->hair_in_dm);
psys->hair_out_dm->getVertCos(psys->hair_out_dm, deformedVerts);
clothModifier_do(psys->clmd, sim->scene, sim->ob, dm, deformedVerts);
clothModifier_do(psys->clmd, sim->scene, sim->ob, psys->hair_in_dm, deformedVerts);
CDDM_apply_vert_coords(psys->hair_out_dm, deformedVerts);