Commit: fd21b31024c52cffe0a16220c10d15dc10c637ba
Author: Campbell Barton
Date:   Thu Jul 30 22:16:01 2015 +1000
Branches: temp-looptri-collision
https://developer.blender.org/rBfd21b31024c52cffe0a16220c10d15dc10c637ba

Work in progress, move collision modifier to looptri

Theres still some unresolved issues so committing to temp branch

===================================================================

M       source/blender/blenkernel/BKE_cloth.h
M       source/blender/blenkernel/BKE_collision.h
M       source/blender/blenkernel/BKE_particle.h
M       source/blender/blenkernel/intern/cloth.c
M       source/blender/blenkernel/intern/collision.c
M       source/blender/blenkernel/intern/particle_system.c
M       source/blender/blenkernel/intern/pointcache.c
M       source/blender/blenkernel/intern/softbody.c
M       source/blender/blenloader/intern/readfile.c
M       source/blender/makesdna/DNA_modifier_types.h
M       source/blender/modifiers/intern/MOD_collision.c
M       source/blender/physics/intern/BPH_mass_spring.cpp
M       source/blender/physics/intern/implicit.h
M       source/blender/physics/intern/implicit_blender.c
M       source/blender/physics/intern/implicit_eigen.cpp

===================================================================

diff --git a/source/blender/blenkernel/BKE_cloth.h 
b/source/blender/blenkernel/BKE_cloth.h
index 81621f9..e7dde61 100644
--- a/source/blender/blenkernel/BKE_cloth.h
+++ b/source/blender/blenkernel/BKE_cloth.h
@@ -86,15 +86,17 @@ typedef struct ClothSolverResult {
 typedef struct Cloth {
        struct ClothVertex      *verts;                 /* The vertices that 
represent this cloth. */
        struct  LinkNode        *springs;               /* The springs 
connecting the mesh. */
-       unsigned int            numverts;               /* The number of verts 
== m * n. */
        unsigned int            numsprings;             /* The count of 
springs. */
-       unsigned int            numfaces;
+       unsigned int            mvert_num;              /* The number of verts 
== m * n. */
+       unsigned int            mloop_num;
+       unsigned int            looptri_num;
        unsigned char           old_solver_type;        /* unused, only 1 
solver here */
        unsigned char           pad2;
        short                   pad3;
        struct BVHTree          *bvhtree;                       /* collision 
tree for this cloth object */
        struct BVHTree          *bvhselftree;                   /* collision 
tree for this cloth object */
-       struct MFace            *mfaces;
+       struct MLoop            *mloop;
+       struct MLoopTri         *looptri;
        struct Implicit_Data    *implicit;              /* our implicit solver 
connects to this pointer */
        struct EdgeSet          *edgeset;               /* used for 
selfcollisions */
        int last_frame, pad4;
@@ -233,8 +235,8 @@ void clothModifier_do (struct ClothModifierData *clmd, 
struct Scene *scene, stru
 int cloth_uses_vgroup(struct ClothModifierData *clmd);
 
 // needed for collision.c
-void bvhtree_update_from_cloth (struct ClothModifierData *clmd, int moving );
-void bvhselftree_update_from_cloth (struct ClothModifierData *clmd, int moving 
);
+void bvhtree_update_from_cloth(struct ClothModifierData *clmd, bool moving);
+void bvhselftree_update_from_cloth(struct ClothModifierData *clmd, bool 
moving);
 
 // needed for button_object.c
 void cloth_clear_cache (struct Object *ob, struct ClothModifierData *clmd, 
float framenr );
diff --git a/source/blender/blenkernel/BKE_collision.h 
b/source/blender/blenkernel/BKE_collision.h
index bdc2032..f1edcce 100644
--- a/source/blender/blenkernel/BKE_collision.h
+++ b/source/blender/blenkernel/BKE_collision.h
@@ -47,6 +47,8 @@ struct CollisionModifierData;
 struct Group;
 struct MFace;
 struct MVert;
+struct MLoop;
+struct MLoopTri;
 struct Object;
 struct Scene;
 
@@ -124,8 +126,17 @@ FaceCollPair;
 // used in modifier.c from collision.c
 /////////////////////////////////////////////////
 
-BVHTree *bvhtree_build_from_mvert(struct MFace *mfaces, unsigned int numfaces, 
struct MVert *x, unsigned int numverts, float epsilon);
-void bvhtree_update_from_mvert(BVHTree *bvhtree, struct MFace *faces, int 
numfaces, struct MVert *x, struct MVert *xnew, int numverts, int moving);
+BVHTree *bvhtree_build_from_mvert(
+        const struct MVert *mvert,
+        const struct MLoop *mloop,
+        const struct MLoopTri *looptri, int looptri_num,
+        float epsilon);
+void bvhtree_update_from_mvert(
+        BVHTree *bvhtree,
+        const struct MVert *mvert, const struct MVert *mvert_moving,
+        const struct MLoop *mloop,
+        const struct MLoopTri *looptri, int looptri_num,
+        bool moving);
 
 /////////////////////////////////////////////////
 
diff --git a/source/blender/blenkernel/BKE_particle.h 
b/source/blender/blenkernel/BKE_particle.h
index e03789f..3232570 100644
--- a/source/blender/blenkernel/BKE_particle.h
+++ b/source/blender/blenkernel/BKE_particle.h
@@ -179,7 +179,7 @@ typedef struct ParticleBillboardData {
 
 typedef struct ParticleCollisionElement {
        /* pointers to original data */
-       float *x[4], *v[4];
+       float *x[3], *v[3];
 
        /* values interpolated from original data*/
        float x0[3], x1[3], x2[3], p[3];
diff --git a/source/blender/blenkernel/intern/cloth.c 
b/source/blender/blenkernel/intern/cloth.c
index e3ff968..62fbfca 100644
--- a/source/blender/blenkernel/intern/cloth.c
+++ b/source/blender/blenkernel/intern/cloth.c
@@ -137,7 +137,6 @@ static BVHTree *bvhselftree_build_from_cloth 
(ClothModifierData *clmd, float eps
        BVHTree *bvhtree;
        Cloth *cloth;
        ClothVertex *verts;
-       float co[12];
 
        if (!clmd)
                return NULL;
@@ -149,21 +148,22 @@ static BVHTree *bvhselftree_build_from_cloth 
(ClothModifierData *clmd, float eps
        
        verts = cloth->verts;
        
-       // in the moment, return zero if no faces there
-       if (!cloth->numverts)
+       /* in the moment, return zero if no faces there */
+       if (!cloth->mvert_num)
                return NULL;
        
-       // create quadtree with k=26
-       bvhtree = BLI_bvhtree_new(cloth->numverts, epsilon, 4, 6);
+       /* create quadtree with k=26 */
+       bvhtree = BLI_bvhtree_new(cloth->mvert_num, epsilon, 4, 6);
        
-       // fill tree
-       for (i = 0; i < cloth->numverts; i++, verts++) {
-               copy_v3_v3(&co[0*3], verts->xold);
+       /* fill tree */
+       for (i = 0; i < cloth->mvert_num; i++, verts++) {
+               const float *co;
+               co = verts->xold;
                
                BLI_bvhtree_insert(bvhtree, i, co, 1);
        }
        
-       // balance tree
+       /* balance tree */
        BLI_bvhtree_balance(bvhtree);
        
        return bvhtree;
@@ -175,8 +175,8 @@ static BVHTree *bvhtree_build_from_cloth (ClothModifierData 
*clmd, float epsilon
        BVHTree *bvhtree;
        Cloth *cloth;
        ClothVertex *verts;
-       MFace *mfaces;
-       float co[12];
+       const MLoop *mloop;
+       const MLoopTri *lt;
 
        if (!clmd)
                return NULL;
@@ -187,25 +187,25 @@ static BVHTree *bvhtree_build_from_cloth 
(ClothModifierData *clmd, float epsilon
                return NULL;
        
        verts = cloth->verts;
-       mfaces = cloth->mfaces;
+       mloop = cloth->mloop;
+       lt = cloth->looptri;
        
        /* in the moment, return zero if no faces there */
-       if (!cloth->numfaces)
+       if (!cloth->looptri_num)
                return NULL;
 
        /* create quadtree with k=26 */
-       bvhtree = BLI_bvhtree_new(cloth->numfaces, epsilon, 4, 26);
+       bvhtree = BLI_bvhtree_new(cloth->looptri_num, epsilon, 4, 26);
 
        /* fill tree */
-       for (i = 0; i < cloth->numfaces; i++, mfaces++) {
-               copy_v3_v3(&co[0*3], verts[mfaces->v1].xold);
-               copy_v3_v3(&co[1*3], verts[mfaces->v2].xold);
-               copy_v3_v3(&co[2*3], verts[mfaces->v3].xold);
+       for (i = 0; i < cloth->looptri_num; i++, lt++) {
+               float co[3][3];
 
-               if (mfaces->v4)
-                       copy_v3_v3(&co[3*3], verts[mfaces->v4].xold);
+               copy_v3_v3(co[0], verts[mloop[lt->tri[0]].v].xold);
+               copy_v3_v3(co[1], verts[mloop[lt->tri[1]].v].xold);
+               copy_v3_v3(co[2], verts[mloop[lt->tri[2]].v].xold);
 
-               BLI_bvhtree_insert(bvhtree, i, co, (mfaces->v4 ? 4 : 3));
+               BLI_bvhtree_insert(bvhtree, i, co[0], 3);
        }
 
        /* balance tree */
@@ -214,90 +214,91 @@ static BVHTree *bvhtree_build_from_cloth 
(ClothModifierData *clmd, float epsilon
        return bvhtree;
 }
 
-void bvhtree_update_from_cloth(ClothModifierData *clmd, int moving)
+void bvhtree_update_from_cloth(ClothModifierData *clmd, bool moving)
 {      
        unsigned int i = 0;
        Cloth *cloth = clmd->clothObject;
        BVHTree *bvhtree = cloth->bvhtree;
        ClothVertex *verts = cloth->verts;
-       MFace *mfaces;
-       float co[12], co_moving[12];
-       bool ret = false;
+       const MLoop *mloop;
+       const MLoopTri *lt;
        
        if (!bvhtree)
                return;
        
-       mfaces = cloth->mfaces;
+       mloop = cloth->mloop;
+       lt = cloth->looptri;
        
-       // update vertex position in bvh tree
-       if (verts && mfaces) {
-               for (i = 0; i < cloth->numfaces; i++, mfaces++) {
-                       copy_v3_v3(&co[0*3], verts[mfaces->v1].txold);
-                       copy_v3_v3(&co[1*3], verts[mfaces->v2].txold);
-                       copy_v3_v3(&co[2*3], verts[mfaces->v3].txold);
-                       
-                       if (mfaces->v4)
-                               copy_v3_v3(&co[3*3], verts[mfaces->v4].txold);
-               
-                       // copy new locations into array
+       /* update vertex position in bvh tree */
+       if (verts && lt) {
+               for (i = 0; i < cloth->looptri_num; i++, lt++) {
+                       float co[3][3], co_moving[3][3];
+                       bool ret;
+
+                       copy_v3_v3(co[0], verts[mloop[lt->tri[0]].v].txold);
+                       copy_v3_v3(co[1], verts[mloop[lt->tri[1]].v].txold);
+                       copy_v3_v3(co[2], verts[mloop[lt->tri[2]].v].txold);
+
+                       /* copy new locations into array */
                        if (moving) {
-                               // update moving positions
-                               copy_v3_v3(&co_moving[0*3], 
verts[mfaces->v1].tx);
-                               copy_v3_v3(&co_moving[1*3], 
verts[mfaces->v2].tx);
-                               copy_v3_v3(&co_moving[2*3], 
verts[mfaces->v3].tx);
-                               
-                               if (mfaces->v4)
-                                       copy_v3_v3(&co_moving[3*3], 
verts[mfaces->v4].tx);
-                               
-                               ret = BLI_bvhtree_update_node(bvhtree, i, co, 
co_moving, (mfaces->v4 ? 4 : 3));
+                               /* update moving positions */
+                               copy_v3_v3(co_moving[0], 
verts[mloop[lt->tri[0]].v].tx);
+                               copy_v3_v3(co_moving[1], 
verts[mloop[lt->tri[1]].v].tx);
+                               copy_v3_v3(co_moving[2], 
verts[mloop[lt->tri[2]].v].tx);
+
+                               ret = BLI_bvhtree_update_node(bvhtree, i, 
co[0], co_moving[0], 3);
                        }
                        else {
-                               ret = BLI_bvhtree_update_node(bvhtree, i, co, 
NULL, (mfaces->v4 ? 4 : 3));
+                               ret = BLI_bvhtree_update_node(bvhtree, i, 
co[0], NULL, 3);
                        }
                        
-                       // check if tree is already full
-                       if (!ret)
+                       /* check if tree is already full */
+                       if (ret == false) {
                                break;
+                       }
                }
                
                BLI_bvhtree_update_tree(bvhtree);
        }
 }
 
-void bvhselftree_update_from_cloth(ClothModifierData *clmd, int moving)
+void bvhselftree_update_from_cloth(ClothModifierData *clmd, bool moving)
 {      
        unsigned int i = 0;
        Cloth *cloth = clmd->clothObject;
        BVHTree *bvhtree = cloth->bvhselftree;
        ClothVertex *verts = cloth->verts;
-       MFace *mfaces;
-       float co[12], co_moving[12];
-       int ret = 0;
+       const MLoop *mloop;
+       const MLoopTri *looptri;
        
        if (!bvhtree)
                return;
        
-       mfaces = cloth->mfaces;
+       mloop = cloth->mloop;
+       looptri = cloth->looptri;
 
-       // update vertex position in bvh tree
-       if (verts && mfaces) {
-               for (i = 0; i < cloth->numverts; i++, verts++) {
-                       copy_v3_v3(&co[0*3], verts->txold);
+       /* update vertex position in bvh tree */
+       if (verts && mloop && looptri) {
+               for (i = 0; i < cloth->mvert_num; i++, verts++) {
+                       const float *co, *co_moving;
+                       bool ret;
 
-                       // copy new locations into array
-                       if (moving) {
-                               // update moving positions
-                               copy_v3_v3(&co_moving[0*3], verts->tx);
+                       co = verts->txold;
 
+                       /* copy new locations into array */
+                       if (moving) {
+                               /* update moving positions */
+                               co_moving = verts->tx;
                                ret = BLI_bvhtree_update_node(bvhtree, i, co, 
co_moving, 1);
                        }
                        else {
                                ret = BLI_bvhtree_update_node(bvhtree, i, co, 
NULL, 1);
                        }
 
-                       // check if tree is already full
-                       if (!ret)
+                       /* check if tree is already full */
+                       if (ret == false) {
                                break;
+                       }
                }
                
                BLI_bvhtree_update_tree(bvhtree);
@@ -360

@@ Diff output truncated at 10240 characters. @@

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to