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
diff options
context:
space:
mode:
authorDaniel Genrich <daniel.genrich@gmx.net>2012-05-15 16:26:29 +0400
committerDaniel Genrich <daniel.genrich@gmx.net>2012-05-15 16:26:29 +0400
commit8242f624a1d10649946f9db6994dc8b07a1c8218 (patch)
tree2a8ede52bd7234063484d4cb17e0529624b8e08d
parent7050633c6716b7f28aef906f47ec2793119d0a49 (diff)
Cloth: Revert triangulation after talking with brecht.
People: Better use subsurf after cloth since you can get failing collisions otherwise!
-rw-r--r--source/blender/blenkernel/BKE_cloth.h2
-rw-r--r--source/blender/blenkernel/intern/cloth.c44
-rw-r--r--source/blender/blenkernel/intern/particle_system.c14
-rw-r--r--source/blender/modifiers/intern/MOD_cloth.c31
4 files changed, 44 insertions, 47 deletions
diff --git a/source/blender/blenkernel/BKE_cloth.h b/source/blender/blenkernel/BKE_cloth.h
index 998c90ad488..378cc72beb1 100644
--- a/source/blender/blenkernel/BKE_cloth.h
+++ b/source/blender/blenkernel/BKE_cloth.h
@@ -211,7 +211,7 @@ void implicit_set_positions (struct ClothModifierData *clmd );
void cloth_free_modifier_extern (struct ClothModifierData *clmd );
void cloth_free_modifier (struct ClothModifierData *clmd );
void cloth_init (struct ClothModifierData *clmd );
-struct DerivedMesh *clothModifier_do (struct ClothModifierData *clmd, struct Scene *scene, struct Object *ob, struct DerivedMesh *dm);
+void clothModifier_do (struct ClothModifierData *clmd, struct Scene *scene, struct Object *ob, struct DerivedMesh *dm, float (*vertexCos)[3]);
int cloth_uses_vgroup(struct ClothModifierData *clmd);
diff --git a/source/blender/blenkernel/intern/cloth.c b/source/blender/blenkernel/intern/cloth.c
index df746143d19..0e81b503cbf 100644
--- a/source/blender/blenkernel/intern/cloth.c
+++ b/source/blender/blenkernel/intern/cloth.c
@@ -93,7 +93,7 @@ static CM_SOLVER_DEF solvers [] =
/* ********** cloth engine ******* */
/* Prototypes for internal functions.
*/
-static void cloth_to_object (Object *ob, ClothModifierData *clmd, DerivedMesh *dm);
+static void cloth_to_object (Object *ob, ClothModifierData *clmd, float (*vertexCos)[3]);
static void cloth_from_mesh ( ClothModifierData *clmd, DerivedMesh *dm );
static int cloth_from_object(Object *ob, ClothModifierData *clmd, DerivedMesh *dm, float framenr, int first);
static int cloth_build_springs ( ClothModifierData *clmd, DerivedMesh *dm );
@@ -419,7 +419,7 @@ static int do_step_cloth(Object *ob, ClothModifierData *clmd, DerivedMesh *resul
return ret;
}
-
+#if 0
static DerivedMesh *cloth_to_triangles(DerivedMesh *dm)
{
DerivedMesh *result = NULL;
@@ -472,18 +472,18 @@ static DerivedMesh *cloth_to_triangles(DerivedMesh *dm)
return result;
}
+#endif
/************************************************
* clothModifier_do - main simulation function
************************************************/
-DerivedMesh *clothModifier_do(ClothModifierData *clmd, Scene *scene, Object *ob, DerivedMesh *dm)
+void clothModifier_do(ClothModifierData *clmd, Scene *scene, Object *ob, DerivedMesh *dm, float (*vertexCos)[3])
{
PointCache *cache;
PTCacheID pid;
float timescale;
int framenr, startframe, endframe;
int cache_result;
- DerivedMesh *result = NULL;
clmd->scene= scene; /* nice to pass on later :) */
framenr= (int)scene->r.cfra;
@@ -503,7 +503,7 @@ DerivedMesh *clothModifier_do(ClothModifierData *clmd, Scene *scene, Object *ob,
BKE_ptcache_validate(cache, 0);
cache->last_exact= 0;
cache->flag &= ~PTCACHE_REDO_NEEDED;
- return NULL;
+ return;
}
// unused in the moment, calculated separately in implicit.c
@@ -515,21 +515,20 @@ DerivedMesh *clothModifier_do(ClothModifierData *clmd, Scene *scene, Object *ob,
/* do simulation */
if (!do_init_cloth(ob, clmd, dm, framenr))
- return NULL;
+ return;
do_step_cloth(ob, clmd, dm, framenr);
- result = cloth_to_triangles(dm);
- cloth_to_object(ob, clmd, result);
+ cloth_to_object(ob, clmd, vertexCos);
clmd->clothObject->last_frame= framenr;
- return result;
+ return;
}
/* simulation is only active during a specific period */
if (framenr < startframe) {
BKE_ptcache_invalidate(cache);
- return NULL;
+ return;
}
else if (framenr > endframe) {
framenr= endframe;
@@ -537,7 +536,7 @@ DerivedMesh *clothModifier_do(ClothModifierData *clmd, Scene *scene, Object *ob,
/* initialize simulation data if it didn't exist already */
if (!do_init_cloth(ob, clmd, dm, framenr))
- return NULL;
+ return;
if ((framenr == startframe) && (clmd->sim_parms->preroll == 0)) {
BKE_ptcache_id_reset(scene, &pid, PTCACHE_RESET_OUTDATED);
@@ -545,7 +544,7 @@ DerivedMesh *clothModifier_do(ClothModifierData *clmd, Scene *scene, Object *ob,
BKE_ptcache_validate(cache, framenr);
cache->flag &= ~PTCACHE_REDO_NEEDED;
clmd->clothObject->last_frame= framenr;
- return NULL;
+ return;
}
/* try to read from cache */
@@ -553,8 +552,7 @@ DerivedMesh *clothModifier_do(ClothModifierData *clmd, Scene *scene, Object *ob,
if (cache_result == PTCACHE_READ_EXACT || cache_result == PTCACHE_READ_INTERPOLATED) {
implicit_set_positions(clmd);
- result = cloth_to_triangles(dm);
- cloth_to_object (ob, clmd, result);
+ cloth_to_object (ob, clmd, vertexCos);
BKE_ptcache_validate(cache, framenr);
@@ -563,7 +561,7 @@ DerivedMesh *clothModifier_do(ClothModifierData *clmd, Scene *scene, Object *ob,
clmd->clothObject->last_frame= framenr;
- return result;
+ return;
}
else if (cache_result==PTCACHE_READ_OLD) {
implicit_set_positions(clmd);
@@ -571,11 +569,11 @@ DerivedMesh *clothModifier_do(ClothModifierData *clmd, Scene *scene, Object *ob,
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 */
BKE_ptcache_invalidate(cache);
- return NULL;
+ return;
}
if (framenr!=clmd->clothObject->last_frame+1)
- return NULL;
+ return;
/* if on second frame, write cache for first frame */
if (cache->simframe == startframe && (cache->flag & PTCACHE_OUTDATED || cache->last_exact==0))
@@ -592,11 +590,8 @@ DerivedMesh *clothModifier_do(ClothModifierData *clmd, Scene *scene, Object *ob,
else
BKE_ptcache_write(&pid, framenr);
- result = cloth_to_triangles(dm);
- cloth_to_object (ob, clmd, result);
+ cloth_to_object (ob, clmd, vertexCos);
clmd->clothObject->last_frame= framenr;
-
- return result;
}
/* frees all */
@@ -743,19 +738,18 @@ void cloth_free_modifier_extern(ClothModifierData *clmd )
* cloth_to_object - copies the deformed vertices to the object.
*
**/
-static void cloth_to_object (Object *ob, ClothModifierData *clmd, DerivedMesh *dm)
+static void cloth_to_object (Object *ob, ClothModifierData *clmd, float (*vertexCos)[3])
{
unsigned int i = 0;
Cloth *cloth = clmd->clothObject;
- MVert *verts = dm->getVertArray(dm);
if (clmd->clothObject) {
/* inverse matrix is not uptodate... */
invert_m4_m4(ob->imat, ob->obmat);
for (i = 0; i < cloth->numverts; i++) {
- copy_v3_v3 (verts[i].co, cloth->verts[i].x);
- mul_m4_v3(ob->imat, verts[i].co); /* cloth is in global coords */
+ copy_v3_v3 (vertexCos[i], cloth->verts[i].x);
+ mul_m4_v3(ob->imat, vertexCos[i]); /* cloth is in global coords */
}
}
}
diff --git a/source/blender/blenkernel/intern/particle_system.c b/source/blender/blenkernel/intern/particle_system.c
index af8382d5ce1..5397b1729f9 100644
--- a/source/blender/blenkernel/intern/particle_system.c
+++ b/source/blender/blenkernel/intern/particle_system.c
@@ -3555,7 +3555,6 @@ static void do_hair_dynamics(ParticleSimulationData *sim)
{
ParticleSystem *psys = sim->psys;
DerivedMesh *dm = psys->hair_in_dm;
- DerivedMesh *result = NULL;
MVert *mvert = NULL;
MEdge *medge = NULL;
MDeformVert *dvert = NULL;
@@ -3660,15 +3659,14 @@ static void do_hair_dynamics(ParticleSimulationData *sim)
psys->clmd->sim_parms->effector_weights = psys->part->effector_weights;
deformedVerts = MEM_callocN(sizeof(*deformedVerts)*dm->getNumVerts(dm), "do_hair_dynamics vertexCos");
+ psys->hair_out_dm = CDDM_copy(dm);
+ psys->hair_out_dm->getVertCos(psys->hair_out_dm, deformedVerts);
- result = clothModifier_do(psys->clmd, sim->scene, sim->ob, dm);
+ clothModifier_do(psys->clmd, sim->scene, sim->ob, dm, deformedVerts);
- if (result) {
- CDDM_calc_normals(result);
- psys->hair_out_dm = result;
- }
- else
- psys->hair_out_dm = CDDM_copy(dm);
+ CDDM_apply_vert_coords(psys->hair_out_dm, deformedVerts);
+
+ MEM_freeN(deformedVerts);
psys->clmd->sim_parms->effector_weights = NULL;
}
diff --git a/source/blender/modifiers/intern/MOD_cloth.c b/source/blender/modifiers/intern/MOD_cloth.c
index 72e5d792e1f..2c38bc42a8f 100644
--- a/source/blender/modifiers/intern/MOD_cloth.c
+++ b/source/blender/modifiers/intern/MOD_cloth.c
@@ -67,10 +67,10 @@ static void initData(ModifierData *md)
cloth_init(clmd);
}
-static DerivedMesh *applyModifier(ModifierData *md, Object *ob,
- DerivedMesh *dm,
- ModifierApplyFlag UNUSED(flag))
+static void deformVerts(ModifierData *md, Object *ob, DerivedMesh *derivedData, float (*vertexCos)[3],
+ int UNUSED(numVerts), ModifierApplyFlag UNUSED(flag))
{
+ DerivedMesh *dm;
ClothModifierData *clmd = (ClothModifierData *) md;
DerivedMesh *result = NULL;
@@ -79,20 +79,25 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob,
initData(md);
if (!clmd->sim_parms || !clmd->coll_parms)
- return dm;
+ return;
}
+ dm = get_dm(ob, NULL, derivedData, NULL, 0);
+ if (dm == derivedData)
+ dm = CDDM_copy(dm);
+
+ CDDM_apply_vert_coords(dm, vertexCos);
+
DM_ensure_tessface(dm); /* BMESH - UNTIL MODIFIER IS UPDATED FOR MPoly */
- result = clothModifier_do(clmd, md->scene, ob, dm);
+ clothModifier_do(clmd, md->scene, ob, dm, vertexCos);
- if(result)
- {
- CDDM_calc_normals(result);
- return result;
+ if (result) {
+ result->getVertCos(result, vertexCos);
+ result->release(result);
}
- return dm;
+ dm->release(dm);
}
static void updateDepgraph(ModifierData *md, DagForest *forest, Scene *scene, Object *ob, DagNode *obNode)
@@ -200,17 +205,17 @@ ModifierTypeInfo modifierType_Cloth = {
/* name */ "Cloth",
/* structName */ "ClothModifierData",
/* structSize */ sizeof(ClothModifierData),
- /* type */ eModifierTypeType_Constructive,
+ /* type */ eModifierTypeType_OnlyDeform,
/* flags */ eModifierTypeFlag_AcceptsMesh |
eModifierTypeFlag_UsesPointCache |
eModifierTypeFlag_Single,
/* copyData */ copyData,
- /* deformVerts */ NULL,
+ /* deformVerts */ deformVerts,
/* deformMatrices */ NULL,
/* deformVertsEM */ NULL,
/* deformMatricesEM */ NULL,
- /* applyModifier */ applyModifier,
+ /* applyModifier */ NULL,
/* applyModifierEM */ NULL,
/* initData */ initData,
/* requiredDataMask */ requiredDataMask,