Exemplo n.º 1
0
    private void Update()
    {
//        m_Hermite = new Hermite();
//        m_Hermite.Initialize(m_Points.Select(tr => tr.position).ToArray(),
//            m_InTangents.Select(tr => tr.forward).ToArray(),
//            m_OutTangents.Select(tr => tr.forward).ToArray(),
//            m_Times.ToArray(),
//            m_Points.Count);
//
//        // draw curve
//        float step = 1f / m_ResolutionVisual;
//        for (int i = 1; i < m_ResolutionVisual; i++)
//        {
//            var previousPoint = m_Hermite.Evaluate((i - 1) * step);
//            var thisPoint = m_Hermite.Evaluate((i) * step);
//            Debug.DrawLine(previousPoint, thisPoint, m_CurveColor);
//        }

        for (int i = 0; i < m_InTangents.Count; i++)
        {
            m_Hermite.SetInTangent(i, m_InTangents[i].position);
        }
        for (int i = 0; i < m_OutTangents.Count; i++)
        {
            m_Hermite.SetOutTangent(i, m_OutTangents[i].position);
        }
        for (int i = 0; i < m_Points.Count; i++)
        {
            m_Hermite.SetPosition(i, m_Points[i].position);
        }
        for (int i = 0; i < m_Times.Count; i++)
        {
            m_Hermite.SetTime(i, m_Times[i]);
        }

//        // draw curve
//        float step = 1f / m_ResolutionVisual;
//        for (int i = 1; i < m_ResolutionVisual; i++)
//        {
//            var previousPoint = m_Hermite.Evaluate((i - 1) * step);
//            var thisPoint = m_Hermite.Evaluate((i) * step);
//            Debug.DrawLine(previousPoint, thisPoint, m_CurveColor);
//        }

        // draw tangents
        for (int i = 0; i < m_Points.Count; i++)
        {
            if (i > 0)
            {
                Debug.DrawLine(m_Points[i].position, m_Points[i].position + m_InTangents[i - 1].position, m_InTangColor);
            }

            if (i < m_Points.Count - 1)
            {
                Debug.DrawLine(m_Points[i].position, m_Points[i].position + m_OutTangents[i].position, m_OutTangColor);
            }
        }
    }
Exemplo n.º 2
0
        public void ValidateData()
        {
            var posFail     = points.Count != m_Hermite.Positions.Count;
            var outTangFail = outTangents.Count != m_Hermite.OutTangents.Count;
            var inTangFail  = inTangents.Count != m_Hermite.InTangents.Count;
            var timesFail   = times.Count != m_Hermite.Times.Count;

            if (posFail)
            {
                ///////////////////
                /// ADDITION
                ///////////////////
                if (points.Count == m_Hermite.Positions.Count + 1)
                {
                    // we assume addition from editor via SerializedProperty has happened
                    var differentIndex = CheckForDifference <Vector3>(points, m_Hermite.Positions);
                    m_Hermite.AddPositionToIndexNatural(points[differentIndex], differentIndex);

                    inTangents.Clear();
                    inTangents.AddRange(m_Hermite.InTangents);
                    outTangents.Clear();
                    outTangents.AddRange(m_Hermite.OutTangents);
                    times.Clear();
                    times.AddRange(m_Hermite.Times);
                }
//                if (inTangents.Count + 1 == m_Hermite.InTangents.Count)
//                { // we assume another tangent has been generated because we've added another point
//                    var differentIndex = CheckForDifference<Vector3>(inTangents, m_Hermite.InTangents);
//                    inTangents.Insert(differentIndex, m_Hermite.InTangents[differentIndex]);
//                }
//                if (outTangents.Count + 1 == m_Hermite.OutTangents.Count)
//                { // we assume another tangent has been generated because we've added another point
//                    var differentIndex = CheckForDifference<Vector3>(outTangents, m_Hermite.OutTangents);
//                    outTangents.Insert(differentIndex, m_Hermite.OutTangents[differentIndex]);
//                }
//                if (times.Count + 1 == m_Hermite.Times.Count)
//                { // we assume another time has been generated because we've added another point
//                    var differentIndex = CheckForDifference<float>(times, m_Hermite.Times);
//                    times.Insert(differentIndex, m_Hermite.Times[differentIndex]);
//                }

                ///////////////////
                /// REMOVAL
                ///////////////////
                if (points.Count == m_Hermite.Positions.Count - 1)
                {
                    // we assume it's removal
                    var differentIndex = CheckForDifference <Vector3>(points, m_Hermite.Positions);
                    m_Hermite.RemovePosition(differentIndex);
                }

                if (inTangents.Count - 1 == m_Hermite.InTangents.Count)
                {
                    // we assume tangent has been removed internally because of point removal
                    var differentIndex = CheckForDifference <Vector3>(inTangents, m_Hermite.InTangents);
                    inTangents.RemoveAt(differentIndex);
                }

                if (outTangents.Count - 1 == m_Hermite.OutTangents.Count)
                {
                    // we assume tangent has been removed internally because of point removal
                    var differentIndex = CheckForDifference <Vector3>(outTangents, m_Hermite.OutTangents);
                    outTangents.RemoveAt(differentIndex);
                }

                if (times.Count - 1 == m_Hermite.Times.Count)
                {
                    // we assume time has been removed because we've remove a point
                    var differentIndex = CheckForDifference <float>(times, m_Hermite.Times);
                    times.RemoveAt(differentIndex);
                }
            }

            // EVALUATE THE CHANGES - they can happen by manipulating the field via editor SerializedProperty writing
            GetTheDifferences <Vector3>(m_Hermite.Positions, points, m_DifferencesVect);
            if (m_DifferencesVect.Count > 0)
            {
                foreach (var difVect in m_DifferencesVect)
                {
                    m_Hermite.SetPosition(difVect.Key, difVect.Value);
                }
            }

            GetTheDifferences <Vector3>(m_Hermite.InTangents, inTangents, m_DifferencesVect);
            if (m_DifferencesVect.Count > 0)
            {
                foreach (var difVect in m_DifferencesVect)
                {
                    m_Hermite.SetInTangent(difVect.Key, difVect.Value);
                }
            }

            GetTheDifferences <Vector3>(m_Hermite.OutTangents, outTangents, m_DifferencesVect);
            if (m_DifferencesVect.Count > 0)
            {
                foreach (var difVect in m_DifferencesVect)
                {
                    m_Hermite.SetOutTangent(difVect.Key, difVect.Value);
                }
            }

            GetTheDifferences <float>(m_Hermite.Times, times, m_DifferencesFloat);
            if (m_DifferencesFloat.Count > 0)
            {
                foreach (var difFloat in m_DifferencesFloat)
                {
                    m_Hermite.SetTime(difFloat.Key, difFloat.Value);
                }
            }
        }