[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 03:15:20 CEST 2011


heh was gonna fix it my self and noticed there isn't any eltopo-capi.h
file in the source. little fail! :)

cheers

Daniel Salazar
3Developer.com



On Sat, Apr 9, 2011 at 6:08 PM, Daniel Salazar - 3Developer.com
<zanqdo at gmail.com> wrote:
> 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