[DEV] test is back

This commit is contained in:
Edouard DUPIN 2017-09-30 13:58:25 +02:00
parent 07611ca29f
commit 2436ec2ef9
2 changed files with 37 additions and 41 deletions

View File

@ -62,12 +62,12 @@ bool ProxyShape::raycast(const Ray& ray, RaycastInfo& raycastInfo) {
ray.maxFraction); ray.maxFraction);
bool isHit = m_collisionShape->raycast(rayLocal, raycastInfo, this); bool isHit = m_collisionShape->raycast(rayLocal, raycastInfo, this);
if (isHit == true) {
// Convert the raycast info int32_to world-space // Convert the raycast info int32_to world-space
raycastInfo.worldPoint = localToWorldTransform * raycastInfo.worldPoint; raycastInfo.worldPoint = localToWorldTransform * raycastInfo.worldPoint;
raycastInfo.worldNormal = localToWorldTransform.getOrientation() * raycastInfo.worldNormal; raycastInfo.worldNormal = localToWorldTransform.getOrientation() * raycastInfo.worldNormal;
raycastInfo.worldNormal.normalize(); raycastInfo.worldNormal.normalize();
}
return isHit; return isHit;
} }

View File

@ -48,68 +48,64 @@ bool BoxShape::raycast(const Ray& ray, RaycastInfo& raycastInfo, ProxyShape* pro
vec3 rayDirection = ray.point2 - ray.point1; vec3 rayDirection = ray.point2 - ray.point1;
float tMin = FLT_MIN; float tMin = FLT_MIN;
float tMax = FLT_MAX; float tMax = FLT_MAX;
vec3 normalDirection(float(0), float(0), float(0)); vec3 normalDirection(0,0,0);
vec3 currentNormal; vec3 currentNormal(0,0,0);
// For each of the three slabs // For each of the three slabs
for (int32_t i=0; i<3; i++) { for (int32_t iii=0; iii<3; ++iii) {
// If ray is parallel to the slab // If ray is parallel to the slab
if (etk::abs(rayDirection[i]) < FLT_EPSILON) { if (etk::abs(rayDirection[iii]) < FLT_EPSILON) {
// If the ray's origin is not inside the slab, there is no hit // If the ray's origin is not inside the slab, there is no hit
if (ray.point1[i] > m_extent[i] || ray.point1[i] < -m_extent[i]) return false; if (ray.point1[iii] > m_extent[iii] || ray.point1[iii] < -m_extent[iii]) {
} return false;
else { }
} else {
// Compute the int32_tersection of the ray with the near and far plane of the slab // Compute the intersection of the ray with the near and far plane of the slab
float oneOverD = 1.0f / rayDirection[i]; float oneOverD = 1.0f / rayDirection[iii];
float t1 = (-m_extent[i] - ray.point1[i]) * oneOverD; float t1 = (-m_extent[iii] - ray.point1[iii]) * oneOverD;
float t2 = (m_extent[i] - ray.point1[i]) * oneOverD; float t2 = (m_extent[iii] - ray.point1[iii]) * oneOverD;
currentNormal[0] = (i == 0) ? -m_extent[i] : 0.0f; currentNormal[0] = (iii == 0) ? -m_extent[iii] : 0.0f;
currentNormal[1] = (i == 1) ? -m_extent[i] : 0.0f; currentNormal[1] = (iii == 1) ? -m_extent[iii] : 0.0f;
currentNormal[2] = (i == 2) ? -m_extent[i] : 0.0f; currentNormal[2] = (iii == 2) ? -m_extent[iii] : 0.0f;
// Swap t1 and t2 if need so that t1 is intersection with near plane and
// Swap t1 and t2 if need so that t1 is int32_tersection with near plane and
// t2 with far plane // t2 with far plane
if (t1 > t2) { if (t1 > t2) {
etk::swap(t1, t2); etk::swap(t1, t2);
currentNormal = -currentNormal; currentNormal = -currentNormal;
} }
// Compute the intersection of the of slab intersection interval with previous slabs
// Compute the int32_tersection of the of slab int32_tersection int32_terval with previous slabs
if (t1 > tMin) { if (t1 > tMin) {
tMin = t1; tMin = t1;
normalDirection = currentNormal; normalDirection = currentNormal;
} }
tMax = etk::min(tMax, t2); tMax = etk::min(tMax, t2);
// If tMin is larger than the maximum raycasting fraction, we return no hit // If tMin is larger than the maximum raycasting fraction, we return no hit
if (tMin > ray.maxFraction) return false; if (tMin > ray.maxFraction) {
return false;
// If the slabs int32_tersection is empty, there is no hit }
if (tMin > tMax) return false; // If the slabs intersection is empty, there is no hit
if (tMin > tMax) {
return false;
}
} }
} }
// If tMin is negative, we return no hit // If tMin is negative, we return no hit
if (tMin < 0.0f || tMin > ray.maxFraction) return false; if ( tMin < 0.0f
|| tMin > ray.maxFraction) {
return false;
}
if (normalDirection == vec3(0,0,0)) {
return false;
}
// The ray int32_tersects the three slabs, we compute the hit point // The ray int32_tersects the three slabs, we compute the hit point
vec3 localHitPoint = ray.point1 + tMin * rayDirection; vec3 localHitPoint = ray.point1 + tMin * rayDirection;
raycastInfo.body = proxyShape->getBody(); raycastInfo.body = proxyShape->getBody();
raycastInfo.proxyShape = proxyShape; raycastInfo.proxyShape = proxyShape;
raycastInfo.hitFraction = tMin; raycastInfo.hitFraction = tMin;
raycastInfo.worldPoint = localHitPoint; raycastInfo.worldPoint = localHitPoint;
raycastInfo.worldNormal = normalDirection; raycastInfo.worldNormal = normalDirection;
return true; return true;
} }
// Return the extents of the box // Return the extents of the box
/** /**
* @return The vector with the three extents of the box shape (in meters) * @return The vector with the three extents of the box shape (in meters)