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 SOLVER_DISABLE_IMPLICIT_CONE_FRICTION = 2048, 34 SOLVER_USE_ARTICULATED_WARMSTARTING = 4096, 35 }; 36 37 struct btContactSolverInfoData 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; //successive over-relaxation term 47 btScalar m_erp; //error reduction for non-contact constraints 48 btScalar m_erp2; //error reduction for contact constraints 49 btScalar m_deformable_erp; //error reduction for deformable constraints 50 btScalar m_globalCfm; //constraint force mixing for contacts and non-contacts 51 btScalar m_frictionERP; //error reduction for friction constraints 52 btScalar m_frictionCFM; //constraint force mixing for friction constraints 53 54 int m_splitImpulse; 55 btScalar m_splitImpulsePenetrationThreshold; 56 btScalar m_splitImpulseTurnErp; 57 btScalar m_linearSlop; 58 btScalar m_warmstartingFactor; 59 btScalar m_articulatedWarmstartingFactor; 60 int m_solverMode; 61 int m_restingContactRestitutionThreshold; 62 int m_minimumSolverBatchSize; 63 btScalar m_maxGyroscopicForce; 64 btScalar m_singleAxisRollingFrictionThreshold; 65 btScalar m_leastSquaresResidualThreshold; 66 btScalar m_restitutionVelocityThreshold; 67 bool m_jointFeedbackInWorldSpace; 68 bool m_jointFeedbackInJointFrame; 69 int m_reportSolverAnalytics; 70 }; 71 72 struct btContactSolverInfo : public btContactSolverInfoData 73 { btContactSolverInfobtContactSolverInfo74 inline btContactSolverInfo() 75 { 76 m_tau = btScalar(0.6); 77 m_damping = btScalar(1.0); 78 m_friction = btScalar(0.3); 79 m_timeStep = btScalar(1.f / 60.f); 80 m_restitution = btScalar(0.); 81 m_maxErrorReduction = btScalar(20.); 82 m_numIterations = 10; 83 m_erp = btScalar(0.2); 84 m_erp2 = btScalar(0.2); 85 m_deformable_erp = btScalar(0.); 86 m_globalCfm = btScalar(0.); 87 m_frictionERP = btScalar(0.2); //positional friction 'anchors' are disabled by default 88 m_frictionCFM = btScalar(0.); 89 m_sor = btScalar(1.); 90 m_splitImpulse = true; 91 m_splitImpulsePenetrationThreshold = -.04f; 92 m_splitImpulseTurnErp = 0.1f; 93 m_linearSlop = btScalar(0.0); 94 m_warmstartingFactor = btScalar(0.85); 95 m_articulatedWarmstartingFactor = btScalar(0.85); 96 //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; 97 m_solverMode = SOLVER_USE_WARMSTARTING | SOLVER_SIMD; // | SOLVER_RANDMIZE_ORDER; 98 m_restingContactRestitutionThreshold = 2; //unused as of 2.81 99 m_minimumSolverBatchSize = 128; //try to combine islands until the amount of constraints reaches this limit 100 m_maxGyroscopicForce = 100.f; ///it is only used for 'explicit' version of gyroscopic force 101 m_singleAxisRollingFrictionThreshold = 1e30f; ///if the velocity is above this threshold, it will use a single constraint row (axis), otherwise 3 rows. 102 m_leastSquaresResidualThreshold = 0.f; 103 m_restitutionVelocityThreshold = 0.2f; //if the relative velocity is below this threshold, there is zero restitution 104 m_jointFeedbackInWorldSpace = false; 105 m_jointFeedbackInJointFrame = false; 106 m_reportSolverAnalytics = 0; 107 } 108 }; 109 110 ///do not change those serialization structures, it requires an updated sBulletDNAstr/sBulletDNAstr64 111 struct btContactSolverInfoDoubleData 112 { 113 double m_tau; 114 double m_damping; //global non-contact constraint damping, can be locally overridden by constraints during 'getInfo2'. 115 double m_friction; 116 double m_timeStep; 117 double m_restitution; 118 double m_maxErrorReduction; 119 double m_sor; 120 double m_erp; //used as Baumgarte factor 121 double m_erp2; //used in Split Impulse 122 double m_globalCfm; //constraint force mixing 123 double m_splitImpulsePenetrationThreshold; 124 double m_splitImpulseTurnErp; 125 double m_linearSlop; 126 double m_warmstartingFactor; 127 double m_articulatedWarmstartingFactor; 128 double m_maxGyroscopicForce; ///it is only used for 'explicit' version of gyroscopic force 129 double m_singleAxisRollingFrictionThreshold; 130 131 int m_numIterations; 132 int m_solverMode; 133 int m_restingContactRestitutionThreshold; 134 int m_minimumSolverBatchSize; 135 int m_splitImpulse; 136 char m_padding[4]; 137 }; 138 ///do not change those serialization structures, it requires an updated sBulletDNAstr/sBulletDNAstr64 139 struct btContactSolverInfoFloatData 140 { 141 float m_tau; 142 float m_damping; //global non-contact constraint damping, can be locally overridden by constraints during 'getInfo2'. 143 float m_friction; 144 float m_timeStep; 145 146 float m_restitution; 147 float m_maxErrorReduction; 148 float m_sor; 149 float m_erp; //used as Baumgarte factor 150 151 float m_erp2; //used in Split Impulse 152 float m_globalCfm; //constraint force mixing 153 float m_splitImpulsePenetrationThreshold; 154 float m_splitImpulseTurnErp; 155 156 float m_linearSlop; 157 float m_warmstartingFactor; 158 float m_articulatedWarmstartingFactor; 159 float m_maxGyroscopicForce; 160 161 float m_singleAxisRollingFrictionThreshold; 162 int m_numIterations; 163 int m_solverMode; 164 int m_restingContactRestitutionThreshold; 165 166 int m_minimumSolverBatchSize; 167 int m_splitImpulse; 168 169 }; 170 171 #endif //BT_CONTACT_SOLVER_INFO 172