// Magica Cloth.
// Copyright (c) MagicaSoft, 2020-2022.
// https://magicasoft.jp
using System.Collections.Generic;
#if UNITY_EDITOR
using UnityEditor;
#endif
using UnityEngine;
namespace MagicaReductionMesh
{
///
/// デバッグ機能
///
public class DebugData : ReductionMeshAccess
{
///
/// メッシュ状態ログ表示
///
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
);
}
//=========================================================================================
///
/// FinalDataの共有頂点デバッグ表示
/// (OnDrawGizmos内で呼び出してください)
///
///
///
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 drawNumberList = null,
float axisSize = 0.01f
)
{
if (final == null)
return;
List wposList;
List wnorList;
List 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 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);
}
///
/// FinalDataの子頂点デバッグ表示
/// (OnDrawGizmos内で呼び出してください)
///
///
///
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 swposList;
List swnorList;
List swtanList;
Utility.CalcFinalDataWorldPositionNormalTangent(final, out swposList, out swnorList, out swtanList);
for (int mindex = 0; mindex < final.MeshCount; mindex++)
{
List wposList;
List wnorList;
List 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);
}
}
}
}
}
}