BoneDistanceToSkinMgr.cs 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197
  1. using System;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. internal class BoneDistanceToSkinMgr
  5. {
  6. public BoneDistanceToSkinMgr(TMorphSkin morph, SkinThickness skinThick, Transform t)
  7. {
  8. BoneDistanceToSkinMgr $this = this;
  9. Action<SkinThickness.Group> action = delegate(SkinThickness.Group grp)
  10. {
  11. Transform start = CMT.SearchObjName(t, grp.startBoneName, false);
  12. Transform end = CMT.SearchObjName(t, grp.endBoneName, false);
  13. BoneDistanceToSkinMgr.Group group = new BoneDistanceToSkinMgr.Group(morph, start, end);
  14. $this.m_BoneDistanceToSkin[grp.groupName] = group;
  15. BoneDistanceToSkinMgr.Group group2 = group;
  16. foreach (SkinThickness.Group.Point point in grp.points)
  17. {
  18. Transform target = CMT.SearchObjName(t, point.targetBoneName, false);
  19. group2.AddPoint(point, target);
  20. }
  21. };
  22. if (skinThick.use)
  23. {
  24. foreach (KeyValuePair<string, SkinThickness.Group> keyValuePair in skinThick.groups)
  25. {
  26. action(keyValuePair.Value);
  27. }
  28. }
  29. }
  30. public void Update()
  31. {
  32. foreach (KeyValuePair<string, BoneDistanceToSkinMgr.Group> keyValuePair in this.m_BoneDistanceToSkin)
  33. {
  34. keyValuePair.Value.UpdateDisntace();
  35. }
  36. }
  37. public float GetDistanceToSkinByAngle(string groupName, float ratio, float angle, out float defaultDistance)
  38. {
  39. return this.m_BoneDistanceToSkin[groupName].GetDistanceToSkinByAngle(ratio, angle, out defaultDistance);
  40. }
  41. private Dictionary<string, BoneDistanceToSkinMgr.Group> m_BoneDistanceToSkin = new Dictionary<string, BoneDistanceToSkinMgr.Group>();
  42. private class Group
  43. {
  44. public Group(TMorphSkin morph, Transform start, Transform end)
  45. {
  46. this.m_morph = morph;
  47. this.m_start = start;
  48. this.m_end = end;
  49. }
  50. public void AddPoint(SkinThickness.Group.Point point, Transform target)
  51. {
  52. this.m_points.Add(new BoneDistanceToSkinMgr.Group.Point(this, point, target));
  53. }
  54. public void UpdateDisntace()
  55. {
  56. foreach (BoneDistanceToSkinMgr.Group.Point point in this.m_points)
  57. {
  58. point.UpdateDisntace();
  59. }
  60. }
  61. public float GetDistanceToSkinByAngle(float ratio, float angle, out float defaultDistance)
  62. {
  63. float result = 0f;
  64. BoneDistanceToSkinMgr.Group.Point point = this.m_points[0];
  65. BoneDistanceToSkinMgr.Group.Point point2 = this.m_points[this.m_points.Count - 1];
  66. angle %= 360f;
  67. if (angle < 0f)
  68. {
  69. angle = 360f + angle;
  70. }
  71. if (ratio <= point.m_distRatioNow)
  72. {
  73. float num = MathCM.SignedAngle(this.m_start.up, point.m_target.up, this.m_start.right);
  74. result = point.GetNearAngleDistance(angle - num, out defaultDistance);
  75. }
  76. else if (point2.m_distRatioNow <= ratio)
  77. {
  78. float num2 = MathCM.SignedAngle(this.m_start.up, point2.m_target.up, this.m_start.right);
  79. result = point2.GetNearAngleDistance(angle - num2, out defaultDistance);
  80. }
  81. else
  82. {
  83. defaultDistance = 0f;
  84. for (int i = 0; i < this.m_points.Count - 1; i++)
  85. {
  86. point = this.m_points[i];
  87. point2 = this.m_points[i + 1];
  88. if (point.m_distRatioNow <= ratio && ratio <= point2.m_distRatioNow)
  89. {
  90. float num3 = (ratio - point.m_distRatioNow) / (point2.m_distRatioNow - point.m_distRatioNow);
  91. float num4 = MathCM.SignedAngle(this.m_start.up, point.m_target.up, this.m_start.right);
  92. float num5 = MathCM.SignedAngle(this.m_start.up, point2.m_target.up, this.m_start.right);
  93. float num6 = num4 + (num5 - num4) * num3;
  94. float num7;
  95. float nearAngleDistance = point.GetNearAngleDistance(angle - num6, out num7);
  96. float num8;
  97. float nearAngleDistance2 = point2.GetNearAngleDistance(angle - num6, out num8);
  98. result = nearAngleDistance + (nearAngleDistance2 - nearAngleDistance) * num3;
  99. defaultDistance = num7 + (num8 - num7) * num3;
  100. break;
  101. }
  102. }
  103. }
  104. return result;
  105. }
  106. private TMorphSkin m_morph;
  107. private Transform m_start;
  108. private Transform m_end;
  109. private List<BoneDistanceToSkinMgr.Group.Point> m_points = new List<BoneDistanceToSkinMgr.Group.Point>();
  110. private class Point
  111. {
  112. public Point(BoneDistanceToSkinMgr.Group group, SkinThickness.Group.Point point, Transform target)
  113. {
  114. this.m_group = group;
  115. this.m_pointDef = point;
  116. this.m_target = target;
  117. this.m_distRatioDef = this.m_pointDef.ratioSegmentStartToEnd;
  118. foreach (SkinThickness.Group.Point.DefPerAngle defPerAngle in this.m_pointDef.distanceParAngle)
  119. {
  120. this.m_angleDistance.Add(new BoneDistanceToSkinMgr.Group.Point.AngleDist
  121. {
  122. angle = defPerAngle.angleDgree,
  123. defDisntace = defPerAngle.defaultDistance,
  124. vidx = defPerAngle.vidx
  125. });
  126. }
  127. }
  128. public void UpdateDisntace()
  129. {
  130. this.m_distRatioNow = Vector3.Distance(this.m_group.m_start.position, this.m_target.position) / Vector3.Distance(this.m_group.m_start.position, this.m_group.m_end.position);
  131. foreach (BoneDistanceToSkinMgr.Group.Point.AngleDist angleDist in this.m_angleDistance)
  132. {
  133. Vector3 zero = Vector3.zero;
  134. this.m_group.m_morph.CalcVidxToPos(angleDist.vidx, ref zero);
  135. angleDist.nowDistance = (this.m_target.position - zero).magnitude;
  136. }
  137. }
  138. public float GetNearAngleDistance(float angle, out float defDistance)
  139. {
  140. angle %= 360f;
  141. float num = 360f;
  142. int index = -1;
  143. for (int i = 0; i < this.m_angleDistance.Count; i++)
  144. {
  145. float num2 = Mathf.Abs((float)this.m_angleDistance[i].angle - angle);
  146. if (num2 < num)
  147. {
  148. num = num2;
  149. index = i;
  150. }
  151. }
  152. BoneDistanceToSkinMgr.Group.Point.AngleDist angleDist = this.m_angleDistance[index];
  153. float nowDistance = angleDist.nowDistance;
  154. defDistance = angleDist.defDisntace;
  155. return nowDistance;
  156. }
  157. private BoneDistanceToSkinMgr.Group m_group;
  158. public SkinThickness.Group.Point m_pointDef;
  159. public Transform m_target;
  160. public float m_distRatioDef;
  161. public float m_distRatioNow;
  162. private List<BoneDistanceToSkinMgr.Group.Point.AngleDist> m_angleDistance = new List<BoneDistanceToSkinMgr.Group.Point.AngleDist>();
  163. private class AngleDist
  164. {
  165. public int angle;
  166. public float nowDistance;
  167. public float defDisntace;
  168. public int vidx;
  169. }
  170. }
  171. }
  172. }