public void EvaluatePolyline(CurvedPolygonsNet net, OutputMesh mesh, CPNGuide guide)
        {
            bool uvAvailable = net.GetUv() != null && net.GetUv().Length != 0 && mesh.DoUseUVs();
            int  countP      = mesh.CountProperties();

            //bool tgAvailable = net.GetTangents() != null && net.GetTangents().Length != 0;

            short[] tessellationDegrees = CPNGuide_loqs;

            guide.vBuffer = CreateBufferWithIndices(guide.vBuffer, net.GetVertices(), guide.GetIndices());
            guide.nBuffer = CreateBufferWithIndices(guide.vBuffer, net.GetNormals(), guide.GetIndices());
            if (uvAvailable)
            {
                guide.uvsBuffer = CreateBufferWithIndices(guide.uvsBuffer, net.GetUv(), guide.GetIndices());
            }
            if (countP > 0)
            {
                guide.PreparePropertiesBuffers(countP);
                for (int k = 0; k < countP; k++)
                {
                    guide.propertiesBuffer[k] = CreateBufferWithIndices(guide.propertiesBuffer[k],
                                                                        net.GetProperties3()[k], guide.GetIndices());
                }
            }
        }
        public Vector3 EvalAxis(CPNGuide guide)
        {
            if (guide.GetN() == -1)
            {
                int N = guide.GetIndices().Length;
                if (N > 0)
                {
                    Vector3 pDev1  = (guide.vBuffer[1] - guide.vBuffer[0]).normalized;
                    Vector3 pPerp1 = Vector3.Cross(pDev1, guide.nBuffer[0]).normalized;

                    Vector3 pDev2  = (guide.vBuffer[N - 1] - guide.vBuffer[N - 2]).normalized;
                    Vector3 pPerp2 = Vector3.Cross(pDev2, guide.nBuffer[N - 1]).normalized;

                    Vector3 pPerp = ((T1 + T2) * pPerp1 + (T3 + T4) * pPerp2);

                    return(pPerp.normalized);
                }
                else
                {
                    return(Vector3.zero);
                }
            }

            Vector3 Dev1  = (guide.vBuffer[1] - guide.vBuffer[0]).normalized;
            Vector3 Perp1 = Vector3.Cross(Dev1, guide.firstNormal).normalized;

            Vector3 Dev2  = (guide.vBuffer[3] - guide.vBuffer[2]).normalized;
            Vector3 Perp2 = Vector3.Cross(Dev2, guide.lastNormal).normalized;

            Vector3 Perp = ((T1 + T2) * Perp1 + (T3 + T4) * Perp2);

            return(Perp.normalized);
        }
        /*
         * if (linear) {   //forgot linear evaluation.. uff.
         *  mesh.SetVertex(index, vBuffer[0] * t + vBuffer[1] * tm);
         *  if (uvAvailable)
         *      mesh.SetUV(index, uvsBuffer[0] * t + uvsBuffer[1] * tm);
         *  if (nsAvailable)
         *  {
         *
         *      Vector3 Dev = vBuffer[1] - vBuffer[0];
         *      Vector3 Perp = ((1 - t) * perpA + t * perpB).normalized;
         *
         *      Vector3 normal = Vector3.Normalize(Vector3.Cross(Dev, Perp)).normalized;
         *
         *      mesh.SetNormal(index, normal);
         *  }
         * }*/

        public float EvalAt(float t, CPNGuide guide)
        {
            if (guide.GetN() == -1)  //Polylines

            {
                int N = guide.GetIndices().Length - 1;

                if (N > 1)
                {
                    float T  = t * N;
                    int   pI = (int)T;
                    pI = (pI == N) ? pI - 1 : pI;
                    this.polylineIndex = pI;
                    this.T2            = T - pI;
                    this.T1            = 1 - this.T2;
                }
                else
                {
                    this.polylineIndex = 0;
                }

                return(t);
            }

            float j = t * guide.GetN();

            t       = j * (guide.tessellationStepA + j * guide.tessellationStepB);
            this.t  = t;
            this.tm = 1 - this.t;

            this.T1 = tm * tm * tm;
            this.T2 = 3 * t * tm * tm;
            this.T3 = 3 * t * t * tm;
            this.T4 = t * t * t;

            float w2 = guide.w2;
            float w3 = guide.w3;

            this.G    = (T1 + T2 * w2 + T3 * w3 + T4);
            this.recG = 1.0f / G;

            return(t);
        }
        public Vector3 EvalDev(CPNGuide guide)
        {
            if (guide.GetN() == -1)
            {
                return((guide.vBuffer[this.polylineIndex + 1] - guide.vBuffer[this.polylineIndex]) * (guide.GetIndices().Length - 1));
            }

            float tp  = t + 0.001f;
            float tmp = 1 - tp;

            float T1p = tmp * tmp * tmp;
            float T2p = 3 * tp * tmp * tmp;
            float T3p = 3 * tp * tp * tmp;
            float T4p = tp * tp * tp;
            float w2  = guide.w2;
            float w3  = guide.w3;

            Vector3[] vBuffer = guide.vBuffer;
            Vector3   F1      = (vBuffer[0] * T1 + vBuffer[1] * T2 * w2 + vBuffer[2] * T3 * w3 + vBuffer[3] * T4) /
                                (T1 + T2 * w2 + T3 * w3 + T4);
            Vector3 F2 = (vBuffer[0] * T1p + vBuffer[1] * T2p * w2 + vBuffer[2] * T3p * w3 + vBuffer[3] * T4p) /
                         (T1p + T2p * w2 + T3p * w3 + T4p);

            return((F2 - F1) * (1000f));
        }