Esempio n. 1
0
        private void DrawSegments(PathBehaviour pathBehaviour)
        {
            for (int segmentIndex = 0; segmentIndex < pathBehaviour.NumberOfSegments; ++segmentIndex)
            {
                var curKnot = pathBehaviour.Knots[segmentIndex % pathBehaviour.Knots.Count];
                var nexKnot = pathBehaviour.Knots[(segmentIndex + 1) % pathBehaviour.Knots.Count];

                Vector3 start        = pathBehaviour.PathSpaceToWorldSpace(curKnot.Position);
                Vector3 end          = pathBehaviour.PathSpaceToWorldSpace(nexKnot.Position);
                Vector3 startControl = pathBehaviour.PathSpaceToWorldSpace(curKnot.OutControlPoint + curKnot.Position);
                Vector3 endControl   = pathBehaviour.PathSpaceToWorldSpace(nexKnot.InControlPoint + nexKnot.Position);

                Handles.DrawBezier(start, end, startControl, endControl, Color.white, null, 2f);
            }
        }
Esempio n. 2
0
        private bool DrawPointHandles(PathBehaviour pathBehaviour, CubicBezierKnot segment, int index)
        {
            // Check for changes in the path position.
            Vector3 position = pathBehaviour.PathSpaceToWorldSpace(segment.Position);

            bool selected = _list.index == index;
            bool dirty    = false;

            // Show a label to indicate which point is which.
            string pointName = string.Format("P{0}", index);

            Handles.color = Color.gray;
            Handles.Label(position + new Vector3(0, HandleUtility.GetHandleSize(position) * 0.3f, 0), pointName);

            bool moved = DrawHandle(ref position, position, pathBehaviour, index * 3 + 0, false, "Move Bezier Point", selected);

            if (moved)
            {
                position    = pathBehaviour.WorldSpaceToPathSpace(position);
                _list.index = index;
                // Keep the tangents at relative positions to the bezier point.
                segment.Position = position;
                dirty            = true;
            }

            if (segment.Type == CubicBezierKnotType.Singular || pathBehaviour.AutoControlPoints)
            {
                return(dirty);
            }

            // Check for changes in to the in control point.
            Vector3 inControlPoint = pathBehaviour.PathSpaceToWorldSpace(segment.InControlPoint + segment.Position);

            Handles.color = selected ? Color.yellow : Color.blue;
            Handles.DrawLine(position, inControlPoint);

            moved = DrawHandle(ref inControlPoint, position, pathBehaviour, index * 3 + 1, true, "Move Bezier Control Point", selected);
            if (moved)
            {
                inControlPoint         = pathBehaviour.WorldSpaceToPathSpace(inControlPoint) - segment.Position;
                _list.index            = index;
                segment.InControlPoint = inControlPoint;
                segment.RecalculateControlPoint(true, true);
                dirty = true;
            }

            // Check for changes to the out control point
            Vector3 outControlPoint = pathBehaviour.PathSpaceToWorldSpace(segment.OutControlPoint + segment.Position);

            Handles.color = selected ? Color.yellow : Color.blue;
            Handles.DrawLine(position, outControlPoint);

            moved = DrawHandle(ref outControlPoint, position, pathBehaviour, index * 3 + 2, true, "Move Bezier Control Point", selected);
            if (moved)
            {
                outControlPoint = pathBehaviour.WorldSpaceToPathSpace(outControlPoint) - segment.Position;
                _list.index     = index;

                segment.OutControlPoint = outControlPoint;
                segment.RecalculateControlPoint(false, true);
                dirty = true;
            }
            return(dirty);
        }