[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [36073] trunk/blender: =cloth collisions=

Joseph Eagar joeedh at gmail.com
Sun Apr 10 01:19:12 CEST 2011


Revision: 36073
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=36073
Author:   joeedh
Date:     2011-04-09 23:19:11 +0000 (Sat, 09 Apr 2011)
Log Message:
-----------
=cloth collisions=

Plugged the eltopo library into the cloth solver.
I was playing with it earlier, and it's so easy to
use I decided to quickly put it in (trunk's) cloth.

See http://www.cs.ubc.ca/labs/imager/tr/2009/eltopo/eltopo.html
.  The authors are on the bleeding edge of continuous collision
detection (one of them did ILM's cloth sim).  
I
don't really have to time to plug it into softbody, particles,
bullet, fluid, etc, but doing so would be pretty straightforward.
I'll leave that up to someone else.

To use, turn on USE_ELTOPO (in cmake) or WITH_BF_ELTOPO in scons.

Modified Paths:
--------------
    trunk/blender/build_files/cmake/FindPythonLibsUnix.cmake
    trunk/blender/build_files/scons/tools/btools.py
    trunk/blender/extern/CMakeLists.txt
    trunk/blender/extern/SConscript
    trunk/blender/source/blender/blenkernel/BKE_collision.h
    trunk/blender/source/blender/blenkernel/CMakeLists.txt
    trunk/blender/source/blender/blenkernel/SConscript
    trunk/blender/source/blender/blenkernel/intern/collision.c
    trunk/blender/source/blenderplayer/CMakeLists.txt
    trunk/blender/source/creator/CMakeLists.txt

Modified: trunk/blender/build_files/cmake/FindPythonLibsUnix.cmake
===================================================================
--- trunk/blender/build_files/cmake/FindPythonLibsUnix.cmake	2011-04-09 19:46:17 UTC (rev 36072)
+++ trunk/blender/build_files/cmake/FindPythonLibsUnix.cmake	2011-04-09 23:19:11 UTC (rev 36073)
@@ -4,7 +4,7 @@
 #  PYTHON_INCLUDE_DIRS
 #  PYTHON_LIBRARY
 #  PYTHON_LIBPATH
-#  PYTHON_LINKFLAGS
+#  PYTHON_LINKFLAGSPYTHON
 
 #=============================================================================
 

Modified: trunk/blender/build_files/scons/tools/btools.py
===================================================================
--- trunk/blender/build_files/scons/tools/btools.py	2011-04-09 19:46:17 UTC (rev 36072)
+++ trunk/blender/build_files/scons/tools/btools.py	2011-04-09 23:19:11 UTC (rev 36073)
@@ -99,7 +99,7 @@
             'WITH_BF_INTERNATIONAL',
             'BF_GETTEXT', 'BF_GETTEXT_INC', 'BF_GETTEXT_LIB', 'WITH_BF_GETTEXT_STATIC', 'BF_GETTEXT_LIB_STATIC', 'BF_GETTEXT_LIBPATH',
             'WITH_BF_ICONV', 'BF_ICONV', 'BF_ICONV_INC', 'BF_ICONV_LIB', 'BF_ICONV_LIBPATH',
-            'WITH_BF_GAMEENGINE', 'WITH_BF_BULLET', 'BF_BULLET', 'BF_BULLET_INC', 'BF_BULLET_LIB',
+            'WITH_BF_GAMEENGINE', 'WITH_BF_BULLET', 'WITH_BF_ELTOPO', 'BF_BULLET', 'BF_BULLET_INC', 'BF_BULLET_LIB',
             'BF_WINTAB', 'BF_WINTAB_INC',
             'WITH_BF_FREETYPE', 'BF_FREETYPE', 'BF_FREETYPE_INC', 'BF_FREETYPE_LIB', 'BF_FREETYPE_LIBPATH', 'BF_FREETYPE_LIB_STATIC', 'WITH_BF_FREETYPE_STATIC',
             'WITH_BF_QUICKTIME', 'BF_QUICKTIME', 'BF_QUICKTIME_INC', 'BF_QUICKTIME_LIB', 'BF_QUICKTIME_LIBPATH',
@@ -365,6 +365,8 @@
         (BoolVariable('WITH_BF_GAMEENGINE', 'Build with gameengine' , False)),
 
         (BoolVariable('WITH_BF_BULLET', 'Use Bullet if true', True)),
+        (BoolVariable('WITH_BF_ELTOPO', 'Use Eltopo collision library if true', False)),
+        
         ('BF_BULLET', 'Bullet base dir', ''),
         ('BF_BULLET_INC', 'Bullet include path', ''),
         ('BF_BULLET_LIB', 'Bullet library', ''),

Modified: trunk/blender/extern/CMakeLists.txt
===================================================================
--- trunk/blender/extern/CMakeLists.txt	2011-04-09 19:46:17 UTC (rev 36072)
+++ trunk/blender/extern/CMakeLists.txt	2011-04-09 23:19:11 UTC (rev 36073)
@@ -31,6 +31,10 @@
 	add_subdirectory(bullet2)
 endif()
 
+if(WITH_ELTOPO)
+	add_subdirectory(eltopo)
+endif()
+
 if(WITH_BINRELOC)
 	add_subdirectory(binreloc)
 endif()

Modified: trunk/blender/extern/SConscript
===================================================================
--- trunk/blender/extern/SConscript	2011-04-09 19:46:17 UTC (rev 36072)
+++ trunk/blender/extern/SConscript	2011-04-09 23:19:11 UTC (rev 36073)
@@ -4,6 +4,9 @@
 
 SConscript(['glew/SConscript'])
 
+if env['WITH_BF_ELTOPO']:
+    SConscript(['eltopo/SConscript'])
+
 if env['WITH_BF_BULLET']:
     SConscript(['bullet2/src/SConscript'])
 

Modified: trunk/blender/source/blender/blenkernel/BKE_collision.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_collision.h	2011-04-09 19:46:17 UTC (rev 36072)
+++ trunk/blender/source/blender/blenkernel/BKE_collision.h	2011-04-09 23:19:11 UTC (rev 36073)
@@ -63,7 +63,11 @@
 /* COLLISION FLAGS */
 typedef enum
 {
-	COLLISION_IN_FUTURE = ( 1 << 1 ),
+	COLLISION_IN_FUTURE =		(1 << 1),
+#ifdef USE_ELTOPO
+	COLLISION_USE_COLLFACE =	(1 << 2),
+	COLLISION_IS_EDGES =		(1 << 3),
+#endif
 } COLLISION_FLAGS;
 
 
@@ -81,7 +85,13 @@
 	float pa[3], pb[3]; // collision point p1 on face1, p2 on face2
 	int flag;
 	float time; // collision time, from 0 up to 1
+#ifdef USE_ELTOPO /*either ap* or bp* can be set, but not both*/
+	float bary[3];
+	int ap1, ap2, ap3, collp, bp1, bp2, bp3;
+	int collface;
+#else
 	int ap1, ap2, ap3, bp1, bp2, bp3;
+#endif
 	int pointsb[4];
 }
 CollPair;
@@ -109,6 +119,7 @@
 	float pa[3], pb[3]; // collision point p1 on face1, p2 on face2
 }
 FaceCollPair;
+
 ////////////////////////////////////////
 
 

Modified: trunk/blender/source/blender/blenkernel/CMakeLists.txt
===================================================================
--- trunk/blender/source/blender/blenkernel/CMakeLists.txt	2011-04-09 19:46:17 UTC (rev 36072)
+++ trunk/blender/source/blender/blenkernel/CMakeLists.txt	2011-04-09 23:19:11 UTC (rev 36073)
@@ -140,7 +140,7 @@
 	intern/writeavi.c
 	intern/writeffmpeg.c
 	intern/writeframeserver.c
-
+	
 	BKE_DerivedMesh.h
 	BKE_action.h
 	BKE_anim.h
@@ -235,6 +235,11 @@
 	add_definitions(-DUSE_BULLET)
 endif()
 
+if(WITH_ELTOPO)
+	list(APPEND INC ../../../extern/eltopo)
+	add_definitions(-DUSE_ELTOPO)
+endif()
+
 if(WITH_IMAGE_OPENEXR)
 	add_definitions(-DWITH_OPENEXR)
 endif()

Modified: trunk/blender/source/blender/blenkernel/SConscript
===================================================================
--- trunk/blender/source/blender/blenkernel/SConscript	2011-04-09 19:46:17 UTC (rev 36072)
+++ trunk/blender/source/blender/blenkernel/SConscript	2011-04-09 23:19:11 UTC (rev 36073)
@@ -27,6 +27,10 @@
     if env['BF_DEBUG']:
         defs.append('DEBUG')
 
+if env['WITH_BF_ELTOPO']:
+    incs += ' ../../../extern/eltopo'
+    defs.append('USE_ELTOPO')
+        
 if env['WITH_BF_QUICKTIME']:
     incs += ' ../quicktime'
 

Modified: trunk/blender/source/blender/blenkernel/intern/collision.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/collision.c	2011-04-09 19:46:17 UTC (rev 36072)
+++ trunk/blender/source/blender/blenkernel/intern/collision.c	2011-04-09 23:19:11 UTC (rev 36073)
@@ -48,6 +48,8 @@
 #include "BLI_math.h"
 #include "BLI_edgehash.h"
 #include "BLI_utildefines.h"
+#include "BLI_ghash.h"
+#include "BLI_memarena.h"
 
 #include "BKE_DerivedMesh.h"
 #include "BKE_global.h"
@@ -63,7 +65,11 @@
 #include "BLI_kdopbvh.h"
 #include "BKE_collision.h"
 
+#ifdef USE_ELTOPO
+#include "eltopo-capi.h"
+#endif
 
+
 /***********************************
 Collision modifier code start
 ***********************************/
@@ -486,7 +492,7 @@
 	VECADDMUL ( to, v3, w3 );
 }
 
-
+#ifndef USE_ELTOPO
 static int cloth_collision_response_static ( ClothModifierData *clmd, CollisionModifierData *collmd, CollPair *collpair, CollPair *collision_end )
 {
 	int result = 0;
@@ -601,7 +607,663 @@
 	}
 	return result;
 }
+#endif
 
+#ifdef USE_ELTOPO
+typedef struct edgepairkey {
+	int a1, a2, b1, b2;
+} edgepairkey;
+
+unsigned int edgepair_hash(void *vkey)
+{
+	edgepairkey *key = vkey;
+	int keys[4] = {key->a1, key->a2, key->b1, key->b2};
+	int i, j;
+	
+	for (i=0; i<4; i++) {
+		for (j=0; j<3; j++) {
+			if (keys[j] >= keys[j+1]) {
+				SWAP(int, keys[j], keys[j+1]);
+			}
+		}
+	}
+	
+	return keys[0]*101 + keys[1]*72 + keys[2]*53 + keys[3]*34;
+}
+
+int edgepair_cmp(const void *va, const void *vb)
+{
+	edgepairkey *a = va, *b = vb;
+	int keysa[4] = {a->a1, a->a2, a->b1, a->b2};
+	int keysb[4] = {b->a1, b->a2, b->b1, b->b2};
+	int i;
+	
+	for (i=0; i<4; i++) {
+		int j, ok=0;
+		for (j=0; j<4; j++) {
+			if (keysa[i] == keysa[j]) {
+				ok = 1;
+				break;
+			}
+		}
+		if (!ok)
+			return -1;
+	}
+	
+	return 0;
+}
+
+static void get_edgepairkey(edgepairkey *key, int a1, int a2, int b1, int b2)
+{
+	key->a1 = a1;
+	key->a2 = a2;
+	key->b1 = b1;
+	key->b2 = b2;
+}
+
+/*an immense amount of duplication goes on here. . .a major performance hit, I'm sure*/
+static CollPair* cloth_edge_collision ( ModifierData *md1, ModifierData *md2, 
+										BVHTreeOverlap *overlap, CollPair *collpair,
+										GHash *visithash, MemArena *arena)
+{
+	ClothModifierData *clmd = ( ClothModifierData * ) md1;
+	CollisionModifierData *collmd = ( CollisionModifierData * ) md2;
+	MFace *face1=NULL, *face2 = NULL;
+	ClothVertex *verts1 = clmd->clothObject->verts;
+	double distance = 0;
+	edgepairkey *key, tstkey;
+	float epsilon1 = clmd->coll_parms->epsilon;
+	float epsilon2 = BLI_bvhtree_getepsilon ( collmd->bvhtree );
+	float no[3], uv[3], t, relnor;
+	int i, i1, i2, i3, i4, i5, i6;
+	Cloth *cloth = clmd->clothObject;
+	float n1[3], n2[3], off[3], v1[2][3], v2[2][3], v3[2][3], v4[2][3], v5[2][3], v6[2][3];
+	void **verts[] = {v1, v2, v3, v4, v5, v6};
+	int j, ret, bp1, bp2, bp3, ap1, ap2, ap3, table[6];
+	
+	face1 = & ( clmd->clothObject->mfaces[overlap->indexA] );
+	face2 = & ( collmd->mfaces[overlap->indexB] );
+
+	// check all 4 possible collisions
+	for ( i = 0; i < 4; i++ )
+	{
+		if ( i == 0 )
+		{
+			// fill faceA
+			ap1 = face1->v1;
+			ap2 = face1->v2;
+			ap3 = face1->v3;
+
+			// fill faceB
+			bp1 = face2->v1;
+			bp2 = face2->v2;
+			bp3 = face2->v3;
+		}
+		else if ( i == 1 )
+		{
+			if ( face1->v4 )
+			{
+				// fill faceA
+				ap1 = face1->v1;
+				ap2 = face1->v3;
+				ap3 = face1->v4;
+
+				// fill faceB
+				bp1 = face2->v1;
+				bp2 = face2->v2;
+				bp3 = face2->v3;
+			}
+			else {
+				continue;
+			}
+		}
+		if ( i == 2 )
+		{
+			if ( face2->v4 )
+			{
+				// fill faceA
+				ap1 = face1->v1;
+				ap2 = face1->v2;
+				ap3 = face1->v3;
+
+				// fill faceB
+				bp1 = face2->v1;
+				bp2 = face2->v3;
+				bp3 = face2->v4;
+			}
+			else {
+				continue;
+			}
+		}
+		else if ( i == 3 )
+		{
+			if ( face1->v4 && face2->v4 )
+			{
+				// fill faceA
+				ap1 = face1->v1;
+				ap2 = face1->v3;
+				ap3 = face1->v4;
+
+				// fill faceB
+				bp1 = face2->v1;
+				bp2 = face2->v3;
+				bp3 = face2->v4;
+			}
+			else {
+				continue;
+			}
+		}
+		
+		copy_v3_v3(v1[0], cloth->verts[ap1].txold); 
+		copy_v3_v3(v1[1], cloth->verts[ap1].tx);
+		copy_v3_v3(v2[0], cloth->verts[ap2].txold);
+		copy_v3_v3(v2[1], cloth->verts[ap2].tx);
+		copy_v3_v3(v3[0], cloth->verts[ap3].txold);
+		copy_v3_v3(v3[1], cloth->verts[ap3].tx);
+		
+		copy_v3_v3(v4[0], collmd->current_x[bp1].co);
+		copy_v3_v3(v4[1], collmd->current_xnew[bp1].co);
+		copy_v3_v3(v5[0], collmd->current_x[bp2].co);
+		copy_v3_v3(v5[1], collmd->current_xnew[bp2].co);
+		copy_v3_v3(v6[0], collmd->current_x[bp3].co);
+		copy_v3_v3(v6[1], collmd->current_xnew[bp3].co);
+		
+		normal_tri_v3(n2, v4[1], v5[1], v6[1]);
+
+		/*offset new positions a bit, to account for margins*/
+		copy_v3_v3(off, n2);
+		mul_v3_fl(off,  epsilon1 + epsilon2 + ALMOST_ZERO);
+		add_v3_v3(v4[1], off); add_v3_v3(v5[1], off); add_v3_v3(v6[1], off);
+		
+		i1 = ap1; i2 = ap2; i3 = ap3;
+		i4 = bp1; i5 = bp2; i6 = bp3;
+
+		for (j=0; j<3; j++) {
+			int collp1, collp2, k, j2 = (j+1)%3;
+			
+			table[0] = ap1; table[1] = ap2; table[2] = ap3;
+			table[3] = bp1; table[4] = bp2; table[5] = bp3;

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list