[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