1 /* 2 Bullet Continuous Collision Detection and Physics Library 3 Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/ 4 5 This software is provided 'as-is', without any express or implied warranty. 6 In no event will the authors be held liable for any damages arising from the use of this software. 7 Permission is granted to anyone to use this software for any purpose, 8 including commercial applications, and to alter it and redistribute it freely, 9 subject to the following restrictions: 10 11 1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. 12 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. 13 3. This notice may not be removed or altered from any source distribution. 14 */ 15 16 #ifndef BT_CONTACT_SOLVER_INFO 17 #define BT_CONTACT_SOLVER_INFO 18 19 #include "LinearMath/btScalar.h" 20 21 enum btSolverMode 22 { 23 SOLVER_RANDMIZE_ORDER = 1, 24 SOLVER_FRICTION_SEPARATE = 2, 25 SOLVER_USE_WARMSTARTING = 4, 26 SOLVER_USE_2_FRICTION_DIRECTIONS = 16, 27 SOLVER_ENABLE_FRICTION_DIRECTION_CACHING = 32, 28 SOLVER_DISABLE_VELOCITY_DEPENDENT_FRICTION_DIRECTION = 64, 29 SOLVER_CACHE_FRIENDLY = 128, 30 SOLVER_SIMD = 256, 31 SOLVER_INTERLEAVE_CONTACT_AND_FRICTION_CONSTRAINTS = 512, 32 SOLVER_ALLOW_ZERO_LENGTH_FRICTION_DIRECTIONS = 1024 33 }; 34 35 struct btContactSolverInfoData 36 { 37 38 39 btScalar m_tau; 40 btScalar m_damping;//global non-contact constraint damping, can be locally overridden by constraints during 'getInfo2'. 41 btScalar m_friction; 42 btScalar m_timeStep; 43 btScalar m_restitution; 44 int m_numIterations; 45 btScalar m_maxErrorReduction; 46 btScalar m_sor; 47 btScalar m_erp;//used as Baumgarte factor 48 btScalar m_erp2;//used in Split Impulse 49 btScalar m_globalCfm;//constraint force mixing 50 int m_splitImpulse; 51 btScalar m_splitImpulsePenetrationThreshold; 52 btScalar m_splitImpulseTurnErp; 53 btScalar m_linearSlop; 54 btScalar m_warmstartingFactor; 55 56 int m_solverMode; 57 int m_restingContactRestitutionThreshold; 58 int m_minimumSolverBatchSize; 59 btScalar m_maxGyroscopicForce; 60 btScalar m_singleAxisRollingFrictionThreshold; 61 62 63 }; 64 65 struct btContactSolverInfo : public btContactSolverInfoData 66 { 67 68 69 btContactSolverInfobtContactSolverInfo70 inline btContactSolverInfo() 71 { 72 m_tau = btScalar(0.6); 73 m_damping = btScalar(1.0); 74 m_friction = btScalar(0.3); 75 m_timeStep = btScalar(1.f/60.f); 76 m_restitution = btScalar(0.); 77 m_maxErrorReduction = btScalar(20.); 78 m_numIterations = 10; 79 m_erp = btScalar(0.2); 80 m_erp2 = btScalar(0.8); 81 m_globalCfm = btScalar(0.); 82 m_sor = btScalar(1.); 83 m_splitImpulse = true; 84 m_splitImpulsePenetrationThreshold = -.04f; 85 m_splitImpulseTurnErp = 0.1f; 86 m_linearSlop = btScalar(0.0); 87 m_warmstartingFactor=btScalar(0.85); 88 //m_solverMode = SOLVER_USE_WARMSTARTING | SOLVER_SIMD | SOLVER_DISABLE_VELOCITY_DEPENDENT_FRICTION_DIRECTION|SOLVER_USE_2_FRICTION_DIRECTIONS|SOLVER_ENABLE_FRICTION_DIRECTION_CACHING;// | SOLVER_RANDMIZE_ORDER; 89 m_solverMode = SOLVER_USE_WARMSTARTING | SOLVER_SIMD;// | SOLVER_RANDMIZE_ORDER; 90 m_restingContactRestitutionThreshold = 2;//unused as of 2.81 91 m_minimumSolverBatchSize = 128; //try to combine islands until the amount of constraints reaches this limit 92 m_maxGyroscopicForce = 100.f; ///it is only used for 'explicit' version of gyroscopic force 93 m_singleAxisRollingFrictionThreshold = 1e30f;///if the velocity is above this threshold, it will use a single constraint row (axis), otherwise 3 rows. 94 } 95 }; 96 97 ///do not change those serialization structures, it requires an updated sBulletDNAstr/sBulletDNAstr64 98 struct btContactSolverInfoDoubleData 99 { 100 double m_tau; 101 double m_damping;//global non-contact constraint damping, can be locally overridden by constraints during 'getInfo2'. 102 double m_friction; 103 double m_timeStep; 104 double m_restitution; 105 double m_maxErrorReduction; 106 double m_sor; 107 double m_erp;//used as Baumgarte factor 108 double m_erp2;//used in Split Impulse 109 double m_globalCfm;//constraint force mixing 110 double m_splitImpulsePenetrationThreshold; 111 double m_splitImpulseTurnErp; 112 double m_linearSlop; 113 double m_warmstartingFactor; 114 double m_maxGyroscopicForce;///it is only used for 'explicit' version of gyroscopic force 115 double m_singleAxisRollingFrictionThreshold; 116 117 int m_numIterations; 118 int m_solverMode; 119 int m_restingContactRestitutionThreshold; 120 int m_minimumSolverBatchSize; 121 int m_splitImpulse; 122 char m_padding[4]; 123 124 }; 125 ///do not change those serialization structures, it requires an updated sBulletDNAstr/sBulletDNAstr64 126 struct btContactSolverInfoFloatData 127 { 128 float m_tau; 129 float m_damping;//global non-contact constraint damping, can be locally overridden by constraints during 'getInfo2'. 130 float m_friction; 131 float m_timeStep; 132 133 float m_restitution; 134 float m_maxErrorReduction; 135 float m_sor; 136 float m_erp;//used as Baumgarte factor 137 138 float m_erp2;//used in Split Impulse 139 float m_globalCfm;//constraint force mixing 140 float m_splitImpulsePenetrationThreshold; 141 float m_splitImpulseTurnErp; 142 143 float m_linearSlop; 144 float m_warmstartingFactor; 145 float m_maxGyroscopicForce; 146 float m_singleAxisRollingFrictionThreshold; 147 148 int m_numIterations; 149 int m_solverMode; 150 int m_restingContactRestitutionThreshold; 151 int m_minimumSolverBatchSize; 152 153 int m_splitImpulse; 154 char m_padding[4]; 155 }; 156 157 158 159 #endif //BT_CONTACT_SOLVER_INFO 160