Beispiel #1
0
        public static Func <BGCurvePointI> GetPointProvider(BGCurve.PointsModeEnum pointsMode, BGCurve curve)
        {
            //init provider
            Func <BGCurvePointI> provider = null;

            switch (pointsMode)
            {
            case BGCurve.PointsModeEnum.Components:
                provider = () => Undo.AddComponent <BGCurvePointComponent>(curve.gameObject);
                break;

            case BGCurve.PointsModeEnum.GameObjectsNoTransform:
            case BGCurve.PointsModeEnum.GameObjectsTransform:
                provider = () =>
                {
                    var pointGO   = new GameObject();
                    var transform = pointGO.transform;
                    transform.parent        = curve.transform;
                    transform.localRotation = Quaternion.identity;
                    transform.localPosition = Vector3.zero;
                    transform.localScale    = Vector3.one;

                    Undo.RegisterCreatedObjectUndo(pointGO, "Create point");
                    var point = Undo.AddComponent <BGCurvePointGO>(pointGO);
                    return(point);
                };
                break;
            }

            return(provider);
        }
Beispiel #2
0
        public static Action<BGCurvePointI> GetPointDestroyer(BGCurve.PointsModeEnum pointsMode, BGCurve curve)
        {
            //init destroyer
            Action<BGCurvePointI> destroyer = null;
            switch (pointsMode)
            {
                case BGCurve.PointsModeEnum.Components:
                    destroyer = point => Undo.DestroyObjectImmediate((UnityEngine.Object) point);
                    break;
                case BGCurve.PointsModeEnum.GameObjectsNoTransform:
                case BGCurve.PointsModeEnum.GameObjectsTransform:
                    destroyer = point => Undo.DestroyObjectImmediate(((MonoBehaviour) point).gameObject);
                    break;
            }

            return destroyer;
        }
Beispiel #3
0
        //=================================================================================
        //                                                    This is not copy/pasted part
        //=================================================================================

        /// <summary>all methods, prefixed with Private, are not meant to be called from outside of BGCurve package </summary>
        //Init with data. No events are fired. point==null for pointsMode switching.
        public void PrivateInit(BGCurvePoint point, BGCurve.PointsModeEnum pointsMode)
        {
            if (point != null)
            {
                // init from new point
                curve          = point.Curve;
                controlType    = point.ControlType;
                pointTransform = point.PointTransform;

                switch (pointsMode)
                {
                case BGCurve.PointsModeEnum.GameObjectsNoTransform:
                    positionLocal      = point.PositionLocal;
                    controlFirstLocal  = point.ControlFirstLocal;
                    controlSecondLocal = point.ControlSecondLocal;
                    break;

                case BGCurve.PointsModeEnum.GameObjectsTransform:
                    transform.localPosition = point.PositionLocal;

                    //transformed locals are always the same
                    var targetTransform = pointTransform != null ? pointTransform : transform;
                    controlFirstLocal  = targetTransform.InverseTransformVector(point.ControlFirstLocalTransformed);
                    controlSecondLocal = targetTransform.InverseTransformVector(point.ControlSecondLocalTransformed);
                    break;

                default:
                    throw new ArgumentOutOfRangeException("pointsMode", pointsMode, null);
                }
            }
            else
            {
                // change pointsMode
                Transform targetTransform;
                switch (pointsMode)
                {
                case BGCurve.PointsModeEnum.GameObjectsNoTransform:
                {
                    if (Curve.PointsMode != BGCurve.PointsModeEnum.GameObjectsTransform)
                    {
                        throw new ArgumentOutOfRangeException("Curve.PointsMode", "Curve points mode should be equal to GameObjectsTransform");
                    }

                    positionLocal = transform.localPosition;

                    //transformed locals are always the same
                    targetTransform = pointTransform != null ? pointTransform : curve.transform;
                    break;
                }

                case BGCurve.PointsModeEnum.GameObjectsTransform:
                {
                    if (Curve.PointsMode != BGCurve.PointsModeEnum.GameObjectsNoTransform)
                    {
                        throw new ArgumentOutOfRangeException("Curve.PointsMode", "Curve points mode should be equal to GameObjectsNoTransform");
                    }

                    transform.position = PositionWorld;

                    //transformed locals are always the same
                    targetTransform = pointTransform != null ? pointTransform : transform;
                    break;
                }

                default:
                    throw new ArgumentOutOfRangeException("pointsMode", pointsMode, null);
                }

                controlFirstLocal  = targetTransform.InverseTransformVector(ControlFirstLocalTransformed);
                controlSecondLocal = targetTransform.InverseTransformVector(ControlSecondLocalTransformed);
            }
        }