123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293 |
- // Magica Cloth.
- // Copyright (c) MagicaSoft, 2020-2022.
- // https://magicasoft.jp
- using System.Collections.Generic;
- #if UNITY_EDITOR
- using UnityEditor;
- #endif
- using UnityEngine;
- namespace MagicaReductionMesh
- {
- /// <summary>
- /// デバッグ機能
- /// </summary>
- public class DebugData : ReductionMeshAccess
- {
- /// <summary>
- /// メッシュ状態ログ表示
- /// </summary>
- public void DispMeshInfo(string header = "")
- {
- Debug.Log(header + (string.IsNullOrEmpty(header) ? "" : "\n")
- + " Mesh:" + MeshData.MeshCount
- + " VertexCnt:" + MeshData.VertexCount
- + " TriangleCnt:" + MeshData.TriangleCount
- + " LineCnt:" + MeshData.LineCount
- + " TetraCnt:" + MeshData.TetraCount
- );
- }
- //=========================================================================================
- /// <summary>
- /// FinalDataの共有頂点デバッグ表示
- /// (OnDrawGizmos内で呼び出してください)
- /// </summary>
- /// <param name="final"></param>
- /// <param name="drawNormal"></param>
- public static void DebugDrawShared(
- FinalData final,
- bool drawTriangle = true, bool drawLine = true, bool drawTetra = true,
- bool drawVertexNormal = true, bool drawVertexTangent = true, bool drawNumber = false,
- int maxPolygonCount = int.MaxValue, int layer = -1, int tetraIndex = -1, float tetraSize = 1.0f,
- List<int> drawNumberList = null,
- float axisSize = 0.01f
- )
- {
- if (final == null)
- return;
- List<Vector3> wposList;
- List<Vector3> wnorList;
- List<Vector4> wtanList;
- Utility.CalcFinalDataWorldPositionNormalTangent(final, out wposList, out wnorList, out wtanList);
- // triangle
- if (drawTriangle)
- {
- int tcnt = final.TriangleCount;
- for (int i = 0; i < tcnt && i < maxPolygonCount; i++)
- {
- int index = i * 3;
- int vi0 = final.triangles[index];
- int vi1 = final.triangles[index + 1];
- int vi2 = final.triangles[index + 2];
- if (drawNumberList != null && drawNumberList.Count > 0)
- {
- if (drawNumberList.Contains(vi0) == false && drawNumberList.Contains(vi1) == false && drawNumberList.Contains(vi2) == false)
- continue;
- }
- var v0 = wposList[vi0];
- var v1 = wposList[vi1];
- var v2 = wposList[vi2];
- Gizmos.color = Color.magenta;
- Gizmos.DrawLine(v0, v1);
- Gizmos.DrawLine(v1, v2);
- Gizmos.DrawLine(v0, v2);
- }
- }
- // line
- if (drawLine)
- {
- Gizmos.color = Color.cyan;
- int lcnt = final.LineCount;
- for (int i = 0; i < lcnt; i++)
- {
- int index = i * 2;
- int vi0 = final.lines[index];
- int vi1 = final.lines[index + 1];
- Gizmos.DrawLine(wposList[vi0], wposList[vi1]);
- }
- }
- // tetra
- if (drawTetra)
- {
- Gizmos.color = Color.green;
- int tetracnt = final.TetraCount;
- for (int i = 0; i < tetracnt; i++)
- {
- DrawTetra(final, i, wposList, tetraSize);
- }
- }
- if (tetraIndex >= 0 && tetraIndex < final.TetraCount)
- {
- Gizmos.color = Color.red;
- DrawTetra(final, tetraIndex, wposList, tetraSize);
- }
- // normal
- if (drawVertexNormal)
- {
- Gizmos.color = Color.blue;
- if (drawNumberList != null && drawNumberList.Count > 0)
- {
- foreach (var i in drawNumberList)
- {
- var wpos = wposList[i];
- Gizmos.DrawLine(wpos, wpos + wnorList[i] * axisSize);
- }
- }
- else
- {
- for (int i = 0; i < final.VertexCount; i++)
- {
- var wpos = wposList[i];
- Gizmos.DrawLine(wpos, wpos + wnorList[i] * axisSize);
- }
- }
- }
- // tangent
- if (drawVertexTangent)
- {
- Gizmos.color = Color.red;
- if (drawNumberList != null && drawNumberList.Count > 0)
- {
- foreach (var i in drawNumberList)
- {
- var wpos = wposList[i];
- Vector3 wtan = wtanList[i];
- Gizmos.DrawLine(wpos, wpos + wtan * axisSize);
- }
- }
- else
- {
- for (int i = 0; i < final.VertexCount; i++)
- {
- var wpos = wposList[i];
- Vector3 wtan = wtanList[i];
- Gizmos.DrawLine(wpos, wpos + wtan * axisSize);
- }
- }
- }
- // number
- #if UNITY_EDITOR
- if (drawNumber)
- {
- if (drawNumberList != null && drawNumberList.Count > 0)
- {
- foreach (var i in drawNumberList)
- {
- var wpos = wposList[i];
- Handles.Label(wpos, "(" + i.ToString() + ")");
- }
- }
- else
- {
- for (int i = 0; i < final.VertexCount; i++)
- {
- var wpos = wposList[i];
- Handles.Label(wpos, "(" + i.ToString() + ")");
- }
- }
- }
- #endif
- }
- private static void DrawTetra(FinalData final, int tetraIndex, List<Vector3> wposList, float tetraSize)
- {
- // サイズチェック
- if (final.tetraSizes[tetraIndex] > tetraSize)
- return;
- int index = tetraIndex * 4;
- int vi0 = final.tetras[index];
- int vi1 = final.tetras[index + 1];
- int vi2 = final.tetras[index + 2];
- int vi3 = final.tetras[index + 3];
- var v0 = wposList[vi0];
- var v1 = wposList[vi1];
- var v2 = wposList[vi2];
- var v3 = wposList[vi3];
- Gizmos.DrawLine(v0, v1);
- Gizmos.DrawLine(v0, v2);
- Gizmos.DrawLine(v0, v3);
- Gizmos.DrawLine(v1, v2);
- Gizmos.DrawLine(v2, v3);
- Gizmos.DrawLine(v3, v1);
- }
- /// <summary>
- /// FinalDataの子頂点デバッグ表示
- /// (OnDrawGizmos内で呼び出してください)
- /// </summary>
- /// <param name="final"></param>
- /// <param name="drawNormal"></param>
- public static void DebugDrawChild(
- FinalData final, bool drawPosition = false, bool drawNormal = false, bool drawTriangle = false, bool drawNumber = false,
- int maxVertexCount = int.MaxValue,
- float positionSize = 0.001f, float axisSize = 0.01f
- )
- {
- if (final == null)
- return;
- if (drawPosition == false && drawNormal == false && drawTriangle == false && drawNumber == false)
- return;
- List<Vector3> swposList;
- List<Vector3> swnorList;
- List<Vector4> swtanList;
- Utility.CalcFinalDataWorldPositionNormalTangent(final, out swposList, out swnorList, out swtanList);
- for (int mindex = 0; mindex < final.MeshCount; mindex++)
- {
- List<Vector3> wposList;
- List<Vector3> wnorList;
- List<Vector4> wtanList;
- Utility.CalcFinalDataChildWorldPositionNormalTangent(
- final, mindex, swposList, swnorList, swtanList,
- out wposList, out wnorList, out wtanList
- );
- for (int i = 0; i < wposList.Count && i < maxVertexCount; i++)
- {
- var wpos = wposList[i];
- // position
- if (drawPosition)
- {
- Gizmos.color = Color.red;
- Gizmos.DrawSphere(wpos, positionSize);
- }
- // normal
- if (drawNormal)
- {
- Gizmos.color = Color.blue;
- Gizmos.DrawLine(wpos, wpos + wnorList[i] * axisSize);
- }
- #if UNITY_EDITOR
- // number
- if (drawNumber)
- {
- Handles.Label(wpos, i.ToString());
- }
- #endif
- }
- // triangle
- if (drawTriangle)
- {
- Gizmos.color = Color.magenta;
- var triangles = final.meshList[mindex].mesh.triangles;
- for (int i = 0; i < triangles.Length / 3; i++)
- {
- int v0 = triangles[i * 3];
- int v1 = triangles[i * 3 + 1];
- int v2 = triangles[i * 3 + 2];
- var wpos0 = wposList[v0];
- var wpos1 = wposList[v1];
- var wpos2 = wposList[v2];
- Gizmos.DrawLine(wpos0, wpos1);
- Gizmos.DrawLine(wpos1, wpos2);
- Gizmos.DrawLine(wpos2, wpos0);
- }
- }
- }
- }
- }
- }
|