private static SwayBone ReadSwayBone([NotNull, ItemNotNull] string[] lines, [NotNull] string line, ref int i) { var kv = ParseKeyValue(line); var bone = new SwayBone(); var anyPropSet = false; do { var setAProp = true; switch (kv.Key) { case "SwayBone": bone.Path = kv.Value; setAProp = false; break; case "radius": bone.Radius = Convert.ToSingle(kv.Value); break; case "type": bone.Type = ParseColliderType(kv.Value); break; case "isSkirt": bone.IsSkirt = Convert.ToBoolean(kv.Value); break; case "HitMuteForce": bone.HitMuteForce = Convert.ToBoolean(kv.Value); break; case "HitMuteRate": bone.HitMuteRate = Convert.ToSingle(kv.Value); break; case "isZConstraint": bone.IsZConstraint = Convert.ToBoolean(kv.Value); break; case "limitAngle": bone.HasAngleLimit = Convert.ToBoolean(kv.Value); break; case "useBindDir": bone.UseBindingDirection = Convert.ToBoolean(kv.Value); break; case "minYAngle": bone.MinYAngle = Convert.ToSingle(kv.Value); break; case "maxYAngle": bone.MaxYAngle = Convert.ToSingle(kv.Value); break; case "minZAngle": bone.MinZAngle = Convert.ToSingle(kv.Value); break; case "maxZAngle": bone.MaxZAngle = Convert.ToSingle(kv.Value); break; case "followForce": bone.FollowForce = Convert.ToSingle(kv.Value); break; case "refParam": bone.RefParam = ParseRefParam(kv.Value); break; case "stiffnessForce": bone.StiffnessForce = Convert.ToSingle(kv.Value); break; case "dragForce": bone.DragForce = Convert.ToSingle(kv.Value); break; case "hitTwice": bone.HitTwice = Convert.ToBoolean(kv.Value); break; case "useLinkHit": bone.UseLinkHit = Convert.ToBoolean(kv.Value); break; case "gravity": bone.Gravity = ParseVector3(kv.Value); break; case "colliderOffset": bone.ColliderOffset = ParseVector3(kv.Value); break; case "sideSpringTorelance": // not my typo bone.SideSpringTolerance = Convert.ToSingle(kv.Value); break; case "sideSpringForce": bone.SideSpringForce = Convert.ToSingle(kv.Value); break; case "sideAntiSpringTorelance": // not my typo bone.SideAntiSpringTolerance = Convert.ToSingle(kv.Value); break; case "sideAntiSpringForce": bone.SideAntiSpringForce = Convert.ToSingle(kv.Value); break; case "antiFoldForceK": bone.AntiFoldForceK = Convert.ToSingle(kv.Value); break; case "antiFoldAngle": bone.AntiFoldAngle = Convert.ToSingle(kv.Value); break; case "colliders": { var colliderCount = Convert.ToInt32(kv.Value); var colliderPathList = new List <string>(); for (var j = 0; j < colliderCount; ++j) { ++i; line = lines[i]; kv = ParseKeyValue(line); colliderPathList.Add(kv.Value); } bone.ColliderPaths = colliderPathList.ToArray(); break; } case "sideLink": bone.SideLinkPath = kv.Value; break; default: Debug.LogWarning($"Unknown bone property key/value: {kv.Key} / {kv.Value}"); setAProp = false; break; } anyPropSet = anyPropSet || setAProp; { ++i; line = lines[i]; if (line.Length == 0 || line[0] != ' ') { // A new entry (manager/collider/bone) starts. // Decrease counter so the next reading attempt will work with auto counter increment. --i; break; } kv = ParseKeyValue(line); } } while (true); if (!anyPropSet) { throw new ArgumentException("Empty SwayBone body"); } return(bone); }
public static bool IsSemiRootBone([NotNull] this SwayBone bone) { return(bone.Parent == null); }