Changeset 3329

Show
Ignore:
Timestamp:
01/29/10 19:15:36 (7 months ago)
Author:
Azaezel
Message:

pruned material entries of plug-in interaction. bullet it's self doesn't have the concept, so all internal calls dealing with getting and setting restitution/friction/ect. will reference wrappers around the object-instance, with the material class here being for extension purposes via callbacks

Location:
plugins/branches/0185_GEN_PHYSICS_REFACTOR_2/ZBullet/src
Files:
4 modified

Legend:

Unmodified
Added
Removed
  • plugins/branches/0185_GEN_PHYSICS_REFACTOR_2/ZBullet/src/PhysicsActor.cpp

    r3326 r3329  
    132132    // set the transform call back function 
    133133    btRigidBodySetTransformCallback(m_pActor, TransformCallback); 
    134     btRigidBodySetForceAndTorqueCallback(m_pActor, ApplyForceAndTorqueCallback); 
    135     btRigidBodySetAutoactiveCallback(m_pActor, ActivationStateCallback); 
    136134     
    137135    m_pActor->setUserPointer(this); 
     
    177175{ 
    178176    m_material = _material; 
    179     btRigidBodySetMaterialGroupID(m_pActor, m_material->getMaterialID()); 
     177    //todo: assign actual bullet matrerial properties to the actor it'sself, leave this reference for extended 
     178    //variables for use with zen behaviors 
    180179} 
    181180 
  • plugins/branches/0185_GEN_PHYSICS_REFACTOR_2/ZBullet/src/PhysicsMaterial.cpp

    r3326 r3329  
    117117    // Newton friction coefficients are normally between 0 and 1 
    118118    m_dynamicFriction = _dynamicFriction; 
    119     if (m_dynamicFriction < 0.01f) 
    120         m_dynamicFriction = 0.01f; 
    121     if (m_staticFriction < m_dynamicFriction + 0.01f) 
    122         m_staticFriction = m_dynamicFriction + 0.01f; 
    123  
    124     materials_vector_type materials = m_pZone->getAllMaterials(); 
    125     materials_vector_type::const_iterator iter = materials.begin(); 
    126     while (iter != materials.end()) 
    127     { 
    128         pPhysicsMaterial_type pMaterial = *iter; 
    129  
    130         ZBulletMaterialSetDefaultFriction(m_pNewtonZone, pMaterial->getMaterialID(), m_id, 
    131             (Zen::Math::Real)((m_staticFriction + pMaterial->getStaticFriction()) / 2.0f), 
    132             (Zen::Math::Real)((m_dynamicFriction + pMaterial->getDynamicFriction()) / 2.0f)); 
    133  
    134         iter++; 
    135     } 
    136119} 
    137120 
     
    140123PhysicsMaterial::setMatMatrixDynamicFriction(pPhysicsMaterial_type _material, Math::Real _dynamicFriction) 
    141124{ 
    142         ZBulletMaterialSetDefaultFriction(m_pNewtonZone, getMaterialID(), m_id, getStaticFriction(), _dynamicFriction); 
     125//todo: for breaking the laws of physics and setting a specific dynamic friction vs a given material 
     126//(done more often than you'd think in practice) 
    143127} 
    144128 
     
    149133    // Newton friction coefficients are normally between 0 and 1 
    150134    m_staticFriction = _staticFriction; 
    151     if (m_staticFriction < 0.02f) 
    152         m_staticFriction = 0.02f; 
    153     if (m_dynamicFriction > m_staticFriction - 0.01f) 
    154         m_dynamicFriction = m_staticFriction - 0.01f; 
    155  
    156     materials_vector_type materials = m_pZone->getAllMaterials(); 
    157     materials_vector_type::const_iterator iter = materials.begin(); 
    158     while (iter != materials.end()) 
    159     { 
    160         pPhysicsMaterial_type pMaterial = *iter; 
    161  
    162         ZBulletMaterialSetDefaultFriction(m_pNewtonZone, pMaterial->getMaterialID(), m_id, 
    163             (Zen::Math::Real)((m_staticFriction + pMaterial->getStaticFriction()) / 2.0f), 
    164             (Zen::Math::Real)((m_dynamicFriction + pMaterial->getDynamicFriction()) / 2.0f)); 
    165  
    166         iter++; 
    167     } 
    168135} 
    169136 
     
    172139PhysicsMaterial::setMatMatrixStaticFriction(pPhysicsMaterial_type _material, Math::Real _staticFriction) 
    173140{ 
    174     ZBulletMaterialSetDefaultFriction(m_pNewtonZone, getMaterialID(), m_id, _staticFriction, getDynamicFriction()); 
     141//todo: for breaking the laws of physics and setting a specific static friction vs a given material 
     142//(done more often than you'd think in practice) 
    175143} 
    176144 
     
    180148{ 
    181149    m_restitution = _restitution; 
    182  
    183     materials_vector_type materials = m_pZone->getAllMaterials(); 
    184     materials_vector_type::const_iterator iter = materials.begin(); 
    185     while (iter != materials.end()) 
    186     { 
    187         pPhysicsMaterial_type pMaterial = *iter; 
    188  
    189         ZBulletMaterialSetDefaultElasticity(m_pNewtonZone, pMaterial->getMaterialID(), m_id, 
    190             (Zen::Math::Real)((m_restitution + pMaterial->getRestitution()) / 2.0f)); 
    191  
    192         iter++; 
    193     } 
    194150} 
    195151 
     
    198154PhysicsMaterial::setMatMatrixRestitution(pPhysicsMaterial_type _material, Math::Real _restitution) 
    199155{ 
    200         ZBulletMaterialSetDefaultElasticity(m_pNewtonZone, getMaterialID(), m_id, _restitution); 
     156//todo: for breaking the laws of physics and setting a specific restitution vs a given material 
     157//(done more often than you'd think in practice) 
    201158} 
    202159 
     
    206163{ 
    207164    m_bAdvancedCollisionPrediction = _mode; 
    208  
    209     materials_vector_type materials = m_pZone->getAllMaterials(); 
    210     materials_vector_type::const_iterator iter = materials.begin(); 
    211     while (iter != materials.end()) 
    212     { 
    213         pPhysicsMaterial_type pMaterial = *iter; 
    214  
    215         // advanced collision detection is infectious.  if either material has it, it's enabled. 
    216         if (m_bAdvancedCollisionPrediction || pMaterial->getAdvancedCollisionPrediction()) 
    217         { 
    218             ZBulletMaterialSetContinuousCollisionMode(m_pNewtonZone, pMaterial->getMaterialID(), m_id, 1); 
    219         } 
    220         else 
    221         { 
    222             ZBulletMaterialSetContinuousCollisionMode(m_pNewtonZone, pMaterial->getMaterialID(), m_id, 0); 
    223         } 
    224  
    225         iter++; 
    226     } 
     165//todo: implement ccd (continuous collision detection) 
    227166} 
    228167 
     
    232171{ 
    233172    m_bCollidable = _collide; 
    234  
    235     materials_vector_type materials = m_pZone->getAllMaterials(); 
    236     materials_vector_type::const_iterator iter = materials.begin(); 
    237     while (iter != materials.end()) 
    238     { 
    239         pPhysicsMaterial_type pMaterial = *iter; 
    240  
    241         // collision detection is infectious.  if either material has it turned off, it's disabled. 
    242         if (!m_bCollidable || !pMaterial->getCollidable()) 
    243         { 
    244             ZBulletMaterialSetDefaultCollidable(m_pNewtonZone, pMaterial->getMaterialID(), m_id, 0); 
    245         } 
    246         else 
    247         { 
    248             ZBulletMaterialSetDefaultCollidable(m_pNewtonZone, pMaterial->getMaterialID(), m_id, 1); 
    249         } 
    250  
    251         iter++; 
    252     } 
    253 } 
     173//todo: handle via collisiongroups 
    254174 
    255175//-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~ 
     
    257177PhysicsMaterial::setMatMatrixCollidable(pPhysicsMaterial_type _material, bool _collide) 
    258178{ 
    259     m_bCollidable = _collide;//likely redundant...? 
    260         ZBulletMaterialSetDefaultCollidable(m_pNewtonZone,_material->getMaterialID(), m_id, _collide); 
     179//todo: handle via collisiongroups 
    261180} 
    262181 
     
    265184PhysicsMaterial::setIgnoreCollision(pPhysicsMaterial_type _material) 
    266185{ 
    267     ZBulletMaterialSetDefaultCollidable(m_pNewtonZone, _material->getMaterialID(), m_id, 0); 
     186//todo: handle via collisiongroups 
    268187} 
    269188 
    270 //-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~ 
    271 static int GenericContactBegin(const ZBulletMaterial* material, const btRigidBody* body0, const btRigidBody* body1); 
    272 static int  GenericContactProcess(const ZBulletMaterial* material, const btManifoldPoint* contact); 
    273 static void GenericContactEnd(const ZBulletMaterial* material); 
    274  
    275 static PhysicsActor*          g_currentObjectRegister; 
    276 static PhysicsActor*          g_hitObjectRegister; 
    277  
    278 //-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~ 
    279 void 
    280 PhysicsMaterial::setCallbacks() 
    281 { 
    282     materials_vector_type materials = m_pZone->getAllMaterials(); 
    283     materials_vector_type::const_iterator iter = materials.begin(); 
    284     while (iter != materials.end()) 
    285     { 
    286         pPhysicsMaterial_type pMaterial = *iter; 
    287  
    288         ZBulletMaterialSetCollisionCallback(m_pNewtonZone, pMaterial->getMaterialID(), m_id, NULL, GenericContactBegin, GenericContactProcess, GenericContactEnd); 
    289         ZBulletMaterialSetCollisionCallback(m_pNewtonZone, m_id, pMaterial->getMaterialID(), NULL, GenericContactBegin, GenericContactProcess, GenericContactEnd); 
    290         iter++; 
    291     } 
    292 } 
    293  
    294 //Research Note: http://bulletphysics.com/Bullet/BulletPhysics2.74_2.htm#_Toc223854903  
     189//Research Note: See CustomMaterialCombinerCallback in Bullet/Demos/ConcaveDemo/ConcavePhysicsDemo.cpp for an example implementation. 
    295190//We'll likely want to end up putting a global material callback funciton later similar to the newton callbacks in method, if not useage 
    296191 
  • plugins/branches/0185_GEN_PHYSICS_REFACTOR_2/ZBullet/src/PhysicsService.cpp

    r3294 r3329  
    3030#include <exception> 
    3131#include <iostream> 
     32#include <btManifoldResult.h> 
    3233 
     34extern ContactAddedCallback             gContactAddedCallback; 
    3335//-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~ 
    3436namespace Zen { 
     
    3739PhysicsService::PhysicsService() 
    3840{ 
     41    //gContactAddedCallback usage can be found under btManifoldResult::addContactPoint 
     42    //it is an explicitly defined global method handle called during btManifoldResult::addContactPoint 
     43    gContactAddedCallback = CustomMaterialCombinerCallback; 
    3944} 
    4045 
     
    102107} 
    103108 
     109// See CustomMaterialCombinerCallback in Bullet/Demos/ConcaveDemo/ConcavePhysicsDemo.cpp for an example implementation. 
     110///User can override this material combiner by implementing gContactAddedCallback and setting body0->m_collisionFlags |= btCollisionObject::customMaterialCallback; 
     111inline btScalar calculateCombinedFriction(float friction0,float friction1) 
     112{ 
     113        btScalar friction = friction0 * friction1; 
     114 
     115        const btScalar MAX_FRICTION  = 10.f; 
     116        if (friction < -MAX_FRICTION) 
     117                friction = -MAX_FRICTION; 
     118        if (friction > MAX_FRICTION) 
     119                friction = MAX_FRICTION; 
     120        return friction; 
     121 
     122} 
     123 
     124inline btScalar calculateCombinedRestitution(float restitution0,float restitution1) 
     125{ 
     126        return restitution0 * restitution1; 
     127} 
     128 
     129static bool CustomMaterialCombinerCallback(btManifoldPoint& cp, const btCollisionObject* colObj0,int partId0,int index0,const btCollisionObject* colObj1,int partId1,int index1) 
     130{ 
     131//point of contaact, object, face, child shape, face2, child shape2. see also ConvexDecompositionDemo MyContactCallback that ships with the bullet library 
     132 
     133        float friction0 = colObj0->getFriction(); 
     134        float friction1 = colObj1->getFriction(); 
     135        float restitution0 = colObj0->getRestitution(); 
     136        float restitution1 = colObj1->getRestitution(); 
     137 
     138        if (colObj0->getCollisionFlags() & btCollisionObject::CF_CUSTOM_MATERIAL_CALLBACK) 
     139        { 
     140                friction0 = 1.0;//partId0,index0 
     141                restitution0 = 0.f; 
     142        } 
     143        if (colObj1->getCollisionFlags() & btCollisionObject::CF_CUSTOM_MATERIAL_CALLBACK) 
     144        { 
     145                if (index1&1) 
     146                { 
     147                        friction1 = 1.0f;//partId1,index1 
     148                } else 
     149                { 
     150                        friction1 = 0.f; 
     151                } 
     152                restitution1 = 0.f; 
     153        } 
     154 
     155        cp.m_combinedFriction = calculateCombinedFriction(friction0,friction1); 
     156        cp.m_combinedRestitution = calculateCombinedRestitution(restitution0,restitution1); 
     157 
     158        //this return value is currently ignored, but to be on the safe side: return false if you don't calculate friction 
     159        return true; 
     160} 
     161 
    104162//-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~ 
    105163}   // namespace ZBullet 
  • plugins/branches/0185_GEN_PHYSICS_REFACTOR_2/ZBullet/src/PhysicsZone.cpp

    r3324 r3329  
    5757    // Set up the collision configuration and dispatcher 
    5858    m_pCollisionConfiguration = new btDefaultCollisionConfiguration(); 
    59     m_pDispatcher = new btCollisionDispatcher(collisionConfiguration); 
     59    m_pDispatcher = new btCollisionDispatcher(m_pCollisionConfiguration); 
    6060  
    6161    // The actual physics solver