Modify the method that return the bounds of a collision shape and make the getSupportPoint() methods non-const
This commit is contained in:
parent
e4d283186f
commit
c3f4355c25
|
@ -83,9 +83,9 @@ int EPAAlgorithm::isOriginInTetrahedron(const Vector3& p1, const Vector3& p2,
|
||||||
/// GJK algorithm. The EPA Algorithm will extend this simplex polytope to find
|
/// GJK algorithm. The EPA Algorithm will extend this simplex polytope to find
|
||||||
/// the correct penetration depth
|
/// the correct penetration depth
|
||||||
bool EPAAlgorithm::computePenetrationDepthAndContactPoints(const Simplex& simplex,
|
bool EPAAlgorithm::computePenetrationDepthAndContactPoints(const Simplex& simplex,
|
||||||
const CollisionShape* collisionShape1,
|
CollisionShape* collisionShape1,
|
||||||
const Transform& transform1,
|
const Transform& transform1,
|
||||||
const CollisionShape* collisionShape2,
|
CollisionShape* collisionShape2,
|
||||||
const Transform& transform2,
|
const Transform& transform2,
|
||||||
Vector3& v, ContactPointInfo*& contactInfo) {
|
Vector3& v, ContactPointInfo*& contactInfo) {
|
||||||
|
|
||||||
|
|
|
@ -119,9 +119,9 @@ class EPAAlgorithm {
|
||||||
|
|
||||||
/// Compute the penetration depth with EPA algorithm.
|
/// Compute the penetration depth with EPA algorithm.
|
||||||
bool computePenetrationDepthAndContactPoints(const Simplex& simplex,
|
bool computePenetrationDepthAndContactPoints(const Simplex& simplex,
|
||||||
const CollisionShape* collisionShape1,
|
CollisionShape* collisionShape1,
|
||||||
const Transform& transform1,
|
const Transform& transform1,
|
||||||
const CollisionShape* collisionShape2,
|
CollisionShape* collisionShape2,
|
||||||
const Transform& transform2,
|
const Transform& transform2,
|
||||||
Vector3& v, ContactPointInfo*& contactInfo);
|
Vector3& v, ContactPointInfo*& contactInfo);
|
||||||
};
|
};
|
||||||
|
|
|
@ -57,9 +57,9 @@ GJKAlgorithm::~GJKAlgorithm() {
|
||||||
/// algorithm on the enlarged object to obtain a simplex polytope that contains the
|
/// algorithm on the enlarged object to obtain a simplex polytope that contains the
|
||||||
/// origin, they we give that simplex polytope to the EPA algorithm which will compute
|
/// origin, they we give that simplex polytope to the EPA algorithm which will compute
|
||||||
/// the correct penetration depth and contact points between the enlarged objects.
|
/// the correct penetration depth and contact points between the enlarged objects.
|
||||||
bool GJKAlgorithm::testCollision(const CollisionShape* collisionShape1,
|
bool GJKAlgorithm::testCollision(CollisionShape* collisionShape1,
|
||||||
const Transform& transform1,
|
const Transform& transform1,
|
||||||
const CollisionShape* collisionShape2,
|
CollisionShape* collisionShape2,
|
||||||
const Transform& transform2,
|
const Transform& transform2,
|
||||||
ContactPointInfo*& contactInfo) {
|
ContactPointInfo*& contactInfo) {
|
||||||
|
|
||||||
|
@ -259,9 +259,9 @@ bool GJKAlgorithm::testCollision(const CollisionShape* collisionShape1,
|
||||||
/// assumed to intersect in the original objects (without margin). Therefore such
|
/// assumed to intersect in the original objects (without margin). Therefore such
|
||||||
/// a polytope must exist. Then, we give that polytope to the EPA algorithm to
|
/// a polytope must exist. Then, we give that polytope to the EPA algorithm to
|
||||||
/// compute the correct penetration depth and contact points of the enlarged objects.
|
/// compute the correct penetration depth and contact points of the enlarged objects.
|
||||||
bool GJKAlgorithm::computePenetrationDepthForEnlargedObjects(const CollisionShape* collisionShape1,
|
bool GJKAlgorithm::computePenetrationDepthForEnlargedObjects(CollisionShape* collisionShape1,
|
||||||
const Transform& transform1,
|
const Transform& transform1,
|
||||||
const CollisionShape* collisionShape2,
|
CollisionShape* collisionShape2,
|
||||||
const Transform& transform2,
|
const Transform& transform2,
|
||||||
ContactPointInfo*& contactInfo,
|
ContactPointInfo*& contactInfo,
|
||||||
Vector3& v) {
|
Vector3& v) {
|
||||||
|
|
|
@ -74,9 +74,9 @@ class GJKAlgorithm : public NarrowPhaseAlgorithm {
|
||||||
GJKAlgorithm& operator=(const GJKAlgorithm& algorithm);
|
GJKAlgorithm& operator=(const GJKAlgorithm& algorithm);
|
||||||
|
|
||||||
/// Compute the penetration depth for enlarged objects.
|
/// Compute the penetration depth for enlarged objects.
|
||||||
bool computePenetrationDepthForEnlargedObjects(const CollisionShape* collisionShape1,
|
bool computePenetrationDepthForEnlargedObjects(CollisionShape* collisionShape1,
|
||||||
const Transform& transform1,
|
const Transform& transform1,
|
||||||
const CollisionShape* collisionShape2,
|
CollisionShape* collisionShape2,
|
||||||
const Transform& transform2,
|
const Transform& transform2,
|
||||||
ContactPointInfo*& contactInfo, Vector3& v);
|
ContactPointInfo*& contactInfo, Vector3& v);
|
||||||
|
|
||||||
|
@ -91,9 +91,9 @@ class GJKAlgorithm : public NarrowPhaseAlgorithm {
|
||||||
~GJKAlgorithm();
|
~GJKAlgorithm();
|
||||||
|
|
||||||
/// Return true and compute a contact info if the two bounding volumes collide.
|
/// Return true and compute a contact info if the two bounding volumes collide.
|
||||||
virtual bool testCollision(const CollisionShape* collisionShape1,
|
virtual bool testCollision(CollisionShape *collisionShape1,
|
||||||
const Transform& transform1,
|
const Transform& transform1,
|
||||||
const CollisionShape* collisionShape2,
|
CollisionShape *collisionShape2,
|
||||||
const Transform& transform2,
|
const Transform& transform2,
|
||||||
ContactPointInfo*& contactInfo);
|
ContactPointInfo*& contactInfo);
|
||||||
};
|
};
|
||||||
|
|
|
@ -78,9 +78,9 @@ class NarrowPhaseAlgorithm {
|
||||||
void setCurrentOverlappingPair(BroadPhasePair* overlappingPair);
|
void setCurrentOverlappingPair(BroadPhasePair* overlappingPair);
|
||||||
|
|
||||||
/// Return true and compute a contact info if the two bounding volume collide
|
/// Return true and compute a contact info if the two bounding volume collide
|
||||||
virtual bool testCollision(const CollisionShape* collisionShape1,
|
virtual bool testCollision(CollisionShape* collisionShape1,
|
||||||
const Transform& transform1,
|
const Transform& transform1,
|
||||||
const CollisionShape* collisionShape2,
|
CollisionShape* collisionShape2,
|
||||||
const Transform& transform2,
|
const Transform& transform2,
|
||||||
ContactPointInfo*& contactInfo)=0;
|
ContactPointInfo*& contactInfo)=0;
|
||||||
};
|
};
|
||||||
|
|
|
@ -41,9 +41,9 @@ SphereVsSphereAlgorithm::~SphereVsSphereAlgorithm() {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool SphereVsSphereAlgorithm::testCollision(const CollisionShape* collisionShape1,
|
bool SphereVsSphereAlgorithm::testCollision(CollisionShape* collisionShape1,
|
||||||
const Transform& transform1,
|
const Transform& transform1,
|
||||||
const CollisionShape* collisionShape2,
|
CollisionShape* collisionShape2,
|
||||||
const Transform& transform2,
|
const Transform& transform2,
|
||||||
ContactPointInfo*& contactInfo) {
|
ContactPointInfo*& contactInfo) {
|
||||||
|
|
||||||
|
|
|
@ -63,9 +63,9 @@ class SphereVsSphereAlgorithm : public NarrowPhaseAlgorithm {
|
||||||
virtual ~SphereVsSphereAlgorithm();
|
virtual ~SphereVsSphereAlgorithm();
|
||||||
|
|
||||||
/// Return true and compute a contact info if the two bounding volume collide
|
/// Return true and compute a contact info if the two bounding volume collide
|
||||||
virtual bool testCollision(const CollisionShape* collisionShape1,
|
virtual bool testCollision(CollisionShape* collisionShape1,
|
||||||
const Transform& transform1,
|
const Transform& transform1,
|
||||||
const CollisionShape* collisionShape2,
|
CollisionShape* collisionShape2,
|
||||||
const Transform& transform2,
|
const Transform& transform2,
|
||||||
ContactPointInfo*& contactInfo);
|
ContactPointInfo*& contactInfo);
|
||||||
};
|
};
|
||||||
|
|
|
@ -80,19 +80,19 @@ class BoxShape : public CollisionShape {
|
||||||
virtual BoxShape* clone(void* allocatedMemory) const;
|
virtual BoxShape* clone(void* allocatedMemory) const;
|
||||||
|
|
||||||
/// Return the extents of the box
|
/// Return the extents of the box
|
||||||
const Vector3& getExtent() const;
|
Vector3 getExtent() const;
|
||||||
|
|
||||||
/// Return the local extents in x,y and z direction.
|
/// Return the local bounds of the shape in x, y and z directions
|
||||||
virtual Vector3 getLocalExtents() const;
|
virtual void getLocalBounds(Vector3& min, Vector3& max) const;
|
||||||
|
|
||||||
/// Return the number of bytes used by the collision shape
|
/// Return the number of bytes used by the collision shape
|
||||||
virtual size_t getSizeInBytes() const;
|
virtual size_t getSizeInBytes() const;
|
||||||
|
|
||||||
/// Return a local support point in a given direction with the object margin
|
/// Return a local support point in a given direction with the object margin
|
||||||
virtual Vector3 getLocalSupportPointWithMargin(const Vector3& direction) const;
|
virtual Vector3 getLocalSupportPointWithMargin(const Vector3& direction);
|
||||||
|
|
||||||
/// Return a local support point in a given direction without the object margin
|
/// Return a local support point in a given direction without the object margin
|
||||||
virtual Vector3 getLocalSupportPointWithoutMargin(const Vector3& direction) const;
|
virtual Vector3 getLocalSupportPointWithoutMargin(const Vector3& direction);
|
||||||
|
|
||||||
/// Return the local inertia tensor of the collision shape
|
/// Return the local inertia tensor of the collision shape
|
||||||
virtual void computeLocalInertiaTensor(Matrix3x3& tensor, decimal mass) const;
|
virtual void computeLocalInertiaTensor(Matrix3x3& tensor, decimal mass) const;
|
||||||
|
@ -107,14 +107,19 @@ inline BoxShape* BoxShape::clone(void* allocatedMemory) const {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Return the extents of the box
|
// Return the extents of the box
|
||||||
inline const Vector3& BoxShape::getExtent() const {
|
inline Vector3 BoxShape::getExtent() const {
|
||||||
return mExtent + Vector3(mMargin, mMargin, mMargin);
|
return mExtent + Vector3(mMargin, mMargin, mMargin);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Return the local extents of the box (half-width) in x,y and z local direction.
|
// Return the local bounds of the shape in x, y and z directions
|
||||||
/// This method is used to compute the AABB of the box
|
/// This method is used to compute the AABB of the box
|
||||||
inline Vector3 BoxShape::getLocalExtents() const {
|
inline void BoxShape::getLocalBounds(Vector3& min, Vector3& max) const {
|
||||||
return mExtent + Vector3(mMargin, mMargin, mMargin);
|
|
||||||
|
// Maximum bounds
|
||||||
|
max = mExtent + Vector3(mMargin, mMargin, mMargin);
|
||||||
|
|
||||||
|
// Minimum bounds
|
||||||
|
min = -max;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Return the number of bytes used by the collision shape
|
// Return the number of bytes used by the collision shape
|
||||||
|
@ -123,7 +128,7 @@ inline size_t BoxShape::getSizeInBytes() const {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Return a local support point in a given direction with the object margin
|
// Return a local support point in a given direction with the object margin
|
||||||
inline Vector3 BoxShape::getLocalSupportPointWithMargin(const Vector3& direction) const {
|
inline Vector3 BoxShape::getLocalSupportPointWithMargin(const Vector3& direction) {
|
||||||
|
|
||||||
assert(mMargin > 0.0);
|
assert(mMargin > 0.0);
|
||||||
|
|
||||||
|
@ -133,7 +138,7 @@ inline Vector3 BoxShape::getLocalSupportPointWithMargin(const Vector3& direction
|
||||||
}
|
}
|
||||||
|
|
||||||
// Return a local support point in a given direction without the objec margin
|
// Return a local support point in a given direction without the objec margin
|
||||||
inline Vector3 BoxShape::getLocalSupportPointWithoutMargin(const Vector3& direction) const {
|
inline Vector3 BoxShape::getLocalSupportPointWithoutMargin(const Vector3& direction) {
|
||||||
|
|
||||||
return Vector3(direction.x < 0.0 ? -mExtent.x : mExtent.x,
|
return Vector3(direction.x < 0.0 ? -mExtent.x : mExtent.x,
|
||||||
direction.y < 0.0 ? -mExtent.y : mExtent.y,
|
direction.y < 0.0 ? -mExtent.y : mExtent.y,
|
||||||
|
|
|
@ -55,7 +55,7 @@ CapsuleShape::~CapsuleShape() {
|
||||||
/// Therefore, in this method, we compute the support points of both top and bottom spheres of
|
/// Therefore, in this method, we compute the support points of both top and bottom spheres of
|
||||||
/// the capsule and return the point with the maximum dot product with the direction vector. Note
|
/// the capsule and return the point with the maximum dot product with the direction vector. Note
|
||||||
/// that the object margin is implicitly the radius and height of the capsule.
|
/// that the object margin is implicitly the radius and height of the capsule.
|
||||||
Vector3 CapsuleShape::getLocalSupportPointWithMargin(const Vector3& direction) const {
|
Vector3 CapsuleShape::getLocalSupportPointWithMargin(const Vector3& direction) {
|
||||||
|
|
||||||
// If the direction vector is not the zero vector
|
// If the direction vector is not the zero vector
|
||||||
if (direction.lengthSquare() >= MACHINE_EPSILON * MACHINE_EPSILON) {
|
if (direction.lengthSquare() >= MACHINE_EPSILON * MACHINE_EPSILON) {
|
||||||
|
@ -87,7 +87,7 @@ Vector3 CapsuleShape::getLocalSupportPointWithMargin(const Vector3& direction) c
|
||||||
}
|
}
|
||||||
|
|
||||||
// Return a local support point in a given direction without the object margin.
|
// Return a local support point in a given direction without the object margin.
|
||||||
Vector3 CapsuleShape::getLocalSupportPointWithoutMargin(const Vector3& direction) const {
|
Vector3 CapsuleShape::getLocalSupportPointWithoutMargin(const Vector3& direction) {
|
||||||
|
|
||||||
// If the dot product of the direction and the local Y axis (dotProduct = direction.y)
|
// If the dot product of the direction and the local Y axis (dotProduct = direction.y)
|
||||||
// is positive
|
// is positive
|
||||||
|
|
|
@ -86,13 +86,13 @@ class CapsuleShape : public CollisionShape {
|
||||||
virtual size_t getSizeInBytes() const;
|
virtual size_t getSizeInBytes() const;
|
||||||
|
|
||||||
/// Return a local support point in a given direction with the object margin.
|
/// Return a local support point in a given direction with the object margin.
|
||||||
virtual Vector3 getLocalSupportPointWithMargin(const Vector3& direction) const;
|
virtual Vector3 getLocalSupportPointWithMargin(const Vector3& direction);
|
||||||
|
|
||||||
/// Return a local support point in a given direction without the object margin
|
/// Return a local support point in a given direction without the object margin
|
||||||
virtual Vector3 getLocalSupportPointWithoutMargin(const Vector3& direction) const;
|
virtual Vector3 getLocalSupportPointWithoutMargin(const Vector3& direction);
|
||||||
|
|
||||||
/// Return the local extents in x,y and z direction
|
/// Return the local bounds of the shape in x, y and z directions
|
||||||
virtual Vector3 getLocalExtents() const;
|
virtual void getLocalBounds(Vector3& min, Vector3& max) const;
|
||||||
|
|
||||||
/// Return the local inertia tensor of the collision shape
|
/// Return the local inertia tensor of the collision shape
|
||||||
virtual void computeLocalInertiaTensor(Matrix3x3& tensor, decimal mass) const;
|
virtual void computeLocalInertiaTensor(Matrix3x3& tensor, decimal mass) const;
|
||||||
|
@ -121,12 +121,19 @@ inline size_t CapsuleShape::getSizeInBytes() const {
|
||||||
return sizeof(CapsuleShape);
|
return sizeof(CapsuleShape);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Return the local extents of the collision shape (half-width) in x,y and z local direction
|
// Return the local bounds of the shape in x, y and z directions
|
||||||
// This method is used to compute the AABB of the box
|
// This method is used to compute the AABB of the box
|
||||||
inline Vector3 CapsuleShape::getLocalExtents() const {
|
inline void CapsuleShape::getLocalBounds(Vector3& min, Vector3& max) const {
|
||||||
return Vector3(mRadius,
|
|
||||||
mHalfHeight + mRadius,
|
// Maximum bounds
|
||||||
mRadius);
|
max.x = mRadius;
|
||||||
|
max.y = mHalfHeight + mRadius;
|
||||||
|
max.z = mRadius;
|
||||||
|
|
||||||
|
// Minimum bounds
|
||||||
|
min.x = -mRadius;
|
||||||
|
min.y = -max.y;
|
||||||
|
min.z = min.x;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Test equality between two capsule shapes
|
// Test equality between two capsule shapes
|
||||||
|
|
|
@ -48,20 +48,25 @@ CollisionShape::~CollisionShape() {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Update the AABB of a body using its collision shape
|
// Update the AABB of a body using its collision shape
|
||||||
inline void CollisionShape::updateAABB(AABB& aabb, const Transform& transform) {
|
void CollisionShape::updateAABB(AABB& aabb, const Transform& transform) {
|
||||||
|
|
||||||
// Get the local extents in x,y and z direction
|
// Get the local bounds in x,y and z direction
|
||||||
Vector3 extents = getLocalExtents();
|
Vector3 minBounds;
|
||||||
|
Vector3 maxBounds;
|
||||||
|
getLocalBounds(minBounds, maxBounds);
|
||||||
|
|
||||||
// Rotate the local extents according to the orientation of the body
|
// Rotate the local bounds according to the orientation of the body
|
||||||
Matrix3x3 worldAxis = transform.getOrientation().getMatrix().getAbsoluteMatrix();
|
Matrix3x3 worldAxis = transform.getOrientation().getMatrix().getAbsoluteMatrix();
|
||||||
Vector3 worldExtents = Vector3(worldAxis.getColumn(0).dot(extents),
|
Vector3 worldMinBounds(worldAxis.getColumn(0).dot(minBounds),
|
||||||
worldAxis.getColumn(1).dot(extents),
|
worldAxis.getColumn(1).dot(minBounds),
|
||||||
worldAxis.getColumn(2).dot(extents));
|
worldAxis.getColumn(2).dot(minBounds));
|
||||||
|
Vector3 worldMaxBounds(worldAxis.getColumn(0).dot(maxBounds),
|
||||||
|
worldAxis.getColumn(1).dot(maxBounds),
|
||||||
|
worldAxis.getColumn(2).dot(maxBounds));
|
||||||
|
|
||||||
// Compute the minimum and maximum coordinates of the rotated extents
|
// Compute the minimum and maximum coordinates of the rotated extents
|
||||||
Vector3 minCoordinates = transform.getPosition() - worldExtents;
|
Vector3 minCoordinates = transform.getPosition() + worldMinBounds;
|
||||||
Vector3 maxCoordinates = transform.getPosition() + worldExtents;
|
Vector3 maxCoordinates = transform.getPosition() + worldMaxBounds;
|
||||||
|
|
||||||
// Update the AABB with the new minimum and maximum coordinates
|
// Update the AABB with the new minimum and maximum coordinates
|
||||||
aabb.setMin(minCoordinates);
|
aabb.setMin(minCoordinates);
|
||||||
|
|
|
@ -36,7 +36,7 @@
|
||||||
namespace reactphysics3d {
|
namespace reactphysics3d {
|
||||||
|
|
||||||
/// Type of the collision shape
|
/// Type of the collision shape
|
||||||
enum CollisionShapeType {BOX, SPHERE, CONE, CYLINDER, CAPSULE};
|
enum CollisionShapeType {BOX, SPHERE, CONE, CYLINDER, CAPSULE, CONVEX_MESH};
|
||||||
|
|
||||||
// Declarations
|
// Declarations
|
||||||
class Body;
|
class Body;
|
||||||
|
@ -95,13 +95,13 @@ class CollisionShape {
|
||||||
virtual size_t getSizeInBytes() const = 0;
|
virtual size_t getSizeInBytes() const = 0;
|
||||||
|
|
||||||
/// Return a local support point in a given direction with the object margin
|
/// Return a local support point in a given direction with the object margin
|
||||||
virtual Vector3 getLocalSupportPointWithMargin(const Vector3& direction) const=0;
|
virtual Vector3 getLocalSupportPointWithMargin(const Vector3& direction)=0;
|
||||||
|
|
||||||
/// Return a local support point in a given direction without the object margin
|
/// Return a local support point in a given direction without the object margin
|
||||||
virtual Vector3 getLocalSupportPointWithoutMargin(const Vector3& direction) const=0;
|
virtual Vector3 getLocalSupportPointWithoutMargin(const Vector3& direction)=0;
|
||||||
|
|
||||||
/// Return the local extents in x,y and z direction
|
/// Return the local bounds of the shape in x, y and z directions
|
||||||
virtual Vector3 getLocalExtents() const=0;
|
virtual void getLocalBounds(Vector3& min, Vector3& max) const=0;
|
||||||
|
|
||||||
/// Return the local inertia tensor of the collision shapes
|
/// Return the local inertia tensor of the collision shapes
|
||||||
virtual void computeLocalInertiaTensor(Matrix3x3& tensor, decimal mass) const=0;
|
virtual void computeLocalInertiaTensor(Matrix3x3& tensor, decimal mass) const=0;
|
||||||
|
|
|
@ -54,7 +54,7 @@ ConeShape::~ConeShape() {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Return a local support point in a given direction with the object margin
|
// Return a local support point in a given direction with the object margin
|
||||||
inline Vector3 ConeShape::getLocalSupportPointWithMargin(const Vector3& direction) const {
|
Vector3 ConeShape::getLocalSupportPointWithMargin(const Vector3& direction) {
|
||||||
|
|
||||||
// Compute the support point without the margin
|
// Compute the support point without the margin
|
||||||
Vector3 supportPoint = getLocalSupportPointWithoutMargin(direction);
|
Vector3 supportPoint = getLocalSupportPointWithoutMargin(direction);
|
||||||
|
@ -70,7 +70,7 @@ inline Vector3 ConeShape::getLocalSupportPointWithMargin(const Vector3& directio
|
||||||
}
|
}
|
||||||
|
|
||||||
// Return a local support point in a given direction without the object margin
|
// Return a local support point in a given direction without the object margin
|
||||||
inline Vector3 ConeShape::getLocalSupportPointWithoutMargin(const Vector3& direction) const {
|
Vector3 ConeShape::getLocalSupportPointWithoutMargin(const Vector3& direction) {
|
||||||
|
|
||||||
const Vector3& v = direction;
|
const Vector3& v = direction;
|
||||||
decimal sinThetaTimesLengthV = mSinTheta * v.length();
|
decimal sinThetaTimesLengthV = mSinTheta * v.length();
|
||||||
|
|
|
@ -94,13 +94,13 @@ class ConeShape : public CollisionShape {
|
||||||
virtual size_t getSizeInBytes() const;
|
virtual size_t getSizeInBytes() const;
|
||||||
|
|
||||||
/// Return a local support point in a given direction with the object margin
|
/// Return a local support point in a given direction with the object margin
|
||||||
virtual Vector3 getLocalSupportPointWithMargin(const Vector3& direction) const;
|
virtual Vector3 getLocalSupportPointWithMargin(const Vector3& direction);
|
||||||
|
|
||||||
/// Return a local support point in a given direction without the object margin
|
/// Return a local support point in a given direction without the object margin
|
||||||
virtual Vector3 getLocalSupportPointWithoutMargin(const Vector3& direction) const;
|
virtual Vector3 getLocalSupportPointWithoutMargin(const Vector3& direction);
|
||||||
|
|
||||||
/// Return the local extents in x,y and z direction
|
/// Return the local bounds of the shape in x, y and z directions
|
||||||
virtual Vector3 getLocalExtents() const;
|
virtual void getLocalBounds(Vector3& min, Vector3& max) const;
|
||||||
|
|
||||||
/// Return the local inertia tensor of the collision shape
|
/// Return the local inertia tensor of the collision shape
|
||||||
virtual void computeLocalInertiaTensor(Matrix3x3& tensor, decimal mass) const;
|
virtual void computeLocalInertiaTensor(Matrix3x3& tensor, decimal mass) const;
|
||||||
|
@ -129,9 +129,18 @@ inline size_t ConeShape::getSizeInBytes() const {
|
||||||
return sizeof(ConeShape);
|
return sizeof(ConeShape);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Return the local extents in x,y and z direction
|
// Return the local bounds of the shape in x, y and z directions
|
||||||
inline Vector3 ConeShape::getLocalExtents() const {
|
inline void ConeShape::getLocalBounds(Vector3& min, Vector3& max) const {
|
||||||
return Vector3(mRadius + mMargin, mHalfHeight + mMargin, mRadius + mMargin);
|
|
||||||
|
// Maximum bounds
|
||||||
|
max.x = mRadius + mMargin;
|
||||||
|
max.y = mHalfHeight + mMargin;
|
||||||
|
max.z = max.x;
|
||||||
|
|
||||||
|
// Minimum bounds
|
||||||
|
min.x = -max.x;
|
||||||
|
min.y = -max.y;
|
||||||
|
min.z = min.x;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Return the local inertia tensor of the collision shape
|
// Return the local inertia tensor of the collision shape
|
||||||
|
|
|
@ -50,7 +50,7 @@ CylinderShape::~CylinderShape() {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Return a local support point in a given direction with the object margin
|
// Return a local support point in a given direction with the object margin
|
||||||
Vector3 CylinderShape::getLocalSupportPointWithMargin(const Vector3& direction) const {
|
Vector3 CylinderShape::getLocalSupportPointWithMargin(const Vector3& direction) {
|
||||||
|
|
||||||
// Compute the support point without the margin
|
// Compute the support point without the margin
|
||||||
Vector3 supportPoint = getLocalSupportPointWithoutMargin(direction);
|
Vector3 supportPoint = getLocalSupportPointWithoutMargin(direction);
|
||||||
|
@ -66,7 +66,7 @@ Vector3 CylinderShape::getLocalSupportPointWithMargin(const Vector3& direction)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Return a local support point in a given direction without the object margin
|
// Return a local support point in a given direction without the object margin
|
||||||
Vector3 CylinderShape::getLocalSupportPointWithoutMargin(const Vector3& direction) const {
|
Vector3 CylinderShape::getLocalSupportPointWithoutMargin(const Vector3& direction) {
|
||||||
|
|
||||||
Vector3 supportPoint(0.0, 0.0, 0.0);
|
Vector3 supportPoint(0.0, 0.0, 0.0);
|
||||||
decimal uDotv = direction.y;
|
decimal uDotv = direction.y;
|
||||||
|
|
|
@ -91,13 +91,13 @@ class CylinderShape : public CollisionShape {
|
||||||
virtual size_t getSizeInBytes() const;
|
virtual size_t getSizeInBytes() const;
|
||||||
|
|
||||||
/// Return a local support point in a given direction with the object margin
|
/// Return a local support point in a given direction with the object margin
|
||||||
virtual Vector3 getLocalSupportPointWithMargin(const Vector3& direction) const;
|
virtual Vector3 getLocalSupportPointWithMargin(const Vector3& direction);
|
||||||
|
|
||||||
/// Return a local support point in a given direction without the object margin
|
/// Return a local support point in a given direction without the object margin
|
||||||
virtual Vector3 getLocalSupportPointWithoutMargin(const Vector3& direction) const;
|
virtual Vector3 getLocalSupportPointWithoutMargin(const Vector3& direction);
|
||||||
|
|
||||||
/// Return the local extents in x,y and z direction
|
/// Return the local bounds of the shape in x, y and z directions
|
||||||
virtual Vector3 getLocalExtents() const;
|
virtual void getLocalBounds(Vector3& min, Vector3& max) const;
|
||||||
|
|
||||||
/// Return the local inertia tensor of the collision shape
|
/// Return the local inertia tensor of the collision shape
|
||||||
virtual void computeLocalInertiaTensor(Matrix3x3& tensor, decimal mass) const;
|
virtual void computeLocalInertiaTensor(Matrix3x3& tensor, decimal mass) const;
|
||||||
|
@ -126,9 +126,18 @@ inline size_t CylinderShape::getSizeInBytes() const {
|
||||||
return sizeof(CylinderShape);
|
return sizeof(CylinderShape);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Return the local extents in x,y and z direction
|
// Return the local bounds of the shape in x, y and z directions
|
||||||
inline Vector3 CylinderShape::getLocalExtents() const {
|
inline void CylinderShape::getLocalBounds(Vector3& min, Vector3& max) const {
|
||||||
return Vector3(mRadius + mMargin, mHalfHeight + mMargin, mRadius + mMargin);
|
|
||||||
|
// Maximum bounds
|
||||||
|
max.x = mRadius + mMargin;
|
||||||
|
max.y = mHalfHeight + mMargin;
|
||||||
|
max.z = max.x;
|
||||||
|
|
||||||
|
// Minimum bounds
|
||||||
|
min.x = -max.x;
|
||||||
|
min.y = -max.y;
|
||||||
|
min.z = min.x;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Return the local inertia tensor of the cylinder
|
// Return the local inertia tensor of the cylinder
|
||||||
|
|
|
@ -78,13 +78,13 @@ class SphereShape : public CollisionShape {
|
||||||
virtual size_t getSizeInBytes() const;
|
virtual size_t getSizeInBytes() const;
|
||||||
|
|
||||||
/// Return a local support point in a given direction with the object margin
|
/// Return a local support point in a given direction with the object margin
|
||||||
virtual Vector3 getLocalSupportPointWithMargin(const Vector3& direction) const;
|
virtual Vector3 getLocalSupportPointWithMargin(const Vector3& direction);
|
||||||
|
|
||||||
/// Return a local support point in a given direction without the object margin
|
/// Return a local support point in a given direction without the object margin
|
||||||
virtual Vector3 getLocalSupportPointWithoutMargin(const Vector3& direction) const;
|
virtual Vector3 getLocalSupportPointWithoutMargin(const Vector3& direction);
|
||||||
|
|
||||||
/// Return the local extents in x,y and z direction
|
/// Return the local bounds of the shape in x, y and z directions.
|
||||||
virtual Vector3 getLocalExtents() const;
|
virtual void getLocalBounds(Vector3& min, Vector3& max) const;
|
||||||
|
|
||||||
/// Return the local inertia tensor of the collision shape
|
/// Return the local inertia tensor of the collision shape
|
||||||
virtual void computeLocalInertiaTensor(Matrix3x3& tensor, decimal mass) const;
|
virtual void computeLocalInertiaTensor(Matrix3x3& tensor, decimal mass) const;
|
||||||
|
@ -112,7 +112,7 @@ inline size_t SphereShape::getSizeInBytes() const {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Return a local support point in a given direction with the object margin
|
// Return a local support point in a given direction with the object margin
|
||||||
inline Vector3 SphereShape::getLocalSupportPointWithMargin(const Vector3& direction) const {
|
inline Vector3 SphereShape::getLocalSupportPointWithMargin(const Vector3& direction) {
|
||||||
|
|
||||||
// If the direction vector is not the zero vector
|
// If the direction vector is not the zero vector
|
||||||
if (direction.lengthSquare() >= MACHINE_EPSILON * MACHINE_EPSILON) {
|
if (direction.lengthSquare() >= MACHINE_EPSILON * MACHINE_EPSILON) {
|
||||||
|
@ -127,16 +127,25 @@ inline Vector3 SphereShape::getLocalSupportPointWithMargin(const Vector3& direct
|
||||||
}
|
}
|
||||||
|
|
||||||
// Return a local support point in a given direction without the object margin
|
// Return a local support point in a given direction without the object margin
|
||||||
inline Vector3 SphereShape::getLocalSupportPointWithoutMargin(const Vector3& direction) const {
|
inline Vector3 SphereShape::getLocalSupportPointWithoutMargin(const Vector3& direction) {
|
||||||
|
|
||||||
// Return the center of the sphere (the radius is taken into account in the object margin)
|
// Return the center of the sphere (the radius is taken into account in the object margin)
|
||||||
return Vector3(0.0, 0.0, 0.0);
|
return Vector3(0.0, 0.0, 0.0);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Return the local extents of the collision shape (half-width) in x,y and z local direction
|
// Return the local bounds of the shape in x, y and z directions.
|
||||||
// This method is used to compute the AABB of the box
|
// This method is used to compute the AABB of the box
|
||||||
inline Vector3 SphereShape::getLocalExtents() const {
|
inline void SphereShape::getLocalBounds(Vector3& min, Vector3& max) const {
|
||||||
return Vector3(mRadius, mRadius, mRadius);
|
|
||||||
|
// Maximum bounds
|
||||||
|
max.x = mRadius;
|
||||||
|
max.y = mRadius;
|
||||||
|
max.z = mRadius;
|
||||||
|
|
||||||
|
// Minimum bounds
|
||||||
|
min.x = -mRadius;
|
||||||
|
min.y = min.x;
|
||||||
|
min.z = min.x;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Return the local inertia tensor of the sphere
|
// Return the local inertia tensor of the sphere
|
||||||
|
@ -151,15 +160,11 @@ inline void SphereShape::computeLocalInertiaTensor(Matrix3x3& tensor, decimal ma
|
||||||
inline void SphereShape::updateAABB(AABB& aabb, const Transform& transform) {
|
inline void SphereShape::updateAABB(AABB& aabb, const Transform& transform) {
|
||||||
|
|
||||||
// Get the local extents in x,y and z direction
|
// Get the local extents in x,y and z direction
|
||||||
Vector3 extents = getLocalExtents();
|
Vector3 extents(mRadius, mRadius, mRadius);
|
||||||
|
|
||||||
// Compute the minimum and maximum coordinates of the rotated extents
|
|
||||||
Vector3 minCoordinates = transform.getPosition() - extents;
|
|
||||||
Vector3 maxCoordinates = transform.getPosition() + extents;
|
|
||||||
|
|
||||||
// Update the AABB with the new minimum and maximum coordinates
|
// Update the AABB with the new minimum and maximum coordinates
|
||||||
aabb.setMin(minCoordinates);
|
aabb.setMin(transform.getPosition() - extents);
|
||||||
aabb.setMax(maxCoordinates);
|
aabb.setMax(transform.getPosition() + extents);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Test equality between two sphere shapes
|
// Test equality between two sphere shapes
|
||||||
|
|
|
@ -154,7 +154,6 @@ CollisionShape* CollisionWorld::createCollisionShape(const CollisionShape& colli
|
||||||
// A similar collision shape does not already exist in the world, so we create a
|
// A similar collision shape does not already exist in the world, so we create a
|
||||||
// new one and add it to the world
|
// new one and add it to the world
|
||||||
void* allocatedMemory = mMemoryAllocator.allocate(collisionShape.getSizeInBytes());
|
void* allocatedMemory = mMemoryAllocator.allocate(collisionShape.getSizeInBytes());
|
||||||
size_t test = collisionShape.getSizeInBytes();
|
|
||||||
CollisionShape* newCollisionShape = collisionShape.clone(allocatedMemory);
|
CollisionShape* newCollisionShape = collisionShape.clone(allocatedMemory);
|
||||||
mCollisionShapes.push_back(newCollisionShape);
|
mCollisionShapes.push_back(newCollisionShape);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user