[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [16477] branches/sim_physics/source/ gameengine/Physics/Bullet/CcdPhysicsEnvironment.cpp: Repair rayCast part 2: return correct polygon information and true normal
Benoit Bolsee
benoit.bolsee at online.be
Thu Sep 11 22:16:33 CEST 2008
Revision: 16477
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=16477
Author: ben2610
Date: 2008-09-11 22:16:30 +0200 (Thu, 11 Sep 2008)
Log Message:
-----------
Repair rayCast part 2: return correct polygon information and true normal
Modified Paths:
--------------
branches/sim_physics/source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.cpp
Modified: branches/sim_physics/source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.cpp
===================================================================
--- branches/sim_physics/source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.cpp 2008-09-11 20:09:07 UTC (rev 16476)
+++ branches/sim_physics/source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.cpp 2008-09-11 20:16:30 UTC (rev 16477)
@@ -741,8 +741,8 @@
// save shape information as ClosestRayResultCallback::AddSingleResult() does not do it
if (rayResult.m_localShapeInfo)
{
- m_hitTriangleShape = NULL;//rayResult.m_localShapeInfo->m_triangleShape;
- m_hitTriangleIndex = 0;//rayResult.m_localShapeInfo->m_triangleIndex;
+ m_hitTriangleShape = rayResult.m_collisionObject->getCollisionShape();
+ m_hitTriangleIndex = rayResult.m_localShapeInfo->m_triangleIndex;
} else
{
m_hitTriangleShape = NULL;
@@ -786,16 +786,6 @@
result.m_hitPoint[1] = rayCallback.m_hitPointWorld.getY();
result.m_hitPoint[2] = rayCallback.m_hitPointWorld.getZ();
- if (rayCallback.m_hitNormalWorld.length2() > (SIMD_EPSILON*SIMD_EPSILON))
- {
- rayCallback.m_hitNormalWorld.normalize();
- } else
- {
- rayCallback.m_hitNormalWorld.setValue(1,0,0);
- }
- result.m_hitNormal[0] = rayCallback.m_hitNormalWorld.getX();
- result.m_hitNormal[1] = rayCallback.m_hitNormalWorld.getY();
- result.m_hitNormal[2] = rayCallback.m_hitNormalWorld.getZ();
if (rayCallback.m_hitTriangleShape != NULL)
{
// identify the mesh polygon
@@ -821,9 +811,63 @@
{
result.m_meshObject = shapeInfo->m_meshObject;
result.m_polygon = shapeInfo->m_polygonIndexArray.at(rayCallback.m_hitTriangleIndex);
+
+ // Bullet returns the normal from "outside".
+ // If the user requests the real normal, compute it now
+ if (filterCallback.m_faceNormal)
+ {
+ // this code is copied from Bullet
+ btVector3 triangle[3];
+ const unsigned char *vertexbase;
+ int numverts;
+ PHY_ScalarType type;
+ int stride;
+ const unsigned char *indexbase;
+ int indexstride;
+ int numfaces;
+ PHY_ScalarType indicestype;
+ btTriangleMeshShape* triangleShape = (btTriangleMeshShape*)shape;
+ btStridingMeshInterface* meshInterface = triangleShape->getMeshInterface();
+
+ meshInterface->getLockedReadOnlyVertexIndexBase(
+ &vertexbase,
+ numverts,
+ type,
+ stride,
+ &indexbase,
+ indexstride,
+ numfaces,
+ indicestype,
+ 0);
+
+ unsigned int* gfxbase = (unsigned int*)(indexbase+rayCallback.m_hitTriangleIndex*indexstride);
+ const btVector3& meshScaling = meshInterface->getScaling();
+ for (int j=2;j>=0;j--)
+ {
+ int graphicsindex = indicestype==PHY_SHORT?((unsigned short*)gfxbase)[j]:gfxbase[j];
+
+ btScalar* graphicsbase = (btScalar*)(vertexbase+graphicsindex*stride);
+
+ triangle[j] = btVector3(graphicsbase[0]*meshScaling.getX(),graphicsbase[1]*meshScaling.getY(),graphicsbase[2]*meshScaling.getZ());
+ }
+ meshInterface->unLockReadOnlyVertexBase(0);
+ btVector3 triangleNormal;
+ triangleNormal = (triangle[1]-triangle[0]).cross(triangle[2]-triangle[0]);
+ rayCallback.m_hitNormalWorld = rayCallback.m_collisionObject->getWorldTransform().getBasis()*triangleNormal;
+ }
}
}
}
+ if (rayCallback.m_hitNormalWorld.length2() > (SIMD_EPSILON*SIMD_EPSILON))
+ {
+ rayCallback.m_hitNormalWorld.normalize();
+ } else
+ {
+ rayCallback.m_hitNormalWorld.setValue(1,0,0);
+ }
+ result.m_hitNormal[0] = rayCallback.m_hitNormalWorld.getX();
+ result.m_hitNormal[1] = rayCallback.m_hitNormalWorld.getY();
+ result.m_hitNormal[2] = rayCallback.m_hitNormalWorld.getZ();
filterCallback.reportHit(&result);
}
More information about the Bf-blender-cvs
mailing list