//    *
        //	 * Builds a shape from control points
        //
        //-----------------------------------------------------------------------

        //Shape CubicHermiteSpline2::realizeShape()
        public Shape realizeShape()
        {
            Shape shape = new Shape();

            int numPoints = mClosed ? mPoints.size() : (mPoints.size() - 1);

            //Precompute tangents
            for (int i = 0; i < mPoints.size(); ++i)
            {
                CubicHermiteSplineControlPoint <Vector2> mp = mPoints[i];
                GlobalMembers.computeTangents(ref mp, safeGetPoint((i - 1)).position, safeGetPoint(i + 1).position);
            }
            for (int i = 0; i < numPoints; ++i)
            {
                ControlPoint         pointBefore = mPoints[i];
                ControlPoint         pointAfter  = safeGetPoint(i + 1);
                std_vector <Vector2> shape_getPointsReference = shape.getPointsReference();
                GlobalMembers.computeCubicHermitePoints(pointBefore, pointAfter, (uint)mNumSeg, ref shape_getPointsReference);

                if (i == mPoints.size() - 2 && !mClosed)
                {
                    shape.addPoint(pointAfter.position);
                }
            }
            if (mClosed)
            {
                shape.close();
            }
            shape.setOutSide(mOutSide);

            return(shape);
        }
        public static void computeTangents(ref CubicHermiteSplineControlPoint <Vector3> point, Vector3 pointBefore, Vector3 pointAfter)
        {
            switch (point.autoTangentBefore)
            {
            case CubicHermiteSplineAutoTangentMode.AT_STRAIGHT:
                point.tangentBefore = point.position - pointBefore;
                break;

            case CubicHermiteSplineAutoTangentMode.AT_CATMULL:
                point.tangentBefore = pointAfter - pointBefore;
                break;

            case CubicHermiteSplineAutoTangentMode.AT_NONE:
                break;
            }

            switch (point.autoTangentAfter)
            {
            case CubicHermiteSplineAutoTangentMode.AT_STRAIGHT:
                point.tangentAfter = pointAfter - point.position;
                break;

            case CubicHermiteSplineAutoTangentMode.AT_CATMULL:
                point.tangentAfter = pointAfter - pointBefore;
                break;

            case CubicHermiteSplineAutoTangentMode.AT_NONE:
                break;
            }
        }
        //
        //ORIGINAL LINE: inline CubicHermiteSpline2& addPoint(Ogre::float x, Ogre::float y, CubicHermiteSplineAutoTangentMode autoTangentMode = AT_CATMULL)
        public CubicHermiteSpline2 addPoint(float x, float y, CubicHermiteSplineAutoTangentMode autoTangentMode)
        {
            CubicHermiteSplineControlPoint <Vector2> cp = new CubicHermiteSplineControlPoint <Vector2>();

            cp.position          = new Vector2(x, y);
            cp.autoTangentBefore = autoTangentMode;
            cp.autoTangentAfter  = autoTangentMode;
            mPoints.push_back(cp);
            return(this);
        }
        //
        //ORIGINAL LINE: inline CubicHermiteSpline3& addPoint(const Ogre::Vector3& p, CubicHermiteSplineAutoTangentMode autoTangentMode = AT_CATMULL)
        public CubicHermiteSpline3 addPoint(Vector3 p, CubicHermiteSplineAutoTangentMode autoTangentMode)
        {
            ControlPoint cp = new CubicHermiteSplineControlPoint <Vector3>();

            cp.position          = p;
            cp.autoTangentBefore = autoTangentMode;
            cp.autoTangentAfter  = autoTangentMode;
            mPoints.push_back(cp);
            return(this);
        }
        //
        //ORIGINAL LINE: inline CubicHermiteSpline2& addPoint(const Ogre::Vector2& p, CubicHermiteSplineAutoTangentMode autoTangentMode = AT_CATMULL)
        public CubicHermiteSpline2 addPoint(Vector2 p, CubicHermiteSplineAutoTangentMode autoTangentMode)
        {
            CubicHermiteSplineControlPoint <Vector2> cp = new CubicHermiteSplineControlPoint <Vector2>();

            //
            //ORIGINAL LINE: cp.position = p;
            cp.position          = (p);
            cp.autoTangentBefore = autoTangentMode;
            cp.autoTangentAfter  = autoTangentMode;
            mPoints.push_back(cp);
            return(this);
        }
        public static void computeCubicHermitePoints(CubicHermiteSplineControlPoint <Real> pointBefore, CubicHermiteSplineControlPoint <Real> pointAfter, uint numSeg, ref std_vector <Real> pointList)
        {
            Real p0 = pointBefore.position;
            Real m0 = pointBefore.tangentAfter;
            Real p1 = pointAfter.position;
            Real m1 = pointAfter.tangentBefore;

            for (uint j = 0; j < numSeg; ++j)
            {
                float t  = (float)j / (float)numSeg;
                float t2 = t * t;
                float t3 = t2 * t;
                Real  P  = (2 * t3 - 3 * t2 + 1) * p0 + (t3 - 2 * t2 + t) * m0 + (-2 * t3 + 3 * t2) * p1 + (t3 - t2) * m1;
                pointList.Add(P);
            }
        }