Пример #1
0
 public CurveResult Evaluate(float curveT, ref CurveResult result)
 {
     //CurveResult result = new CurveResult();
     unsafe
     {
         fixed(CurveResult *p = &result)
         {
             SDK_GfxICurve_EvaluateNative(mCoreObject, curveT, p);
         }
     }
     return(result);
 }
Пример #2
0
        public override void Evaluate(float curveT, Binding.AnimationElementBinding bindingElement)
        {
            var binding = bindingElement as BoneAnimationBinding;

            if (binding == null)
            {
                return;
            }
            var         boneCurve   = Curve as CGfxBoneCurve;
            CurveResult curveResult = new CurveResult();

            curveResult.BoneSRTResult = binding.Bone.Transform;
            curveResult        = boneCurve.Evaluate(curveT, ref curveResult);
            binding.MotionData = boneCurve.EvaluateMotionState(curveT);
            binding.Value      = curveResult;
        }
        /// Bezier :
        ///	Evaluate a Bezier curve at a particular parameter value
        ///     Fill in control points for resulting sub-curves if "Left" and
        ///	"Right" are non-null.
        ///
        ///     - int degree;      Degree of bezier curve
        ///     - Point2* V;       Control pts
        ///     - double t;        Parameter value
        private static CurveResult Curve(Vector2[] V, int degree, double t)
        {
            const int WDegree = 5;

            Vector2[,] Vtemp = new Vector2[5 + 1, WDegree + 1];

            // Copy control points
            for (var j = 0; j <= degree; j++)
            {
                Vtemp[0, j] = V[j];
            }

            // Triangle computation
            for (var i = 1; i <= degree; i++)
            {
                for (var j = 0; j <= degree - i; j++)
                {
                    Vtemp[i, j] = new Vector2
                    {
                        X = (1.0 - t) * Vtemp[i - 1, j].X + t * Vtemp[i - 1, j + 1].X,
                        Y = (1.0 - t) * Vtemp[i - 1, j].Y + t * Vtemp[i - 1, j + 1].Y
                    };
                }
            }

            var result = new CurveResult
            {
                Point      = Vtemp[degree, 0],
                LeftCurve  = new Vector2[WDegree + 1],
                RightRight = new Vector2[WDegree + 1]
            };

            for (var i = 0; i <= degree; i++)
            {
                result.LeftCurve[i]  = Vtemp[i, 0];
                result.RightRight[i] = Vtemp[degree - i, i];
            }

            return(result);
        }