2015-02-15 20:56:45 +00:00
|
|
|
/********************************************************************************
|
|
|
|
* ReactPhysics3D physics library, http://www.reactphysics3d.com *
|
2016-04-11 18:15:20 +00:00
|
|
|
* Copyright (c) 2010-2016 Daniel Chappuis *
|
2015-02-15 20:56:45 +00:00
|
|
|
*********************************************************************************
|
|
|
|
* *
|
|
|
|
* 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. *
|
|
|
|
* *
|
|
|
|
********************************************************************************/
|
2014-08-04 20:46:58 +00:00
|
|
|
|
|
|
|
// Libraries
|
|
|
|
#include "ProxyShape.h"
|
|
|
|
|
|
|
|
using namespace reactphysics3d;
|
|
|
|
|
|
|
|
// Constructor
|
2015-02-12 21:31:26 +00:00
|
|
|
/**
|
|
|
|
* @param body Pointer to the parent body
|
|
|
|
* @param shape Pointer to the collision shape
|
|
|
|
* @param transform Transformation from collision shape local-space to body local-space
|
|
|
|
* @param mass Mass of the collision shape (in kilograms)
|
|
|
|
*/
|
2015-09-04 17:56:27 +00:00
|
|
|
ProxyShape::ProxyShape(CollisionBody* body, CollisionShape* shape, const Transform& transform, decimal mass)
|
2014-08-04 20:46:58 +00:00
|
|
|
:mBody(body), mCollisionShape(shape), mLocalToBodyTransform(transform), mMass(mass),
|
2016-05-15 17:25:58 +00:00
|
|
|
mNext(nullptr), mBroadPhaseID(-1), mCachedCollisionData(nullptr), mUserData(nullptr),
|
2014-12-31 00:19:14 +00:00
|
|
|
mCollisionCategoryBits(0x0001), mCollideWithMaskBits(0xFFFF) {
|
2014-08-04 20:46:58 +00:00
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
// Destructor
|
|
|
|
ProxyShape::~ProxyShape() {
|
|
|
|
|
|
|
|
// Release the cached collision data memory
|
2016-05-15 17:25:58 +00:00
|
|
|
if (mCachedCollisionData != nullptr) {
|
2014-08-04 20:46:58 +00:00
|
|
|
free(mCachedCollisionData);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// Return true if a point is inside the collision shape
|
2015-02-12 21:31:26 +00:00
|
|
|
/**
|
|
|
|
* @param worldPoint Point to test in world-space coordinates
|
|
|
|
* @return True if the point is inside the collision shape
|
|
|
|
*/
|
2014-08-04 20:46:58 +00:00
|
|
|
bool ProxyShape::testPointInside(const Vector3& worldPoint) {
|
|
|
|
const Transform localToWorld = mBody->getTransform() * mLocalToBodyTransform;
|
|
|
|
const Vector3 localPoint = localToWorld.getInverse() * worldPoint;
|
2014-08-09 08:28:37 +00:00
|
|
|
return mCollisionShape->testPointInside(localPoint, this);
|
2014-08-04 20:46:58 +00:00
|
|
|
}
|
|
|
|
|
2015-12-07 16:32:18 +00:00
|
|
|
// Raycast method with feedback information
|
|
|
|
/**
|
|
|
|
* @param ray Ray to use for the raycasting
|
|
|
|
* @param[out] raycastInfo Result of the raycasting that is valid only if the
|
|
|
|
* methods returned true
|
|
|
|
* @return True if the ray hit the collision shape
|
|
|
|
*/
|
|
|
|
bool ProxyShape::raycast(const Ray& ray, RaycastInfo& raycastInfo) {
|
|
|
|
|
|
|
|
// If the corresponding body is not active, it cannot be hit by rays
|
|
|
|
if (!mBody->isActive()) return false;
|
|
|
|
|
|
|
|
// Convert the ray into the local-space of the collision shape
|
|
|
|
const Transform localToWorldTransform = getLocalToWorldTransform();
|
|
|
|
const Transform worldToLocalTransform = localToWorldTransform.getInverse();
|
|
|
|
Ray rayLocal(worldToLocalTransform * ray.point1,
|
|
|
|
worldToLocalTransform * ray.point2,
|
|
|
|
ray.maxFraction);
|
|
|
|
|
|
|
|
bool isHit = mCollisionShape->raycast(rayLocal, raycastInfo, this);
|
|
|
|
|
|
|
|
// Convert the raycast info into world-space
|
|
|
|
raycastInfo.worldPoint = localToWorldTransform * raycastInfo.worldPoint;
|
|
|
|
raycastInfo.worldNormal = localToWorldTransform.getOrientation() * raycastInfo.worldNormal;
|
|
|
|
raycastInfo.worldNormal.normalize();
|
|
|
|
|
|
|
|
return isHit;
|
|
|
|
}
|