DebugData.cs 10.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293
  1. // Magica Cloth.
  2. // Copyright (c) MagicaSoft, 2020-2022.
  3. // https://magicasoft.jp
  4. using System.Collections.Generic;
  5. #if UNITY_EDITOR
  6. using UnityEditor;
  7. #endif
  8. using UnityEngine;
  9. namespace MagicaReductionMesh
  10. {
  11. /// <summary>
  12. /// デバッグ機能
  13. /// </summary>
  14. public class DebugData : ReductionMeshAccess
  15. {
  16. /// <summary>
  17. /// メッシュ状態ログ表示
  18. /// </summary>
  19. public void DispMeshInfo(string header = "")
  20. {
  21. Debug.Log(header + (string.IsNullOrEmpty(header) ? "" : "\n")
  22. + " Mesh:" + MeshData.MeshCount
  23. + " VertexCnt:" + MeshData.VertexCount
  24. + " TriangleCnt:" + MeshData.TriangleCount
  25. + " LineCnt:" + MeshData.LineCount
  26. + " TetraCnt:" + MeshData.TetraCount
  27. );
  28. }
  29. //=========================================================================================
  30. /// <summary>
  31. /// FinalDataの共有頂点デバッグ表示
  32. /// (OnDrawGizmos内で呼び出してください)
  33. /// </summary>
  34. /// <param name="final"></param>
  35. /// <param name="drawNormal"></param>
  36. public static void DebugDrawShared(
  37. FinalData final,
  38. bool drawTriangle = true, bool drawLine = true, bool drawTetra = true,
  39. bool drawVertexNormal = true, bool drawVertexTangent = true, bool drawNumber = false,
  40. int maxPolygonCount = int.MaxValue, int layer = -1, int tetraIndex = -1, float tetraSize = 1.0f,
  41. List<int> drawNumberList = null,
  42. float axisSize = 0.01f
  43. )
  44. {
  45. if (final == null)
  46. return;
  47. List<Vector3> wposList;
  48. List<Vector3> wnorList;
  49. List<Vector4> wtanList;
  50. Utility.CalcFinalDataWorldPositionNormalTangent(final, out wposList, out wnorList, out wtanList);
  51. // triangle
  52. if (drawTriangle)
  53. {
  54. int tcnt = final.TriangleCount;
  55. for (int i = 0; i < tcnt && i < maxPolygonCount; i++)
  56. {
  57. int index = i * 3;
  58. int vi0 = final.triangles[index];
  59. int vi1 = final.triangles[index + 1];
  60. int vi2 = final.triangles[index + 2];
  61. if (drawNumberList != null && drawNumberList.Count > 0)
  62. {
  63. if (drawNumberList.Contains(vi0) == false && drawNumberList.Contains(vi1) == false && drawNumberList.Contains(vi2) == false)
  64. continue;
  65. }
  66. var v0 = wposList[vi0];
  67. var v1 = wposList[vi1];
  68. var v2 = wposList[vi2];
  69. Gizmos.color = Color.magenta;
  70. Gizmos.DrawLine(v0, v1);
  71. Gizmos.DrawLine(v1, v2);
  72. Gizmos.DrawLine(v0, v2);
  73. }
  74. }
  75. // line
  76. if (drawLine)
  77. {
  78. Gizmos.color = Color.cyan;
  79. int lcnt = final.LineCount;
  80. for (int i = 0; i < lcnt; i++)
  81. {
  82. int index = i * 2;
  83. int vi0 = final.lines[index];
  84. int vi1 = final.lines[index + 1];
  85. Gizmos.DrawLine(wposList[vi0], wposList[vi1]);
  86. }
  87. }
  88. // tetra
  89. if (drawTetra)
  90. {
  91. Gizmos.color = Color.green;
  92. int tetracnt = final.TetraCount;
  93. for (int i = 0; i < tetracnt; i++)
  94. {
  95. DrawTetra(final, i, wposList, tetraSize);
  96. }
  97. }
  98. if (tetraIndex >= 0 && tetraIndex < final.TetraCount)
  99. {
  100. Gizmos.color = Color.red;
  101. DrawTetra(final, tetraIndex, wposList, tetraSize);
  102. }
  103. // normal
  104. if (drawVertexNormal)
  105. {
  106. Gizmos.color = Color.blue;
  107. if (drawNumberList != null && drawNumberList.Count > 0)
  108. {
  109. foreach (var i in drawNumberList)
  110. {
  111. var wpos = wposList[i];
  112. Gizmos.DrawLine(wpos, wpos + wnorList[i] * axisSize);
  113. }
  114. }
  115. else
  116. {
  117. for (int i = 0; i < final.VertexCount; i++)
  118. {
  119. var wpos = wposList[i];
  120. Gizmos.DrawLine(wpos, wpos + wnorList[i] * axisSize);
  121. }
  122. }
  123. }
  124. // tangent
  125. if (drawVertexTangent)
  126. {
  127. Gizmos.color = Color.red;
  128. if (drawNumberList != null && drawNumberList.Count > 0)
  129. {
  130. foreach (var i in drawNumberList)
  131. {
  132. var wpos = wposList[i];
  133. Vector3 wtan = wtanList[i];
  134. Gizmos.DrawLine(wpos, wpos + wtan * axisSize);
  135. }
  136. }
  137. else
  138. {
  139. for (int i = 0; i < final.VertexCount; i++)
  140. {
  141. var wpos = wposList[i];
  142. Vector3 wtan = wtanList[i];
  143. Gizmos.DrawLine(wpos, wpos + wtan * axisSize);
  144. }
  145. }
  146. }
  147. // number
  148. #if UNITY_EDITOR
  149. if (drawNumber)
  150. {
  151. if (drawNumberList != null && drawNumberList.Count > 0)
  152. {
  153. foreach (var i in drawNumberList)
  154. {
  155. var wpos = wposList[i];
  156. Handles.Label(wpos, "(" + i.ToString() + ")");
  157. }
  158. }
  159. else
  160. {
  161. for (int i = 0; i < final.VertexCount; i++)
  162. {
  163. var wpos = wposList[i];
  164. Handles.Label(wpos, "(" + i.ToString() + ")");
  165. }
  166. }
  167. }
  168. #endif
  169. }
  170. private static void DrawTetra(FinalData final, int tetraIndex, List<Vector3> wposList, float tetraSize)
  171. {
  172. // サイズチェック
  173. if (final.tetraSizes[tetraIndex] > tetraSize)
  174. return;
  175. int index = tetraIndex * 4;
  176. int vi0 = final.tetras[index];
  177. int vi1 = final.tetras[index + 1];
  178. int vi2 = final.tetras[index + 2];
  179. int vi3 = final.tetras[index + 3];
  180. var v0 = wposList[vi0];
  181. var v1 = wposList[vi1];
  182. var v2 = wposList[vi2];
  183. var v3 = wposList[vi3];
  184. Gizmos.DrawLine(v0, v1);
  185. Gizmos.DrawLine(v0, v2);
  186. Gizmos.DrawLine(v0, v3);
  187. Gizmos.DrawLine(v1, v2);
  188. Gizmos.DrawLine(v2, v3);
  189. Gizmos.DrawLine(v3, v1);
  190. }
  191. /// <summary>
  192. /// FinalDataの子頂点デバッグ表示
  193. /// (OnDrawGizmos内で呼び出してください)
  194. /// </summary>
  195. /// <param name="final"></param>
  196. /// <param name="drawNormal"></param>
  197. public static void DebugDrawChild(
  198. FinalData final, bool drawPosition = false, bool drawNormal = false, bool drawTriangle = false, bool drawNumber = false,
  199. int maxVertexCount = int.MaxValue,
  200. float positionSize = 0.001f, float axisSize = 0.01f
  201. )
  202. {
  203. if (final == null)
  204. return;
  205. if (drawPosition == false && drawNormal == false && drawTriangle == false && drawNumber == false)
  206. return;
  207. List<Vector3> swposList;
  208. List<Vector3> swnorList;
  209. List<Vector4> swtanList;
  210. Utility.CalcFinalDataWorldPositionNormalTangent(final, out swposList, out swnorList, out swtanList);
  211. for (int mindex = 0; mindex < final.MeshCount; mindex++)
  212. {
  213. List<Vector3> wposList;
  214. List<Vector3> wnorList;
  215. List<Vector4> wtanList;
  216. Utility.CalcFinalDataChildWorldPositionNormalTangent(
  217. final, mindex, swposList, swnorList, swtanList,
  218. out wposList, out wnorList, out wtanList
  219. );
  220. for (int i = 0; i < wposList.Count && i < maxVertexCount; i++)
  221. {
  222. var wpos = wposList[i];
  223. // position
  224. if (drawPosition)
  225. {
  226. Gizmos.color = Color.red;
  227. Gizmos.DrawSphere(wpos, positionSize);
  228. }
  229. // normal
  230. if (drawNormal)
  231. {
  232. Gizmos.color = Color.blue;
  233. Gizmos.DrawLine(wpos, wpos + wnorList[i] * axisSize);
  234. }
  235. #if UNITY_EDITOR
  236. // number
  237. if (drawNumber)
  238. {
  239. Handles.Label(wpos, i.ToString());
  240. }
  241. #endif
  242. }
  243. // triangle
  244. if (drawTriangle)
  245. {
  246. Gizmos.color = Color.magenta;
  247. var triangles = final.meshList[mindex].mesh.triangles;
  248. for (int i = 0; i < triangles.Length / 3; i++)
  249. {
  250. int v0 = triangles[i * 3];
  251. int v1 = triangles[i * 3 + 1];
  252. int v2 = triangles[i * 3 + 2];
  253. var wpos0 = wposList[v0];
  254. var wpos1 = wposList[v1];
  255. var wpos2 = wposList[v2];
  256. Gizmos.DrawLine(wpos0, wpos1);
  257. Gizmos.DrawLine(wpos1, wpos2);
  258. Gizmos.DrawLine(wpos2, wpos0);
  259. }
  260. }
  261. }
  262. }
  263. }
  264. }