[Bf-committers] [Bf-blender-cvs] SVN commit: /data/svn/bf-blender [36073] trunk/blender: =cloth collisions=
Daniel Salazar - 3Developer.com
zanqdo at gmail.com
Sun Apr 10 02:08:24 CEST 2011
scons error
http://www.pasteall.org/20713
Daniel Salazar
3Developer.com
On Sat, Apr 9, 2011 at 5:19 PM, Joseph Eagar <joeedh at gmail.com> wrote:
> 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. @@
> _______________________________________________
> Bf-blender-cvs mailing list
> Bf-blender-cvs at blender.org
> http://lists.blender.org/mailman/listinfo/bf-blender-cvs
>
More information about the Bf-committers
mailing list