示例#1
0
        public void SetPointConstaintSide(CSGPlane buildPlane, int pointIndex, int side, HandleConstraints state)
        {
            if (curveTangentHandles[(pointIndex * 2) + side].Constraint == state)
            {
                return;
            }

            curveTangentHandles[(pointIndex * 2) + side].Constraint = state;
            if (state != HandleConstraints.Straight &&
                curveTangentHandles[(pointIndex * 2) + (1 - side)].Constraint != HandleConstraints.Straight)
            {
                if (state == HandleConstraints.Broken &&
                    curveTangentHandles[(pointIndex * 2) + (1 - side)].Constraint == HandleConstraints.Mirrored)
                {
                    curveTangentHandles[(pointIndex * 2) + (1 - side)].Constraint = HandleConstraints.Broken;
                }

                curvePointHandles[pointIndex].Tangent           = true;
                curve.Tangents[(pointIndex * 2) + side].Tangent = -curve.Tangents[(pointIndex * 2) + (1 - side)].Tangent;
                return;
            }

            switch (state)
            {
            case HandleConstraints.Broken:
            case HandleConstraints.Mirrored:
            {
                if (curvePointHandles[pointIndex].Tangent)
                {
                    break;
                }
                var count   = curve.Points.Length;
                var prev    = (pointIndex + count - 1) % count;
                var curr    = pointIndex;
                var next    = (pointIndex + count + 1) % count;
                var vertex0 = curve.Points[prev];
                var vertex1 = curve.Points[curr];
                var vertex2 = curve.Points[next];

                var centerA = (vertex0 + vertex1 + vertex2) / 3;

                var deltaA = (centerA - vertex1);

                var tangentA = Vector3.Cross(buildPlane.normal, deltaA);
                if (side == 0)
                {
                    tangentA = -tangentA;
                }

                curvePointHandles[pointIndex].Tangent           = true;
                curve.Tangents[(pointIndex * 2) + side].Tangent = tangentA;
                break;
            }
            }
        }
示例#2
0
 public void SetPointConstraint(CSGPlane buildPlane, int pointIndex, HandleConstraints state)
 {
     SetPointConstaintSide(buildPlane, pointIndex, 0, state);
     SetPointConstaintSide(buildPlane, pointIndex, 1, state);
 }