[dali_2.3.21] Merge branch 'devel/master'
[platform/core/uifw/dali-toolkit.git] / dali-physics / third-party / bullet3 / src / BulletDynamics / Vehicle / btWheelInfo.cpp
1 /*
2  * Copyright (c) 2005 Erwin Coumans https://bulletphysics.org
3  *
4  * Permission to use, copy, modify, distribute and sell this software
5  * and its documentation for any purpose is hereby granted without fee,
6  * provided that the above copyright notice appear in all copies.
7  * Erwin Coumans makes no representations about the suitability 
8  * of this software for any purpose.  
9  * It is provided "as is" without express or implied warranty.
10 */
11 #include "btWheelInfo.h"
12 #include "BulletDynamics/Dynamics/btRigidBody.h"  // for pointvelocity
13
14 btScalar btWheelInfo::getSuspensionRestLength() const
15 {
16         return m_suspensionRestLength1;
17 }
18
19 void btWheelInfo::updateWheel(const btRigidBody& chassis, RaycastInfo& raycastInfo)
20 {
21         (void)raycastInfo;
22
23         if (m_raycastInfo.m_isInContact)
24
25         {
26                 btScalar project = m_raycastInfo.m_contactNormalWS.dot(m_raycastInfo.m_wheelDirectionWS);
27                 btVector3 chassis_velocity_at_contactPoint;
28                 btVector3 relpos = m_raycastInfo.m_contactPointWS - chassis.getCenterOfMassPosition();
29                 chassis_velocity_at_contactPoint = chassis.getVelocityInLocalPoint(relpos);
30                 btScalar projVel = m_raycastInfo.m_contactNormalWS.dot(chassis_velocity_at_contactPoint);
31                 if (project >= btScalar(-0.1))
32                 {
33                         m_suspensionRelativeVelocity = btScalar(0.0);
34                         m_clippedInvContactDotSuspension = btScalar(1.0) / btScalar(0.1);
35                 }
36                 else
37                 {
38                         btScalar inv = btScalar(-1.) / project;
39                         m_suspensionRelativeVelocity = projVel * inv;
40                         m_clippedInvContactDotSuspension = inv;
41                 }
42         }
43
44         else  // Not in contact : position wheel in a nice (rest length) position
45         {
46                 m_raycastInfo.m_suspensionLength = this->getSuspensionRestLength();
47                 m_suspensionRelativeVelocity = btScalar(0.0);
48                 m_raycastInfo.m_contactNormalWS = -m_raycastInfo.m_wheelDirectionWS;
49                 m_clippedInvContactDotSuspension = btScalar(1.0);
50         }
51 }