summaryrefslogtreecommitdiff
path: root/src/math-helpers.cpp
blob: d153ce503b72e5c9116ef0564a463774ca5e9322 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
#include "math-helpers.hpp"

// https://pybullet.org/Bullet/phpBB3/viewtopic.php?t=11462

void GlmToBullet(const glm::vec3 &vec, btVector3 &btVec) {
	btVec.setX(vec.x);
	btVec.setY(vec.y);
	btVec.setZ(vec.z);
	btVec.setW(0.f);
}

void GlmToBullet(const glm::quat &quat, btQuaternion &btQuat) {
	btQuat.setX(quat.x);
	btQuat.setY(quat.y);
	btQuat.setZ(quat.z);
	btQuat.setW(quat.w);
}

void BulletToGlm(const btVector3 &vec, glm::vec3 &glmVec) {
	glmVec.x = vec.getX();
	glmVec.y = vec.getY();
	glmVec.z = vec.getZ();
}

void BulletToGlm(const btQuaternion &quat, glm::quat &glmQuat) {
	glmQuat.x = quat.getX();
	glmQuat.y = quat.getY();
	glmQuat.z = quat.getZ();
	glmQuat.w = quat.getW();
}

void BulletToGlm(const btTransform &trans, glm::mat4 &glmMat4) {
	const btMatrix3x3& basis = trans.getBasis();
	// rotation
	for (int r = 0; r < 3; r++) {
		for (int c = 0; c < 3; c++) {
			glmMat4[c][r] = basis[r][c];
		}
	} // translation
	btVector3 origin = trans.getOrigin();
	glmMat4[3][0] = origin.getX();
	glmMat4[3][1] = origin.getY();
	glmMat4[3][2] = origin.getZ();
	// unit scale
	glmMat4[0][3] = 0.0f;
	glmMat4[1][3] = 0.0f;
	glmMat4[2][3] = 0.0f;
	glmMat4[3][3] = 1.0f;
}

template<typename T>
T log_interp_T(T min_value, T max_value, T t) {
	T start = log10(min_value);
	T end   = log10(max_value);
	T intrp = start + (t * (end - start));
	return pow(T(10), intrp);
}

float log_interp(float min_value, float max_value, float t) {
	return log_interp_T<float>(min_value, max_value, t);
}

double log_interp(double min_value, double max_value, double t) {
	return log_interp_T<double>(min_value, max_value, t);
}