Revision: 19953
          
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=19953
Author:   ben2610
Date:     2009-04-28 00:21:42 +0200 (Tue, 28 Apr 2009)

Log Message:
-----------
BGE soft body: change welding option to disable welding check by default: 
speeds up shape conversion. This is fine if the object has no duplicate 
vertices. Otherwise, bullet will be extremely slow and you can either set some 
welding or remove duplicates in the mesh. Welding is now displayed in linear 
scale: 0.0 -> 0.01, no need to use logarithmic scale ;-). Fix a bug with Bullet 
by which vertex array for soft body must have 3xfloat stride.

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/intern/bullet.c
    trunk/blender/source/blender/makesdna/DNA_object_force.h
    trunk/blender/source/blender/src/buttons_logic.c
    trunk/blender/source/gameengine/Converter/BL_BlenderDataConversion.cpp
    trunk/blender/source/gameengine/Physics/Bullet/CcdPhysicsController.cpp
    trunk/blender/source/gameengine/Physics/Bullet/CcdPhysicsController.h

Modified: trunk/blender/source/blender/blenkernel/intern/bullet.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/bullet.c     2009-04-27 
22:14:51 UTC (rev 19952)
+++ trunk/blender/source/blender/blenkernel/intern/bullet.c     2009-04-27 
22:21:42 UTC (rev 19953)
@@ -82,7 +82,7 @@
        bsb->collisionflags = 0;
        //bsb->collisionflags = OB_BSB_COL_CL_RS + OB_BSB_COL_CL_SS;
        bsb->numclusteriterations = 64;
-       bsb->welding = -4.f;
+       bsb->welding = 0.f;
 
        return bsb;
 }

Modified: trunk/blender/source/blender/makesdna/DNA_object_force.h
===================================================================
--- trunk/blender/source/blender/makesdna/DNA_object_force.h    2009-04-27 
22:14:51 UTC (rev 19952)
+++ trunk/blender/source/blender/makesdna/DNA_object_force.h    2009-04-27 
22:21:42 UTC (rev 19953)
@@ -119,7 +119,7 @@
        float   kAHR;                   /* Anchors hardness [0,1] */
        int             collisionflags; /* Vertex/Face or Signed Distance 
Field(SDF) or Clusters, Soft versus Soft or Rigid */
        int             numclusteriterations;   /* number of iterations to 
refine collision clusters*/
-       float   welding;                /* welding limit to remove 
duplicate/nearby vertices, 0.0000001..0.01 */
+       float   welding;                /* welding limit to remove 
duplicate/nearby vertices, 0.0..0.01 */
 } BulletSoftBody;
 
 /* BulletSoftBody.flag */

Modified: trunk/blender/source/blender/src/buttons_logic.c
===================================================================
--- trunk/blender/source/blender/src/buttons_logic.c    2009-04-27 22:14:51 UTC 
(rev 19952)
+++ trunk/blender/source/blender/src/buttons_logic.c    2009-04-27 22:21:42 UTC 
(rev 19953)
@@ -3104,13 +3104,10 @@
                        uiBlockEndAlign(block);
                        yco -= 20;
                        xco = 0;
-                       if (ob->bsoft->welding == 0.f)
-                               ob->bsoft->welding = -4.f;
+                       uiDefButF(block, NUMSLI, 0, "Welding ", 
+                               xco, yco, 360, 19, &ob->bsoft->welding, 0.f, 
0.01f, 10, 4, 
+                               "Welding threshold: distance between nearby 
vertices to be considered equal => set to 0.0 to disable welding test and speed 
up scene loading (ok if the mesh has no duplicates)");
 
-                       uiDefButF(block, NUMSLI, 0, "Welding(10^) ", 
-                               xco, yco, 360, 19, &ob->bsoft->welding, -7.f, 
-2.f, 10, 2, 
-                               "Threshold to remove duplicate/nearby vertices. 
Displayed in logarithmic scale for readability: linear values from 0.0000001 to 
0.01");
-
                        /*
                        //too complex tweaking, disable for now
                        uiDefButF(block, NUMSLI, REDRAWVIEW3D, "kVC",           

Modified: trunk/blender/source/gameengine/Converter/BL_BlenderDataConversion.cpp
===================================================================
--- trunk/blender/source/gameengine/Converter/BL_BlenderDataConversion.cpp      
2009-04-27 22:14:51 UTC (rev 19952)
+++ trunk/blender/source/gameengine/Converter/BL_BlenderDataConversion.cpp      
2009-04-27 22:21:42 UTC (rev 19953)
@@ -1418,10 +1418,7 @@
                        objprop.m_soft_kAHR= blenderobject->bsoft->kAHR;        
                /* Anchors hardness [0,1] */
                        objprop.m_soft_collisionflags= 
blenderobject->bsoft->collisionflags;    /* Vertex/Face or Signed Distance 
Field(SDF) or Clusters, Soft versus Soft or Rigid */
                        objprop.m_soft_numclusteriterations= 
blenderobject->bsoft->numclusteriterations;        /* number of iterations to 
refine collision clusters*/
-                       if (blenderobject->bsoft->welding == 0.f)
-                               objprop.m_soft_welding = 0.0001f;               
/* welding */
-                       else
-                               objprop.m_soft_welding = 
pow(10.f,blenderobject->bsoft->welding);               /* welding */
+                       objprop.m_soft_welding = blenderobject->bsoft->welding; 
        /* welding */
                
                } else
                {
@@ -1461,7 +1458,7 @@
                        objprop.m_soft_kAHR= 0.7f;
                        objprop.m_soft_collisionflags= OB_BSB_COL_SDF_RS + 
OB_BSB_COL_VF_SS;
                        objprop.m_soft_numclusteriterations= 16;
-                       objprop.m_soft_welding = 0.0001f;
+                       objprop.m_soft_welding = 0.f;
                }
        }
 

Modified: 
trunk/blender/source/gameengine/Physics/Bullet/CcdPhysicsController.cpp
===================================================================
--- trunk/blender/source/gameengine/Physics/Bullet/CcdPhysicsController.cpp     
2009-04-27 22:14:51 UTC (rev 19952)
+++ trunk/blender/source/gameengine/Physics/Bullet/CcdPhysicsController.cpp     
2009-04-27 22:21:42 UTC (rev 19953)
@@ -1368,9 +1368,9 @@
                        }
                }
 
-               m_vertexArray.resize(tot_bt_verts);
+               m_vertexArray.resize(tot_bt_verts*3);
 
-               btVector3 *bt= &m_vertexArray[0];
+               btScalar *bt= &m_vertexArray[0];
 
                for (int p2=0; p2<numpolys; p2++)
                {
@@ -1388,8 +1388,9 @@
                                                const float* vtx = v->getXYZ();
                                                vert_tag_array[orig_index]= 
false;
 
-                                               bt->setX(vtx[0]);  
bt->setY(vtx[1]);  bt->setZ(vtx[2]);
-                                               bt++;
+                                               *bt++ = vtx[0];
+                                               *bt++ = vtx[1];
+                                               *bt++ = vtx[2];
                                        }
                                }
                        }
@@ -1421,11 +1422,11 @@
                        }
                }
 
-               m_vertexArray.resize(tot_bt_verts);
+               m_vertexArray.resize(tot_bt_verts*3);
                m_polygonIndexArray.resize(tot_bt_tris);
                m_triFaceArray.resize(tot_bt_tris*3);
 
-               btVector3 *bt= &m_vertexArray[0];
+               btScalar *bt= &m_vertexArray[0];
                int *poly_index_pt= &m_polygonIndexArray[0];
                int *tri_pt= &m_triFaceArray[0];
 
@@ -1459,20 +1460,23 @@
                                if (vert_tag_array[i1]==true) { /* *** v1 *** */
                                        vert_tag_array[i1]= false;
                                        vtx = v1->getXYZ();
-                                       bt->setX(vtx[0]);       bt->setY( 
vtx[1]);      bt->setZ(vtx[2]);
-                                       bt++;
+                                       *bt++ = vtx[0];
+                                       *bt++ = vtx[1];
+                                       *bt++ = vtx[2];
                                }
                                if (vert_tag_array[i2]==true) { /* *** v2 *** */
                                        vert_tag_array[i2]= false;
                                        vtx = v2->getXYZ();
-                                       bt->setX(vtx[0]);       
bt->setY(vtx[1]);       bt->setZ(vtx[2]);
-                                       bt++;
+                                       *bt++ = vtx[0];
+                                       *bt++ = vtx[1];
+                                       *bt++ = vtx[2];
                                }
                                if (vert_tag_array[i3]==true) { /* *** v3 *** */
                                        vert_tag_array[i3]= false;
                                        vtx = v3->getXYZ();
-                                       bt->setX(vtx[0]);       
bt->setY(vtx[1]);       bt->setZ(vtx[2]);
-                                       bt++;
+                                       *bt++ = vtx[0]; 
+                                       *bt++ = vtx[1];
+                                       *bt++ = vtx[2];
                                }
 
                                if (poly->VertexCount()==4)
@@ -1493,8 +1497,9 @@
                                        if (vert_tag_array[i4]==true) { /* *** 
v4 *** */
                                                vert_tag_array[i4]= false;
                                                vtx = v4->getXYZ();
-                                               bt->setX(vtx[0]);       
bt->setY(vtx[1]);       bt->setZ(vtx[2]);
-                                               bt++;
+                                               *bt++ = vtx[0];
+                                               *bt++ = vtx[1]; 
+                                               *bt++ = vtx[2];
                                        }
                                }
                        }
@@ -1577,7 +1582,7 @@
                break;
 
        case PHY_SHAPE_POLYTOPE:
-               collisionShape = new 
btConvexHullShape(&m_vertexArray[0].getX(), m_vertexArray.size());
+               collisionShape = new btConvexHullShape(&m_vertexArray[0], 
m_vertexArray.size()/3, 3*sizeof(btScalar));
                break;
 
        case PHY_SHAPE_MESH:
@@ -1594,9 +1599,9 @@
                                                m_polygonIndexArray.size(),
                                                &m_triFaceArray[0],
                                                3*sizeof(int),
-                                               m_vertexArray.size(),
-                                               (btScalar*) 
&m_vertexArray[0].x(),
-                                               sizeof(btVector3)
+                                               m_vertexArray.size()/3,
+                                               &m_vertexArray[0],
+                                               3*sizeof(btScalar)
                                );
                                
                                btGImpactMeshShape* gimpactShape =  new 
btGImpactMeshShape(indexVertexArrays);
@@ -1619,12 +1624,13 @@
                                        bool removeDuplicateVertices=true;
                                        // m_vertexArray not in multiple of 3 
anymore, use m_triFaceArray
                                        for(int i=0; i<m_triFaceArray.size(); 
i+=3) {
-                                               collisionMeshData->addTriangle(
-                                                               
m_vertexArray[m_triFaceArray[i]],
-                                                               
m_vertexArray[m_triFaceArray[i+1]],
-                                                               
m_vertexArray[m_triFaceArray[i+2]],
-                                                               
removeDuplicateVertices
-                                               );
+                                               btScalar *bt = 
&m_vertexArray[3*m_triFaceArray[i]];
+                                               btVector3 v1(bt[0], bt[1], 
bt[2]);
+                                               bt = 
&m_vertexArray[3*m_triFaceArray[i+1]];
+                                               btVector3 v2(bt[0], bt[1], 
bt[2]);
+                                               bt = 
&m_vertexArray[3*m_triFaceArray[i+2]];
+                                               btVector3 v3(bt[0], bt[1], 
bt[2]);
+                                               
collisionMeshData->addTriangle(v1, v2, v3, removeDuplicateVertices);
                                        }
                                        indexVertexArrays = collisionMeshData;
 
@@ -1634,9 +1640,9 @@
                                                        
m_polygonIndexArray.size(),
                                                        &m_triFaceArray[0],
                                                        3*sizeof(int),
-                                                       m_vertexArray.size(),
-                                                       (btScalar*) 
&m_vertexArray[0].x(),
-                                                       sizeof(btVector3));
+                                                       m_vertexArray.size()/3,
+                                                       &m_vertexArray[0],
+                                                       3*sizeof(btScalar));
                                }
                                
                                // this shape will be shared and not deleted 
until shapeInfo is deleted

Modified: trunk/blender/source/gameengine/Physics/Bullet/CcdPhysicsController.h
===================================================================
--- trunk/blender/source/gameengine/Physics/Bullet/CcdPhysicsController.h       
2009-04-27 22:14:51 UTC (rev 19952)
+++ trunk/blender/source/gameengine/Physics/Bullet/CcdPhysicsController.h       
2009-04-27 22:21:42 UTC (rev 19953)
@@ -161,8 +161,8 @@
        btTransform                             m_childTrans;
        btVector3                               m_childScale;
        void*                                   m_userData;     
-       btAlignedObjectArray<btVector3> m_vertexArray;  // Contains both vertex 
array for polytope shape and
-                                                                               
        // triangle array for concave mesh shape.
+       btAlignedObjectArray<btScalar>  m_vertexArray;  // Contains both vertex 
array for polytope shape and
+                                                                               
        // triangle array for concave mesh shape. Each vertex is 3 consecutive 
values
                                                                                
        // In this case a triangle is made of 3 consecutive points
        std::vector<int>                m_polygonIndexArray;    // Contains the 
array of polygon index in the 
                                                                                
                        // original mesh that correspond to shape triangles.
@@ -173,12 +173,8 @@
 
        void    setVertexWeldingThreshold1(float threshold)
        {
-               m_weldingThreshold1  = threshold;
+               m_weldingThreshold1  = threshold*threshold;
        }
-       float   getVertexWeldingThreshold1() const
-       {
-               return m_weldingThreshold1;
-       }
 protected:
        static std::map<RAS_MeshObject*, CcdShapeConstructionInfo*> 
m_meshShapeMap;
        int                                             m_refCount;             
// this class is shared between replicas


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

Reply via email to