public void SwitchSides()
 {
     SplineUtility.ReverseArray(Surfaces.AsArray());
     SplineUtility.ReverseArray(Samples.AsArray());
     InvertSamples();
     m_NumLeftSurfaces = Surfaces.Length;
     m_NumLeftSamples  = Samples.Length;
 }
예제 #2
0
        void SolveCorner()
        {
            if (m_ParentObj != null)
            {
                DestroyImmediate(m_ParentObj);
            }
            m_ParentObj = new GameObject("RoundedCornerVisualizer");

            NativeArray <float2> leftBuffer, rightBuffer;

            switch (testCase)
            {
            case TestCase.BetweenBothSegments:
                BetweenBothSegments(out leftBuffer, out rightBuffer);
                break;

            case TestCase.PivotLeftSegment:
                PivotNextLeftSegment(out leftBuffer, out rightBuffer);
                break;

            case TestCase.PivotRightSegment:
                PivotNextRightSegment(out leftBuffer, out rightBuffer);
                break;

            case TestCase.PivotBothSegments:
                PivotBothSegments(out leftBuffer, out rightBuffer);
                break;

            case TestCase.InwardInput:
                InwardInput(out leftBuffer, out rightBuffer);
                break;

            case TestCase.OutwardInput:
                OutwardInput(out leftBuffer, out rightBuffer);
                break;

            default:
                throw new ArgumentOutOfRangeException();
            }

            SplineUtility.ReverseArray(rightBuffer);

            var leftBufferTransform  = Float2ToRigidTransform(leftBuffer);
            var rightBufferTransform = Float2ToRigidTransform(rightBuffer);

            var roundedCornerSolver = new RoundedCornerSolver
            {
                LeftBuffer   = leftBufferTransform,
                RightBuffer  = rightBufferTransform,
                CornerRadius = radius
            };

            if (roundedCornerSolver.Solve(out var results))
            {
                var leftTangent  = Utilities.GeometryUtility.SwizzleX0Z(results.LeftTangent);
                var rightTangent = Utilities.GeometryUtility.SwizzleX0Z(results.RightTangent);
                CreateLine(leftBufferTransform, Color.green);
                CreateLine(rightBufferTransform, Color.green);
                CreateLine(new Vector3[] { leftTangent, results.Center3 }, Color.red);
                CreateLine(new Vector3[] { rightTangent, results.Center3 }, Color.blue);
                CreateCircle(results.Center3, radius, Color.cyan);
            }
            else
            {
                CreateLine(leftBufferTransform, Color.magenta);
                CreateLine(rightBufferTransform, Color.magenta);
            }

            CreateNormals(leftBuffer);
            CreateNormals(rightBuffer);

            leftBuffer.Dispose();
            rightBuffer.Dispose();
            leftBufferTransform.Dispose();
            rightBufferTransform.Dispose();
        }