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