/* * All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or * its licensors. * * For complete copyright and license terms please see the LICENSE at the root of this * distribution (the "License"). All use of this software is governed by the License, * or, if provided, by the license below or the license accompanying this file. Do not * remove or modify any license notices. This file is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * */ // include required headers #include "PlaneEq.h" namespace MCore { // clip points against the plane bool PlaneEq::Clip(const AZStd::vector& pointsIn, AZStd::vector& pointsOut) const { size_t numPoints = pointsIn.size(); MCORE_ASSERT(&pointsIn != &pointsOut); MCORE_ASSERT(numPoints >= 2); size_t vert1 = numPoints - 1; float firstDist = CalcDistanceTo(pointsIn[vert1]); float nextDist = firstDist; bool firstIn = (firstDist >= 0.0f); bool nextIn = firstIn; pointsOut.clear(); if (numPoints == 2) { numPoints = 1; } for (int32 vert2 = 0; vert2 < numPoints; vert2++) { float dist = nextDist; bool in = nextIn; nextDist = CalcDistanceTo(pointsIn[vert2]); nextIn = (nextDist >= 0.0f); if (in) { pointsOut.emplace_back(pointsIn[vert1]); } if ((in != nextIn) && (dist != 0.0f) && (nextDist != 0.0f)) { AZ::Vector3 dir = (pointsIn[vert2] - pointsIn[vert1]); float frac = dist / (dist - nextDist); if ((frac > 0.0f) && (frac < 1.0f)) { pointsOut.emplace_back(pointsIn[vert1] + frac * dir); } } vert1 = vert2; } //if (numPoints == 1) // return (pointsOut.GetLength() > 1); return (pointsOut.size() > 1); } // clip a set of vectors to this plane bool PlaneEq::Clip(AZStd::vector& points) const { AZStd::vector pointsOut; if (Clip(points, pointsOut)) { points = pointsOut; return true; } return false; } } // namespace MCore