12 #ifndef hifi_BulletUtil_h
13 #define hifi_BulletUtil_h
15 #include <btBulletDynamicsCommon.h>
16 #include <glm/glm.hpp>
17 #include <glm/gtc/quaternion.hpp>
19 inline glm::vec3 bulletToGLM(
const btVector3& b) {
20 return glm::vec3(b.getX(), b.getY(), b.getZ());
23 inline glm::quat bulletToGLM(
const btQuaternion& b) {
24 return glm::quat(b.getW(), b.getX(), b.getY(), b.getZ());
27 inline btVector3 glmToBullet(
const glm::vec3& g) {
28 return btVector3(g.x, g.y, g.z);
31 inline btQuaternion glmToBullet(
const glm::quat& g) {
32 return btQuaternion(g.x, g.y, g.z, g.w);
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]);
43 inline btTransform glmToBullet(
const glm::mat4& m) {
45 return btTransform(glmToBullet(m3), glmToBullet(glm::vec3(m[3][0], m[3][1], m[3][2])));
48 inline glm::mat4 bulletToGLM(
const btTransform& t) {
51 const btMatrix3x3& basis = t.getBasis();
53 for (
int r = 0; r < 3; r++) {
54 for (
int c = 0; c < 3; c++) {
55 m[c][r] = basis[r][c];
60 btVector3 origin = t.getOrigin();
61 m[3][0] = origin.getX();
62 m[3][1] = origin.getY();
63 m[3][2] = origin.getZ();
73 inline btVector3 rotateVector(
const btQuaternion& q,
const btVector3& vec) {
74 return glmToBullet(bulletToGLM(q) * bulletToGLM(vec));
77 inline btVector3 clampLength(
const btVector3& v,
const float& maxLength) {
78 if (v.length() > maxLength) {
79 return v.normalized() * maxLength;