Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/source
diff options
context:
space:
mode:
authorLukas Tönne <lukas.toenne@gmail.com>2014-09-13 20:45:58 +0400
committerLukas Tönne <lukas.toenne@gmail.com>2015-01-20 11:30:00 +0300
commit0d60337a83463cbd658038eed5f8efa2fa8a4de6 (patch)
treeae506199314d73627d8b47c65250760939b16dc8 /source
parent5322def57cdbb81d38c5ba8e8e617c697791d22b (diff)
Renamed functions to make them explicitly refer to cloth, and split the
create/free functions for solver data off from the cloth solver.
Diffstat (limited to 'source')
-rw-r--r--source/blender/blenkernel/BKE_cloth.h6
-rw-r--r--source/blender/blenkernel/intern/cloth.c12
-rw-r--r--source/blender/physics/BPH_mass_spring.h13
-rw-r--r--source/blender/physics/intern/implicit_blender.c148
4 files changed, 90 insertions, 89 deletions
diff --git a/source/blender/blenkernel/BKE_cloth.h b/source/blender/blenkernel/BKE_cloth.h
index 3dec5c82da2..571c0ec89a1 100644
--- a/source/blender/blenkernel/BKE_cloth.h
+++ b/source/blender/blenkernel/BKE_cloth.h
@@ -246,9 +246,9 @@ typedef enum {
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 );
- int ( *free ) (struct ClothModifierData *clmd );
+ 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;
diff --git a/source/blender/blenkernel/intern/cloth.c b/source/blender/blenkernel/intern/cloth.c
index 89ad084b59e..9fb42d5e989 100644
--- a/source/blender/blenkernel/intern/cloth.c
+++ b/source/blender/blenkernel/intern/cloth.c
@@ -56,8 +56,8 @@
// 254 = MAX!
static CM_SOLVER_DEF solvers [] =
{
- { "Implicit", CM_IMPLICIT, implicit_init, implicit_solver, implicit_free },
- // { "Implicit C++", CM_IMPLICITCPP, implicitcpp_init, implicitcpp_solver, implicitcpp_free },
+ { "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 ******* */
@@ -345,7 +345,7 @@ static int do_init_cloth(Object *ob, ClothModifierData *clmd, DerivedMesh *resul
return 0;
}
- implicit_set_positions(clmd);
+ BKE_cloth_solver_set_positions(clmd);
clmd->clothObject->last_frame= MINFRAME-1;
}
@@ -528,7 +528,7 @@ void clothModifier_do(ClothModifierData *clmd, Scene *scene, Object *ob, Derived
cache_result = BKE_ptcache_read(&pid, (float)framenr+scene->r.subframe);
if (cache_result == PTCACHE_READ_EXACT || cache_result == PTCACHE_READ_INTERPOLATED) {
- implicit_set_positions(clmd);
+ BKE_cloth_solver_set_positions(clmd);
cloth_to_object (ob, clmd, vertexCos);
BKE_ptcache_validate(cache, framenr);
@@ -541,7 +541,7 @@ void clothModifier_do(ClothModifierData *clmd, Scene *scene, Object *ob, Derived
return;
}
else if (cache_result==PTCACHE_READ_OLD) {
- implicit_set_positions(clmd);
+ BKE_cloth_solver_set_positions(clmd);
}
else if ( /*ob->id.lib ||*/ (cache->flag & PTCACHE_BAKED)) { /* 2.4x disabled lib, but this can be used in some cases, testing further - campbell */
/* if baked and nothing in cache, do nothing */
@@ -938,7 +938,7 @@ static int cloth_from_object(Object *ob, ClothModifierData *clmd, DerivedMesh *d
}
if (!first)
- implicit_set_positions(clmd);
+ BKE_cloth_solver_set_positions(clmd);
clmd->clothObject->bvhtree = bvhtree_build_from_cloth ( clmd, MAX2(clmd->coll_parms->epsilon, clmd->coll_parms->distance_repel) );
diff --git a/source/blender/physics/BPH_mass_spring.h b/source/blender/physics/BPH_mass_spring.h
index 2960082852f..8382d0befe7 100644
--- a/source/blender/physics/BPH_mass_spring.h
+++ b/source/blender/physics/BPH_mass_spring.h
@@ -28,10 +28,15 @@
#ifndef __BPH_MASS_SPRING_H__
#define __BPH_MASS_SPRING_H__
-int implicit_init (struct Object *ob, struct ClothModifierData *clmd );
-int implicit_free (struct ClothModifierData *clmd );
-int implicit_solver (struct Object *ob, float frame, struct ClothModifierData *clmd, struct ListBase *effectors );
-void implicit_set_positions (struct ClothModifierData *clmd );
+struct Implicit_Data;
+
+struct Implicit_Data *BPH_mass_spring_solver_create(int numverts, int numsprings);
+void BPH_mass_spring_solver_free(struct Implicit_Data *id);
+
+int BPH_cloth_solver_init(struct Object *ob, struct ClothModifierData *clmd);
+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 );
bool implicit_hair_volume_get_texture_data(struct Object *UNUSED(ob), struct ClothModifierData *clmd, struct ListBase *UNUSED(effectors), struct VoxelData *vd);
diff --git a/source/blender/physics/intern/implicit_blender.c b/source/blender/physics/intern/implicit_blender.c
index 76b1e356299..2dbb1eb325a 100644
--- a/source/blender/physics/intern/implicit_blender.c
+++ b/source/blender/physics/intern/implicit_blender.c
@@ -681,58 +681,81 @@ typedef struct Implicit_Data {
fmatrix3x3 *P, *Pinv; /* pre-conditioning matrix */
} Implicit_Data;
-int implicit_init(Object *UNUSED(ob), ClothModifierData *clmd)
+Implicit_Data *BPH_mass_spring_solver_create(int numverts, int numsprings)
{
- unsigned int i = 0;
- Cloth *cloth = NULL;
- ClothVertex *verts = NULL;
- ClothSpring *spring = NULL;
- Implicit_Data *id = NULL;
- LinkNode *search = NULL;
+ Implicit_Data *id = (Implicit_Data *)MEM_callocN(sizeof(Implicit_Data), "implicit vecmat");
+
+ /* process diagonal elements */
+ id->A = create_bfmatrix(numverts, numsprings);
+ id->dFdV = create_bfmatrix(numverts, numsprings);
+ id->dFdX = create_bfmatrix(numverts, numsprings);
+ id->S = create_bfmatrix(numverts, 0);
+ id->Pinv = create_bfmatrix(numverts, numsprings);
+ id->P = create_bfmatrix(numverts, numsprings);
+ id->bigI = create_bfmatrix(numverts, numsprings); // TODO 0 springs
+ id->M = create_bfmatrix(numverts, numsprings);
+ id->X = create_lfvector(numverts);
+ id->Xnew = create_lfvector(numverts);
+ id->V = create_lfvector(numverts);
+ id->Vnew = create_lfvector(numverts);
+ id->F = create_lfvector(numverts);
+ id->B = create_lfvector(numverts);
+ id->dV = create_lfvector(numverts);
+ id->z = create_lfvector(numverts);
+
+ id->root = MEM_callocN(sizeof(RootTransform) * numverts, "root transforms");
+
+ return id;
+}
+
+void BPH_mass_spring_solver_free(Implicit_Data *id)
+{
+ del_bfmatrix(id->A);
+ del_bfmatrix(id->dFdV);
+ del_bfmatrix(id->dFdX);
+ del_bfmatrix(id->S);
+ del_bfmatrix(id->P);
+ del_bfmatrix(id->Pinv);
+ del_bfmatrix(id->bigI);
+ del_bfmatrix(id->M);
+
+ del_lfvector(id->X);
+ del_lfvector(id->Xnew);
+ del_lfvector(id->V);
+ del_lfvector(id->Vnew);
+ del_lfvector(id->F);
+ del_lfvector(id->B);
+ del_lfvector(id->dV);
+ del_lfvector(id->z);
+
+ MEM_freeN(id->root);
+
+ MEM_freeN(id);
+}
+
+int BPH_cloth_solver_init(Object *UNUSED(ob), ClothModifierData *clmd)
+{
+ Cloth *cloth = clmd->clothObject;
+ ClothVertex *verts = cloth->verts;
+ Implicit_Data *id;
+ unsigned int i;
+ LinkNode *search;
if (G.debug_value > 0)
printf("implicit_init\n");
-
- // init memory guard
- // BLI_listbase_clear(&MEMORY_BASE);
-
- cloth = (Cloth *)clmd->clothObject;
- verts = cloth->verts;
-
- // create implicit base
- id = (Implicit_Data *)MEM_callocN(sizeof(Implicit_Data), "implicit vecmat");
- cloth->implicit = id;
-
- /* process diagonal elements */
- id->A = create_bfmatrix(cloth->numverts, cloth->numsprings);
- id->dFdV = create_bfmatrix(cloth->numverts, cloth->numsprings);
- id->dFdX = create_bfmatrix(cloth->numverts, cloth->numsprings);
- id->S = create_bfmatrix(cloth->numverts, 0);
- id->Pinv = create_bfmatrix(cloth->numverts, cloth->numsprings);
- id->P = create_bfmatrix(cloth->numverts, cloth->numsprings);
- id->bigI = create_bfmatrix(cloth->numverts, cloth->numsprings); // TODO 0 springs
- id->M = create_bfmatrix(cloth->numverts, cloth->numsprings);
- id->X = create_lfvector(cloth->numverts);
- id->Xnew = create_lfvector(cloth->numverts);
- id->V = create_lfvector(cloth->numverts);
- id->Vnew = create_lfvector(cloth->numverts);
- id->F = create_lfvector(cloth->numverts);
- id->B = create_lfvector(cloth->numverts);
- id->dV = create_lfvector(cloth->numverts);
- id->z = create_lfvector(cloth->numverts);
-
- id->root = MEM_callocN(sizeof(RootTransform) * cloth->numverts, "root transforms");
-
+
+ cloth->implicit = id = BPH_mass_spring_solver_create(cloth->numverts, cloth->numsprings);
+
for (i = 0; i < cloth->numverts; i++) {
id->A[i].r = id->A[i].c = id->dFdV[i].r = id->dFdV[i].c = id->dFdX[i].r = id->dFdX[i].c = id->P[i].c = id->P[i].r = id->Pinv[i].c = id->Pinv[i].r = id->bigI[i].c = id->bigI[i].r = id->M[i].r = id->M[i].c = i;
initdiag_fmatrixS(id->M[i].m, verts[i].mass);
}
-
+
// init springs
search = cloth->springs;
for (i = 0; i < cloth->numsprings; i++) {
- spring = search->link;
+ ClothSpring *spring = search->link;
// dFdV_start[i].r = big_I[i].r = big_zero[i].r =
id->A[i+cloth->numverts].r = id->dFdV[i+cloth->numverts].r = id->dFdX[i+cloth->numverts].r =
@@ -752,45 +775,18 @@ int implicit_init(Object *UNUSED(ob), ClothModifierData *clmd)
for (i = 0; i < cloth->numverts; i++) {
copy_v3_v3(id->X[i], verts[i].x);
}
-
+
return 1;
}
-int implicit_free(ClothModifierData *clmd)
+void BPH_cloth_solver_free(ClothModifierData *clmd)
{
- Implicit_Data *id;
- Cloth *cloth;
- cloth = (Cloth *)clmd->clothObject;
-
- if (cloth) {
- id = cloth->implicit;
-
- if (id) {
- del_bfmatrix(id->A);
- del_bfmatrix(id->dFdV);
- del_bfmatrix(id->dFdX);
- del_bfmatrix(id->S);
- del_bfmatrix(id->P);
- del_bfmatrix(id->Pinv);
- del_bfmatrix(id->bigI);
- del_bfmatrix(id->M);
-
- del_lfvector(id->X);
- del_lfvector(id->Xnew);
- del_lfvector(id->V);
- del_lfvector(id->Vnew);
- del_lfvector(id->F);
- del_lfvector(id->B);
- del_lfvector(id->dV);
- del_lfvector(id->z);
-
- MEM_freeN(id->root);
-
- MEM_freeN(id);
- }
+ Cloth *cloth = clmd->clothObject;
+
+ if (cloth->implicit) {
+ BPH_mass_spring_solver_free(cloth->implicit);
+ cloth->implicit = NULL;
}
-
- return 1;
}
/* ==== Transformation of Moving Reference Frame ====
@@ -2526,7 +2522,7 @@ static int UNUSED_FUNCTION(cloth_calc_helper_forces)(Object *UNUSED(ob), ClothMo
return 1;
}
-int implicit_solver(Object *ob, float frame, ClothModifierData *clmd, ListBase *effectors)
+int BPH_cloth_solve(Object *ob, float frame, ClothModifierData *clmd, ListBase *effectors)
{
unsigned int i=0;
float step=0.0f, tf=clmd->sim_parms->timescale;
@@ -2718,7 +2714,7 @@ int implicit_solver(Object *ob, float frame, ClothModifierData *clmd, ListBase *
return 1;
}
-void implicit_set_positions(ClothModifierData *clmd)
+void BKE_cloth_solver_set_positions(ClothModifierData *clmd)
{
Cloth *cloth = clmd->clothObject;
ClothVertex *verts = cloth->verts;