Add setLocalScaling() method to CollisionShape and ProxyShape and fix issue in collision detection test method
This commit is contained in:
parent
4eceb7e7c6
commit
3476f3e9c4
|
@ -197,15 +197,22 @@ void CollisionBody::updateBroadPhaseState() const {
|
||||||
// For all the proxy collision shapes of the body
|
// For all the proxy collision shapes of the body
|
||||||
for (ProxyShape* shape = mProxyCollisionShapes; shape != NULL; shape = shape->mNext) {
|
for (ProxyShape* shape = mProxyCollisionShapes; shape != NULL; shape = shape->mNext) {
|
||||||
|
|
||||||
// Recompute the world-space AABB of the collision shape
|
// Update the proxy
|
||||||
AABB aabb;
|
updateProxyShapeInBroadPhase(shape);
|
||||||
shape->getCollisionShape()->computeAABB(aabb, mTransform *shape->getLocalToBodyTransform());
|
|
||||||
|
|
||||||
// Update the broad-phase state for the proxy collision shape
|
|
||||||
mWorld.mCollisionDetection.updateProxyCollisionShape(shape, aabb);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Update the broad-phase state of a proxy collision shape of the body
|
||||||
|
void CollisionBody::updateProxyShapeInBroadPhase(ProxyShape* proxyShape) const {
|
||||||
|
|
||||||
|
// Recompute the world-space AABB of the collision shape
|
||||||
|
AABB aabb;
|
||||||
|
proxyShape->getCollisionShape()->computeAABB(aabb, mTransform * proxyShape->getLocalToBodyTransform());
|
||||||
|
|
||||||
|
// Update the broad-phase state for the proxy collision shape
|
||||||
|
mWorld.mCollisionDetection.updateProxyCollisionShape(proxyShape, aabb);
|
||||||
|
}
|
||||||
|
|
||||||
// Set whether or not the body is active
|
// Set whether or not the body is active
|
||||||
/**
|
/**
|
||||||
* @param isActive True if you want to activate the body
|
* @param isActive True if you want to activate the body
|
||||||
|
|
|
@ -102,6 +102,9 @@ class CollisionBody : public Body {
|
||||||
/// Update the broad-phase state for this body (because it has moved for instance)
|
/// Update the broad-phase state for this body (because it has moved for instance)
|
||||||
virtual void updateBroadPhaseState() const;
|
virtual void updateBroadPhaseState() const;
|
||||||
|
|
||||||
|
/// Update the broad-phase state of a proxy collision shape of the body
|
||||||
|
void updateProxyShapeInBroadPhase(ProxyShape* proxyShape) const;
|
||||||
|
|
||||||
/// Ask the broad-phase to test again the collision shapes of the body for collision
|
/// Ask the broad-phase to test again the collision shapes of the body for collision
|
||||||
/// (as if the body has moved).
|
/// (as if the body has moved).
|
||||||
void askForBroadPhaseCollisionCheck() const;
|
void askForBroadPhaseCollisionCheck() const;
|
||||||
|
|
|
@ -335,9 +335,11 @@ void CollisionDetection::computeNarrowPhaseBetweenShapes(CollisionCallback* call
|
||||||
CollisionShapeInfo shape2Info(shape2, shape2->getCollisionShape(), shape2->getLocalToWorldTransform(),
|
CollisionShapeInfo shape2Info(shape2, shape2->getCollisionShape(), shape2->getLocalToWorldTransform(),
|
||||||
pair, shape2->getCachedCollisionData());
|
pair, shape2->getCachedCollisionData());
|
||||||
|
|
||||||
|
TestCollisionBetweenShapesCallback narrowPhaseCallback(callback);
|
||||||
|
|
||||||
// Use the narrow-phase collision detection algorithm to check
|
// Use the narrow-phase collision detection algorithm to check
|
||||||
// if there really is a collision
|
// if there really is a collision
|
||||||
narrowPhaseAlgorithm->testCollision(shape1Info, shape2Info, this);
|
narrowPhaseAlgorithm->testCollision(shape1Info, shape2Info, &narrowPhaseCallback);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Add all the contact manifolds (between colliding bodies) to the bodies
|
// Add all the contact manifolds (between colliding bodies) to the bodies
|
||||||
|
@ -518,3 +520,9 @@ EventListener* CollisionDetection::getWorldEventListener() {
|
||||||
MemoryAllocator& CollisionDetection::getWorldMemoryAllocator() {
|
MemoryAllocator& CollisionDetection::getWorldMemoryAllocator() {
|
||||||
return mWorld->mMemoryAllocator;
|
return mWorld->mMemoryAllocator;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Called by a narrow-phase collision algorithm when a new contact has been found
|
||||||
|
void TestCollisionBetweenShapesCallback::notifyContact(OverlappingPair* overlappingPair,
|
||||||
|
const ContactPointInfo& contactInfo) {
|
||||||
|
mCollisionCallback->notifyContact(contactInfo);
|
||||||
|
}
|
||||||
|
|
|
@ -47,6 +47,26 @@ class BroadPhaseAlgorithm;
|
||||||
class CollisionWorld;
|
class CollisionWorld;
|
||||||
class CollisionCallback;
|
class CollisionCallback;
|
||||||
|
|
||||||
|
// Class TestCollisionBetweenShapesCallback
|
||||||
|
class TestCollisionBetweenShapesCallback : public NarrowPhaseCallback {
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
CollisionCallback* mCollisionCallback;
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
// Constructor
|
||||||
|
TestCollisionBetweenShapesCallback(CollisionCallback* callback)
|
||||||
|
: mCollisionCallback(callback) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// Called by a narrow-phase collision algorithm when a new contact has been found
|
||||||
|
virtual void notifyContact(OverlappingPair* overlappingPair,
|
||||||
|
const ContactPointInfo& contactInfo);
|
||||||
|
};
|
||||||
|
|
||||||
// Class CollisionDetection
|
// Class CollisionDetection
|
||||||
/**
|
/**
|
||||||
* This class computes the collision detection algorithms. We first
|
* This class computes the collision detection algorithms. We first
|
||||||
|
|
|
@ -152,6 +152,12 @@ class ProxyShape {
|
||||||
/// Return the pointer to the cached collision data
|
/// Return the pointer to the cached collision data
|
||||||
void** getCachedCollisionData();
|
void** getCachedCollisionData();
|
||||||
|
|
||||||
|
/// Return the scaling vector of the collision shape
|
||||||
|
Vector3 getScaling() const;
|
||||||
|
|
||||||
|
/// Set the scaling vector of the collision shape
|
||||||
|
virtual void setScaling(const Vector3& scaling);
|
||||||
|
|
||||||
// -------------------- Friendship -------------------- //
|
// -------------------- Friendship -------------------- //
|
||||||
|
|
||||||
friend class OverlappingPair;
|
friend class OverlappingPair;
|
||||||
|
@ -293,6 +299,21 @@ inline void ProxyShape::setCollideWithMaskBits(unsigned short collideWithMaskBit
|
||||||
mCollideWithMaskBits = collideWithMaskBits;
|
mCollideWithMaskBits = collideWithMaskBits;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Return the scaling vector of the collision shape
|
||||||
|
inline Vector3 ProxyShape::getScaling() const {
|
||||||
|
return mCollisionShape->getScaling();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set the scaling vector of the collision shape
|
||||||
|
inline void ProxyShape::setScaling(const Vector3& scaling) {
|
||||||
|
|
||||||
|
// Set the local scaling of the collision shape
|
||||||
|
mCollisionShape->setLocalScaling(scaling);
|
||||||
|
|
||||||
|
// Notify the body that the proxy shape has to be updated in the broad-phase
|
||||||
|
mBody->updateProxyShapeInBroadPhase(this);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -37,6 +37,19 @@ const int TreeNode::NULL_TREE_NODE = -1;
|
||||||
// Constructor
|
// Constructor
|
||||||
DynamicAABBTree::DynamicAABBTree(decimal extraAABBGap) : mExtraAABBGap(extraAABBGap) {
|
DynamicAABBTree::DynamicAABBTree(decimal extraAABBGap) : mExtraAABBGap(extraAABBGap) {
|
||||||
|
|
||||||
|
init();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Destructor
|
||||||
|
DynamicAABBTree::~DynamicAABBTree() {
|
||||||
|
|
||||||
|
// Free the allocated memory for the nodes
|
||||||
|
free(mNodes);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Initialize the tree
|
||||||
|
void DynamicAABBTree::init() {
|
||||||
|
|
||||||
mRootNodeID = TreeNode::NULL_TREE_NODE;
|
mRootNodeID = TreeNode::NULL_TREE_NODE;
|
||||||
mNbNodes = 0;
|
mNbNodes = 0;
|
||||||
mNbAllocatedNodes = 8;
|
mNbAllocatedNodes = 8;
|
||||||
|
@ -56,11 +69,14 @@ DynamicAABBTree::DynamicAABBTree(decimal extraAABBGap) : mExtraAABBGap(extraAABB
|
||||||
mFreeNodeID = 0;
|
mFreeNodeID = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Destructor
|
// Clear all the nodes and reset the tree
|
||||||
DynamicAABBTree::~DynamicAABBTree() {
|
void DynamicAABBTree::reset() {
|
||||||
|
|
||||||
// Free the allocated memory for the nodes
|
// Free the allocated memory for the nodes
|
||||||
free(mNodes);
|
free(mNodes);
|
||||||
|
|
||||||
|
// Initialize the tree
|
||||||
|
init();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Allocate and return a new node in the tree
|
// Allocate and return a new node in the tree
|
||||||
|
|
|
@ -159,6 +159,9 @@ class DynamicAABBTree {
|
||||||
/// Internally add an object into the tree
|
/// Internally add an object into the tree
|
||||||
int addObjectInternal(const AABB& aabb);
|
int addObjectInternal(const AABB& aabb);
|
||||||
|
|
||||||
|
/// Initialize the tree
|
||||||
|
void init();
|
||||||
|
|
||||||
#ifndef NDEBUG
|
#ifndef NDEBUG
|
||||||
|
|
||||||
/// Check if the tree structure is valid (for debugging purpose)
|
/// Check if the tree structure is valid (for debugging purpose)
|
||||||
|
@ -214,6 +217,9 @@ class DynamicAABBTree {
|
||||||
|
|
||||||
/// Return the root AABB of the tree
|
/// Return the root AABB of the tree
|
||||||
AABB getRootAABB() const;
|
AABB getRootAABB() const;
|
||||||
|
|
||||||
|
/// Clear all the nodes and reset the tree
|
||||||
|
void reset();
|
||||||
};
|
};
|
||||||
|
|
||||||
// Return true if the node is a leaf of the tree
|
// Return true if the node is a leaf of the tree
|
||||||
|
|
|
@ -86,7 +86,7 @@ void ConvexVsTriangleCallback::testTriangle(const Vector3* trianglePoints) {
|
||||||
|
|
||||||
// Create a triangle collision shape
|
// Create a triangle collision shape
|
||||||
// TODO : Do we need to use a collision margin for a triangle ?
|
// TODO : Do we need to use a collision margin for a triangle ?
|
||||||
TriangleShape triangleShape(trianglePoints[0], trianglePoints[1], trianglePoints[2], 0.0);
|
TriangleShape triangleShape(trianglePoints[0], trianglePoints[1], trianglePoints[2]);
|
||||||
|
|
||||||
// Select the collision algorithm to use between the triangle and the convex shape
|
// Select the collision algorithm to use between the triangle and the convex shape
|
||||||
NarrowPhaseAlgorithm* algo = mCollisionDetection->getCollisionAlgorithm(triangleShape.getType(),
|
NarrowPhaseAlgorithm* algo = mCollisionDetection->getCollisionAlgorithm(triangleShape.getType(),
|
||||||
|
|
|
@ -97,6 +97,9 @@ class BoxShape : public ConvexShape {
|
||||||
/// Return the extents of the box
|
/// Return the extents of the box
|
||||||
Vector3 getExtent() const;
|
Vector3 getExtent() const;
|
||||||
|
|
||||||
|
/// Set the scaling vector of the collision shape
|
||||||
|
virtual void setLocalScaling(const Vector3& scaling);
|
||||||
|
|
||||||
/// Return the local bounds of the shape in x, y and z directions
|
/// Return the local bounds of the shape in x, y and z directions
|
||||||
virtual void getLocalBounds(Vector3& min, Vector3& max) const;
|
virtual void getLocalBounds(Vector3& min, Vector3& max) const;
|
||||||
|
|
||||||
|
@ -112,6 +115,14 @@ inline Vector3 BoxShape::getExtent() const {
|
||||||
return mExtent + Vector3(mMargin, mMargin, mMargin);
|
return mExtent + Vector3(mMargin, mMargin, mMargin);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Set the scaling vector of the collision shape
|
||||||
|
inline void BoxShape::setLocalScaling(const Vector3& scaling) {
|
||||||
|
|
||||||
|
mExtent = (mExtent / mScaling) * scaling;
|
||||||
|
|
||||||
|
CollisionShape::setLocalScaling(scaling);
|
||||||
|
}
|
||||||
|
|
||||||
// Return the local bounds of the shape in x, y and z directions
|
// 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
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -102,6 +102,9 @@ class CapsuleShape : public ConvexShape {
|
||||||
/// Return the height of the capsule
|
/// Return the height of the capsule
|
||||||
decimal getHeight() const;
|
decimal getHeight() const;
|
||||||
|
|
||||||
|
/// Set the scaling vector of the collision shape
|
||||||
|
virtual void setLocalScaling(const Vector3& scaling);
|
||||||
|
|
||||||
/// Return the local bounds of the shape in x, y and z directions
|
/// Return the local bounds of the shape in x, y and z directions
|
||||||
virtual void getLocalBounds(Vector3& min, Vector3& max) const;
|
virtual void getLocalBounds(Vector3& min, Vector3& max) const;
|
||||||
|
|
||||||
|
@ -125,6 +128,15 @@ inline decimal CapsuleShape::getHeight() const {
|
||||||
return mHalfHeight + mHalfHeight;
|
return mHalfHeight + mHalfHeight;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Set the scaling vector of the collision shape
|
||||||
|
inline void CapsuleShape::setLocalScaling(const Vector3& scaling) {
|
||||||
|
|
||||||
|
mHalfHeight = (mHalfHeight / mScaling.y) * scaling.y;
|
||||||
|
mRadius = (mRadius / mScaling.x) * scaling.x;
|
||||||
|
|
||||||
|
CollisionShape::setLocalScaling(scaling);
|
||||||
|
}
|
||||||
|
|
||||||
// Return the number of bytes used by the collision shape
|
// Return the number of bytes used by the collision shape
|
||||||
inline size_t CapsuleShape::getSizeInBytes() const {
|
inline size_t CapsuleShape::getSizeInBytes() const {
|
||||||
return sizeof(CapsuleShape);
|
return sizeof(CapsuleShape);
|
||||||
|
|
|
@ -32,7 +32,7 @@
|
||||||
using namespace reactphysics3d;
|
using namespace reactphysics3d;
|
||||||
|
|
||||||
// Constructor
|
// Constructor
|
||||||
CollisionShape::CollisionShape(CollisionShapeType type) : mType(type){
|
CollisionShape::CollisionShape(CollisionShapeType type) : mType(type), mScaling(1.0, 1.0, 1.0) {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -61,6 +61,9 @@ class CollisionShape {
|
||||||
/// Type of the collision shape
|
/// Type of the collision shape
|
||||||
CollisionShapeType mType;
|
CollisionShapeType mType;
|
||||||
|
|
||||||
|
/// Scaling vector of the collision shape
|
||||||
|
Vector3 mScaling;
|
||||||
|
|
||||||
// -------------------- Methods -------------------- //
|
// -------------------- Methods -------------------- //
|
||||||
|
|
||||||
/// Private copy-constructor
|
/// Private copy-constructor
|
||||||
|
@ -97,6 +100,12 @@ class CollisionShape {
|
||||||
/// Return the local bounds of the shape in x, y and z directions
|
/// Return the local bounds of the shape in x, y and z directions
|
||||||
virtual void getLocalBounds(Vector3& min, Vector3& max) const=0;
|
virtual void getLocalBounds(Vector3& min, Vector3& max) const=0;
|
||||||
|
|
||||||
|
/// Return the scaling vector of the collision shape
|
||||||
|
Vector3 getScaling() const;
|
||||||
|
|
||||||
|
/// Set the local scaling vector of the collision shape
|
||||||
|
virtual void setLocalScaling(const Vector3& scaling);
|
||||||
|
|
||||||
/// 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;
|
||||||
|
|
||||||
|
@ -129,6 +138,16 @@ inline bool CollisionShape::isConvex(CollisionShapeType shapeType) {
|
||||||
return shapeType != CONCAVE_MESH;
|
return shapeType != CONCAVE_MESH;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Return the scaling vector of the collision shape
|
||||||
|
inline Vector3 CollisionShape::getScaling() const {
|
||||||
|
return mScaling;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set the scaling vector of the collision shape
|
||||||
|
inline void CollisionShape::setLocalScaling(const Vector3& scaling) {
|
||||||
|
mScaling = scaling;
|
||||||
|
}
|
||||||
|
|
||||||
// Return the maximum number of contact manifolds allowed in an overlapping
|
// Return the maximum number of contact manifolds allowed in an overlapping
|
||||||
// pair wit the given two collision shape types
|
// pair wit the given two collision shape types
|
||||||
inline int CollisionShape::computeNbMaxContactManifolds(CollisionShapeType shapeType1,
|
inline int CollisionShape::computeNbMaxContactManifolds(CollisionShapeType shapeType1,
|
||||||
|
|
|
@ -80,15 +80,15 @@ void ConcaveMeshShape::initBVHTree() {
|
||||||
// Get the vertices components of the triangle
|
// Get the vertices components of the triangle
|
||||||
if (vertexType == TriangleVertexArray::VERTEX_FLOAT_TYPE) {
|
if (vertexType == TriangleVertexArray::VERTEX_FLOAT_TYPE) {
|
||||||
const float* vertices = (float*)(verticesStart + vertexIndex * vertexStride);
|
const float* vertices = (float*)(verticesStart + vertexIndex * vertexStride);
|
||||||
trianglePoints[k][0] = decimal(vertices[0]);
|
trianglePoints[k][0] = decimal(vertices[0]) * mScaling.x;
|
||||||
trianglePoints[k][1] = decimal(vertices[1]);
|
trianglePoints[k][1] = decimal(vertices[1]) * mScaling.y;
|
||||||
trianglePoints[k][2] = decimal(vertices[2]);
|
trianglePoints[k][2] = decimal(vertices[2]) * mScaling.z;
|
||||||
}
|
}
|
||||||
else if (vertexType == TriangleVertexArray::VERTEX_DOUBLE_TYPE) {
|
else if (vertexType == TriangleVertexArray::VERTEX_DOUBLE_TYPE) {
|
||||||
const double* vertices = (double*)(verticesStart + vertexIndex * vertexStride);
|
const double* vertices = (double*)(verticesStart + vertexIndex * vertexStride);
|
||||||
trianglePoints[k][0] = decimal(vertices[0]);
|
trianglePoints[k][0] = decimal(vertices[0]) * mScaling.x;
|
||||||
trianglePoints[k][1] = decimal(vertices[1]);
|
trianglePoints[k][1] = decimal(vertices[1]) * mScaling.y;
|
||||||
trianglePoints[k][2] = decimal(vertices[2]);
|
trianglePoints[k][2] = decimal(vertices[2]) * mScaling.z;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -133,15 +133,15 @@ void ConcaveMeshShape::getTriangleVerticesWithIndexPointer(int32 subPart, int32
|
||||||
// Get the vertices components of the triangle
|
// Get the vertices components of the triangle
|
||||||
if (vertexType == TriangleVertexArray::VERTEX_FLOAT_TYPE) {
|
if (vertexType == TriangleVertexArray::VERTEX_FLOAT_TYPE) {
|
||||||
const float* vertices = (float*)(verticesStart + vertexIndex * vertexStride);
|
const float* vertices = (float*)(verticesStart + vertexIndex * vertexStride);
|
||||||
outTriangleVertices[k][0] = decimal(vertices[0]);
|
outTriangleVertices[k][0] = decimal(vertices[0]) * mScaling.x;
|
||||||
outTriangleVertices[k][1] = decimal(vertices[1]);
|
outTriangleVertices[k][1] = decimal(vertices[1]) * mScaling.y;
|
||||||
outTriangleVertices[k][2] = decimal(vertices[2]);
|
outTriangleVertices[k][2] = decimal(vertices[2]) * mScaling.z;
|
||||||
}
|
}
|
||||||
else if (vertexType == TriangleVertexArray::VERTEX_DOUBLE_TYPE) {
|
else if (vertexType == TriangleVertexArray::VERTEX_DOUBLE_TYPE) {
|
||||||
const double* vertices = (double*)(verticesStart + vertexIndex * vertexStride);
|
const double* vertices = (double*)(verticesStart + vertexIndex * vertexStride);
|
||||||
outTriangleVertices[k][0] = decimal(vertices[0]);
|
outTriangleVertices[k][0] = decimal(vertices[0]) * mScaling.x;
|
||||||
outTriangleVertices[k][1] = decimal(vertices[1]);
|
outTriangleVertices[k][1] = decimal(vertices[1]) * mScaling.y;
|
||||||
outTriangleVertices[k][2] = decimal(vertices[2]);
|
outTriangleVertices[k][2] = decimal(vertices[2]) * mScaling.z;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -30,7 +30,6 @@
|
||||||
#include "ConcaveShape.h"
|
#include "ConcaveShape.h"
|
||||||
#include "collision/broadphase/DynamicAABBTree.h"
|
#include "collision/broadphase/DynamicAABBTree.h"
|
||||||
#include "collision/TriangleMesh.h"
|
#include "collision/TriangleMesh.h"
|
||||||
#include <iostream>
|
|
||||||
|
|
||||||
namespace reactphysics3d {
|
namespace reactphysics3d {
|
||||||
|
|
||||||
|
@ -130,6 +129,9 @@ class ConcaveMeshShape : public ConcaveShape {
|
||||||
/// Return the local bounds of the shape in x, y and z directions.
|
/// Return the local bounds of the shape in x, y and z directions.
|
||||||
virtual void getLocalBounds(Vector3& min, Vector3& max) const;
|
virtual void getLocalBounds(Vector3& min, Vector3& max) const;
|
||||||
|
|
||||||
|
/// Set the local scaling vector of the collision shape
|
||||||
|
virtual void setLocalScaling(const Vector3& scaling);
|
||||||
|
|
||||||
/// 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;
|
||||||
|
|
||||||
|
@ -150,14 +152,16 @@ inline size_t ConcaveMeshShape::getSizeInBytes() const {
|
||||||
inline Vector3 ConcaveMeshShape::getLocalSupportPointWithMargin(const Vector3& direction,
|
inline Vector3 ConcaveMeshShape::getLocalSupportPointWithMargin(const Vector3& direction,
|
||||||
void** cachedCollisionData) const {
|
void** cachedCollisionData) const {
|
||||||
|
|
||||||
// TODO : Implement this
|
// Should not be used
|
||||||
|
assert(false);
|
||||||
return Vector3(0, 0, 0);
|
return Vector3(0, 0, 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
|
||||||
inline Vector3 ConcaveMeshShape::getLocalSupportPointWithoutMargin(const Vector3& direction,
|
inline Vector3 ConcaveMeshShape::getLocalSupportPointWithoutMargin(const Vector3& direction,
|
||||||
void** cachedCollisionData) const {
|
void** cachedCollisionData) const {
|
||||||
// TODO : Implement this
|
// Should not be used
|
||||||
|
assert(false);
|
||||||
return Vector3(0.0, 0.0, 0.0);
|
return Vector3(0.0, 0.0, 0.0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -176,6 +180,18 @@ inline void ConcaveMeshShape::getLocalBounds(Vector3& min, Vector3& max) const {
|
||||||
max = treeAABB.getMax();
|
max = treeAABB.getMax();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Set the local scaling vector of the collision shape
|
||||||
|
inline void ConcaveMeshShape::setLocalScaling(const Vector3& scaling) {
|
||||||
|
|
||||||
|
CollisionShape::setLocalScaling(scaling);
|
||||||
|
|
||||||
|
// Reset the Dynamic AABB Tree
|
||||||
|
mDynamicAABBTree.reset();
|
||||||
|
|
||||||
|
// Rebuild Dynamic AABB Tree here
|
||||||
|
initBVHTree();
|
||||||
|
}
|
||||||
|
|
||||||
// Return the local inertia tensor of the sphere
|
// Return the local inertia tensor of the sphere
|
||||||
/**
|
/**
|
||||||
* @param[out] tensor The 3x3 inertia tensor matrix of the shape in local-space
|
* @param[out] tensor The 3x3 inertia tensor matrix of the shape in local-space
|
||||||
|
@ -213,9 +229,6 @@ inline void ConvexTriangleAABBOverlapCallback::notifyOverlappingNode(int nodeId)
|
||||||
|
|
||||||
// Call the callback to test narrow-phase collision with this triangle
|
// Call the callback to test narrow-phase collision with this triangle
|
||||||
mTriangleTestCallback.testTriangle(trianglePoints);
|
mTriangleTestCallback.testTriangle(trianglePoints);
|
||||||
|
|
||||||
// TODO : Delete this
|
|
||||||
std::cout << "Notify triangle test" << std::endl;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -105,6 +105,9 @@ class ConeShape : public ConvexShape {
|
||||||
/// Return the height
|
/// Return the height
|
||||||
decimal getHeight() const;
|
decimal getHeight() const;
|
||||||
|
|
||||||
|
/// Set the scaling vector of the collision shape
|
||||||
|
virtual void setLocalScaling(const Vector3& scaling);
|
||||||
|
|
||||||
/// Return the local bounds of the shape in x, y and z directions
|
/// Return the local bounds of the shape in x, y and z directions
|
||||||
virtual void getLocalBounds(Vector3& min, Vector3& max) const;
|
virtual void getLocalBounds(Vector3& min, Vector3& max) const;
|
||||||
|
|
||||||
|
@ -128,6 +131,15 @@ inline decimal ConeShape::getHeight() const {
|
||||||
return decimal(2.0) * mHalfHeight;
|
return decimal(2.0) * mHalfHeight;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Set the scaling vector of the collision shape
|
||||||
|
inline void ConeShape::setLocalScaling(const Vector3& scaling) {
|
||||||
|
|
||||||
|
mHalfHeight = (mHalfHeight / mScaling.y) * scaling.y;
|
||||||
|
mRadius = (mRadius / mScaling.x) * scaling.x;
|
||||||
|
|
||||||
|
CollisionShape::setLocalScaling(scaling);
|
||||||
|
}
|
||||||
|
|
||||||
// Return the number of bytes used by the collision shape
|
// Return the number of bytes used by the collision shape
|
||||||
inline size_t ConeShape::getSizeInBytes() const {
|
inline size_t ConeShape::getSizeInBytes() const {
|
||||||
return sizeof(ConeShape);
|
return sizeof(ConeShape);
|
||||||
|
|
|
@ -148,7 +148,7 @@ Vector3 ConvexMeshShape::getLocalSupportPointWithoutMargin(const Vector3& direct
|
||||||
*((int*)(*cachedCollisionData)) = maxVertex;
|
*((int*)(*cachedCollisionData)) = maxVertex;
|
||||||
|
|
||||||
// Return the support vertex
|
// Return the support vertex
|
||||||
return mVertices[maxVertex];
|
return mVertices[maxVertex] * mScaling;
|
||||||
}
|
}
|
||||||
else { // If the edges information is not used
|
else { // If the edges information is not used
|
||||||
|
|
||||||
|
@ -171,7 +171,7 @@ Vector3 ConvexMeshShape::getLocalSupportPointWithoutMargin(const Vector3& direct
|
||||||
assert(maxDotProduct >= decimal(0.0));
|
assert(maxDotProduct >= decimal(0.0));
|
||||||
|
|
||||||
// Return the vertex with the largest dot product in the support direction
|
// Return the vertex with the largest dot product in the support direction
|
||||||
return mVertices[indexMaxDotProduct];
|
return mVertices[indexMaxDotProduct] * mScaling;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -44,7 +44,7 @@ class CollisionWorld;
|
||||||
// TODO : Make possible to create a ConvexMeshShape using a TriangleMesh as for
|
// TODO : Make possible to create a ConvexMeshShape using a TriangleMesh as for
|
||||||
// the ConcaveMeshShape
|
// the ConcaveMeshShape
|
||||||
|
|
||||||
// TODO : Make possible for the user to have a scaling factor on the mesh
|
// TODO : Check that scaling factor is working after the change of the previous TODO
|
||||||
|
|
||||||
// Class ConvexMeshShape
|
// Class ConvexMeshShape
|
||||||
/**
|
/**
|
||||||
|
@ -64,6 +64,8 @@ class CollisionWorld;
|
||||||
*/
|
*/
|
||||||
class ConvexMeshShape : public ConvexShape {
|
class ConvexMeshShape : public ConvexShape {
|
||||||
|
|
||||||
|
// TODO : Implement method setLocalScaling() here
|
||||||
|
|
||||||
protected :
|
protected :
|
||||||
|
|
||||||
// -------------------- Attributes -------------------- //
|
// -------------------- Attributes -------------------- //
|
||||||
|
|
|
@ -102,6 +102,9 @@ class CylinderShape : public ConvexShape {
|
||||||
/// Return the height
|
/// Return the height
|
||||||
decimal getHeight() const;
|
decimal getHeight() const;
|
||||||
|
|
||||||
|
/// Set the scaling vector of the collision shape
|
||||||
|
virtual void setLocalScaling(const Vector3& scaling);
|
||||||
|
|
||||||
/// Return the local bounds of the shape in x, y and z directions
|
/// Return the local bounds of the shape in x, y and z directions
|
||||||
virtual void getLocalBounds(Vector3& min, Vector3& max) const;
|
virtual void getLocalBounds(Vector3& min, Vector3& max) const;
|
||||||
|
|
||||||
|
@ -125,6 +128,15 @@ inline decimal CylinderShape::getHeight() const {
|
||||||
return mHalfHeight + mHalfHeight;
|
return mHalfHeight + mHalfHeight;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Set the scaling vector of the collision shape
|
||||||
|
inline void CylinderShape::setLocalScaling(const Vector3& scaling) {
|
||||||
|
|
||||||
|
mHalfHeight = (mHalfHeight / mScaling.y) * scaling.y;
|
||||||
|
mRadius = (mRadius / mScaling.x) * scaling.x;
|
||||||
|
|
||||||
|
CollisionShape::setLocalScaling(scaling);
|
||||||
|
}
|
||||||
|
|
||||||
// Return the number of bytes used by the collision shape
|
// Return the number of bytes used by the collision shape
|
||||||
inline size_t CylinderShape::getSizeInBytes() const {
|
inline size_t CylinderShape::getSizeInBytes() const {
|
||||||
return sizeof(CylinderShape);
|
return sizeof(CylinderShape);
|
||||||
|
|
|
@ -35,7 +35,7 @@ using namespace reactphysics3d;
|
||||||
/**
|
/**
|
||||||
* @param radius Radius of the sphere (in meters)
|
* @param radius Radius of the sphere (in meters)
|
||||||
*/
|
*/
|
||||||
SphereShape::SphereShape(decimal radius) : ConvexShape(SPHERE, radius), mRadius(radius) {
|
SphereShape::SphereShape(decimal radius) : ConvexShape(SPHERE, radius) {
|
||||||
assert(radius > decimal(0.0));
|
assert(radius > decimal(0.0));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -51,7 +51,7 @@ bool SphereShape::raycast(const Ray& ray, RaycastInfo& raycastInfo, ProxyShape*
|
||||||
|
|
||||||
const Vector3 sphereCenter = proxyShape->getLocalToWorldTransform().getPosition();
|
const Vector3 sphereCenter = proxyShape->getLocalToWorldTransform().getPosition();
|
||||||
const Vector3 m = ray.point1 - sphereCenter;
|
const Vector3 m = ray.point1 - sphereCenter;
|
||||||
decimal c = m.dot(m) - mRadius * mRadius;
|
decimal c = m.dot(m) - mMargin * mMargin;
|
||||||
|
|
||||||
// If the origin of the ray is inside the sphere, we return no intersection
|
// If the origin of the ray is inside the sphere, we return no intersection
|
||||||
if (c < decimal(0.0)) return false;
|
if (c < decimal(0.0)) return false;
|
||||||
|
|
|
@ -48,8 +48,6 @@ class SphereShape : public ConvexShape {
|
||||||
|
|
||||||
// -------------------- Attributes -------------------- //
|
// -------------------- Attributes -------------------- //
|
||||||
|
|
||||||
/// Radius of the sphere
|
|
||||||
decimal mRadius;
|
|
||||||
|
|
||||||
// -------------------- Methods -------------------- //
|
// -------------------- Methods -------------------- //
|
||||||
|
|
||||||
|
@ -89,6 +87,9 @@ class SphereShape : public ConvexShape {
|
||||||
/// Return the radius of the sphere
|
/// Return the radius of the sphere
|
||||||
decimal getRadius() const;
|
decimal getRadius() const;
|
||||||
|
|
||||||
|
/// Set the scaling vector of the collision shape
|
||||||
|
virtual void setLocalScaling(const Vector3& scaling);
|
||||||
|
|
||||||
/// Return the local bounds of the shape in x, y and z directions.
|
/// Return the local bounds of the shape in x, y and z directions.
|
||||||
virtual void getLocalBounds(Vector3& min, Vector3& max) const;
|
virtual void getLocalBounds(Vector3& min, Vector3& max) const;
|
||||||
|
|
||||||
|
@ -104,7 +105,15 @@ class SphereShape : public ConvexShape {
|
||||||
* @return Radius of the sphere (in meters)
|
* @return Radius of the sphere (in meters)
|
||||||
*/
|
*/
|
||||||
inline decimal SphereShape::getRadius() const {
|
inline decimal SphereShape::getRadius() const {
|
||||||
return mRadius;
|
return mMargin;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set the scaling vector of the collision shape
|
||||||
|
inline void SphereShape::setLocalScaling(const Vector3& scaling) {
|
||||||
|
|
||||||
|
mMargin = (mMargin / mScaling.x) * scaling.x;
|
||||||
|
|
||||||
|
CollisionShape::setLocalScaling(scaling);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Return the number of bytes used by the collision shape
|
// Return the number of bytes used by the collision shape
|
||||||
|
@ -145,12 +154,12 @@ inline Vector3 SphereShape::getLocalSupportPointWithoutMargin(const Vector3& dir
|
||||||
inline void SphereShape::getLocalBounds(Vector3& min, Vector3& max) const {
|
inline void SphereShape::getLocalBounds(Vector3& min, Vector3& max) const {
|
||||||
|
|
||||||
// Maximum bounds
|
// Maximum bounds
|
||||||
max.x = mRadius;
|
max.x = mMargin;
|
||||||
max.y = mRadius;
|
max.y = mMargin;
|
||||||
max.z = mRadius;
|
max.z = mMargin;
|
||||||
|
|
||||||
// Minimum bounds
|
// Minimum bounds
|
||||||
min.x = -mRadius;
|
min.x = -mMargin;
|
||||||
min.y = min.x;
|
min.y = min.x;
|
||||||
min.z = min.x;
|
min.z = min.x;
|
||||||
}
|
}
|
||||||
|
@ -162,7 +171,7 @@ inline void SphereShape::getLocalBounds(Vector3& min, Vector3& max) const {
|
||||||
* @param mass Mass to use to compute the inertia tensor of the collision shape
|
* @param mass Mass to use to compute the inertia tensor of the collision shape
|
||||||
*/
|
*/
|
||||||
inline void SphereShape::computeLocalInertiaTensor(Matrix3x3& tensor, decimal mass) const {
|
inline void SphereShape::computeLocalInertiaTensor(Matrix3x3& tensor, decimal mass) const {
|
||||||
decimal diag = decimal(0.4) * mass * mRadius * mRadius;
|
decimal diag = decimal(0.4) * mass * mMargin * mMargin;
|
||||||
tensor.setAllValues(diag, 0.0, 0.0,
|
tensor.setAllValues(diag, 0.0, 0.0,
|
||||||
0.0, diag, 0.0,
|
0.0, diag, 0.0,
|
||||||
0.0, 0.0, diag);
|
0.0, 0.0, diag);
|
||||||
|
@ -177,7 +186,7 @@ inline void SphereShape::computeLocalInertiaTensor(Matrix3x3& tensor, decimal ma
|
||||||
inline void SphereShape::computeAABB(AABB& aabb, const Transform& transform) {
|
inline void SphereShape::computeAABB(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(mRadius, mRadius, mRadius);
|
Vector3 extents(mMargin, mMargin, mMargin);
|
||||||
|
|
||||||
// Update the AABB with the new minimum and maximum coordinates
|
// Update the AABB with the new minimum and maximum coordinates
|
||||||
aabb.setMin(transform.getPosition() - extents);
|
aabb.setMin(transform.getPosition() - extents);
|
||||||
|
@ -186,7 +195,7 @@ inline void SphereShape::computeAABB(AABB& aabb, const Transform& transform) {
|
||||||
|
|
||||||
// Return true if a point is inside the collision shape
|
// Return true if a point is inside the collision shape
|
||||||
inline bool SphereShape::testPointInside(const Vector3& localPoint, ProxyShape* proxyShape) const {
|
inline bool SphereShape::testPointInside(const Vector3& localPoint, ProxyShape* proxyShape) const {
|
||||||
return (localPoint.lengthSquare() < mRadius * mRadius);
|
return (localPoint.lengthSquare() < mMargin * mMargin);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -38,9 +38,8 @@ using namespace reactphysics3d;
|
||||||
* @param point3 Third point of the triangle
|
* @param point3 Third point of the triangle
|
||||||
* @param margin The collision margin (in meters) around the collision shape
|
* @param margin The collision margin (in meters) around the collision shape
|
||||||
*/
|
*/
|
||||||
TriangleShape::TriangleShape(const Vector3& point1, const Vector3& point2,
|
TriangleShape::TriangleShape(const Vector3& point1, const Vector3& point2, const Vector3& point3)
|
||||||
const Vector3& point3, decimal margin)
|
: ConvexShape(TRIANGLE, 0) {
|
||||||
: ConvexShape(TRIANGLE, margin) {
|
|
||||||
mPoints[0] = point1;
|
mPoints[0] = point1;
|
||||||
mPoints[1] = point2;
|
mPoints[1] = point2;
|
||||||
mPoints[2] = point3;
|
mPoints[2] = point3;
|
||||||
|
|
|
@ -77,8 +77,7 @@ class TriangleShape : public ConvexShape {
|
||||||
// -------------------- Methods -------------------- //
|
// -------------------- Methods -------------------- //
|
||||||
|
|
||||||
/// Constructor
|
/// Constructor
|
||||||
TriangleShape(const Vector3& point1, const Vector3& point2,
|
TriangleShape(const Vector3& point1, const Vector3& point2, const Vector3& point3);
|
||||||
const Vector3& point3, decimal margin);
|
|
||||||
|
|
||||||
/// Destructor
|
/// Destructor
|
||||||
virtual ~TriangleShape();
|
virtual ~TriangleShape();
|
||||||
|
@ -86,6 +85,9 @@ class TriangleShape : public ConvexShape {
|
||||||
/// Return the local bounds of the shape in x, y and z directions.
|
/// Return the local bounds of the shape in x, y and z directions.
|
||||||
virtual void getLocalBounds(Vector3& min, Vector3& max) const;
|
virtual void getLocalBounds(Vector3& min, Vector3& max) const;
|
||||||
|
|
||||||
|
/// Set the local scaling vector of the collision shape
|
||||||
|
virtual void setLocalScaling(const Vector3& scaling);
|
||||||
|
|
||||||
/// 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;
|
||||||
|
|
||||||
|
@ -102,8 +104,6 @@ inline size_t TriangleShape::getSizeInBytes() const {
|
||||||
inline Vector3 TriangleShape::getLocalSupportPointWithMargin(const Vector3& direction,
|
inline Vector3 TriangleShape::getLocalSupportPointWithMargin(const Vector3& direction,
|
||||||
void** cachedCollisionData) const {
|
void** cachedCollisionData) const {
|
||||||
|
|
||||||
// TODO : Do we need to use margin for triangle support point ?
|
|
||||||
|
|
||||||
return getLocalSupportPointWithoutMargin(direction, cachedCollisionData);
|
return getLocalSupportPointWithoutMargin(direction, cachedCollisionData);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -129,6 +129,16 @@ inline void TriangleShape::getLocalBounds(Vector3& min, Vector3& max) const {
|
||||||
max.setAllValues(xAxis.getMaxValue(), yAxis.getMaxValue(), zAxis.getMaxValue());
|
max.setAllValues(xAxis.getMaxValue(), yAxis.getMaxValue(), zAxis.getMaxValue());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Set the local scaling vector of the collision shape
|
||||||
|
inline void TriangleShape::setLocalScaling(const Vector3& scaling) {
|
||||||
|
|
||||||
|
mPoints[0] = (mPoints[0] / mScaling) * scaling;
|
||||||
|
mPoints[1] = (mPoints[1] / mScaling) * scaling;
|
||||||
|
mPoints[2] = (mPoints[2] / mScaling) * scaling;
|
||||||
|
|
||||||
|
CollisionShape::setLocalScaling(scaling);
|
||||||
|
}
|
||||||
|
|
||||||
// Return the local inertia tensor of the triangle shape
|
// Return the local inertia tensor of the triangle shape
|
||||||
/**
|
/**
|
||||||
* @param[out] tensor The 3x3 inertia tensor matrix of the shape in local-space
|
* @param[out] tensor The 3x3 inertia tensor matrix of the shape in local-space
|
||||||
|
|
|
@ -145,7 +145,9 @@ struct Vector2 {
|
||||||
friend Vector2 operator-(const Vector2& vector);
|
friend Vector2 operator-(const Vector2& vector);
|
||||||
friend Vector2 operator*(const Vector2& vector, decimal number);
|
friend Vector2 operator*(const Vector2& vector, decimal number);
|
||||||
friend Vector2 operator*(decimal number, const Vector2& vector);
|
friend Vector2 operator*(decimal number, const Vector2& vector);
|
||||||
|
friend Vector2 operator*(const Vector2& vector1, const Vector2& vector2);
|
||||||
friend Vector2 operator/(const Vector2& vector, decimal number);
|
friend Vector2 operator/(const Vector2& vector, decimal number);
|
||||||
|
friend Vector2 operator/(const Vector2& vector1, const Vector2& vector2);
|
||||||
};
|
};
|
||||||
|
|
||||||
// Set the vector to zero
|
// Set the vector to zero
|
||||||
|
@ -279,12 +281,24 @@ inline Vector2 operator*(const Vector2& vector, decimal number) {
|
||||||
return Vector2(number * vector.x, number * vector.y);
|
return Vector2(number * vector.x, number * vector.y);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Overloaded operator for multiplication of two vectors
|
||||||
|
inline Vector2 operator*(const Vector2& vector1, const Vector2& vector2) {
|
||||||
|
return Vector2(vector1.x * vector2.x, vector1.y * vector2.y);
|
||||||
|
}
|
||||||
|
|
||||||
// Overloaded operator for division by a number
|
// Overloaded operator for division by a number
|
||||||
inline Vector2 operator/(const Vector2& vector, decimal number) {
|
inline Vector2 operator/(const Vector2& vector, decimal number) {
|
||||||
assert(number > MACHINE_EPSILON);
|
assert(number > MACHINE_EPSILON);
|
||||||
return Vector2(vector.x / number, vector.y / number);
|
return Vector2(vector.x / number, vector.y / number);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Overload operator for division between two vectors
|
||||||
|
inline Vector2 operator/(const Vector2& vector1, const Vector2& vector2) {
|
||||||
|
assert(vector2.x > MACHINE_EPSILON);
|
||||||
|
assert(vector2.y > MACHINE_EPSILON);
|
||||||
|
return Vector2(vector1.x / vector2.x, vector1.y / vector2.y);
|
||||||
|
}
|
||||||
|
|
||||||
// Overloaded operator for multiplication with a number
|
// Overloaded operator for multiplication with a number
|
||||||
inline Vector2 operator*(decimal number, const Vector2& vector) {
|
inline Vector2 operator*(decimal number, const Vector2& vector) {
|
||||||
return vector * number;
|
return vector * number;
|
||||||
|
|
|
@ -157,7 +157,9 @@ struct Vector3 {
|
||||||
friend Vector3 operator-(const Vector3& vector);
|
friend Vector3 operator-(const Vector3& vector);
|
||||||
friend Vector3 operator*(const Vector3& vector, decimal number);
|
friend Vector3 operator*(const Vector3& vector, decimal number);
|
||||||
friend Vector3 operator*(decimal number, const Vector3& vector);
|
friend Vector3 operator*(decimal number, const Vector3& vector);
|
||||||
|
friend Vector3 operator*(const Vector3& vector1, const Vector3& vector2);
|
||||||
friend Vector3 operator/(const Vector3& vector, decimal number);
|
friend Vector3 operator/(const Vector3& vector, decimal number);
|
||||||
|
friend Vector3 operator/(const Vector3& vector1, const Vector3& vector2);
|
||||||
};
|
};
|
||||||
|
|
||||||
// Set the vector to zero
|
// Set the vector to zero
|
||||||
|
@ -311,11 +313,24 @@ inline Vector3 operator/(const Vector3& vector, decimal number) {
|
||||||
return Vector3(vector.x / number, vector.y / number, vector.z / number);
|
return Vector3(vector.x / number, vector.y / number, vector.z / number);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Overload operator for division between two vectors
|
||||||
|
inline Vector3 operator/(const Vector3& vector1, const Vector3& vector2) {
|
||||||
|
assert(vector2.x > MACHINE_EPSILON);
|
||||||
|
assert(vector2.y > MACHINE_EPSILON);
|
||||||
|
assert(vector2.z > MACHINE_EPSILON);
|
||||||
|
return Vector3(vector1.x / vector2.x, vector1.y / vector2.y, vector1.z / vector2.z);
|
||||||
|
}
|
||||||
|
|
||||||
// Overloaded operator for multiplication with a number
|
// Overloaded operator for multiplication with a number
|
||||||
inline Vector3 operator*(decimal number, const Vector3& vector) {
|
inline Vector3 operator*(decimal number, const Vector3& vector) {
|
||||||
return vector * number;
|
return vector * number;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Overload operator for multiplication between two vectors
|
||||||
|
inline Vector3 operator*(const Vector3& vector1, const Vector3& vector2) {
|
||||||
|
return Vector3(vector1.x * vector2.x, vector1.y * vector2.y, vector1.z * vector2.z);
|
||||||
|
}
|
||||||
|
|
||||||
// Assignment operator
|
// Assignment operator
|
||||||
inline Vector3& Vector3::operator=(const Vector3& vector) {
|
inline Vector3& Vector3::operator=(const Vector3& vector) {
|
||||||
if (&vector != this) {
|
if (&vector != this) {
|
||||||
|
|
|
@ -201,10 +201,17 @@ class TestVector2 : public Test {
|
||||||
vector4 /= 3;
|
vector4 /= 3;
|
||||||
test(vector3 == Vector2(60, 330));
|
test(vector3 == Vector2(60, 330));
|
||||||
test(vector4 == Vector2(5, 20));
|
test(vector4 == Vector2(5, 20));
|
||||||
|
Vector2 vector5(21, 80);
|
||||||
|
Vector2 vector6(7, 10);
|
||||||
|
Vector2 vector7 = vector5 * vector6;
|
||||||
|
test(vector7 == Vector2(147, 800));
|
||||||
|
Vector2 vector8 = vector5 / vector6;
|
||||||
|
test(approxEqual(vector8.x, 3));
|
||||||
|
test(approxEqual(vector8.y, 8));
|
||||||
|
|
||||||
// Negative operator
|
// Negative operator
|
||||||
Vector2 vector5(-34, 5);
|
Vector2 vector9(-34, 5);
|
||||||
Vector2 negative = -vector5;
|
Vector2 negative = -vector9;
|
||||||
test(negative == Vector2(34, -5));
|
test(negative == Vector2(34, -5));
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
|
@ -225,10 +225,18 @@ class TestVector3 : public Test {
|
||||||
vector4 /= 3;
|
vector4 /= 3;
|
||||||
test(vector3 == Vector3(60, 330, 620));
|
test(vector3 == Vector3(60, 330, 620));
|
||||||
test(vector4 == Vector3(5, 20, 11));
|
test(vector4 == Vector3(5, 20, 11));
|
||||||
|
Vector3 vector5(21, 80, 45);
|
||||||
|
Vector3 vector6(7, 10, 3);
|
||||||
|
Vector3 vector7 = vector5 * vector6;
|
||||||
|
test(vector7 == Vector3(147, 800, 135));
|
||||||
|
Vector3 vector8 = vector5 / vector6;
|
||||||
|
test(approxEqual(vector8.x, 3));
|
||||||
|
test(approxEqual(vector8.y, 8));
|
||||||
|
test(approxEqual(vector8.z, 15));
|
||||||
|
|
||||||
// Negative operator
|
// Negative operator
|
||||||
Vector3 vector5(-34, 5, 422);
|
Vector3 vector9(-34, 5, 422);
|
||||||
Vector3 negative = -vector5;
|
Vector3 negative = -vector9;
|
||||||
test(negative == Vector3(34, -5, -422));
|
test(negative == Vector3(34, -5, -422));
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in New Issue
Block a user