Changeset View
Changeset View
Standalone View
Standalone View
extern/bullet2/src/BulletCollision/Gimpact/btClipPolygon.h
| Show All 21 Lines | |||||
| 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. | 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. | 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. | 3. This notice may not be removed or altered from any source distribution. | ||||
| */ | */ | ||||
| #include "LinearMath/btTransform.h" | #include "LinearMath/btTransform.h" | ||||
| #include "LinearMath/btGeometryUtil.h" | #include "LinearMath/btGeometryUtil.h" | ||||
| SIMD_FORCE_INLINE btScalar bt_distance_point_plane(const btVector4 & plane,const btVector3 &point) | SIMD_FORCE_INLINE btScalar bt_distance_point_plane(const btVector4 &plane, const btVector3 &point) | ||||
| { | { | ||||
| return point.dot(plane) - plane[3]; | return point.dot(plane) - plane[3]; | ||||
| } | } | ||||
| /*! Vector blending | /*! Vector blending | ||||
| Takes two vectors a, b, blends them together*/ | Takes two vectors a, b, blends them together*/ | ||||
| SIMD_FORCE_INLINE void bt_vec_blend(btVector3 &vr, const btVector3 &va,const btVector3 &vb, btScalar blend_factor) | SIMD_FORCE_INLINE void bt_vec_blend(btVector3 &vr, const btVector3 &va, const btVector3 &vb, btScalar blend_factor) | ||||
| { | { | ||||
| vr = (1-blend_factor)*va + blend_factor*vb; | vr = (1 - blend_factor) * va + blend_factor * vb; | ||||
| } | } | ||||
| //! This function calcs the distance from a 3D plane | //! This function calcs the distance from a 3D plane | ||||
| SIMD_FORCE_INLINE void bt_plane_clip_polygon_collect( | SIMD_FORCE_INLINE void bt_plane_clip_polygon_collect( | ||||
| const btVector3 & point0, | const btVector3 &point0, | ||||
| const btVector3 & point1, | const btVector3 &point1, | ||||
| btScalar dist0, | btScalar dist0, | ||||
| btScalar dist1, | btScalar dist1, | ||||
| btVector3 * clipped, | btVector3 *clipped, | ||||
| int & clipped_count) | int &clipped_count) | ||||
| { | { | ||||
| bool _prevclassif = (dist0>SIMD_EPSILON); | bool _prevclassif = (dist0 > SIMD_EPSILON); | ||||
| bool _classif = (dist1>SIMD_EPSILON); | bool _classif = (dist1 > SIMD_EPSILON); | ||||
| if(_classif!=_prevclassif) | if (_classif != _prevclassif) | ||||
| { | { | ||||
| btScalar blendfactor = -dist0/(dist1-dist0); | btScalar blendfactor = -dist0 / (dist1 - dist0); | ||||
| bt_vec_blend(clipped[clipped_count],point0,point1,blendfactor); | bt_vec_blend(clipped[clipped_count], point0, point1, blendfactor); | ||||
| clipped_count++; | clipped_count++; | ||||
| } | } | ||||
| if(!_classif) | if (!_classif) | ||||
| { | { | ||||
| clipped[clipped_count] = point1; | clipped[clipped_count] = point1; | ||||
| clipped_count++; | clipped_count++; | ||||
| } | } | ||||
| } | } | ||||
| //! Clips a polygon by a plane | //! Clips a polygon by a plane | ||||
| /*! | /*! | ||||
| *\return The count of the clipped counts | *\return The count of the clipped counts | ||||
| */ | */ | ||||
| SIMD_FORCE_INLINE int bt_plane_clip_polygon( | SIMD_FORCE_INLINE int bt_plane_clip_polygon( | ||||
| const btVector4 & plane, | const btVector4 &plane, | ||||
| const btVector3 * polygon_points, | const btVector3 *polygon_points, | ||||
| int polygon_point_count, | int polygon_point_count, | ||||
| btVector3 * clipped) | btVector3 *clipped) | ||||
| { | { | ||||
| int clipped_count = 0; | int clipped_count = 0; | ||||
| //clip first point | //clip first point | ||||
| btScalar firstdist = bt_distance_point_plane(plane,polygon_points[0]);; | btScalar firstdist = bt_distance_point_plane(plane, polygon_points[0]); | ||||
| ; | |||||
| if(!(firstdist>SIMD_EPSILON)) | if (!(firstdist > SIMD_EPSILON)) | ||||
| { | { | ||||
| clipped[clipped_count] = polygon_points[0]; | clipped[clipped_count] = polygon_points[0]; | ||||
| clipped_count++; | clipped_count++; | ||||
| } | } | ||||
| btScalar olddist = firstdist; | btScalar olddist = firstdist; | ||||
| for(int i=1;i<polygon_point_count;i++) | for (int i = 1; i < polygon_point_count; i++) | ||||
| { | { | ||||
| btScalar dist = bt_distance_point_plane(plane,polygon_points[i]); | btScalar dist = bt_distance_point_plane(plane, polygon_points[i]); | ||||
| bt_plane_clip_polygon_collect( | bt_plane_clip_polygon_collect( | ||||
| polygon_points[i-1],polygon_points[i], | polygon_points[i - 1], polygon_points[i], | ||||
| olddist, | olddist, | ||||
| dist, | dist, | ||||
| clipped, | clipped, | ||||
| clipped_count); | clipped_count); | ||||
| olddist = dist; | olddist = dist; | ||||
| } | } | ||||
| //RETURN TO FIRST point | //RETURN TO FIRST point | ||||
| bt_plane_clip_polygon_collect( | bt_plane_clip_polygon_collect( | ||||
| polygon_points[polygon_point_count-1],polygon_points[0], | polygon_points[polygon_point_count - 1], polygon_points[0], | ||||
| olddist, | olddist, | ||||
| firstdist, | firstdist, | ||||
| clipped, | clipped, | ||||
| clipped_count); | clipped_count); | ||||
| return clipped_count; | return clipped_count; | ||||
| } | } | ||||
| //! Clips a polygon by a plane | //! Clips a polygon by a plane | ||||
| /*! | /*! | ||||
| *\param clipped must be an array of 16 points. | *\param clipped must be an array of 16 points. | ||||
| *\return The count of the clipped counts | *\return The count of the clipped counts | ||||
| */ | */ | ||||
| SIMD_FORCE_INLINE int bt_plane_clip_triangle( | SIMD_FORCE_INLINE int bt_plane_clip_triangle( | ||||
| const btVector4 & plane, | const btVector4 &plane, | ||||
| const btVector3 & point0, | const btVector3 &point0, | ||||
| const btVector3 & point1, | const btVector3 &point1, | ||||
| const btVector3& point2, | const btVector3 &point2, | ||||
| btVector3 * clipped // an allocated array of 16 points at least | btVector3 *clipped // an allocated array of 16 points at least | ||||
| ) | ) | ||||
| { | { | ||||
| int clipped_count = 0; | int clipped_count = 0; | ||||
| //clip first point0 | //clip first point0 | ||||
| btScalar firstdist = bt_distance_point_plane(plane,point0);; | btScalar firstdist = bt_distance_point_plane(plane, point0); | ||||
| ; | |||||
| if(!(firstdist>SIMD_EPSILON)) | if (!(firstdist > SIMD_EPSILON)) | ||||
| { | { | ||||
| clipped[clipped_count] = point0; | clipped[clipped_count] = point0; | ||||
| clipped_count++; | clipped_count++; | ||||
| } | } | ||||
| // point 1 | // point 1 | ||||
| btScalar olddist = firstdist; | btScalar olddist = firstdist; | ||||
| btScalar dist = bt_distance_point_plane(plane,point1); | btScalar dist = bt_distance_point_plane(plane, point1); | ||||
| bt_plane_clip_polygon_collect( | bt_plane_clip_polygon_collect( | ||||
| point0,point1, | point0, point1, | ||||
| olddist, | olddist, | ||||
| dist, | dist, | ||||
| clipped, | clipped, | ||||
| clipped_count); | clipped_count); | ||||
| olddist = dist; | olddist = dist; | ||||
| // point 2 | // point 2 | ||||
| dist = bt_distance_point_plane(plane,point2); | dist = bt_distance_point_plane(plane, point2); | ||||
| bt_plane_clip_polygon_collect( | bt_plane_clip_polygon_collect( | ||||
| point1,point2, | point1, point2, | ||||
| olddist, | olddist, | ||||
| dist, | dist, | ||||
| clipped, | clipped, | ||||
| clipped_count); | clipped_count); | ||||
| olddist = dist; | olddist = dist; | ||||
| //RETURN TO FIRST point0 | //RETURN TO FIRST point0 | ||||
| bt_plane_clip_polygon_collect( | bt_plane_clip_polygon_collect( | ||||
| point2,point0, | point2, point0, | ||||
| olddist, | olddist, | ||||
| firstdist, | firstdist, | ||||
| clipped, | clipped, | ||||
| clipped_count); | clipped_count); | ||||
| return clipped_count; | return clipped_count; | ||||
| } | } | ||||
| #endif // GIM_TRI_COLLISION_H_INCLUDED | #endif // GIM_TRI_COLLISION_H_INCLUDED | ||||