Changeset 3329
- Timestamp:
- 01/29/10 19:15:36 (7 months ago)
- Location:
- plugins/branches/0185_GEN_PHYSICS_REFACTOR_2/ZBullet/src
- Files:
-
- 4 modified
-
PhysicsActor.cpp (modified) (2 diffs)
-
PhysicsMaterial.cpp (modified) (10 diffs)
-
PhysicsService.cpp (modified) (3 diffs)
-
PhysicsZone.cpp (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
plugins/branches/0185_GEN_PHYSICS_REFACTOR_2/ZBullet/src/PhysicsActor.cpp
r3326 r3329 132 132 // set the transform call back function 133 133 btRigidBodySetTransformCallback(m_pActor, TransformCallback); 134 btRigidBodySetForceAndTorqueCallback(m_pActor, ApplyForceAndTorqueCallback);135 btRigidBodySetAutoactiveCallback(m_pActor, ActivationStateCallback);136 134 137 135 m_pActor->setUserPointer(this); … … 177 175 { 178 176 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 180 179 } 181 180 -
plugins/branches/0185_GEN_PHYSICS_REFACTOR_2/ZBullet/src/PhysicsMaterial.cpp
r3326 r3329 117 117 // Newton friction coefficients are normally between 0 and 1 118 118 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 }136 119 } 137 120 … … 140 123 PhysicsMaterial::setMatMatrixDynamicFriction(pPhysicsMaterial_type _material, Math::Real _dynamicFriction) 141 124 { 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) 143 127 } 144 128 … … 149 133 // Newton friction coefficients are normally between 0 and 1 150 134 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 }168 135 } 169 136 … … 172 139 PhysicsMaterial::setMatMatrixStaticFriction(pPhysicsMaterial_type _material, Math::Real _staticFriction) 173 140 { 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) 175 143 } 176 144 … … 180 148 { 181 149 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 }194 150 } 195 151 … … 198 154 PhysicsMaterial::setMatMatrixRestitution(pPhysicsMaterial_type _material, Math::Real _restitution) 199 155 { 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) 201 158 } 202 159 … … 206 163 { 207 164 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) 227 166 } 228 167 … … 232 171 { 233 172 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 254 174 255 175 //-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~ … … 257 177 PhysicsMaterial::setMatMatrixCollidable(pPhysicsMaterial_type _material, bool _collide) 258 178 { 259 m_bCollidable = _collide;//likely redundant...? 260 ZBulletMaterialSetDefaultCollidable(m_pNewtonZone,_material->getMaterialID(), m_id, _collide); 179 //todo: handle via collisiongroups 261 180 } 262 181 … … 265 184 PhysicsMaterial::setIgnoreCollision(pPhysicsMaterial_type _material) 266 185 { 267 ZBulletMaterialSetDefaultCollidable(m_pNewtonZone, _material->getMaterialID(), m_id, 0); 186 //todo: handle via collisiongroups 268 187 } 269 188 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. 295 190 //We'll likely want to end up putting a global material callback funciton later similar to the newton callbacks in method, if not useage 296 191 -
plugins/branches/0185_GEN_PHYSICS_REFACTOR_2/ZBullet/src/PhysicsService.cpp
r3294 r3329 30 30 #include <exception> 31 31 #include <iostream> 32 #include <btManifoldResult.h> 32 33 34 extern ContactAddedCallback gContactAddedCallback; 33 35 //-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~ 34 36 namespace Zen { … … 37 39 PhysicsService::PhysicsService() 38 40 { 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; 39 44 } 40 45 … … 102 107 } 103 108 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; 111 inline 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 124 inline btScalar calculateCombinedRestitution(float restitution0,float restitution1) 125 { 126 return restitution0 * restitution1; 127 } 128 129 static 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 104 162 //-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~ 105 163 } // namespace ZBullet -
plugins/branches/0185_GEN_PHYSICS_REFACTOR_2/ZBullet/src/PhysicsZone.cpp
r3324 r3329 57 57 // Set up the collision configuration and dispatcher 58 58 m_pCollisionConfiguration = new btDefaultCollisionConfiguration(); 59 m_pDispatcher = new btCollisionDispatcher( collisionConfiguration);59 m_pDispatcher = new btCollisionDispatcher(m_pCollisionConfiguration); 60 60 61 61 // The actual physics solver
