102 lines
4.2 KiB
C++
102 lines
4.2 KiB
C++
/********************************************************************************
|
|
* ReactPhysics3D physics library, http://www.reactphysics3d.com *
|
|
* Copyright (c) 2010-2019 Daniel Chappuis *
|
|
*********************************************************************************
|
|
* *
|
|
* 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. *
|
|
* *
|
|
********************************************************************************/
|
|
|
|
// Libraries
|
|
#include "CollisionShape.h"
|
|
#include "utils/Profiler.h"
|
|
#include "body/CollisionBody.h"
|
|
#include "collision/Collider.h"
|
|
|
|
// We want to use the ReactPhysics3D namespace
|
|
using namespace reactphysics3d;
|
|
|
|
// Constructor
|
|
CollisionShape::CollisionShape(CollisionShapeName name, CollisionShapeType type, MemoryAllocator &allocator)
|
|
: mType(type), mName(name), mId(0), mColliders(allocator) {
|
|
|
|
#ifdef IS_PROFILING_ACTIVE
|
|
mProfiler = nullptr;
|
|
#endif
|
|
|
|
}
|
|
|
|
// Compute the world-space AABB of the collision shape given a transform from shape
|
|
// local-space to world-space. The technique is described in the book Real-Time Collision
|
|
// Detection by Christer Ericson.
|
|
/**
|
|
* @param[out] aabb The axis-aligned bounding box (AABB) of the collision shape
|
|
* computed in world-space coordinates
|
|
* @param transform Transform from shape local-space to world-space used to compute
|
|
* the AABB of the collision shape
|
|
*/
|
|
void CollisionShape::computeAABB(AABB& aabb, const Transform& transform) const {
|
|
|
|
RP3D_PROFILE("CollisionShape::computeAABB()", mProfiler);
|
|
|
|
// Get the local bounds in x,y and z direction
|
|
Vector3 minBounds;
|
|
Vector3 maxBounds;
|
|
getLocalBounds(minBounds, maxBounds);
|
|
|
|
const Vector3& translation = transform.getPosition();
|
|
Matrix3x3 matrix = transform.getOrientation().getMatrix();
|
|
Vector3 resultMin;
|
|
Vector3 resultMax;
|
|
|
|
// For each of the three axis
|
|
for (int i=0; i<3; i++) {
|
|
|
|
// Add translation component
|
|
resultMin[i] = translation[i];
|
|
resultMax[i] = translation[i];
|
|
|
|
for (int j=0; j<3; j++) {
|
|
decimal e = matrix[i][j] * minBounds[j];
|
|
decimal f = matrix[i][j] * maxBounds[j];
|
|
|
|
if (e < f) {
|
|
resultMin[i] += e;
|
|
resultMax[i] += f;
|
|
}
|
|
else {
|
|
resultMin[i] += f;
|
|
resultMax[i] += e;
|
|
}
|
|
}
|
|
}
|
|
|
|
// Update the AABB with the new minimum and maximum coordinates
|
|
aabb.setMin(resultMin);
|
|
aabb.setMax(resultMax);
|
|
}
|
|
|
|
/// Notify all the assign colliders that the size of the collision shape has changed
|
|
void CollisionShape::notifyColliderAboutChangedSize() {
|
|
|
|
for (uint i=0; i < mColliders.size(); i++) {
|
|
mColliders[i]->setHasCollisionShapeChangedSize(true);
|
|
}
|
|
}
|