diff options
-rw-r--r-- | source/blender/blenkernel/BKE_cloth.h | 4 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/cloth.c | 41 |
2 files changed, 25 insertions, 20 deletions
diff --git a/source/blender/blenkernel/BKE_cloth.h b/source/blender/blenkernel/BKE_cloth.h index f5bd028ba0d..005057339eb 100644 --- a/source/blender/blenkernel/BKE_cloth.h +++ b/source/blender/blenkernel/BKE_cloth.h @@ -58,9 +58,11 @@ struct CollisionTree; // this is needed for inlining behaviour #ifndef _WIN32 #define LINUX +#ifndef __sgi #define DO_INLINE inline +#endif #else -#define DO_INLINE +#define DO_INLINE __inline #endif #define CLOTH_MAX_THREAD 2 diff --git a/source/blender/blenkernel/intern/cloth.c b/source/blender/blenkernel/intern/cloth.c index 63982e4162a..d933dffad17 100644 --- a/source/blender/blenkernel/intern/cloth.c +++ b/source/blender/blenkernel/intern/cloth.c @@ -1330,6 +1330,10 @@ int cloth_build_springs ( ClothModifierData *clmd, DerivedMesh *dm ) // shear springs for ( i = 0; i < numfaces; i++ ) { + // triangle faces already have shear springs due to structural geometry + if ( mface[i].v4 ) + continue; + spring = ( ClothSpring *) MEM_callocN ( sizeof ( ClothSpring ), "cloth spring" ); if(!spring) @@ -1351,29 +1355,28 @@ int cloth_build_springs ( ClothModifierData *clmd, DerivedMesh *dm ) BLI_linklist_prepend ( &cloth->springs, spring ); - if ( mface[i].v4 ) + + // if ( mface[i].v4 ) --> Quad face + spring = ( ClothSpring * ) MEM_callocN ( sizeof ( ClothSpring ), "cloth spring" ); + + if(!spring) { - spring = ( ClothSpring * ) MEM_callocN ( sizeof ( ClothSpring ), "cloth spring" ); - - if(!spring) - { - cloth_free_errorsprings(cloth, edgehash, edgelist); - return 0; - } + cloth_free_errorsprings(cloth, edgehash, edgelist); + return 0; + } - spring->ij = MIN2(mface[i].v2, mface[i].v4); - spring->kl = MAX2(mface[i].v4, mface[i].v2); - VECSUB ( temp, cloth->verts[spring->kl].x, cloth->verts[spring->ij].x ); - spring->restlen = sqrt ( INPR ( temp, temp ) ); - spring->type = CLOTH_SPRING_TYPE_SHEAR; - spring->stiffness = (cloth->verts[spring->kl].shear_stiff + cloth->verts[spring->ij].shear_stiff) / 2.0; + spring->ij = MIN2(mface[i].v2, mface[i].v4); + spring->kl = MAX2(mface[i].v4, mface[i].v2); + VECSUB ( temp, cloth->verts[spring->kl].x, cloth->verts[spring->ij].x ); + spring->restlen = sqrt ( INPR ( temp, temp ) ); + spring->type = CLOTH_SPRING_TYPE_SHEAR; + spring->stiffness = (cloth->verts[spring->kl].shear_stiff + cloth->verts[spring->ij].shear_stiff) / 2.0; - BLI_linklist_append ( &edgelist[spring->ij], spring ); - BLI_linklist_append ( &edgelist[spring->kl], spring ); - shear_springs++; + BLI_linklist_append ( &edgelist[spring->ij], spring ); + BLI_linklist_append ( &edgelist[spring->kl], spring ); + shear_springs++; - BLI_linklist_prepend ( &cloth->springs, spring ); - } + BLI_linklist_prepend ( &cloth->springs, spring ); } // bending springs |