first commit
This commit is contained in:
108
include/bounce/common/draw.h
Normal file
108
include/bounce/common/draw.h
Normal file
@@ -0,0 +1,108 @@
|
||||
/*
|
||||
* Copyright (c) 2016-2016 Irlan Robson http://www.irlan.net
|
||||
*
|
||||
* This software is provided 'as-is', without any express or implied
|
||||
* warranty. In no event will the authors be held liable for any damages
|
||||
* arising from the use of this software.
|
||||
* Permission is granted to anyone to use this software for any purpose,
|
||||
* including commercial applications, and to alter it and redistribute it
|
||||
* freely, subject to the following restrictions:
|
||||
* 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.
|
||||
* 2. Altered source versions must be plainly marked as such, and must not be
|
||||
* misrepresented as being the original software.
|
||||
* 3. This notice may not be removed or altered from any source distribution.
|
||||
*/
|
||||
|
||||
#ifndef B3_DRAW_H
|
||||
#define B3_DRAW_H
|
||||
|
||||
#include <bounce\common\math\math.h>
|
||||
#include <bounce\collision\shapes\aabb3.h>
|
||||
|
||||
// Color channels used by the debug b3Draw interface.
|
||||
struct b3Color
|
||||
{
|
||||
b3Color() { }
|
||||
|
||||
b3Color(float32 R, float32 G, float32 B, float32 A = 1.0f) : r(R), g(G), b(B), a(A) { }
|
||||
|
||||
float32 r, g, b, a;
|
||||
};
|
||||
|
||||
// Implement this interface and set to a world so it can b3Draw the physics entities.
|
||||
class b3Draw
|
||||
{
|
||||
public :
|
||||
// Bit flags to tell the world what needs to be b3Draw.
|
||||
enum b3Flags
|
||||
{
|
||||
e_shapesFlag = 0x0001,
|
||||
e_centerOfMassesFlag = 0x0002,
|
||||
e_jointsFlag = 0x0004,
|
||||
e_contactPointsFlag = 0x0008,
|
||||
e_contactNormalsFlag = 0x0010,
|
||||
e_contactTangentsFlag = 0x0020,
|
||||
e_aabbsFlag = 0x0040,
|
||||
};
|
||||
|
||||
b3Draw()
|
||||
{
|
||||
m_flags = 0;
|
||||
}
|
||||
|
||||
~b3Draw()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
void SetFlags(u32 flags);
|
||||
void AppendFlags(u32 flags);
|
||||
|
||||
// Draw a point.
|
||||
virtual void DrawPoint(const b3Vec3& point, const b3Color& color) = 0;
|
||||
|
||||
// Draw a line segment.
|
||||
virtual void DrawSegment(const b3Vec3& a, const b3Vec3& b, const b3Color& color) = 0;
|
||||
|
||||
// Draw a polygon with vertices ordered CCW.
|
||||
virtual void DrawPolygon(const b3Vec3* vertices, u32 count, const b3Color& color) = 0;
|
||||
|
||||
// Draw a solid polygon with vertices ordered CCW.
|
||||
virtual void DrawSolidPolygon(const b3Vec3* vertices, u32 count, const b3Color& color) = 0;
|
||||
|
||||
// Draw a circle with center, normal, and radius.
|
||||
virtual void DrawCircle(const b3Vec3& normal, const b3Vec3& center, float32 radius, const b3Color& color) = 0;
|
||||
|
||||
// Draw a solid circle with center, normal, and radius.
|
||||
virtual void DrawSolidCircle(const b3Vec3& normal, const b3Vec3& center, float32 radius, const b3Color& color) = 0;
|
||||
|
||||
// Draw a sphere with center and radius.
|
||||
virtual void DrawSphere(const b3Vec3& center, float32 radius, const b3Color& color) = 0;
|
||||
|
||||
// Draw a solid sphere with center and radius.
|
||||
virtual void DrawSolidSphere(const b3Vec3& center, float32 radius, const b3Color& color) = 0;
|
||||
|
||||
// Draw a AABB.
|
||||
virtual void DrawAABB(const b3AABB3& aabb, const b3Color& color) = 0;
|
||||
|
||||
// Draw a b3Transform.
|
||||
virtual void DrawTransform(const b3Transform& xf) = 0;
|
||||
|
||||
// Debug b3Draw flags.
|
||||
u32 m_flags;
|
||||
};
|
||||
|
||||
inline void b3Draw::SetFlags(u32 flags)
|
||||
{
|
||||
m_flags = flags;
|
||||
}
|
||||
|
||||
inline void b3Draw::AppendFlags(u32 flags)
|
||||
{
|
||||
m_flags |= flags;
|
||||
}
|
||||
|
||||
#endif
|
190
include/bounce/common/geometry.h
Normal file
190
include/bounce/common/geometry.h
Normal file
@@ -0,0 +1,190 @@
|
||||
/*
|
||||
* Copyright (c) 2016-2016 Irlan Robson http://www.irlan.net
|
||||
*
|
||||
* This software is provided 'as-is', without any express or implied
|
||||
* warranty. In no event will the authors be held liable for any damages
|
||||
* arising from the use of this software.
|
||||
* Permission is granted to anyone to use this software for any purpose,
|
||||
* including commercial applications, and to alter it and redistribute it
|
||||
* freely, subject to the following restrictions:
|
||||
* 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.
|
||||
* 2. Altered source versions must be plainly marked as such, and must not be
|
||||
* misrepresented as being the original software.
|
||||
* 3. This notice may not be removed or altered from any source distribution.
|
||||
*/
|
||||
|
||||
#ifndef B3_GEOMETRY_H
|
||||
#define B3_GEOMETRY_H
|
||||
|
||||
#include <bounce\common\math\math.h>
|
||||
#include <bounce\common\math\transform.h>
|
||||
|
||||
// A triangle in indexed form.
|
||||
struct b3Triangle
|
||||
{
|
||||
// Does nothing for performance.
|
||||
b3Triangle() { }
|
||||
|
||||
// Set this triangle from three vertices.
|
||||
b3Triangle(u32 _v1, u32 _v2, u32 _v3)
|
||||
{
|
||||
v1 = _v1;
|
||||
v2 = _v2;
|
||||
v3 = _v3;
|
||||
}
|
||||
|
||||
// Set this triangle from three vertices.
|
||||
void Set(u32 _v1, u32 _v2, u32 _v3)
|
||||
{
|
||||
v1 = _v1;
|
||||
v2 = _v2;
|
||||
v3 = _v3;
|
||||
}
|
||||
|
||||
// Test if this triangle contains a given vertex.
|
||||
bool TestVertex(u32 v) const
|
||||
{
|
||||
return v == v1 || v == v2 || v == v3;
|
||||
}
|
||||
|
||||
// Test if this triangle contains two vertices.
|
||||
bool TestEdge(u32 _v1, u32 _v2) const
|
||||
{
|
||||
return TestVertex(_v1) && TestVertex(_v2);
|
||||
}
|
||||
|
||||
u32 v1, v2, v3;
|
||||
};
|
||||
|
||||
// A plane in constant normal form.
|
||||
// dot(n, p) - d = 0.
|
||||
struct b3Plane
|
||||
{
|
||||
// Does nothing for performance.
|
||||
b3Plane() { }
|
||||
|
||||
// Set this plane from a normal and a signed distance from its origin.
|
||||
b3Plane(const b3Vec3& _normal, float32 _offset)
|
||||
{
|
||||
normal = _normal;
|
||||
offset = _offset;
|
||||
}
|
||||
|
||||
// Set this plane from a normal and a point on the plane.
|
||||
b3Plane(const b3Vec3& _normal, const b3Vec3& _point)
|
||||
{
|
||||
normal = _normal;
|
||||
offset = b3Dot(_normal, _point);
|
||||
}
|
||||
|
||||
// Compute this plane from three non-colinear points.
|
||||
b3Plane(const b3Vec3& A, const b3Vec3& B, const b3Vec3& C)
|
||||
{
|
||||
b3Vec3 N = b3Cross(B - A, C - A);
|
||||
normal = b3Normalize(N);
|
||||
offset = b3Dot(normal, A);
|
||||
}
|
||||
|
||||
b3Vec3 normal;
|
||||
float32 offset;
|
||||
};
|
||||
|
||||
// Transform a plane by a given frame.
|
||||
inline b3Plane operator*(const b3Transform& T, const b3Plane& plane)
|
||||
{
|
||||
b3Vec3 normal = b3Mul(T.rotation, plane.normal);
|
||||
return b3Plane(normal, plane.offset + b3Dot(normal, T.position));
|
||||
}
|
||||
|
||||
// Transform a plane by a given frame.
|
||||
inline b3Plane b3Mul(const b3Transform& T, const b3Plane& plane)
|
||||
{
|
||||
b3Vec3 normal = b3Mul(T.rotation, plane.normal);
|
||||
return b3Plane(normal, plane.offset + b3Dot(normal, T.position));
|
||||
}
|
||||
|
||||
inline float32 b3Distance(const b3Vec3& P, const b3Plane& plane)
|
||||
{
|
||||
return b3Dot(plane.normal, P) - plane.offset;
|
||||
}
|
||||
|
||||
// Project a point onto a plane.
|
||||
// The plane must be normalized.
|
||||
inline b3Vec3 b3Project(const b3Vec3& P, const b3Plane& plane)
|
||||
{
|
||||
float32 fraction = b3Distance(P, plane);
|
||||
return P - fraction * plane.normal;
|
||||
}
|
||||
|
||||
// Compute barycentric coordinates (u, v) for point Q to segment AB.
|
||||
// The last output value is the divisor.
|
||||
inline void b3Barycentric(float32 out[3],
|
||||
const b3Vec3& A, const b3Vec3& B,
|
||||
const b3Vec3& Q)
|
||||
{
|
||||
b3Vec3 AB = B - A;
|
||||
b3Vec3 QA = A - Q;
|
||||
b3Vec3 QB = B - Q;
|
||||
//float32 divisor = b3Dot(AB, AB);
|
||||
out[0] = b3Dot(QB, AB);
|
||||
out[1] = -b3Dot(QA, AB);
|
||||
out[2] = out[0] + out[1];
|
||||
}
|
||||
|
||||
// Compute barycentric coordinates (u, v, w) for point Q to triangle ABC.
|
||||
// The last output value is the divisor.
|
||||
inline void b3Barycentric(float32 out[4],
|
||||
const b3Vec3& A, const b3Vec3& B, const b3Vec3& C,
|
||||
const b3Vec3& Q)
|
||||
{
|
||||
// RTCD, 140.
|
||||
b3Vec3 AB = B - A;
|
||||
b3Vec3 AC = C - A;
|
||||
|
||||
b3Vec3 QA = A - Q;
|
||||
b3Vec3 QB = B - Q;
|
||||
b3Vec3 QC = C - Q;
|
||||
|
||||
b3Vec3 QB_x_QC = b3Cross(QB, QC);
|
||||
b3Vec3 QC_x_QA = b3Cross(QC, QA);
|
||||
b3Vec3 QA_x_QB = b3Cross(QA, QB);
|
||||
|
||||
b3Vec3 AB_x_AC = b3Cross(AB, AC);
|
||||
//float32 divisor = b3Dot(AB_x_AC, AB_x_AC);
|
||||
|
||||
out[0] = b3Dot(QB_x_QC, AB_x_AC);
|
||||
out[1] = b3Dot(QC_x_QA, AB_x_AC);
|
||||
out[2] = b3Dot(QA_x_QB, AB_x_AC);
|
||||
out[3] = out[0] + out[1] + out[2];
|
||||
}
|
||||
|
||||
// Compute barycentric coordinates (u, v, w, x) for point Q to tetrahedron ABCD.
|
||||
// The last output value is the (positive) divisor.
|
||||
inline void b3Barycentric(float32 out[5],
|
||||
const b3Vec3& A, const b3Vec3& B, const b3Vec3& C, const b3Vec3& D,
|
||||
const b3Vec3& Q)
|
||||
{
|
||||
// RTCD, 48, 49.
|
||||
b3Vec3 AB = B - A;
|
||||
b3Vec3 AC = C - A;
|
||||
b3Vec3 AD = D - A;
|
||||
|
||||
b3Vec3 QA = A - Q;
|
||||
b3Vec3 QB = B - Q;
|
||||
b3Vec3 QC = C - Q;
|
||||
b3Vec3 QD = D - Q;
|
||||
|
||||
float32 divisor = b3Det(AB, AC, AD);
|
||||
float32 sign = b3Sign(divisor);
|
||||
|
||||
out[0] = sign * b3Det(QB, QC, QD);
|
||||
out[1] = sign * b3Det(QA, QD, QC);
|
||||
out[2] = sign * b3Det(QA, QB, QD);
|
||||
out[3] = sign * b3Det(QA, QC, QB);
|
||||
out[4] = sign * divisor;
|
||||
}
|
||||
|
||||
#endif
|
85
include/bounce/common/math/mat.h
Normal file
85
include/bounce/common/math/mat.h
Normal file
@@ -0,0 +1,85 @@
|
||||
/*
|
||||
* Copyright (c) 2016-2016 Irlan Robson http://www.irlan.net
|
||||
*
|
||||
* This software is provided 'as-is', without any express or implied
|
||||
* warranty. In no event will the authors be held liable for any damages
|
||||
* arising from the use of this software.
|
||||
* Permission is granted to anyone to use this software for any purpose,
|
||||
* including commercial applications, and to alter it and redistribute it
|
||||
* freely, subject to the following restrictions:
|
||||
* 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.
|
||||
* 2. Altered source versions must be plainly marked as such, and must not be
|
||||
* misrepresented as being the original software.
|
||||
* 3. This notice may not be removed or altered from any source distribution.
|
||||
*/
|
||||
|
||||
#ifndef B3_MAT_H
|
||||
#define B3_MAT_H
|
||||
|
||||
#include <bounce\common\math\math.h>
|
||||
|
||||
// A vector stored in column-major order.
|
||||
template<u32 n>
|
||||
struct b3Vec
|
||||
{
|
||||
b3Vec() { }
|
||||
|
||||
const float32& operator[](u32 i) const
|
||||
{
|
||||
return e[i];
|
||||
}
|
||||
|
||||
float32& operator[](u32 i)
|
||||
{
|
||||
return e[i];
|
||||
}
|
||||
|
||||
void operator+=(const b3Vec<n>& v)
|
||||
{
|
||||
for (u32 i = 0; i < n; ++i)
|
||||
{
|
||||
e[i] += v[i];
|
||||
}
|
||||
}
|
||||
|
||||
float32 e[n];
|
||||
};
|
||||
|
||||
template<u32 n>
|
||||
inline b3Vec<n> operator-(const b3Vec<n>& v)
|
||||
{
|
||||
b3Vec<n> result;
|
||||
for (u32 i = 0; i < n; ++i)
|
||||
{
|
||||
result[i] = -v[i];
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
// A matrix stored in column-major order.
|
||||
template<u32 n, u32 m>
|
||||
struct b3Mat
|
||||
{
|
||||
b3Mat() { }
|
||||
|
||||
const float32& operator()(u32 i, u32 j) const
|
||||
{
|
||||
return e[i + n * j];
|
||||
}
|
||||
|
||||
float32& operator()(u32 i, u32 j)
|
||||
{
|
||||
return e[i + n * j];
|
||||
}
|
||||
|
||||
float32 e[n * m];
|
||||
};
|
||||
|
||||
// Solve Ax = b.
|
||||
// Warning: Make sure to pass a copy of A to the function. It will be invalidated.
|
||||
bool b3Solve(float32* b, float32* A, u32 n);
|
||||
|
||||
#endif
|
59
include/bounce/common/math/mat22.h
Normal file
59
include/bounce/common/math/mat22.h
Normal file
@@ -0,0 +1,59 @@
|
||||
/*
|
||||
* Copyright (c) 2016-2016 Irlan Robson http://www.irlan.net
|
||||
*
|
||||
* This software is provided 'as-is', without any express or implied
|
||||
* warranty. In no event will the authors be held liable for any damages
|
||||
* arising from the use of this software.
|
||||
* Permission is granted to anyone to use this software for any purpose,
|
||||
* including commercial applications, and to alter it and redistribute it
|
||||
* freely, subject to the following restrictions:
|
||||
* 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.
|
||||
* 2. Altered source versions must be plainly marked as such, and must not be
|
||||
* misrepresented as being the original software.
|
||||
* 3. This notice may not be removed or altered from any source distribution.
|
||||
*/
|
||||
|
||||
#ifndef B3_MAT_22_H
|
||||
#define B3_MAT_22_H
|
||||
|
||||
#include <bounce\common\math\vec2.h>
|
||||
|
||||
// A 2-by-2 matrix stored in column-major order.
|
||||
struct b3Mat22
|
||||
{
|
||||
// Does nothing for performance.
|
||||
b3Mat22() { }
|
||||
|
||||
// Set this matrix from two vector elements.
|
||||
b3Mat22(const b3Vec2& _x, const b3Vec2& _y) : x(_x), y(_y) { }
|
||||
|
||||
// Solve Ax = b.
|
||||
// It doesn't compute the inverse.
|
||||
// Therefore, is more efficient.
|
||||
// Returns the zero vector if the matrix is singular.
|
||||
b3Vec2 Solve(const b3Vec2& b) const;
|
||||
|
||||
b3Vec2 x, y;
|
||||
};
|
||||
|
||||
// Multiply a matrix times a vector.
|
||||
inline b3Vec2 operator*(const b3Mat22& A, const b3Vec2& v)
|
||||
{
|
||||
return v.x * A.x + v.y * A.y;
|
||||
}
|
||||
|
||||
// Multiply a matrix times a vector.
|
||||
inline b3Vec2 b3Mul(const b3Mat22& A, const b3Vec2& v)
|
||||
{
|
||||
return v.x * A.x + v.y * A.y;
|
||||
}
|
||||
|
||||
// Invert a matrix.
|
||||
// If the matrix determinant is zero this returns
|
||||
// the zero matrix.
|
||||
inline b3Mat22 b3Inverse(const b3Mat22& A);
|
||||
|
||||
#endif
|
257
include/bounce/common/math/mat33.h
Normal file
257
include/bounce/common/math/mat33.h
Normal file
@@ -0,0 +1,257 @@
|
||||
/*
|
||||
* Copyright (c) 2016-2016 Irlan Robson http://www.irlan.net
|
||||
*
|
||||
* This software is provided 'as-is', without any express or implied
|
||||
* warranty. In no event will the authors be held liable for any damages
|
||||
* arising from the use of this software.
|
||||
* Permission is granted to anyone to use this software for any purpose,
|
||||
* including commercial applications, and to alter it and redistribute it
|
||||
* freely, subject to the following restrictions:
|
||||
* 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.
|
||||
* 2. Altered source versions must be plainly marked as such, and must not be
|
||||
* misrepresented as being the original software.
|
||||
* 3. This notice may not be removed or altered from any source distribution.
|
||||
*/
|
||||
|
||||
#ifndef B3_MAT_33_H
|
||||
#define B3_MAT_33_H
|
||||
|
||||
#include <bounce\common\math\vec3.h>
|
||||
|
||||
// A 3-by-3 matrix stored in column-major order.
|
||||
struct b3Mat33
|
||||
{
|
||||
// Does nothing for performance.
|
||||
b3Mat33() { }
|
||||
|
||||
// Set this matrix from three elements.
|
||||
b3Mat33(const b3Vec3& _x, const b3Vec3& _y, const b3Vec3& _z) : x(_x), y(_y), z(_z) { }
|
||||
|
||||
// Read an indexed column vector from this matrix.
|
||||
const b3Vec3& operator[](u32 i) const
|
||||
{
|
||||
return (&x)[i];
|
||||
}
|
||||
|
||||
// Write an indexed column vector to this matrix.
|
||||
b3Vec3& operator[](u32 i)
|
||||
{
|
||||
return (&x)[i];
|
||||
}
|
||||
|
||||
// Add a matrix to this matrix.
|
||||
void operator+=(const b3Mat33& B)
|
||||
{
|
||||
x += B.x;
|
||||
y += B.y;
|
||||
z += B.z;
|
||||
}
|
||||
|
||||
// Set this matrix to the zero matrix.
|
||||
void SetZero()
|
||||
{
|
||||
x.SetZero();
|
||||
y.SetZero();
|
||||
z.SetZero();
|
||||
}
|
||||
|
||||
// Set this matrix to the identity matrix.
|
||||
void SetIdentity()
|
||||
{
|
||||
x.Set(1.0f, 0.0f, 0.0f);
|
||||
y.Set(0.0f, 1.0f, 0.0f);
|
||||
z.Set(0.0f, 0.0f, 1.0f);
|
||||
}
|
||||
|
||||
// Solve Ax = b.
|
||||
// It doesn't compute the inverse.
|
||||
// Therefore, is more efficient.
|
||||
// Returns the zero vector if the matrix is singular.
|
||||
b3Vec3 Solve(const b3Vec3& b) const;
|
||||
|
||||
float32 operator()(u32 i, u32 j) const
|
||||
{
|
||||
return (&x.x)[i + 3 * j];
|
||||
}
|
||||
|
||||
b3Vec3 x, y, z;
|
||||
};
|
||||
|
||||
// Add two matrices.
|
||||
inline b3Mat33 operator+(const b3Mat33& A, const b3Mat33& B)
|
||||
{
|
||||
return b3Mat33(A.x + B.x, A.y + B.y, A.z + B.z);
|
||||
}
|
||||
|
||||
// Subtract two matrices.
|
||||
inline b3Mat33 operator-(const b3Mat33& A, const b3Mat33& B)
|
||||
{
|
||||
return b3Mat33(A.x - B.x, A.y - B.y, A.z - B.z);
|
||||
}
|
||||
|
||||
// Multiply a scalar times a matrix.
|
||||
inline b3Mat33 operator*(float32 s, const b3Mat33& A)
|
||||
{
|
||||
return b3Mat33(s * A.x, s * A.y, s * A.z);
|
||||
}
|
||||
|
||||
// Negate a matrix.
|
||||
inline b3Mat33 operator-(const b3Mat33& A)
|
||||
{
|
||||
return -1.0f * A;
|
||||
}
|
||||
|
||||
// Multiply a matrix times a vector. If the matrix
|
||||
// represents a rotation this transforms the vector
|
||||
// from one frame to another.
|
||||
inline b3Vec3 operator*(const b3Mat33& A, const b3Vec3& v)
|
||||
{
|
||||
return v.x * A.x + v.y * A.y + v.z * A.z;
|
||||
}
|
||||
|
||||
// Multiply two matrices.
|
||||
inline b3Mat33 operator*(const b3Mat33& A, const b3Mat33& B)
|
||||
{
|
||||
return b3Mat33(A * B.x, A * B.y, A * B.z);
|
||||
}
|
||||
|
||||
// Multiply a matrix times a vector. If the matrix
|
||||
// represents a rotation this transforms the vector
|
||||
// from one frame to another.
|
||||
inline b3Vec3 b3Mul(const b3Mat33& A, const b3Vec3& v)
|
||||
{
|
||||
return v.x * A.x + v.y * A.y + v.z * A.z;
|
||||
}
|
||||
|
||||
// Multiply two matrices.
|
||||
inline b3Mat33 b3Mul(const b3Mat33& A, const b3Mat33& B)
|
||||
{
|
||||
return b3Mat33( b3Mul(A, B.x), b3Mul(A, B.y), b3Mul(A, B.z));
|
||||
}
|
||||
|
||||
// Multiply the transpose of a matrix times a vector. If
|
||||
// the matrix represents a rotation frame this transforms the
|
||||
// vector from one frame to another (inverse b3Transform).
|
||||
inline b3Vec3 b3MulT(const b3Mat33& A, const b3Vec3& v)
|
||||
{
|
||||
return b3Vec3(b3Dot(A.x, v), b3Dot(A.y, v), b3Dot(A.z, v));
|
||||
}
|
||||
|
||||
// Multiply the transpose of a matrix times another.
|
||||
inline b3Mat33 b3MulT(const b3Mat33& A, const b3Mat33& B)
|
||||
{
|
||||
return b3Mat33(
|
||||
b3Vec3(b3Dot(A.x, B.x), b3Dot(A.y, B.x), b3Dot(A.z, B.x)),
|
||||
b3Vec3(b3Dot(A.x, B.y), b3Dot(A.y, B.y), b3Dot(A.z, B.y)),
|
||||
b3Vec3(b3Dot(A.x, B.z), b3Dot(A.y, B.z), b3Dot(A.z, B.z)));
|
||||
}
|
||||
|
||||
// Transpose a matrix.
|
||||
inline b3Mat33 b3Transpose(const b3Mat33& A)
|
||||
{
|
||||
return b3Mat33(
|
||||
b3Vec3(A.x.x, A.y.x, A.z.x),
|
||||
b3Vec3(A.x.y, A.y.y, A.z.y),
|
||||
b3Vec3(A.x.z, A.y.z, A.z.z)
|
||||
);
|
||||
}
|
||||
|
||||
// Uniform scale matrix.
|
||||
inline b3Mat33 b3Diagonal(float32 s)
|
||||
{
|
||||
return b3Mat33(
|
||||
b3Vec3(s, 0.0f, 0.0f),
|
||||
b3Vec3(0.0f, s, 0.0f),
|
||||
b3Vec3(0.0f, 0.0f, s)
|
||||
);
|
||||
}
|
||||
|
||||
// Uniform or non-uniform scale matrix.
|
||||
inline b3Mat33 b3Diagonal(float32 x, float32 y, float32 z)
|
||||
{
|
||||
return b3Mat33(
|
||||
b3Vec3(x, 0.0f, 0.0f),
|
||||
b3Vec3(0.0f, y, 0.0f),
|
||||
b3Vec3(0.0f, 0.0f, z)
|
||||
);
|
||||
}
|
||||
|
||||
// Invert a matrix.
|
||||
// If the matrix is singular this
|
||||
// returns the zero matrix.
|
||||
b3Mat33 b3Inverse(const b3Mat33& A);
|
||||
|
||||
// Return a skew (anti-symmetric) matrix for a vector.
|
||||
inline b3Mat33 b3Skew(const b3Vec3& v)
|
||||
{
|
||||
return b3Mat33(
|
||||
b3Vec3(0.0f, v.z, -v.y),
|
||||
b3Vec3(-v.z, 0.0f, v.x),
|
||||
b3Vec3(v.y, -v.x, 0.0f)
|
||||
);
|
||||
}
|
||||
|
||||
// Compute the dot product of two vectors.
|
||||
inline float32 b3Inner(const b3Vec3& a, const b3Vec3& b)
|
||||
{
|
||||
return b3Dot(a, b);
|
||||
}
|
||||
|
||||
// Compute the outer product of two vectors.
|
||||
// The result is a matrix A = a * b^T.
|
||||
inline b3Mat33 b3Outer(const b3Vec3& a, const b3Vec3& b)
|
||||
{
|
||||
return b3Mat33(b.x * a, b.y * a, b.z * a);
|
||||
}
|
||||
|
||||
// Move an inertia tensor from the its current center
|
||||
// to another.
|
||||
inline b3Mat33 b3MoveToCOM(const b3Mat33& inertia, float32 mass, const b3Vec3& center)
|
||||
{
|
||||
// Paralell Axis Theorem
|
||||
// J = I + m * dot(r, r) * E - outer(r, r)
|
||||
// where
|
||||
// I - inertia about the center of mass
|
||||
// m - mass
|
||||
// E - identity 3x3
|
||||
// r - displacement vector from the current com to the new com
|
||||
// J - inertia tensor at the new center of rotation
|
||||
float32 dd = b3Dot(center, center);
|
||||
b3Mat33 A = b3Diagonal(mass * dd);
|
||||
b3Mat33 B = b3Outer(center, center);
|
||||
return inertia + A - B;
|
||||
}
|
||||
|
||||
// Compute the inertia matrix of a body measured in
|
||||
// inertial frame (variable over time) given the
|
||||
// inertia matrix in body-fixed frame (constant)
|
||||
// and a rotation matrix representing the orientation
|
||||
// of the body frame relative to the inertial frame.
|
||||
inline b3Mat33 b3RotateToFrame(const b3Mat33& inertia, const b3Mat33& rotation)
|
||||
{
|
||||
return rotation * inertia * b3Transpose(rotation);
|
||||
}
|
||||
|
||||
// Compute an orthogonal basis given one of its vectors.
|
||||
// The vector must be normalized.
|
||||
inline b3Mat33 b3Basis(const b3Vec3& a)
|
||||
{
|
||||
// Box2D
|
||||
b3Mat33 A;
|
||||
if (b3Abs(a.x) >= float32(0.57735027))
|
||||
{
|
||||
A.y.Set(a.y, -a.x, 0.0f);
|
||||
}
|
||||
else
|
||||
{
|
||||
A.y.Set(0.0f, a.z, -a.y);
|
||||
}
|
||||
A.y = b3Normalize(A.y);
|
||||
A.z = b3Cross(a, A.y);
|
||||
return A;
|
||||
}
|
||||
|
||||
#endif
|
96
include/bounce/common/math/math.h
Normal file
96
include/bounce/common/math/math.h
Normal file
@@ -0,0 +1,96 @@
|
||||
/*
|
||||
* Copyright (c) 2016-2016 Irlan Robson http://www.irlan.net
|
||||
*
|
||||
* This software is provided 'as-is', without any express or implied
|
||||
* warranty. In no event will the authors be held liable for any damages
|
||||
* arising from the use of this software.
|
||||
* Permission is granted to anyone to use this software for any purpose,
|
||||
* including commercial applications, and to alter it and redistribute it
|
||||
* freely, subject to the following restrictions:
|
||||
* 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.
|
||||
* 2. Altered source versions must be plainly marked as such, and must not be
|
||||
* misrepresented as being the original software.
|
||||
* 3. This notice may not be removed or altered from any source distribution.
|
||||
*/
|
||||
|
||||
#ifndef B3_MATH_H
|
||||
#define B3_MATH_H
|
||||
|
||||
#include <cmath>
|
||||
#include <bounce\common\settings.h>
|
||||
|
||||
inline bool b3IsValid(float32 fx)
|
||||
{
|
||||
u32 ix = *(u32*)(&fx);
|
||||
return (ix & 0x7F800000) != 0x7F800000;
|
||||
}
|
||||
|
||||
inline float32 b3Sqrt(float32 x)
|
||||
{
|
||||
return sqrtf(x);
|
||||
}
|
||||
|
||||
template <class T>
|
||||
inline T b3Abs(T x)
|
||||
{
|
||||
return abs(x);
|
||||
}
|
||||
|
||||
template <class T>
|
||||
inline T b3Min(T a, T b)
|
||||
{
|
||||
return a < b ? a : b;
|
||||
}
|
||||
|
||||
template <class T>
|
||||
inline T b3Max(T a, T b)
|
||||
{
|
||||
return a > b ? a : b;
|
||||
}
|
||||
|
||||
template <class T>
|
||||
inline T b3Clamp(T a, T low, T high)
|
||||
{
|
||||
return b3Max(low, b3Min(a, high));
|
||||
}
|
||||
|
||||
template <class T>
|
||||
inline void b3Swap(T& a, T& b)
|
||||
{
|
||||
T tmp = a;
|
||||
a = b;
|
||||
b = tmp;
|
||||
}
|
||||
|
||||
template <class T>
|
||||
inline T b3Sign(T x)
|
||||
{
|
||||
return T(T(0) < x) - T(T(x) < T(0));
|
||||
}
|
||||
|
||||
template <class T>
|
||||
inline u32 b3UniqueCount(T* V, u32 N)
|
||||
{
|
||||
u32 count = 0;
|
||||
for (u32 i = 0; i < N; ++i)
|
||||
{
|
||||
u32 j;
|
||||
for (j = 0; j < N; ++j)
|
||||
{
|
||||
if (V[i] == V[j])
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (i == j)
|
||||
{
|
||||
++count;
|
||||
}
|
||||
}
|
||||
return count;
|
||||
}
|
||||
|
||||
#endif
|
237
include/bounce/common/math/quat.h
Normal file
237
include/bounce/common/math/quat.h
Normal file
@@ -0,0 +1,237 @@
|
||||
/*
|
||||
* Copyright (c) 2016-2016 Irlan Robson http://www.irlan.net
|
||||
*
|
||||
* This software is provided 'as-is', without any express or implied
|
||||
* warranty. In no event will the authors be held liable for any damages
|
||||
* arising from the use of this software.
|
||||
* Permission is granted to anyone to use this software for any purpose,
|
||||
* including commercial applications, and to alter it and redistribute it
|
||||
* freely, subject to the following restrictions:
|
||||
* 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.
|
||||
* 2. Altered source versions must be plainly marked as such, and must not be
|
||||
* misrepresented as being the original software.
|
||||
* 3. This notice may not be removed or altered from any source distribution.
|
||||
*/
|
||||
|
||||
#ifndef B3_QUAT_H
|
||||
#define B3_QUAT_H
|
||||
|
||||
#include <bounce\common\math\math.h>
|
||||
#include <bounce\common\math\mat33.h>
|
||||
|
||||
// A quaternion represents an orientation with 4 real numbers.
|
||||
struct b3Quat
|
||||
{
|
||||
// Default constructor does nothing for performance.
|
||||
b3Quat() { }
|
||||
|
||||
// Set this quaternion from four values.
|
||||
b3Quat(float32 _x, float32 _y, float32 _z, float32 _w) : x(_x), y(_y), z(_z), w(_w) { }
|
||||
|
||||
// Set this quaternion from an axis and an angle
|
||||
// of rotation about the axis.
|
||||
b3Quat(const b3Vec3& axis, float32 angle)
|
||||
{
|
||||
float32 theta = 0.5f * angle;
|
||||
float32 s = sin(theta);
|
||||
x = s * axis.x;
|
||||
y = s * axis.y;
|
||||
z = s * axis.z;
|
||||
w = cos(theta);
|
||||
}
|
||||
|
||||
// Add a quaternion to this quaternion.
|
||||
void operator+=(const b3Quat& q)
|
||||
{
|
||||
x += q.x;
|
||||
y += q.y;
|
||||
z += q.z;
|
||||
w += q.w;
|
||||
}
|
||||
|
||||
// Subtract a quaternion from this quaternion.
|
||||
void operator-=(const b3Quat& q)
|
||||
{
|
||||
x -= q.x;
|
||||
y -= q.y;
|
||||
z -= q.z;
|
||||
w -= q.w;
|
||||
}
|
||||
|
||||
// Set this quaternion to identity.
|
||||
void SetIdentity()
|
||||
{
|
||||
x = y = z = 0.0f;
|
||||
w = 1.0f;
|
||||
}
|
||||
|
||||
// Set this quaternion from four values.
|
||||
void Set(float32 _x, float32 _y, float32 _z, float32 _w)
|
||||
{
|
||||
x = _x;
|
||||
y = _y;
|
||||
z = _z;
|
||||
w = _w;
|
||||
}
|
||||
|
||||
// Set this quaternion from an axis and an angle
|
||||
// of rotation about the axis.
|
||||
void Set(const b3Vec3& axis, float32 angle)
|
||||
{
|
||||
float32 theta = 0.5f * angle;
|
||||
float32 s = sin(theta);
|
||||
x = s * axis.x;
|
||||
y = s * axis.y;
|
||||
z = s * axis.z;
|
||||
w = cos(theta);
|
||||
}
|
||||
|
||||
// Normalize this quaternion.
|
||||
void Normalize()
|
||||
{
|
||||
float32 s = b3Sqrt(x * x + y * y + z * z + w * w);
|
||||
if (s != 0.0f)
|
||||
{
|
||||
x /= s;
|
||||
y /= s;
|
||||
z /= s;
|
||||
w /= s;
|
||||
}
|
||||
}
|
||||
|
||||
float32 x, y, z, w;
|
||||
};
|
||||
|
||||
// Add two quaternions.
|
||||
inline b3Quat operator+(const b3Quat& a, const b3Quat& b)
|
||||
{
|
||||
return b3Quat(a.x + b.x, a.y + b.y, a.z + b.z, a.w + b.w);
|
||||
}
|
||||
|
||||
// Sobtract two quaternions.
|
||||
inline b3Quat operator-(const b3Quat& a, const b3Quat& b)
|
||||
{
|
||||
return b3Quat(a.x - b.x, a.y - b.y, a.z - b.z, a.w - b.w);
|
||||
}
|
||||
|
||||
// Multiply a quaternion by a scalar.
|
||||
inline b3Quat operator*(float32 s, const b3Quat& q)
|
||||
{
|
||||
return b3Quat(s * q.x, s * q.y, s * q.z, s * q.w);
|
||||
}
|
||||
|
||||
// Negate a quaternion.
|
||||
inline b3Quat operator-(const b3Quat& q)
|
||||
{
|
||||
return b3Quat(-q.x, -q.y, -q.z, -q.w);
|
||||
}
|
||||
|
||||
// Compute a quaternion-quaternion product.
|
||||
inline b3Quat operator*(const b3Quat& a, const b3Quat& b)
|
||||
{
|
||||
return b3Quat(
|
||||
a.w * b.x + a.x * b.w + a.y * b.z - a.z * b.y,
|
||||
a.w * b.y + a.y * b.w + a.z * b.x - a.x * b.z,
|
||||
a.w * b.z + a.z * b.w + a.x * b.y - a.y * b.x,
|
||||
a.w * b.w - a.x * b.x - a.y * b.y - a.z * b.z);
|
||||
}
|
||||
|
||||
// Compute the length of a quaternion.
|
||||
inline float32 b3Length(const b3Quat& q)
|
||||
{
|
||||
return b3Sqrt(q.x * q.x + q.y * q.y + q.z * q.z + q.w * q.w);
|
||||
}
|
||||
|
||||
// Normalize a quarternion.
|
||||
inline b3Quat b3Normalize(const b3Quat& q)
|
||||
{
|
||||
float32 s = b3Length(q);
|
||||
if (s != 0.0f)
|
||||
{
|
||||
s = 1.0f / s;
|
||||
return s * q;
|
||||
}
|
||||
return b3Quat(0.0f, 0.0f, 0.0f, 1.0f);
|
||||
}
|
||||
|
||||
// Compute the dot poduct of two quaternions.
|
||||
inline float b3Dot(const b3Quat& a, const b3Quat& b)
|
||||
{
|
||||
return a.x * b.x + a.y * b.y + a.z * b.z + a.w * b.w;
|
||||
}
|
||||
|
||||
// Compute the conjugate of a quaternion.
|
||||
inline b3Quat b3Conjugate(const b3Quat& q)
|
||||
{
|
||||
return b3Quat(-q.x, -q.y, -q.z, q.w);
|
||||
}
|
||||
|
||||
// Rotate a vector by an orientation quaternion.
|
||||
inline b3Vec3 b3Mul(const b3Quat& q, const b3Vec3& v)
|
||||
{
|
||||
b3Vec3 qv(q.x, q.y, q.z);
|
||||
float32 qs = q.w;
|
||||
|
||||
b3Vec3 t = 2.0f * b3Cross(qv, v);
|
||||
return v + qs * t + b3Cross(qv, t);
|
||||
}
|
||||
|
||||
// Convert a quaternion to a 3-by-3 rotation matrix.
|
||||
inline b3Mat33 b3ConvertQuatToRot(const b3Quat& q)
|
||||
{
|
||||
float32 x = q.x, y = q.y, z = q.z, w = q.w;
|
||||
float32 x2 = x + x, y2 = y + y, z2 = z + z;
|
||||
float32 xx = x * x2, xy = x * y2, xz = x * z2;
|
||||
float32 yy = y * y2, yz = y * z2, zz = z * z2;
|
||||
float32 wx = w * x2, wy = w * y2, wz = w * z2;
|
||||
|
||||
return b3Mat33(
|
||||
b3Vec3(1.0f - (yy + zz), xy + wz, xz - wy),
|
||||
b3Vec3( xy - wz, 1.0f - (xx + zz), yz + wx),
|
||||
b3Vec3( xz + wy, yz - wx, 1.0f - (xx + yy)));
|
||||
}
|
||||
|
||||
// Perform a linear interpolation between two quaternions.
|
||||
inline b3Quat b3Lerp(const b3Quat& a, const b3Quat& b, float32 fraction)
|
||||
{
|
||||
B3_ASSERT(fraction >= 0.0f);
|
||||
B3_ASSERT(fraction <= 1.0f);
|
||||
float32 w1 = 1.0f - fraction;
|
||||
float32 w2 = fraction;
|
||||
return w1 * a + w2 * b;
|
||||
}
|
||||
|
||||
// Perform a spherical interpolation between two quaternions.
|
||||
inline b3Quat b3Slerp(const b3Quat& a, const b3Quat& b, float32 fraction)
|
||||
{
|
||||
B3_ASSERT(fraction >= 0.0f);
|
||||
B3_ASSERT(fraction <= 1.0f);
|
||||
float32 w1 = 1.0f - fraction;
|
||||
float32 w2 = fraction;
|
||||
|
||||
float32 cosine = b3Dot(a, b);
|
||||
b3Quat b2 = b;
|
||||
if (cosine <= FLT_EPSILON * FLT_EPSILON)
|
||||
{
|
||||
b2 = -b;
|
||||
cosine = -cosine;
|
||||
}
|
||||
|
||||
if (cosine > 1.0f - FLT_EPSILON)
|
||||
{
|
||||
return w1 * a + w2 * b2;
|
||||
}
|
||||
|
||||
float32 angle = acos(cosine);
|
||||
float32 sine = sin(angle);
|
||||
b3Quat q1 = sin(w1 * angle) * a;
|
||||
b3Quat q2 = sin(w2 * angle) * b2;
|
||||
float32 invSin = 1.0f / sine;
|
||||
|
||||
return invSin * (q1 + q2);
|
||||
}
|
||||
|
||||
#endif
|
160
include/bounce/common/math/transform.h
Normal file
160
include/bounce/common/math/transform.h
Normal file
@@ -0,0 +1,160 @@
|
||||
/*
|
||||
* Copyright (c) 2016-2016 Irlan Robson http://www.irlan.net
|
||||
*
|
||||
* This software is provided 'as-is', without any express or implied
|
||||
* warranty. In no event will the authors be held liable for any damages
|
||||
* arising from the use of this software.
|
||||
* Permission is granted to anyone to use this software for any purpose,
|
||||
* including commercial applications, and to alter it and redistribute it
|
||||
* freely, subject to the following restrictions:
|
||||
* 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.
|
||||
* 2. Altered source versions must be plainly marked as such, and must not be
|
||||
* misrepresented as being the original software.
|
||||
* 3. This notice may not be removed or altered from any source distribution.
|
||||
*/
|
||||
|
||||
#ifndef B3_TRANSFORM_H
|
||||
#define B3_TRANSFORM_H
|
||||
|
||||
#include <bounce\common\math\mat33.h>
|
||||
#include <bounce\common\math\quat.h>
|
||||
|
||||
// A b3Transform represents a rigid frame.
|
||||
// It has a translation representing a position
|
||||
// and a rotation representing an orientation.
|
||||
struct b3Transform
|
||||
{
|
||||
// Default ctor does nothing for performance.
|
||||
b3Transform() { }
|
||||
|
||||
// Set this b3Transform from a translation vector and an orientation
|
||||
// quaternion.
|
||||
b3Transform(const b3Vec3& p, const b3Quat& q)
|
||||
{
|
||||
position = p;
|
||||
rotation = b3ConvertQuatToRot(q);
|
||||
}
|
||||
|
||||
// Set this b3Transform to the identity.
|
||||
void SetIdentity()
|
||||
{
|
||||
position.SetZero();
|
||||
rotation.SetIdentity();
|
||||
}
|
||||
|
||||
b3Vec3 position; // in fact a translation
|
||||
b3Mat33 rotation;
|
||||
};
|
||||
|
||||
// Motion proxy for TOI computation.
|
||||
struct b3Sweep
|
||||
{
|
||||
b3Vec3 localCenter; // local center
|
||||
|
||||
b3Vec3 worldCenter0; // last world center
|
||||
b3Quat orientation0; // last orientation
|
||||
float32 t0; // last fraction between [0, 1]
|
||||
|
||||
b3Vec3 worldCenter; // world center
|
||||
b3Quat orientation; // world orientation
|
||||
|
||||
// Get this sweep b3Transform at a given time between [0, 1]
|
||||
b3Transform GetTransform(float32 t) const;
|
||||
|
||||
// Advance to a new initial state.
|
||||
void Advance(float32 t);
|
||||
};
|
||||
|
||||
inline b3Transform b3Sweep::GetTransform(float32 t) const
|
||||
{
|
||||
b3Vec3 c = (1.0f - t) * worldCenter0 + t * worldCenter;
|
||||
b3Quat q = (1.0f - t) * orientation0 + t * orientation;
|
||||
q.Normalize();
|
||||
|
||||
b3Transform xf;
|
||||
xf.rotation = b3ConvertQuatToRot(q);
|
||||
xf.position = c - b3Mul(q, localCenter);
|
||||
return xf;
|
||||
}
|
||||
|
||||
inline void b3Sweep::Advance(float32 t)
|
||||
{
|
||||
B3_ASSERT(t < 1.0f);
|
||||
float32 dt = (t - t0) / (1.0f / t0);
|
||||
worldCenter += dt * (worldCenter - worldCenter0);
|
||||
orientation += dt * (orientation - orientation0);
|
||||
orientation.Normalize();
|
||||
t0 = t;
|
||||
}
|
||||
|
||||
// Multiply a b3Transform times a vector. If the b3Transform
|
||||
// represents a frame this returns the vector in terms
|
||||
// of the frame.
|
||||
inline b3Vec3 operator*(const b3Transform& T, const b3Vec3& v)
|
||||
{
|
||||
return b3Mul(T.rotation, v) + T.position;
|
||||
}
|
||||
|
||||
// Multiply a b3Transform times another b3Transform (composed b3Transform).
|
||||
// [A y][B x] = [AB Ax+y]
|
||||
// [0 1][0 1] [0 1 ]
|
||||
inline b3Transform operator*(const b3Transform& A, const b3Transform& B)
|
||||
{
|
||||
b3Transform C;
|
||||
C.rotation = b3Mul(A.rotation, B.rotation);
|
||||
C.position = b3Mul(A.rotation, B.position) + A.position;
|
||||
return C;
|
||||
}
|
||||
|
||||
// Multiply a b3Transform times a vector.
|
||||
inline b3Vec3 b3Mul(const b3Transform& T, const b3Vec3& v)
|
||||
{
|
||||
return b3Mul(T.rotation, v) + T.position;
|
||||
}
|
||||
|
||||
// Multiply a b3Transform times another b3Transform.
|
||||
// [A y][B x] = [AB Ax+y]
|
||||
// [0 1][0 1] [0 1 ]
|
||||
inline b3Transform b3Mul(const b3Transform& A, const b3Transform& B)
|
||||
{
|
||||
b3Transform C;
|
||||
C.rotation = b3Mul(A.rotation, B.rotation);
|
||||
C.position = b3Mul(A.rotation, B.position) + A.position;
|
||||
return C;
|
||||
}
|
||||
|
||||
// Multiply the transpose of one b3Transform (inverse
|
||||
// b3Transform) times another b3Transform (composed b3Transform).
|
||||
//[A^-1 -A^-1*y][B x] = [A^-1*B A^-1(x-y)]
|
||||
//[0 1 ][0 1] [0 1 ]
|
||||
inline b3Transform b3MulT(const b3Transform& A, const b3Transform& B)
|
||||
{
|
||||
b3Transform C;
|
||||
C.rotation = b3MulT(A.rotation, B.rotation);
|
||||
C.position = b3MulT(A.rotation, B.position - A.position);
|
||||
return C;
|
||||
}
|
||||
|
||||
// Multiply the transpose of a b3Transform times a vector.
|
||||
// If the b3Transform represents a frame then this transforms
|
||||
// the vector from one frame to another (inverse b3Transform).
|
||||
//[A^-1 -A^-1*y][x] = A^-1*x - A^-1*y = A^-1 * (x - y)
|
||||
//[0 1 ][1]
|
||||
inline b3Vec3 b3MulT(const b3Transform& A, const b3Vec3& v)
|
||||
{
|
||||
return b3MulT(A.rotation, v - A.position);
|
||||
}
|
||||
|
||||
// Inverse b3Transform.
|
||||
inline b3Transform b3Inverse(const b3Transform& T)
|
||||
{
|
||||
b3Transform B;
|
||||
B.rotation = b3Transpose(T.rotation);
|
||||
B.position = b3MulT(T.rotation, -T.position);
|
||||
return B;
|
||||
}
|
||||
|
||||
#endif
|
154
include/bounce/common/math/vec2.h
Normal file
154
include/bounce/common/math/vec2.h
Normal file
@@ -0,0 +1,154 @@
|
||||
/*
|
||||
* Copyright (c) 2016-2016 Irlan Robson http://www.irlan.net
|
||||
*
|
||||
* This software is provided 'as-is', without any express or implied
|
||||
* warranty. In no event will the authors be held liable for any damages
|
||||
* arising from the use of this software.
|
||||
* Permission is granted to anyone to use this software for any purpose,
|
||||
* including commercial applications, and to alter it and redistribute it
|
||||
* freely, subject to the following restrictions:
|
||||
* 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.
|
||||
* 2. Altered source versions must be plainly marked as such, and must not be
|
||||
* misrepresented as being the original software.
|
||||
* 3. This notice may not be removed or altered from any source distribution.
|
||||
*/
|
||||
|
||||
#ifndef B3_VEC2_H
|
||||
#define B3_VEC2_H
|
||||
|
||||
#include <bounce\common\math\math.h>
|
||||
|
||||
// A 2D column vector.
|
||||
struct b3Vec2
|
||||
{
|
||||
// Does nothing for performance.
|
||||
b3Vec2() { }
|
||||
|
||||
// Set this vector from two components.
|
||||
b3Vec2(float32 _x, float32 _y) : x(_x), y(_y) { }
|
||||
|
||||
// Read an indexed component from this vector.
|
||||
float32 operator[](u32 i) const { return (&x)[i]; }
|
||||
|
||||
// Write an indexed component to this vector.
|
||||
float32& operator[](u32 i) { return (&x)[i]; }
|
||||
|
||||
// Add a vector to this vector.
|
||||
void operator+=(const b3Vec2& v)
|
||||
{
|
||||
x += v.x;
|
||||
y += v.y;
|
||||
}
|
||||
|
||||
// Subtract a vector from this vector.
|
||||
void operator-=(const b3Vec2& v)
|
||||
{
|
||||
x -= v.x;
|
||||
y -= v.y;
|
||||
}
|
||||
|
||||
// Scale this vector.
|
||||
void operator*=(float32 s)
|
||||
{
|
||||
x *= s;
|
||||
y *= s;
|
||||
}
|
||||
|
||||
// Scale this vector.
|
||||
void operator/=(float32 s)
|
||||
{
|
||||
x /= s;
|
||||
y /= s;
|
||||
}
|
||||
|
||||
// Set this vector to the zero vector.
|
||||
void SetZero()
|
||||
{
|
||||
x = y = 0.0f;
|
||||
}
|
||||
|
||||
// Set this vector from two components.
|
||||
void Set(float32 _x, float32 _y)
|
||||
{
|
||||
x = _x;
|
||||
y = _y;
|
||||
}
|
||||
|
||||
// Normalize this vector.
|
||||
void Normalize()
|
||||
{
|
||||
float32 s = b3Sqrt(x * x + y * y);
|
||||
if (s > B3_EPSILON)
|
||||
{
|
||||
x /= s;
|
||||
y /= s;
|
||||
}
|
||||
}
|
||||
|
||||
float32 x, y;
|
||||
};
|
||||
|
||||
// Negate a vector.
|
||||
inline b3Vec2 operator-(const b3Vec2& v)
|
||||
{
|
||||
return b3Vec2(-v.x, -v.y);
|
||||
}
|
||||
|
||||
// Add two vectors.
|
||||
inline b3Vec2 operator+(const b3Vec2& a, const b3Vec2& b)
|
||||
{
|
||||
return b3Vec2(a.x + b.x, a.y + b.y);
|
||||
}
|
||||
|
||||
// Subtract two vectors.
|
||||
inline b3Vec2 operator-(const b3Vec2& a, const b3Vec2& b)
|
||||
{
|
||||
return b3Vec2(a.x - b.x, a.y - b.y);
|
||||
}
|
||||
|
||||
// Multiply a vector by a scalar.
|
||||
inline b3Vec2 operator*(float32 s, const b3Vec2& v)
|
||||
{
|
||||
return b3Vec2(s * v.x, s * v.y);
|
||||
}
|
||||
|
||||
// Compute the dot product of two vectors.
|
||||
inline float32 b3Dot(const b3Vec2& a, const b3Vec2& b)
|
||||
{
|
||||
return a.x * b.x + a.y * b.y;
|
||||
}
|
||||
|
||||
// Compute the length of a vector.
|
||||
inline float32 b3Length(const b3Vec2& v)
|
||||
{
|
||||
return b3Sqrt(v.x * v.x + v.y * v.y);
|
||||
}
|
||||
|
||||
// Normalize a vector.
|
||||
inline b3Vec2 b3Normalize(const b3Vec2& v)
|
||||
{
|
||||
float32 length = b3Length(v);
|
||||
if (length > B3_EPSILON)
|
||||
{
|
||||
float32 s = 1.0f / length;
|
||||
return s * v;
|
||||
}
|
||||
return v;
|
||||
}
|
||||
|
||||
// Compute the euclidean distance between two points.
|
||||
inline float32 b3Distance(const b3Vec2& a, const b3Vec2& b)
|
||||
{
|
||||
return b3Length(a - b);
|
||||
}
|
||||
|
||||
// Compute the determinant of two 2D vectors.
|
||||
inline float32 b3Det(const b3Vec2& a, const b3Vec2& b)
|
||||
{
|
||||
return a.x * b.y - a.y * b.x;
|
||||
}
|
||||
|
||||
#endif
|
248
include/bounce/common/math/vec3.h
Normal file
248
include/bounce/common/math/vec3.h
Normal file
@@ -0,0 +1,248 @@
|
||||
/*
|
||||
* Copyright (c) 2016-2016 Irlan Robson http://www.irlan.net
|
||||
*
|
||||
* This software is provided 'as-is', without any express or implied
|
||||
* warranty. In no event will the authors be held liable for any damages
|
||||
* arising from the use of this software.
|
||||
* Permission is granted to anyone to use this software for any purpose,
|
||||
* including commercial applications, and to alter it and redistribute it
|
||||
* freely, subject to the following restrictions:
|
||||
* 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.
|
||||
* 2. Altered source versions must be plainly marked as such, and must not be
|
||||
* misrepresented as being the original software.
|
||||
* 3. This notice may not be removed or altered from any source distribution.
|
||||
*/
|
||||
|
||||
#ifndef B3_VEC_3_H
|
||||
#define B3_VEC_3_H
|
||||
|
||||
#include <bounce\common\math\math.h>
|
||||
|
||||
// A 3D column vector.
|
||||
struct b3Vec3
|
||||
{
|
||||
// Does nothing for performance.
|
||||
b3Vec3() { }
|
||||
|
||||
// Set this vector from three components.
|
||||
b3Vec3(float32 _x, float32 _y, float32 _z) : x(_x), y(_y), z(_z) { }
|
||||
|
||||
// Read an indexed component from this vector.
|
||||
float32 operator[](u32 i) const
|
||||
{
|
||||
return (&x)[i];
|
||||
}
|
||||
|
||||
// Write an indexed component to this vector.
|
||||
float32& operator[](u32 i)
|
||||
{
|
||||
return (&x)[i];
|
||||
}
|
||||
|
||||
// Add a vector to this vector.
|
||||
void operator+=(const b3Vec3& b)
|
||||
{
|
||||
x += b.x;
|
||||
y += b.y;
|
||||
z += b.z;
|
||||
}
|
||||
|
||||
// Subtract this vector from another vector.
|
||||
void operator-=(const b3Vec3& b)
|
||||
{
|
||||
x -= b.x;
|
||||
y -= b.y;
|
||||
z -= b.z;
|
||||
}
|
||||
|
||||
// Scale this vector.
|
||||
void operator*=(float32 s)
|
||||
{
|
||||
x *= s;
|
||||
y *= s;
|
||||
z *= s;
|
||||
}
|
||||
|
||||
// Scale this vector.
|
||||
void operator/=(float32 s)
|
||||
{
|
||||
x /= s;
|
||||
y /= s;
|
||||
z /= s;
|
||||
}
|
||||
|
||||
// Set this vector to the zero vector.
|
||||
void SetZero()
|
||||
{
|
||||
x = y = z = 0.0f;
|
||||
}
|
||||
|
||||
// Normalize this vector.
|
||||
void Normalize()
|
||||
{
|
||||
float32 lenght = b3Sqrt(x * x + y * y + z * z);
|
||||
if (lenght > B3_EPSILON)
|
||||
{
|
||||
x /= lenght;
|
||||
y /= lenght;
|
||||
z /= lenght;
|
||||
}
|
||||
}
|
||||
|
||||
// Set this vector from three coordinates.
|
||||
void Set(float32 _x, float32 _y, float32 _z)
|
||||
{
|
||||
x = _x;
|
||||
y = _y;
|
||||
z = _z;
|
||||
}
|
||||
|
||||
float32 x, y, z;
|
||||
};
|
||||
|
||||
// Negate a vector.
|
||||
inline b3Vec3 operator-(const b3Vec3& v)
|
||||
{
|
||||
return b3Vec3(-v.x, -v.y, -v.z);
|
||||
}
|
||||
|
||||
// Compute the sum of two vectors.
|
||||
inline b3Vec3 operator+(const b3Vec3& a, const b3Vec3& b)
|
||||
{
|
||||
return b3Vec3(a.x + b.x, a.y + b.y, a.z + b.z);
|
||||
}
|
||||
|
||||
// Compute the subtraction of two vectors.
|
||||
inline b3Vec3 operator-(const b3Vec3& a, const b3Vec3& b)
|
||||
{
|
||||
return b3Vec3(a.x - b.x, a.y - b.y, a.z - b.z);
|
||||
}
|
||||
|
||||
// Compute a scalar-vector product.
|
||||
inline b3Vec3 operator*(float32 s, const b3Vec3& v)
|
||||
{
|
||||
return b3Vec3(s * v.x, s * v.y, s * v.z);
|
||||
}
|
||||
|
||||
// Inverse multiply a scalar-vector.
|
||||
inline b3Vec3 operator/(const b3Vec3& v, float32 s)
|
||||
{
|
||||
return b3Vec3(v.x / s, v.y / s, v.z / s);
|
||||
}
|
||||
|
||||
// Compute the dot-product of two vectors.
|
||||
inline float32 b3Dot(const b3Vec3& a, const b3Vec3& b)
|
||||
{
|
||||
return a.x * b.x + a.y * b.y + a.z * b.z;
|
||||
}
|
||||
|
||||
// Compute the cross-product of two vectors.
|
||||
inline b3Vec3 b3Cross(const b3Vec3& a, const b3Vec3& b)
|
||||
{
|
||||
return b3Vec3(a.y * b.z - a.z * b.y, a.z * b.x - a.x * b.z, a.x * b.y - a.y * b.x);
|
||||
}
|
||||
|
||||
// Compute the determinant of a matrix whose columns are three given vectors.
|
||||
// Useful property: det(a, b, c) = det(c, a, b) = det(b, c, a).
|
||||
inline float32 b3Det(const b3Vec3& a, const b3Vec3& b, const b3Vec3& c)
|
||||
{
|
||||
return b3Dot(a, b3Cross(b, c));
|
||||
}
|
||||
|
||||
// Compute the length of a vector.
|
||||
inline float32 b3Length(const b3Vec3& v)
|
||||
{
|
||||
return b3Sqrt(v.x * v.x + v.y * v.y + v.z * v.z);
|
||||
}
|
||||
|
||||
// Compute the squared length of a vector.
|
||||
inline float32 b3LengthSquared(const b3Vec3& v)
|
||||
{
|
||||
return v.x * v.x + v.y * v.y + v.z * v.z;
|
||||
}
|
||||
|
||||
// Compute the normalized vector of a (non-zero!) vector.
|
||||
inline b3Vec3 b3Normalize(const b3Vec3& v)
|
||||
{
|
||||
float32 length = b3Length(v);
|
||||
if (length > B3_EPSILON)
|
||||
{
|
||||
float32 s = 1.0f / length;
|
||||
return s * v;
|
||||
}
|
||||
return v;
|
||||
}
|
||||
|
||||
// Compute the euclidean distance between two points.
|
||||
inline float32 b3Distance(const b3Vec3& a, const b3Vec3& b)
|
||||
{
|
||||
return b3Length(a - b);
|
||||
}
|
||||
|
||||
// Compute the squared distance between two points.
|
||||
inline float32 b3DistanceSquared(const b3Vec3& a, const b3Vec3& b)
|
||||
{
|
||||
b3Vec3 v = a - b;
|
||||
return b3LengthSquared(v);
|
||||
}
|
||||
|
||||
// Compute the triangle area.
|
||||
inline float32 b3Area(const b3Vec3& a, const b3Vec3& b, const b3Vec3& c)
|
||||
{
|
||||
return b3Length(b3Cross(b - a, c - a));
|
||||
}
|
||||
|
||||
// Compute the squared triangle area.
|
||||
inline float32 b3AreaSquared(const b3Vec3& a, const b3Vec3& b, const b3Vec3& c)
|
||||
{
|
||||
return b3LengthSquared(b3Cross(b - a, c - a));
|
||||
}
|
||||
|
||||
// Compute the tetrahedron volume.
|
||||
inline float32 b3Volume(const b3Vec3& a, const b3Vec3& b, const b3Vec3& c, const b3Vec3& d)
|
||||
{
|
||||
float32 volume = b3Det(b - a, c - a, d - a);
|
||||
// Force a positive volume.
|
||||
float32 sign = b3Sign(volume);
|
||||
const float32 inv6 = 1.0f / 6.0f;
|
||||
return sign * inv6 * volume;
|
||||
}
|
||||
|
||||
// Compute the squared tetrahedron volume.
|
||||
inline float32 b3VolumeSquared(const b3Vec3& a, const b3Vec3& b, const b3Vec3& c, const b3Vec3& d)
|
||||
{
|
||||
float32 volume = b3Volume(a, b, c, d);
|
||||
return volume * volume;
|
||||
}
|
||||
|
||||
// Compute the minimum vector between two vector (per-element).
|
||||
inline b3Vec3 b3Min(const b3Vec3& a, const b3Vec3& b)
|
||||
{
|
||||
return b3Vec3(b3Min(a.x, b.x), b3Min(a.y, b.y), b3Min(a.z, b.z));
|
||||
}
|
||||
|
||||
// Compute the maximum vector between two vector (per-element).
|
||||
inline b3Vec3 b3Max(const b3Vec3& a, const b3Vec3& b)
|
||||
{
|
||||
return b3Vec3(b3Max(a.x, b.x), b3Max(a.y, b.y), b3Max(a.z, b.z));
|
||||
}
|
||||
|
||||
// Find a perpendicular vector to a vector.
|
||||
inline b3Vec3 b3Perp(const b3Vec3& v)
|
||||
{
|
||||
// Box2D
|
||||
// Suppose vector a has all equal components and is a unit vector: a = (s, s, s)
|
||||
// Then 3*s*s = 1, s = sqrt(1/3) = 0.57735. This means that at least one component of a
|
||||
// unit vector must be greater or equal to 0.57735.
|
||||
if (b3Abs(v.x) >= float32(0.57735027))
|
||||
{
|
||||
return b3Vec3(v.y, -v.x, 0.0f);
|
||||
}
|
||||
|
||||
return b3Vec3(0.0f, v.z, -v.y);
|
||||
}
|
||||
|
||||
#endif
|
55
include/bounce/common/memory/block_pool.h
Normal file
55
include/bounce/common/memory/block_pool.h
Normal file
@@ -0,0 +1,55 @@
|
||||
/*
|
||||
* Copyright (c) 2016-2016 Irlan Robson http://www.irlan.net
|
||||
*
|
||||
* This software is provided 'as-is', without any express or implied
|
||||
* warranty. In no event will the authors be held liable for any damages
|
||||
* arising from the use of this software.
|
||||
* Permission is granted to anyone to use this software for any purpose,
|
||||
* including commercial applications, and to alter it and redistribute it
|
||||
* freely, subject to the following restrictions:
|
||||
* 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.
|
||||
* 2. Altered source versions must be plainly marked as such, and must not be
|
||||
* misrepresented as being the original software.
|
||||
* 3. This notice may not be removed or altered from any source distribution.
|
||||
*/
|
||||
|
||||
#ifndef B3_BLOCK_POOL_H
|
||||
#define B3_BLOCK_POOL_H
|
||||
|
||||
#include <bounce\common\settings.h>
|
||||
|
||||
// Number of blocks per chunk.
|
||||
const u32 b3_blockCount = 32;
|
||||
|
||||
// A pool of memory blocks.
|
||||
class b3BlockPool
|
||||
{
|
||||
public:
|
||||
b3BlockPool(u32 blockSize);
|
||||
~b3BlockPool();
|
||||
|
||||
void* Allocate();
|
||||
void Free(void* p);
|
||||
private:
|
||||
struct b3Block
|
||||
{
|
||||
b3Block* next;
|
||||
};
|
||||
|
||||
struct b3Chunk
|
||||
{
|
||||
b3Block* freeBlocks;
|
||||
b3Chunk* next;
|
||||
};
|
||||
|
||||
u32 m_blockSize;
|
||||
u32 m_chunkSize;
|
||||
|
||||
b3Chunk* m_chunks;
|
||||
u32 m_chunkCount;
|
||||
};
|
||||
|
||||
#endif
|
53
include/bounce/common/memory/stack_allocator.h
Normal file
53
include/bounce/common/memory/stack_allocator.h
Normal file
@@ -0,0 +1,53 @@
|
||||
/*
|
||||
* Copyright (c) 2016-2016 Irlan Robson http://www.irlan.net
|
||||
*
|
||||
* This software is provided 'as-is', without any express or implied
|
||||
* warranty. In no event will the authors be held liable for any damages
|
||||
* arising from the use of this software.
|
||||
* Permission is granted to anyone to use this software for any purpose,
|
||||
* including commercial applications, and to alter it and redistribute it
|
||||
* freely, subject to the following restrictions:
|
||||
* 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.
|
||||
* 2. Altered source versions must be plainly marked as such, and must not be
|
||||
* misrepresented as being the original software.
|
||||
* 3. This notice may not be removed or altered from any source distribution.
|
||||
*/
|
||||
|
||||
#ifndef B3_STACK_ALLOCATOR_H
|
||||
#define B3_STACK_ALLOCATOR_H
|
||||
|
||||
#include <bounce\common\settings.h>
|
||||
|
||||
// Allocate 10 MiB from the stack.
|
||||
// Increase as you want.
|
||||
const u32 b3_maxStackSize = B3_MiB(10);
|
||||
|
||||
// An stack allocator.
|
||||
class b3StackAllocator
|
||||
{
|
||||
public :
|
||||
b3StackAllocator();
|
||||
~b3StackAllocator();
|
||||
|
||||
void* Allocate(u32 size);
|
||||
void Free(void* p);
|
||||
private :
|
||||
struct b3Block
|
||||
{
|
||||
u32 size;
|
||||
u8* data;
|
||||
bool parent;
|
||||
};
|
||||
|
||||
u32 m_blockCapacity;
|
||||
b3Block* m_blocks;
|
||||
u32 m_blockCount;
|
||||
|
||||
u32 m_allocatedSize; // marker
|
||||
u8 m_memory[b3_maxStackSize];
|
||||
};
|
||||
|
||||
#endif
|
152
include/bounce/common/settings.h
Normal file
152
include/bounce/common/settings.h
Normal file
@@ -0,0 +1,152 @@
|
||||
/*
|
||||
* Copyright (c) 2016-2016 Irlan Robson http://www.irlan.net
|
||||
*
|
||||
* This software is provided 'as-is', without any express or implied
|
||||
* warranty. In no event will the authors be held liable for any damages
|
||||
* arising from the use of this software.
|
||||
* Permission is granted to anyone to use this software for any purpose,
|
||||
* including commercial applications, and to alter it and redistribute it
|
||||
* freely, subject to the following restrictions:
|
||||
* 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.
|
||||
* 2. Altered source versions must be plainly marked as such, and must not be
|
||||
* misrepresented as being the original software.
|
||||
* 3. This notice may not be removed or altered from any source distribution.
|
||||
*/
|
||||
|
||||
#ifndef B3_SETTINGS_H
|
||||
#define B3_SETTINGS_H
|
||||
|
||||
#include <assert.h>
|
||||
#include <cstring>
|
||||
#include <new>
|
||||
#include <float.h>
|
||||
|
||||
typedef signed int i32;
|
||||
typedef signed short i16;
|
||||
typedef signed char i8;
|
||||
typedef unsigned int u32;
|
||||
typedef unsigned short u16;
|
||||
typedef unsigned char u8;
|
||||
typedef unsigned long long u64;
|
||||
typedef double float64;
|
||||
typedef float float32;
|
||||
|
||||
// You can modify the following parameters as long
|
||||
// as you know what you're doing.
|
||||
|
||||
#define B3_PI (3.14159265359f)
|
||||
#define B3_MAX_FLOAT (FLT_MAX)
|
||||
#define B3_EPSILON (FLT_EPSILON)
|
||||
|
||||
// Collision
|
||||
|
||||
// Maximum number of vertices, edges, and faces a
|
||||
// polyhedron can have. Don't increase this value.
|
||||
#define B3_MAX_HULL_FEATURES (256)
|
||||
|
||||
// How much an AABB in the broad-phase should be extended by
|
||||
// to disallow unecessary proxy updates.
|
||||
// A larger value increases performance when there are
|
||||
// no objects closer to the AABB because no contacts are
|
||||
// even created.
|
||||
#define B3_AABB_EXTENSION (0.2f)
|
||||
|
||||
// This is used to extend AABBs in the broad-phase.
|
||||
// Is used to predict the future position based on the current displacement.
|
||||
// This is a dimensionless multiplier.
|
||||
#define B3_AABB_MULTIPLIER (2.0f)
|
||||
|
||||
// Collision and constraint tolerance.
|
||||
#define B3_LINEAR_SLOP (0.005f)
|
||||
|
||||
// Collision and constraint tolerance.
|
||||
#define B3_ANGULAR_SLOP (2.0f / 180.0f * B3_PI)
|
||||
|
||||
// The radius of the hull shape skin.
|
||||
#define B3_HULL_RADIUS (2.0f * B3_LINEAR_SLOP)
|
||||
|
||||
// Twice the radius of the hull shape skin.
|
||||
#define B3_HULL_RADIUS_SUM (2.0f * B3_HULL_RADIUS)
|
||||
|
||||
// Dynamics
|
||||
|
||||
// The maximum number of manifolds that can be build
|
||||
// for all contacts.
|
||||
#define B3_MAX_MANIFOLDS (3)
|
||||
|
||||
// If this is equal to 4 then the contact generator
|
||||
// will keep the hull-hull manifold clipped points up to 4 such that
|
||||
// still creates a stable manifold to the solver. More points
|
||||
// usually means better torque balance but can decrease
|
||||
// the performance of the solver significantly.
|
||||
// Therefore, keep this to 4 for greater performance.
|
||||
#define B3_MAX_MANIFOLD_POINTS (4)
|
||||
|
||||
// Maximum translation per step to prevent numerical instability
|
||||
// due to large linear velocity.
|
||||
#define B3_MAX_TRANSLATION (2.0f)
|
||||
#define B3_MAX_TRANSLATION_SQUARED (B3_MAX_TRANSLATION * B3_MAX_TRANSLATION)
|
||||
|
||||
// Maximum rotation per step to prevent numerical instability due to
|
||||
// large angular velocity.
|
||||
#define B3_MAX_ROTATION (0.5f * B3_PI)
|
||||
#define B3_MAX_ROTATION_SQUARED (B3_MAX_ROTATION * B3_MAX_ROTATION)
|
||||
|
||||
// The maximum linear position correction used when solving constraints. This helps to
|
||||
// prevent overshoot.
|
||||
#define B3_MAX_LINEAR_CORRECTION (0.2f)
|
||||
|
||||
// The maximum angular position correction used when solving constraints. This helps to
|
||||
// prevent overshoot.
|
||||
#define B3_MAX_ANGULAR_CORRECTION (8.0f / 180.0f * B3_PI)
|
||||
|
||||
// This controls how faster overlaps should be resolved per step.
|
||||
// This is less than and would be close to 1, so that the all overlap is resolved per step.
|
||||
// However values very close to 1 may lead to overshoot.
|
||||
#define B3_BAUMGARTE (0.1f)
|
||||
|
||||
// If the relative velocity of a contact point is below
|
||||
// the threshold then restitution is not applied.
|
||||
#define B3_VELOCITY_THRESHOLD (1.0f)
|
||||
|
||||
// Sleep
|
||||
|
||||
#define B3_TIME_TO_SLEEP (0.2f )
|
||||
#define B3_SLEEP_LINEAR_TOL (0.05f)
|
||||
#define B3_SLEEP_ANGULAR_TOL (2.0f / 180.0f * B3_PI)
|
||||
|
||||
// Memory
|
||||
|
||||
#define B3_NOT_USED(x) ((void)(x))
|
||||
#define B3_ASSERT(c) assert(c)
|
||||
#define B3_STATIC_ASSERT(c) static_assert(c)
|
||||
|
||||
#define B3_KiB(n) (1024 * n)
|
||||
#define B3_MiB(n) (1024 * B3_KiB(n))
|
||||
#define B3_GiB(n) (1024 * B3_MiB(n))
|
||||
|
||||
// You should implement this function to use your own memory allocator.
|
||||
void* b3Alloc(u32 size);
|
||||
|
||||
// You must implement this function if you have implemented b3Alloc.
|
||||
void b3Free(void* block);
|
||||
|
||||
// You should implement this function to visualize log messages coming
|
||||
// from this software.
|
||||
void b3Log(const char* string, ...);
|
||||
|
||||
// The current version this software.
|
||||
struct b3Version
|
||||
{
|
||||
u32 major; //significant changes
|
||||
u32 minor; //minor features
|
||||
u32 revision; //patches
|
||||
};
|
||||
|
||||
// The current version of Bounce.
|
||||
extern b3Version b3_version;
|
||||
|
||||
#endif
|
243
include/bounce/common/template/array.h
Normal file
243
include/bounce/common/template/array.h
Normal file
@@ -0,0 +1,243 @@
|
||||
/*
|
||||
* Copyright (c) 2016-2016 Irlan Robson http://www.irlan.net
|
||||
*
|
||||
* This software is provided 'as-is', without any express or implied
|
||||
* warranty. In no event will the authors be held liable for any damages
|
||||
* arising from the use of this software.
|
||||
* Permission is granted to anyone to use this software for any purpose,
|
||||
* including commercial applications, and to alter it and redistribute it
|
||||
* freely, subject to the following restrictions:
|
||||
* 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.
|
||||
* 2. Altered source versions must be plainly marked as such, and must not be
|
||||
* misrepresented as being the original software.
|
||||
* 3. This notice may not be removed or altered from any source distribution.
|
||||
*/
|
||||
|
||||
#ifndef B3_ARRAY_POD_H
|
||||
#define B3_ARRAY_POD_H
|
||||
|
||||
#include <bounce\common\settings.h>
|
||||
|
||||
// An array for bytes (POD).
|
||||
template <typename T>
|
||||
class b3Array
|
||||
{
|
||||
public:
|
||||
const T& operator[](u32 i) const
|
||||
{
|
||||
B3_ASSERT(i < m_count);
|
||||
return m_elements[i];
|
||||
}
|
||||
|
||||
T& operator[](u32 i)
|
||||
{
|
||||
B3_ASSERT(i < m_count);
|
||||
return m_elements[i];
|
||||
}
|
||||
|
||||
const T* Get(u32 i) const
|
||||
{
|
||||
B3_ASSERT(i < m_count);
|
||||
return m_elements + i;
|
||||
}
|
||||
|
||||
T* Get(u32 i)
|
||||
{
|
||||
B3_ASSERT(i < m_count);
|
||||
return m_elements + i;
|
||||
}
|
||||
|
||||
const T* Elements() const
|
||||
{
|
||||
return m_elements;
|
||||
}
|
||||
|
||||
T* Elements()
|
||||
{
|
||||
return m_elements;
|
||||
}
|
||||
|
||||
void PushBack(const T& ele)
|
||||
{
|
||||
if (m_count == m_capacity)
|
||||
{
|
||||
T* oldElements = m_elements;
|
||||
m_capacity *= 2;
|
||||
m_elements = (T*)b3Alloc(m_capacity * sizeof(T));
|
||||
memcpy(m_elements, oldElements, m_count * sizeof(T));
|
||||
if (oldElements != m_localElements)
|
||||
{
|
||||
b3Free(oldElements);
|
||||
}
|
||||
}
|
||||
B3_ASSERT(m_count < m_capacity);
|
||||
m_elements[m_count] = ele;
|
||||
++m_count;
|
||||
}
|
||||
|
||||
void PopBack()
|
||||
{
|
||||
B3_ASSERT(m_count > 0);
|
||||
--m_count;
|
||||
}
|
||||
|
||||
const T& Back() const
|
||||
{
|
||||
B3_ASSERT(m_count > 0);
|
||||
return m_elements[m_count - 1];
|
||||
}
|
||||
|
||||
T& Back()
|
||||
{
|
||||
B3_ASSERT(m_count > 0);
|
||||
return m_elements[m_count - 1];
|
||||
}
|
||||
|
||||
u32 Count() const
|
||||
{
|
||||
return m_count;
|
||||
}
|
||||
|
||||
bool IsEmpty() const
|
||||
{
|
||||
return m_count == 0;
|
||||
}
|
||||
|
||||
void Remove(u32 index)
|
||||
{
|
||||
B3_ASSERT(m_count > 0);
|
||||
B3_ASSERT(index < m_count);
|
||||
--m_count;
|
||||
// Swap current element with its next.
|
||||
for (u32 i = index; i < m_count; ++i)
|
||||
{
|
||||
m_elements[i] = m_elements[i + 1];
|
||||
}
|
||||
}
|
||||
|
||||
void Reserve(u32 size)
|
||||
{
|
||||
if (m_capacity < size)
|
||||
{
|
||||
T* oldElements = m_elements;
|
||||
m_capacity = 2 * size;
|
||||
m_elements = (T*)b3Alloc(m_capacity * sizeof(T));
|
||||
memcpy(m_elements, oldElements, m_count * sizeof(T));
|
||||
if (oldElements != m_localElements)
|
||||
{
|
||||
b3Free(oldElements);
|
||||
}
|
||||
}
|
||||
|
||||
B3_ASSERT(m_capacity >= size);
|
||||
}
|
||||
|
||||
void Resize(u32 size)
|
||||
{
|
||||
if (m_capacity < size)
|
||||
{
|
||||
T* oldElements = m_elements;
|
||||
m_capacity = 2 * size;
|
||||
m_elements = (T*)b3Alloc(m_capacity * sizeof(T));
|
||||
memcpy(m_elements, oldElements, m_count * sizeof(T));
|
||||
if (oldElements != m_localElements)
|
||||
{
|
||||
b3Free(oldElements);
|
||||
}
|
||||
}
|
||||
B3_ASSERT(m_capacity >= size);
|
||||
m_count = size;
|
||||
}
|
||||
|
||||
void Swap(const b3Array<T>& other)
|
||||
{
|
||||
if (m_elements == other.m_elements)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
// Ensure sufficient capacity for copy.
|
||||
if (m_capacity < other.m_count)
|
||||
{
|
||||
if (m_elements != m_localElements)
|
||||
{
|
||||
b3Free(m_elements);
|
||||
}
|
||||
m_capacity = other.m_capacity;
|
||||
m_elements = (T*)b3Alloc(m_capacity * sizeof(T));
|
||||
}
|
||||
|
||||
// Copy.
|
||||
B3_ASSERT(m_capacity >= other.m_count);
|
||||
m_count = other.m_count;
|
||||
memcpy(m_elements, other.m_elements, other.m_count * sizeof(T));
|
||||
}
|
||||
|
||||
void operator=(const b3Array<T>& other)
|
||||
{
|
||||
Swap(other);
|
||||
}
|
||||
protected:
|
||||
b3Array(T* elements, u32 N)
|
||||
{
|
||||
B3_ASSERT(N > 0);
|
||||
m_localElements = elements;
|
||||
m_capacity = N;
|
||||
m_elements = m_localElements;
|
||||
m_count = 0;
|
||||
}
|
||||
|
||||
b3Array(const b3Array<T>& other)
|
||||
{
|
||||
Swap(other);
|
||||
}
|
||||
|
||||
~b3Array()
|
||||
{
|
||||
if (m_elements != m_localElements)
|
||||
{
|
||||
b3Free(m_elements);
|
||||
}
|
||||
}
|
||||
|
||||
u32 m_capacity;
|
||||
T* m_elements;
|
||||
u32 m_count;
|
||||
|
||||
T* m_localElements;
|
||||
};
|
||||
|
||||
template <typename T, u32 N>
|
||||
class b3StackArray : public b3Array<T>
|
||||
{
|
||||
public :
|
||||
b3StackArray<T, N>() : b3Array<T>(m_stackElements, N)
|
||||
{
|
||||
}
|
||||
|
||||
b3StackArray<T, N>(const b3StackArray<T, N>& other) : b3Array<T>(other)
|
||||
{
|
||||
}
|
||||
|
||||
b3StackArray<T, N>(const b3Array<T>& other) : b3Array<T>(other)
|
||||
{
|
||||
}
|
||||
|
||||
void operator=(const b3StackArray<T, N>& other)
|
||||
{
|
||||
Swap(other);
|
||||
}
|
||||
|
||||
void operator=(const b3Array<T>& other)
|
||||
{
|
||||
Swap(other);
|
||||
}
|
||||
|
||||
protected:
|
||||
T m_stackElements[N];
|
||||
};
|
||||
|
||||
#endif
|
100
include/bounce/common/template/list.h
Normal file
100
include/bounce/common/template/list.h
Normal file
@@ -0,0 +1,100 @@
|
||||
/*
|
||||
* Copyright (c) 2016-2016 Irlan Robson http://www.irlan.net
|
||||
*
|
||||
* This software is provided 'as-is', without any express or implied
|
||||
* warranty. In no event will the authors be held liable for any damages
|
||||
* arising from the use of this software.
|
||||
* Permission is granted to anyone to use this software for any purpose,
|
||||
* including commercial applications, and to alter it and redistribute it
|
||||
* freely, subject to the following restrictions:
|
||||
* 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.
|
||||
* 2. Altered source versions must be plainly marked as such, and must not be
|
||||
* misrepresented as being the original software.
|
||||
* 3. This notice may not be removed or altered from any source distribution.
|
||||
*/
|
||||
|
||||
#ifndef B3_LIST_H
|
||||
#define B3_LIST_H
|
||||
|
||||
#include <bounce\common\settings.h>
|
||||
|
||||
// A singly-linked list.
|
||||
template<class T>
|
||||
class b3List1
|
||||
{
|
||||
public:
|
||||
b3List1()
|
||||
{
|
||||
m_head = nullptr;
|
||||
m_count = 0;
|
||||
}
|
||||
|
||||
~b3List1() { }
|
||||
|
||||
void PushFront(T* link)
|
||||
{
|
||||
link->m_next = m_head;
|
||||
m_head = link;
|
||||
++m_count;
|
||||
}
|
||||
|
||||
void Remove(T* link)
|
||||
{
|
||||
m_head = link->m_next;
|
||||
--m_count;
|
||||
}
|
||||
|
||||
T* m_head;
|
||||
u32 m_count;
|
||||
};
|
||||
|
||||
// A doubly-linked list.
|
||||
template<class T>
|
||||
class b3List2
|
||||
{
|
||||
public:
|
||||
b3List2()
|
||||
{
|
||||
m_head = nullptr;
|
||||
m_count = 0;
|
||||
}
|
||||
|
||||
~b3List2() { }
|
||||
|
||||
void PushFront(T* link)
|
||||
{
|
||||
link->m_prev = nullptr;
|
||||
link->m_next = m_head;
|
||||
if (m_head)
|
||||
{
|
||||
m_head->m_prev = link;
|
||||
}
|
||||
m_head = link;
|
||||
++m_count;
|
||||
}
|
||||
|
||||
void Remove(T* link)
|
||||
{
|
||||
if (link->m_prev)
|
||||
{
|
||||
link->m_prev->m_next = link->m_next;
|
||||
}
|
||||
if (link->m_next)
|
||||
{
|
||||
link->m_next->m_prev = link->m_prev;
|
||||
}
|
||||
if (link == m_head)
|
||||
{
|
||||
m_head = link->m_next;
|
||||
}
|
||||
--m_count;
|
||||
}
|
||||
|
||||
T* m_head;
|
||||
u32 m_count;
|
||||
};
|
||||
|
||||
#endif
|
283
include/bounce/common/template/object_array.h
Normal file
283
include/bounce/common/template/object_array.h
Normal file
@@ -0,0 +1,283 @@
|
||||
/*
|
||||
* Copyright (c) 2016-2016 Irlan Robson http://www.irlan.net
|
||||
*
|
||||
* This software is provided 'as-is', without any express or implied
|
||||
* warranty. In no event will the authors be held liable for any damages
|
||||
* arising from the use of this software.
|
||||
* Permission is granted to anyone to use this software for any purpose,
|
||||
* including commercial applications, and to alter it and redistribute it
|
||||
* freely, subject to the following restrictions:
|
||||
* 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.
|
||||
* 2. Altered source versions must be plainly marked as such, and must not be
|
||||
* misrepresented as being the original software.
|
||||
* 3. This notice may not be removed or altered from any source distribution.
|
||||
*/
|
||||
|
||||
#ifndef B3_OBJECT_ARRAY_H
|
||||
#define B3_OBJECT_ARRAY_H
|
||||
|
||||
#include <bounce\common\settings.h>
|
||||
|
||||
// An array for objects.
|
||||
template <typename T>
|
||||
class b3ObjectArray
|
||||
{
|
||||
public:
|
||||
const T& operator[](u32 i) const
|
||||
{
|
||||
B3_ASSERT(i < m_count);
|
||||
return m_elements[i];
|
||||
}
|
||||
|
||||
T& operator[](u32 i)
|
||||
{
|
||||
B3_ASSERT(i < m_count);
|
||||
return m_elements[i];
|
||||
}
|
||||
|
||||
const T* Get(u32 i) const
|
||||
{
|
||||
B3_ASSERT(i < m_count);
|
||||
return m_elements + i;
|
||||
}
|
||||
|
||||
T* Get(u32 i)
|
||||
{
|
||||
B3_ASSERT(i < m_count);
|
||||
return m_elements + i;
|
||||
}
|
||||
|
||||
const T* Elements() const
|
||||
{
|
||||
return m_elements;
|
||||
}
|
||||
|
||||
T* Elements()
|
||||
{
|
||||
return m_elements;
|
||||
}
|
||||
|
||||
void PushBack(const T& ele)
|
||||
{
|
||||
if (m_count == m_capacity)
|
||||
{
|
||||
// There is no capacity for one more element.
|
||||
T* oldElements = m_elements;
|
||||
m_capacity *= 2;
|
||||
m_elements = (T*)b3Alloc(m_capacity * sizeof(T));
|
||||
|
||||
for (u32 i = 0; i < m_count; ++i)
|
||||
{
|
||||
T* old = oldElements + i;
|
||||
T* e = m_elements + i;
|
||||
new (e) T(*old);
|
||||
old->~T();
|
||||
}
|
||||
|
||||
if (oldElements != m_localElements)
|
||||
{
|
||||
b3Free(oldElements);
|
||||
}
|
||||
}
|
||||
|
||||
B3_ASSERT(m_count < m_capacity);
|
||||
T* e = m_elements + m_count;
|
||||
new(e) T(ele);
|
||||
++m_count;
|
||||
}
|
||||
|
||||
void PopBack()
|
||||
{
|
||||
B3_ASSERT(m_count > 0);
|
||||
--m_count;
|
||||
}
|
||||
|
||||
const T& Back() const
|
||||
{
|
||||
B3_ASSERT(m_count > 0);
|
||||
return m_elements[m_count - 1];
|
||||
}
|
||||
|
||||
T& Back()
|
||||
{
|
||||
B3_ASSERT(m_count > 0);
|
||||
return m_elements[m_count - 1];
|
||||
}
|
||||
|
||||
u32 Count() const
|
||||
{
|
||||
return m_count;
|
||||
}
|
||||
|
||||
bool Empty() const
|
||||
{
|
||||
return m_count == 0;
|
||||
}
|
||||
|
||||
void Resize(u32 size)
|
||||
{
|
||||
if (m_capacity < size)
|
||||
{
|
||||
// There is no capacity for the requested size.
|
||||
T* oldElements = m_elements;
|
||||
m_capacity = 2 * size;
|
||||
m_elements = (T*)b3Alloc(m_capacity * sizeof(T));
|
||||
|
||||
// Construct and copy objects.
|
||||
for (u32 i = 0; i < m_count; ++i)
|
||||
{
|
||||
T* old = oldElements + i;
|
||||
T* e = m_elements + i;
|
||||
new (e) T(*old);
|
||||
old->~T();
|
||||
}
|
||||
|
||||
// Construct objects up to the requested size.
|
||||
for (u32 i = m_count; i < size; ++i)
|
||||
{
|
||||
T* e = m_elements + i;
|
||||
new (e) T();
|
||||
}
|
||||
|
||||
if (oldElements != m_localElements)
|
||||
{
|
||||
b3Free(oldElements);
|
||||
}
|
||||
|
||||
m_count = size;
|
||||
return;
|
||||
}
|
||||
|
||||
B3_ASSERT(m_capacity >= size);
|
||||
if (size < m_count)
|
||||
{
|
||||
// Destroy objects beyond the requested size.
|
||||
for (u32 i = size; i < m_count; ++i)
|
||||
{
|
||||
T* e = m_elements + i;
|
||||
e->~T();
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// Construct objects up to the requested size.
|
||||
for (u32 i = m_count; i < size; ++i)
|
||||
{
|
||||
T* e = m_elements + i;
|
||||
new (e) T();
|
||||
}
|
||||
}
|
||||
|
||||
m_count = size;
|
||||
}
|
||||
|
||||
void Swap(const b3ObjectArray<T>& other)
|
||||
{
|
||||
if (m_elements == other.m_elements)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
// Destroy all objects.
|
||||
for (u32 i = 0; i < m_count; ++i)
|
||||
{
|
||||
T* e = m_elements + i;
|
||||
e->~T();
|
||||
}
|
||||
|
||||
// Ensure sufficient capacity for a copy.
|
||||
if (m_capacity < other.m_count)
|
||||
{
|
||||
if (m_elements != m_localElements)
|
||||
{
|
||||
b3Free(m_elements);
|
||||
}
|
||||
m_capacity = 2 * other.m_count;
|
||||
m_elements = (T*)b3Alloc(m_capacity * sizeof(T));
|
||||
}
|
||||
|
||||
// Copy.
|
||||
B3_ASSERT(m_capacity >= other.m_count);
|
||||
for (u32 i = 0; i < other.m_count; ++i)
|
||||
{
|
||||
T* e2 = other.m_elements + i;
|
||||
T* e1 = m_elements + i;
|
||||
new (e1) T(*e2);
|
||||
}
|
||||
m_count = other.m_count;
|
||||
}
|
||||
protected:
|
||||
b3ObjectArray(T* elements, u32 N)
|
||||
{
|
||||
B3_ASSERT(N > 0);
|
||||
m_localElements = elements;
|
||||
m_capacity = N;
|
||||
m_elements = m_localElements;
|
||||
m_count = 0;
|
||||
}
|
||||
|
||||
b3ObjectArray(const b3ObjectArray<T>& other)
|
||||
{
|
||||
Swap(other);
|
||||
}
|
||||
|
||||
~b3ObjectArray()
|
||||
{
|
||||
if (m_elements != m_localElements)
|
||||
{
|
||||
for (u32 i = 0; i < m_count; ++i)
|
||||
{
|
||||
T* e = m_elements + i;
|
||||
e->~T();
|
||||
}
|
||||
b3Free(m_elements);
|
||||
}
|
||||
}
|
||||
|
||||
void operator=(const b3ObjectArray<T>& other)
|
||||
{
|
||||
Swap(other);
|
||||
}
|
||||
|
||||
u32 m_capacity;
|
||||
T* m_elements;
|
||||
u32 m_count;
|
||||
T* m_localElements;
|
||||
};
|
||||
|
||||
template <typename T, u32 N>
|
||||
class b3StackObjectArray : public b3ObjectArray<T>
|
||||
{
|
||||
public:
|
||||
b3StackObjectArray<T, N>() : b3ObjectArray<T>(m_stackElements, N)
|
||||
{
|
||||
}
|
||||
|
||||
b3StackObjectArray<T, N>(const b3StackObjectArray<T, N>& other) : b3ObjectArray<T>(other)
|
||||
{
|
||||
}
|
||||
|
||||
b3StackObjectArray<T, N>(const b3ObjectArray<T>& other) : b3ObjectArray<T>(other)
|
||||
{
|
||||
}
|
||||
|
||||
void operator=(const b3StackObjectArray<T, N>& other)
|
||||
{
|
||||
Swap(other);
|
||||
}
|
||||
|
||||
void operator=(const b3ObjectArray<T>& other)
|
||||
{
|
||||
Swap(other);
|
||||
}
|
||||
|
||||
protected:
|
||||
//@todo
|
||||
// u8 m_bytes[N * sizeof(T)];
|
||||
T m_stackElements[N];
|
||||
};
|
||||
|
||||
#endif
|
97
include/bounce/common/template/stack.h
Normal file
97
include/bounce/common/template/stack.h
Normal file
@@ -0,0 +1,97 @@
|
||||
/*
|
||||
* Copyright (c) 2016-2016 Irlan Robson http://www.irlan.net
|
||||
*
|
||||
* This software is provided 'as-is', without any express or implied
|
||||
* warranty. In no event will the authors be held liable for any damages
|
||||
* arising from the use of this software.
|
||||
* Permission is granted to anyone to use this software for any purpose,
|
||||
* including commercial applications, and to alter it and redistribute it
|
||||
* freely, subject to the following restrictions:
|
||||
* 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.
|
||||
* 2. Altered source versions must be plainly marked as such, and must not be
|
||||
* misrepresented as being the original software.
|
||||
* 3. This notice may not be removed or altered from any source distribution.
|
||||
*/
|
||||
|
||||
#ifndef B3_STACK_H
|
||||
#define B3_STACK_H
|
||||
|
||||
#include <bounce\common\settings.h>
|
||||
|
||||
// A growable stack for plain-old-data (POD).
|
||||
template <typename T, u32 N>
|
||||
class b3Stack
|
||||
{
|
||||
public:
|
||||
b3Stack()
|
||||
{
|
||||
m_capacity = N;
|
||||
m_elements = m_stackElements;
|
||||
m_count = 0;
|
||||
}
|
||||
|
||||
~b3Stack()
|
||||
{
|
||||
if (m_elements != m_stackElements)
|
||||
{
|
||||
b3Free(m_elements);
|
||||
}
|
||||
m_elements = nullptr;
|
||||
}
|
||||
|
||||
const T& Top() const
|
||||
{
|
||||
B3_ASSERT(m_count);
|
||||
return m_elements[m_count - 1];
|
||||
}
|
||||
|
||||
T& Top()
|
||||
{
|
||||
B3_ASSERT(m_count);
|
||||
return m_elements[m_count - 1];
|
||||
}
|
||||
|
||||
void Push(const T& ele)
|
||||
{
|
||||
if (m_count == m_capacity)
|
||||
{
|
||||
T* oldElements = m_elements;
|
||||
m_capacity *= 2;
|
||||
m_elements = (T*)b3Alloc(m_capacity * sizeof(T));
|
||||
memcpy(m_elements, oldElements, m_count * sizeof(T));
|
||||
if (oldElements != m_stackElements)
|
||||
{
|
||||
b3Free(oldElements);
|
||||
}
|
||||
}
|
||||
B3_ASSERT(m_count < m_capacity);
|
||||
m_elements[m_count] = ele;
|
||||
++m_count;
|
||||
}
|
||||
|
||||
void Pop()
|
||||
{
|
||||
B3_ASSERT(m_count);
|
||||
--m_count;
|
||||
}
|
||||
|
||||
u32 Count() const
|
||||
{
|
||||
return m_count;
|
||||
}
|
||||
|
||||
bool IsEmpty() const
|
||||
{
|
||||
return m_count == 0;
|
||||
}
|
||||
private:
|
||||
u32 m_capacity;
|
||||
T* m_elements;
|
||||
u32 m_count;
|
||||
T m_stackElements[N];
|
||||
};
|
||||
|
||||
#endif
|
63
include/bounce/common/time.h
Normal file
63
include/bounce/common/time.h
Normal file
@@ -0,0 +1,63 @@
|
||||
/*
|
||||
* Copyright (c) 2016-2016 Irlan Robson http://www.irlan.net
|
||||
*
|
||||
* This software is provided 'as-is', without any express or implied
|
||||
* warranty. In no event will the authors be held liable for any damages
|
||||
* arising from the use of this software.
|
||||
* Permission is granted to anyone to use this software for any purpose,
|
||||
* including commercial applications, and to alter it and redistribute it
|
||||
* freely, subject to the following restrictions:
|
||||
* 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.
|
||||
* 2. Altered source versions must be plainly marked as such, and must not be
|
||||
* misrepresented as being the original software.
|
||||
* 3. This notice may not be removed or altered from any source distribution.
|
||||
*/
|
||||
|
||||
#ifndef B3_TIME_H
|
||||
#define B3_TIME_H
|
||||
|
||||
#include <bounce\common\settings.h>
|
||||
|
||||
// A timer class that accumulates time.
|
||||
// Usefull for measuring elapsed times of
|
||||
// sections of code.
|
||||
class b3Time
|
||||
{
|
||||
public :
|
||||
b3Time();
|
||||
|
||||
// Get the accumulated time in miliseconds
|
||||
// from this timer.
|
||||
float64 GetCurMilis() const;
|
||||
|
||||
// Get the elapsed time since this timer was updated.
|
||||
float64 GetElapsedMilis() const;
|
||||
|
||||
// Add the elapsed time since this function
|
||||
// was called to this timer.
|
||||
void Update();
|
||||
|
||||
// Add a given ammout of time to this timer.
|
||||
void UpdateBy(float64 dt);
|
||||
private:
|
||||
static float64 m_invFrequency;
|
||||
|
||||
u64 m_lastRealTime;
|
||||
float64 m_lastTime;
|
||||
float64 m_curTime;
|
||||
};
|
||||
|
||||
inline float64 b3Time::GetCurMilis() const
|
||||
{
|
||||
return m_curTime;
|
||||
}
|
||||
|
||||
inline float64 b3Time::GetElapsedMilis() const
|
||||
{
|
||||
return m_curTime - m_lastTime;
|
||||
}
|
||||
|
||||
#endif
|
Reference in New Issue
Block a user