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; } } }
public void SetPointConstraint(CSGPlane buildPlane, int pointIndex, HandleConstraints state) { SetPointConstaintSide(buildPlane, pointIndex, 0, state); SetPointConstaintSide(buildPlane, pointIndex, 1, state); }