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