Overte C++ Documentation
BulletUtil.h
1 //
2 // BulletUtil.h
3 // libraries/physics/src
4 //
5 // Created by Andrew Meadows 2014.11.02
6 // Copyright 2014 High Fidelity, Inc.
7 //
8 // Distributed under the Apache License, Version 2.0.
9 // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
10 //
11 
12 #ifndef hifi_BulletUtil_h
13 #define hifi_BulletUtil_h
14 
15 #include <btBulletDynamicsCommon.h>
16 #include <glm/glm.hpp>
17 #include <glm/gtc/quaternion.hpp>
18 
19 inline glm::vec3 bulletToGLM(const btVector3& b) {
20  return glm::vec3(b.getX(), b.getY(), b.getZ());
21 }
22 
23 inline glm::quat bulletToGLM(const btQuaternion& b) {
24  return glm::quat(b.getW(), b.getX(), b.getY(), b.getZ());
25 }
26 
27 inline btVector3 glmToBullet(const glm::vec3& g) {
28  return btVector3(g.x, g.y, g.z);
29 }
30 
31 inline btQuaternion glmToBullet(const glm::quat& g) {
32  return btQuaternion(g.x, g.y, g.z, g.w);
33 }
34 
35 inline btMatrix3x3 glmToBullet(const glm::mat3& m) {
36  return btMatrix3x3(m[0][0], m[1][0], m[2][0],
37  m[0][1], m[1][1], m[2][1],
38  m[0][2], m[1][2], m[2][2]);
39 }
40 
41 // btTransform does not contain a full 4x4 matrix, so this transform is lossy.
42 // Affine transformations are OK but perspective transformations are not.
43 inline btTransform glmToBullet(const glm::mat4& m) {
44  glm::mat3 m3(m);
45  return btTransform(glmToBullet(m3), glmToBullet(glm::vec3(m[3][0], m[3][1], m[3][2])));
46 }
47 
48 inline glm::mat4 bulletToGLM(const btTransform& t) {
49  glm::mat4 m;
50 
51  const btMatrix3x3& basis = t.getBasis();
52  // copy over 3x3 part
53  for (int r = 0; r < 3; r++) {
54  for (int c = 0; c < 3; c++) {
55  m[c][r] = basis[r][c];
56  }
57  }
58 
59  // copy traslation part
60  btVector3 origin = t.getOrigin();
61  m[3][0] = origin.getX();
62  m[3][1] = origin.getY();
63  m[3][2] = origin.getZ();
64 
65  // set last row
66  m[0][3] = 0.0f;
67  m[1][3] = 0.0f;
68  m[2][3] = 0.0f;
69  m[3][3] = 1.0f;
70  return m;
71 }
72 
73 inline btVector3 rotateVector(const btQuaternion& q, const btVector3& vec) {
74  return glmToBullet(bulletToGLM(q) * bulletToGLM(vec));
75 }
76 
77 inline btVector3 clampLength(const btVector3& v, const float& maxLength) {
78  if (v.length() > maxLength) {
79  return v.normalized() * maxLength;
80  } else {
81  return v;
82  }
83 }
84 
85 #endif // hifi_BulletUtil_h