Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'extern/bullet/Bullet/NarrowPhaseCollision/RaycastCallback.cpp')
-rw-r--r--extern/bullet/Bullet/NarrowPhaseCollision/RaycastCallback.cpp94
1 files changed, 94 insertions, 0 deletions
diff --git a/extern/bullet/Bullet/NarrowPhaseCollision/RaycastCallback.cpp b/extern/bullet/Bullet/NarrowPhaseCollision/RaycastCallback.cpp
new file mode 100644
index 00000000000..f27801d224b
--- /dev/null
+++ b/extern/bullet/Bullet/NarrowPhaseCollision/RaycastCallback.cpp
@@ -0,0 +1,94 @@
+/*
+ * Copyright (c) 2005 Erwin Coumans http://www.erwincoumans.com
+ *
+ * Permission to use, copy, modify, distribute and sell this software
+ * and its documentation for any purpose is hereby granted without fee,
+ * provided that the above copyright notice appear in all copies.
+ * Erwin Coumans makes no representations about the suitability
+ * of this software for any purpose.
+ * It is provided "as is" without express or implied warranty.
+*/
+
+#include "RaycastCallback.h"
+
+RaycastCallback::RaycastCallback(const SimdVector3& from,const SimdVector3& to)
+ :
+ m_from(from),
+ m_to(to),
+ m_hitFraction(1.f),
+ m_hitProxy(0)
+{
+
+}
+
+
+
+void RaycastCallback::ProcessTriangle(SimdVector3* triangle)
+{
+
+ int hits_found=0;
+ const SimdVector3 &vert0=triangle[0];
+ const SimdVector3 &vert1=triangle[1];
+ const SimdVector3 &vert2=triangle[2];
+
+ SimdVector3 v10; v10 = vert1 - vert0 ;
+ SimdVector3 v20; v20 = vert2 - vert0 ;
+
+ SimdVector3 triangleNormal; triangleNormal = v10.cross( v20 );
+
+ const float dist = vert0.dot(triangleNormal);
+ float dist_a = triangleNormal.dot(m_from) ;
+ dist_a-= dist;
+ float dist_b = triangleNormal.dot(m_to);
+ dist_b -= dist;
+
+ if ( dist_a * dist_b >= 0.0f)
+ {
+ return ; // same sign
+ }
+
+ const float proj_length=dist_a-dist_b;
+ const float distance = (dist_a)/(proj_length);
+ // Now we have the intersection point on the plane, we'll see if it's inside the triangle
+ // Add an epsilon as a tolerance for the raycast,
+ // in case the ray hits exacly on the edge of the triangle.
+ // It must be scaled for the triangle size.
+ if(distance < m_hitFraction)
+ {
+ float edge_tolerance =triangleNormal.length2();
+ edge_tolerance *= -0.0001f;
+ SimdVector3 point; point.setInterpolate3( m_from, m_to, distance);
+ {
+ SimdVector3 v0p; v0p = vert0 - point;
+ SimdVector3 v1p; v1p = vert1 - point;
+ SimdVector3 cp0; cp0 = v0p.cross( v1p );
+
+ if ( (float)(cp0.dot(triangleNormal)) >=edge_tolerance)
+ {
+ SimdVector3 v2p; v2p = vert2 - point;
+ SimdVector3 cp1;
+ cp1 = v1p.cross( v2p);
+ if ( (float)(cp1.dot(triangleNormal)) >=edge_tolerance)
+ {
+ SimdVector3 cp2;
+ cp2 = v2p.cross(v0p);
+ if ( (float)(cp2.dot(triangleNormal)) >=edge_tolerance)
+ {
+ m_hitFraction = distance;
+ if ( dist_a > 0 )
+ {
+ m_hitNormalWorld = triangleNormal;
+ }
+ else
+ {
+ m_hitNormalWorld = -triangleNormal;
+ }
+ hits_found = 1;
+ }
+ }
+ }
+ }
+ }
+ //return hits_found;
+
+}