diff --git a/src/LinearMath/btGeometryUtil.cpp b/src/LinearMath/btGeometryUtil.cpp new file mode 100644 index 000000000..c351ecf17 --- /dev/null +++ b/src/LinearMath/btGeometryUtil.cpp @@ -0,0 +1,168 @@ +/* +Copyright (c) 2003-2006 Gino van den Bergen / Erwin Coumans http://continuousphysics.com/Bullet/ + +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. +*/ + + + +#include "btGeometryUtil.h" + +bool btGeometryUtil::isPointInsidePlanes(const std::vector& planeEquations, const btVector3& point, float margin) +{ + int numbrushes = planeEquations.size(); + for (int i=0;i0.f) + { + return false; + } + } + return true; + +} + + +bool btGeometryUtil::areVerticesBehindPlane(const btVector3& planeNormal, const std::vector& vertices, float margin) +{ + int numvertices = vertices.size(); + for (int i=0;i0.f) + { + return false; + } + } + return true; +} + +bool notExist(const btVector3& planeEquation,const std::vector& planeEquations) +{ + int numbrushes = planeEquations.size(); + for (int i=0;i 0.999f) + { + return false; + } + } + return true; +} + +void btGeometryUtil::getPlaneEquationsFromVertices(std::vector& vertices, std::vector& planeEquationsOut ) +{ + const int numvertices = vertices.size(); + // brute force: + for (int i=0;i 0.0001f) + { + planeEquation.normalize(); + if (notExist(planeEquation,planeEquationsOut)) + { + planeEquation[3] = -planeEquation.dot(N1); + + //check if inside, and replace supportingVertexOut if needed + if (areVerticesBehindPlane(planeEquation,vertices,0.01f)) + { + planeEquationsOut.push_back(planeEquation); + } + } + } + normalSign = -1.f; + } + + } + } + } + +} + +void btGeometryUtil::getVerticesFromPlaneEquations(const std::vector& planeEquations , std::vector& verticesOut ) +{ + const int numbrushes = planeEquations.size(); + // brute force: + for (int i=0;i 0.0001f ) && + ( n3n1.length2() > 0.0001f ) && + ( n1n2.length2() > 0.0001f ) ) + { + //point P out of 3 plane equations: + + // d1 ( N2 * N3 ) + d2 ( N3 * N1 ) + d3 ( N1 * N2 ) + //P = ------------------------------------------------------------------------- + // N1 . ( N2 * N3 ) + + + float quotient = (N1.dot(n2n3)); + if (btFabs(quotient) > 0.000001f) + { + quotient = -1.f / quotient; + n2n3 *= N1[3]; + n3n1 *= N2[3]; + n1n2 *= N3[3]; + btVector3 potentialVertex = n2n3; + potentialVertex += n3n1; + potentialVertex += n1n2; + potentialVertex *= quotient; + + //check if inside, and replace supportingVertexOut if needed + if (isPointInsidePlanes(planeEquations,potentialVertex,0.01f)) + { + verticesOut.push_back(potentialVertex); + } + } + } + } + } + } +} \ No newline at end of file diff --git a/src/LinearMath/btGeometryUtil.h b/src/LinearMath/btGeometryUtil.h new file mode 100644 index 000000000..17498fd87 --- /dev/null +++ b/src/LinearMath/btGeometryUtil.h @@ -0,0 +1,39 @@ +/* +Copyright (c) 2003-2006 Gino van den Bergen / Erwin Coumans http://continuousphysics.com/Bullet/ + +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. +*/ + + +#ifndef BT_GEOMETRY_UTIL_H +#define BT_GEOMETRY_UTIL_H +#include +#include "btVector3.h" + +class btGeometryUtil +{ + public: + + + static void getPlaneEquationsFromVertices(std::vector& vertices, std::vector& planeEquationsOut ); + + static void getVerticesFromPlaneEquations(const std::vector& planeEquations , std::vector& verticesOut ); + + static bool isInside(const std::vector& vertices, const btVector3& planeNormal, float margin); + + static bool isPointInsidePlanes(const std::vector& planeEquations, const btVector3& point, float margin); + + static bool areVerticesBehindPlane(const btVector3& planeNormal, const std::vector& vertices, float margin); + +}; + + +#endif //BT_GEOMETRY_UTIL_H \ No newline at end of file