From 373f142530e288610ace4cf650ad7abb316f5586 Mon Sep 17 00:00:00 2001 From: Daniel Genrich Date: Sun, 2 Mar 2008 22:01:43 +0000 Subject: [PATCH] Cloth: Bugfix for IRIX compile (hopefully), bugfix for multiple springs (appeared on triangles), _test_ for inlining on msvc --- source/blender/blenkernel/BKE_cloth.h | 4 ++- source/blender/blenkernel/intern/cloth.c | 45 +++++++++++++----------- 2 files changed, 27 insertions(+), 22 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; - } - - 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_prepend ( &cloth->springs, spring ); + 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; + + BLI_linklist_append ( &edgelist[spring->ij], spring ); + BLI_linklist_append ( &edgelist[spring->kl], spring ); + shear_springs++; + + BLI_linklist_prepend ( &cloth->springs, spring ); } // bending springs