Esempio n. 1
0
    public void FixTextToRectTrans()
    {
        for (int c = 0; c < refCurves.Length; c++)
        {
            CUIBezierCurve curve = refCurves[c];

            for (int p = 0; p < CUIBezierCurve.CubicBezierCurvePtNum; p++)
            {
                if (curve.ControlPoints != null)
                {
                    Vector3[] controlPoints = curve.ControlPoints;

                    if (c == 0)
                    {
                        controlPoints[p].y = -rectTrans.rect.height * rectTrans.pivot.y;
                    }
                    else
                    {
                        controlPoints[p].y = rectTrans.rect.height - rectTrans.rect.height * rectTrans.pivot.y;
                    }

                    controlPoints[p].x  = rectTrans.rect.width * p / (CUIBezierCurve.CubicBezierCurvePtNum - 1);
                    controlPoints[p].x -= rectTrans.rect.width * rectTrans.pivot.x;

                    controlPoints[p].z = 0;
                }
            }
        }
    }
Esempio n. 2
0
    protected virtual void OnSceneGUI()
    {
        // for CUITextEditor, allow using scene UI to change the control points of the bezier curves

        CUIGraphic script = (CUIGraphic)this.target;

        script.ReportSet();

        for (int c = 0; c < script.RefCurves.Length; c++)
        {
            CUIBezierCurve curve = script.RefCurves[c];

            if (curve.ControlPoints != null)
            {
                Vector3[] controlPoints = curve.ControlPoints;

                Transform  handleTransform = curve.transform;
                Quaternion handleRotation  = curve.transform.rotation;

                for (int p = 0; p < CUIBezierCurve.CubicBezierCurvePtNum; p++)
                {
                    EditorGUI.BeginChangeCheck();
                    Handles.Label(handleTransform.TransformPoint(controlPoints[p]), string.Format("Control Point {0}", p + 1));
                    Vector3 newPt = Handles.DoPositionHandle(handleTransform.TransformPoint(controlPoints[p]), handleRotation);
                    if (EditorGUI.EndChangeCheck())
                    {
                        Undo.RecordObject(curve, "Move Point");
                        Undo.RecordObject(script, "Move Point");
                        EditorUtility.SetDirty(curve);
                        controlPoints[p] = handleTransform.InverseTransformPoint(newPt);
                    }
                }

                Handles.color = Color.gray;
                Handles.DrawLine(handleTransform.TransformPoint(controlPoints[0]), handleTransform.TransformPoint(controlPoints[1]));
                Handles.DrawLine(handleTransform.TransformPoint(controlPoints[1]), handleTransform.TransformPoint(controlPoints[2]));
                Handles.DrawLine(handleTransform.TransformPoint(controlPoints[2]), handleTransform.TransformPoint(controlPoints[3]));

                int sampleSize = 10;

                Handles.color = Color.white;
                for (int s = 0; s < sampleSize; s++)
                {
                    Handles.DrawLine(handleTransform.TransformPoint(curve.GetPoint((float)s / sampleSize)), handleTransform.TransformPoint(curve.GetPoint((float)(s + 1) / sampleSize)));
                }

                curve.EDITOR_ControlPoints = controlPoints;
            }
        }


        if (script.RefCurves != null)
        {
            Handles.DrawLine(script.RefCurves[0].transform.TransformPoint(script.RefCurves[0].ControlPoints[0]), script.RefCurves[1].transform.TransformPoint(script.RefCurves[1].ControlPoints[0]));
            Handles.DrawLine(script.RefCurves[0].transform.TransformPoint(script.RefCurves[0].ControlPoints[3]), script.RefCurves[1].transform.TransformPoint(script.RefCurves[1].ControlPoints[3]));
        }


        script.Refresh();
    }
Esempio n. 3
0
    public void ReferenceCUIForBCurves()
    {
        // compute the position ratio of this rect transform in perspective of reference rect transform

        Vector3 posDeltaBetweenBottomLeftCorner = rectTrans.localPosition;// Difference between pivot

        posDeltaBetweenBottomLeftCorner.x += -rectTrans.rect.width * rectTrans.pivot.x + (refCUIGraphic.rectTrans.rect.width * refCUIGraphic.rectTrans.pivot.x);
        posDeltaBetweenBottomLeftCorner.y += -rectTrans.rect.height * rectTrans.pivot.y + (refCUIGraphic.rectTrans.rect.height * refCUIGraphic.rectTrans.pivot.y);
        //posDeltaBetweenBottomLeftCorner.z = rectTrans.localPosition.z;

        Vector3 bottomLeftPosRatio = new Vector3(posDeltaBetweenBottomLeftCorner.x / refCUIGraphic.RectTrans.rect.width, posDeltaBetweenBottomLeftCorner.y / refCUIGraphic.RectTrans.rect.height, posDeltaBetweenBottomLeftCorner.z);
        Vector3 topRightPosRatio   = new Vector3((posDeltaBetweenBottomLeftCorner.x + rectTrans.rect.width) / refCUIGraphic.RectTrans.rect.width, (posDeltaBetweenBottomLeftCorner.y + rectTrans.rect.height) / refCUIGraphic.RectTrans.rect.height, posDeltaBetweenBottomLeftCorner.z);

        refCurves[0].ControlPoints[0] = refCUIGraphic.GetBCurveSandwichSpacePoint(bottomLeftPosRatio.x, bottomLeftPosRatio.y) - rectTrans.localPosition;
        refCurves[0].ControlPoints[3] = refCUIGraphic.GetBCurveSandwichSpacePoint(topRightPosRatio.x, bottomLeftPosRatio.y) - rectTrans.localPosition;

        refCurves[1].ControlPoints[0] = refCUIGraphic.GetBCurveSandwichSpacePoint(bottomLeftPosRatio.x, topRightPosRatio.y) - rectTrans.localPosition;
        refCurves[1].ControlPoints[3] = refCUIGraphic.GetBCurveSandwichSpacePoint(topRightPosRatio.x, topRightPosRatio.y) - rectTrans.localPosition;

        // use two sample points from the reference curves to find the second and third controls points for this curves
        for (int c = 0; c < refCurves.Length; c++)
        {
            CUIBezierCurve curve = refCurves[c];

            float yTime = c == 0 ? bottomLeftPosRatio.y : topRightPosRatio.y;

            Vector3 leftPoint  = refCUIGraphic.GetBCurveSandwichSpacePoint(bottomLeftPosRatio.x, yTime);
            Vector3 rightPoint = refCUIGraphic.GetBCurveSandwichSpacePoint(topRightPosRatio.x, yTime);

            float quarter      = 0.25f,
                  threeQuarter = 0.75f;

            Vector3 quarterPoint     = refCUIGraphic.GetBCurveSandwichSpacePoint((bottomLeftPosRatio.x * 0.75f + topRightPosRatio.x * 0.25f) / 1.0f, yTime);
            Vector3 threeQuaterPoint = refCUIGraphic.GetBCurveSandwichSpacePoint((bottomLeftPosRatio.x * 0.25f + topRightPosRatio.x * 0.75f) / 1.0f, yTime);

            float x_1 = 3 * threeQuarter * threeQuarter * quarter, // (1 - t)(1 - t)t
                  y_1 = 3 * threeQuarter * quarter * quarter,
                  x_2 = 3 * quarter * quarter * threeQuarter,
                  y_2 = 3 * quarter * threeQuarter * threeQuarter;

            Vector3 contant_1 = quarterPoint - Mathf.Pow(threeQuarter, 3) * leftPoint - Mathf.Pow(quarter, 3) * rightPoint,
                    contant_2 = threeQuaterPoint - Mathf.Pow(quarter, 3) * leftPoint - Mathf.Pow(threeQuarter, 3) * rightPoint,
                    p1,
                    p2;

            solveDoubleEquationWithVector(x_1, y_1, x_2, y_2, contant_1, contant_2, out p1, out p2);

            curve.ControlPoints[1] = p1 - rectTrans.localPosition;
            curve.ControlPoints[2] = p2 - rectTrans.localPosition;
        }


        // use tangent and start and end time to derive control point 2 and 3
    }
Esempio n. 4
0
    protected void OnSceneGUI()
    {
        CUIBezierCurve script = (CUIBezierCurve)this.target;

        if (script.ControlPoints != null)
        {
            Vector3[] controlPoints = script.ControlPoints;

            Transform  handleTransform = script.transform;
            Quaternion handleRotation  = script.transform.rotation;

            for (int p = 0; p < CUIBezierCurve.CubicBezierCurvePtNum; p++)
            {
                EditorGUI.BeginChangeCheck();
                Vector3 newPt = Handles.DoPositionHandle(handleTransform.TransformPoint(controlPoints[p]), handleRotation);
                if (EditorGUI.EndChangeCheck())
                {
                    Undo.RecordObject(script, "Move Point");
                    EditorUtility.SetDirty(script);
                    controlPoints[p] = handleTransform.InverseTransformPoint(newPt);
                    script.Refresh();
                }
            }

            Handles.color = Color.gray;// new Color(0.8f,0.8f,0.8f)
            Handles.DrawLine(handleTransform.TransformPoint(controlPoints[0]), handleTransform.TransformPoint(controlPoints[1]));
            Handles.DrawLine(handleTransform.TransformPoint(controlPoints[1]), handleTransform.TransformPoint(controlPoints[2]));
            Handles.DrawLine(handleTransform.TransformPoint(controlPoints[2]), handleTransform.TransformPoint(controlPoints[3]));

            int sampleSize = 10;

            Handles.color = Color.white;
            for (int s = 0; s < sampleSize; s++)
            {
                Handles.DrawLine(handleTransform.TransformPoint(script.GetPoint((float)s / sampleSize)), handleTransform.TransformPoint(script.GetPoint((float)(s + 1) / sampleSize)));
            }

            script.EDITOR_ControlPoints = controlPoints;
        }
    }
Esempio n. 5
0
    public void Refresh()
    {
        ReportSet();

        // we use local position as the true value. Ratio position follows it, so it should be updated when refresh

        for (int c = 0; c < refCurves.Length; c++)
        {
            CUIBezierCurve curve = refCurves[c];

            if (curve.ControlPoints != null)
            {
                Vector3[] controlPoints = curve.ControlPoints;

                for (int p = 0; p < CUIBezierCurve.CubicBezierCurvePtNum; p++)
                {
#if UNITY_EDITOR
                    Undo.RecordObject(this, "Move Point");
#endif

                    Vector3 ratioPoint = controlPoints[p];

                    ratioPoint.x = (ratioPoint.x + rectTrans.rect.width * rectTrans.pivot.x) / rectTrans.rect.width;
                    ratioPoint.y = (ratioPoint.y + rectTrans.rect.height * rectTrans.pivot.y) / rectTrans.rect.height;

                    refCurvesControlRatioPoints[c][p] = ratioPoint;
                }
            }
        }

        //uiText.SetAllDirty();
        // need this to refresh the UI text, SetAllDirty does not seem to work for all cases
        if (uiGraphic != null)
        {
            uiGraphic.enabled = false;
            uiGraphic.enabled = true;
        }
    }
Esempio n. 6
0
    public void UpdateCurveControlPointPositions()
    {
        ReportSet();

        for (int c = 0; c < refCurves.Length; c++)
        {
            CUIBezierCurve curve = refCurves[c];

#if UNITY_EDITOR
            Undo.RecordObject(curve, "Move Rect");
#endif

            for (int p = 0; p < refCurves[c].ControlPoints.Length; p++)
            {
                Vector3 newPt = refCurvesControlRatioPoints[c][p];

                newPt.x = newPt.x * rectTrans.rect.width - rectTrans.rect.width * rectTrans.pivot.x;
                newPt.y = newPt.y * rectTrans.rect.height - rectTrans.rect.height * rectTrans.pivot.y;

                curve.ControlPoints[p] = newPt;
            }
        }
    }