Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 42da10e

Browse files
添加了两点塌陷和多点塌陷的功能
1 parent f2c90c0 commit 42da10e

File tree

2 files changed

+167
-29
lines changed

2 files changed

+167
-29
lines changed

‎Assets/MeshEditor/Editor/EditMeshVertexAuxiliary.cs‎

Lines changed: 167 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -111,11 +111,11 @@ void OnGUI()
111111

112112
#region 两点塌陷、多点塌陷
113113
EditorGUILayout.BeginHorizontal();
114-
if (GUILayout.Button("两点重合"))
114+
if (GUILayout.Button("两点塌陷"))
115115
{
116116
EditorApplication.delayCall += CollapseOnTwoVertex;
117117
}
118-
if (GUILayout.Button("多点重合"))
118+
if (GUILayout.Button("多点塌陷"))
119119
{
120120
EditorApplication.delayCall += CollapseOnMoreVertex;
121121
}
@@ -153,8 +153,7 @@ void SelectTargetClone()
153153
void AddVertex()
154154
{
155155
#region 判断是否可以创建顶点
156-
GameObject[] obj = Selection.gameObjects;
157-
if (obj.Length != 2)
156+
if (Selection.gameObjects.Length != 2)
158157
{
159158
EditorUtility.DisplayDialog("提示", "请选中两个存在直接连线的顶点,以在两个顶点之间创建新顶点!", "确定");
160159
return;
@@ -321,8 +320,7 @@ void AddVertex()
321320
void DeleteVertex()
322321
{
323322
#region 判断是否可以删除顶点
324-
GameObject[] obj = Selection.gameObjects;
325-
if (obj.Length != 1)
323+
if (Selection.gameObjects.Length != 1)
326324
{
327325
EditorUtility.DisplayDialog("提示", "请选中一个顶点,以删除此顶点!", "确定");
328326
return;
@@ -368,6 +366,7 @@ void DeleteVertex()
368366
{
369367
editMeshVertexSenior._AllTriangleList.Remove(triangles[i]);
370368
}
369+
SeObj1.GetComponent<VertexIdentity>()._Identity = -1;
371370
SeObj1.SetActive(false);
372371
#endregion
373372

@@ -393,8 +392,7 @@ void DeleteVertex()
393392
void IntersectionDisplacement()
394393
{
395394
#region 判断是否可以执行
396-
GameObject[] obj = Selection.gameObjects;
397-
if (obj.Length != 2)
395+
if (Selection.gameObjects.Length != 2)
398396
{
399397
EditorUtility.DisplayDialog("提示", "请选中两个游戏物体!", "确定");
400398
return;
@@ -431,8 +429,7 @@ void IntersectionDisplacement()
431429
void MirrorDisplacement()
432430
{
433431
#region 判断是否可以执行
434-
GameObject[] obj = Selection.gameObjects;
435-
if (obj.Length != 2)
432+
if (Selection.gameObjects.Length != 2)
436433
{
437434
EditorUtility.DisplayDialog("提示", "请选中两个游戏物体!", "确定");
438435
return;
@@ -465,46 +462,187 @@ void MirrorDisplacement()
465462
/// </summary>
466463
void CollapseOnTwoVertex()
467464
{
468-
#region 判断是否可以执行
469-
GameObject[] obj = Selection.gameObjects;
470-
if (obj.Length != 2)
465+
#region 判断是否可以塌陷
466+
if (Selection.gameObjects.Length != 2)
471467
{
472-
EditorUtility.DisplayDialog("提示", "请选中两个游戏物体!", "确定");
468+
EditorUtility.DisplayDialog("提示", "请选中两个合法顶点!", "确定");
473469
return;
474470
}
475-
#endregion
476-
477-
#region 执行
478-
//记录选中的两个物体
471+
//记录选中的两个顶点物体
479472
GameObject SeObj1 = Selection.gameObjects[0];
480473
GameObject SeObj2 = Selection.gameObjects[1];
474+
//获取操作的目标物体
475+
if (SeObj1.transform.parent == null)
476+
{
477+
EditorUtility.DisplayDialog("提示", "未选中两个合法的顶点!", "确定");
478+
return;
479+
}
480+
if (SeObj1.GetComponent<VertexIdentity>() == null || SeObj2.GetComponent<VertexIdentity>() == null
481+
|| SeObj1.GetComponent<VertexIdentity>()._Identity < 0 || SeObj2.GetComponent<VertexIdentity>()._Identity < 0
482+
|| SeObj1.GetComponent<VertexIdentity>()._Identity == SeObj2.GetComponent<VertexIdentity>()._Identity)
483+
{
484+
EditorUtility.DisplayDialog("提示", "未选中顶点或选中了不合法的顶点!", "确定");
485+
return;
486+
}
481487

482-
Vector3 newPosition = SeObj1.transform.position;
488+
target = SeObj1.transform.parent.gameObject;
489+
//获取目标物体的模型网格编辑器(高级)
490+
editMeshVertexSenior = target.GetComponent<EditMeshVertexSenior>();
491+
if (editMeshVertexSenior == null)
492+
{
493+
EditorUtility.DisplayDialog("提示", "意外的目标物体,该物体缺少模型网格编辑器(高级)!", "确定");
494+
return;
495+
}
496+
targetClone = editMeshVertexSenior._target;
497+
oldVertexSize = vertexSize = editMeshVertexSenior._VertexSize;
498+
#endregion
483499

484-
SeObj2.transform.position = newPosition;
485-
SeObj1.transform.position = newPosition;
500+
#region 删除包含此两点的所有面
501+
List<List<int>> triangles = new List<List<int>>();
502+
triangles = IsContainOnTwoVertex(SeObj1, SeObj2);
503+
if (triangles.Count > 0)
504+
{
505+
for (int i = 0; i < triangles.Count; i++)
506+
{
507+
editMeshVertexSenior._AllTriangleList.Remove(triangles[i]);
508+
}
509+
}
510+
#endregion
511+
512+
#region 将包含‘被塌陷点’的所有面数据更改为包含‘塌陷点’
513+
List<int> vertexNumber = editMeshVertexSenior._AllVerticesGroupList[SeObj2.GetComponent<VertexIdentity>()._Identity];
514+
int targetNumber = editMeshVertexSenior._AllVerticesGroupList[SeObj1.GetComponent<VertexIdentity>()._Identity][0];
515+
triangles = IsContainOnOneVertex(SeObj2);
516+
if (triangles.Count > 0)
517+
{
518+
for (int i = 0; i < triangles.Count; i++)
519+
{
520+
for (int j = 0; j < vertexNumber.Count; j++)
521+
{
522+
int number = triangles[i].IndexOf(vertexNumber[j]);
523+
if (number >= 0)
524+
{
525+
triangles[i][number] = targetNumber;
526+
}
527+
}
528+
}
529+
}
530+
SeObj2.GetComponent<VertexIdentity>()._Identity = -1;
531+
SeObj2.SetActive(false);
532+
#endregion
533+
534+
#region 更新目标网格
535+
int[] Alltriangles = new int[editMeshVertexSenior._AllTriangleList.Count * 3];
536+
for (int i = 0; i < editMeshVertexSenior._AllTriangleList.Count; i++)
537+
{
538+
Alltriangles[i * 3] = editMeshVertexSenior._AllTriangleList[i][0];
539+
Alltriangles[i * 3 + 1] = editMeshVertexSenior._AllTriangleList[i][1];
540+
Alltriangles[i * 3 + 2] = editMeshVertexSenior._AllTriangleList[i][2];
541+
}
542+
editMeshVertexSenior._Mesh.Clear();
543+
editMeshVertexSenior._Mesh.vertices = editMeshVertexSenior._AllVerticesList.ToArray();
544+
editMeshVertexSenior._Mesh.triangles = Alltriangles;
545+
editMeshVertexSenior._Mesh.RecalculateNormals();
546+
editMeshVertexSenior._VertexNumber = editMeshVertexSenior._Vertices.Length;
547+
Selection.activeGameObject = targetClone;
486548
#endregion
487549
}
488550
/// <summary>
489551
/// 多点塌陷
490552
/// </summary>
491553
void CollapseOnMoreVertex()
492554
{
493-
#region 判断是否可以执行
555+
#region 判断是否可以塌陷
494556
GameObject[] obj = Selection.gameObjects;
495-
if (obj.Length <= 1)
557+
if (obj.Length <= 2)
496558
{
497-
EditorUtility.DisplayDialog("提示", "请选中多个游戏物体!", "确定");
559+
EditorUtility.DisplayDialog("提示", "请选中多个合法顶点!", "确定");
498560
return;
499561
}
500562
#endregion
501563

502-
#region 执行
503-
Vector3 newPosition = obj[0].transform.position;
504-
505-
for(int i = 0;i < obj.Length;i++)
564+
#region 轮番执行两点塌陷
565+
for (int n = 1; n < obj.Length; n++)
506566
{
507-
obj[i].transform.position = newPosition;
567+
#region 判断是否可以塌陷
568+
//记录两个顶点物体
569+
GameObject SeObj1 = obj[0];
570+
GameObject SeObj2 = obj[n];
571+
//获取操作的目标物体
572+
if (SeObj1.transform.parent == null)
573+
{
574+
EditorUtility.DisplayDialog("提示", "多个顶点中存在不合法的顶点!", "确定");
575+
return;
576+
}
577+
if (SeObj1.GetComponent<VertexIdentity>() == null || SeObj2.GetComponent<VertexIdentity>() == null
578+
|| SeObj1.GetComponent<VertexIdentity>()._Identity < 0 || SeObj2.GetComponent<VertexIdentity>()._Identity < 0
579+
|| SeObj1.GetComponent<VertexIdentity>()._Identity == SeObj2.GetComponent<VertexIdentity>()._Identity)
580+
{
581+
EditorUtility.DisplayDialog("提示", "多个顶点中存在不合法的顶点!", "确定");
582+
return;
583+
}
584+
585+
target = SeObj1.transform.parent.gameObject;
586+
//获取目标物体的模型网格编辑器(高级)
587+
editMeshVertexSenior = target.GetComponent<EditMeshVertexSenior>();
588+
if (editMeshVertexSenior == null)
589+
{
590+
EditorUtility.DisplayDialog("提示", "意外的目标物体,该物体缺少模型网格编辑器(高级)!", "确定");
591+
return;
592+
}
593+
targetClone = editMeshVertexSenior._target;
594+
oldVertexSize = vertexSize = editMeshVertexSenior._VertexSize;
595+
#endregion
596+
597+
#region 删除包含此两点的所有面
598+
List<List<int>> triangles = new List<List<int>>();
599+
triangles = IsContainOnTwoVertex(SeObj1, SeObj2);
600+
if (triangles.Count > 0)
601+
{
602+
for (int i = 0; i < triangles.Count; i++)
603+
{
604+
editMeshVertexSenior._AllTriangleList.Remove(triangles[i]);
605+
}
606+
}
607+
#endregion
608+
609+
#region 将包含‘被塌陷点’的所有面数据更改为包含‘塌陷点’
610+
List<int> vertexNumber = editMeshVertexSenior._AllVerticesGroupList[SeObj2.GetComponent<VertexIdentity>()._Identity];
611+
int targetNumber = editMeshVertexSenior._AllVerticesGroupList[SeObj1.GetComponent<VertexIdentity>()._Identity][0];
612+
triangles = IsContainOnOneVertex(SeObj2);
613+
if (triangles.Count > 0)
614+
{
615+
for (int i = 0; i < triangles.Count; i++)
616+
{
617+
for (int j = 0; j < vertexNumber.Count; j++)
618+
{
619+
int number = triangles[i].IndexOf(vertexNumber[j]);
620+
if (number >= 0)
621+
{
622+
triangles[i][number] = targetNumber;
623+
}
624+
}
625+
}
626+
}
627+
SeObj2.GetComponent<VertexIdentity>()._Identity = -1;
628+
SeObj2.SetActive(false);
629+
#endregion
630+
631+
#region 更新目标网格
632+
int[] Alltriangles = new int[editMeshVertexSenior._AllTriangleList.Count * 3];
633+
for (int i = 0; i < editMeshVertexSenior._AllTriangleList.Count; i++)
634+
{
635+
Alltriangles[i * 3] = editMeshVertexSenior._AllTriangleList[i][0];
636+
Alltriangles[i * 3 + 1] = editMeshVertexSenior._AllTriangleList[i][1];
637+
Alltriangles[i * 3 + 2] = editMeshVertexSenior._AllTriangleList[i][2];
638+
}
639+
editMeshVertexSenior._Mesh.Clear();
640+
editMeshVertexSenior._Mesh.vertices = editMeshVertexSenior._AllVerticesList.ToArray();
641+
editMeshVertexSenior._Mesh.triangles = Alltriangles;
642+
editMeshVertexSenior._Mesh.RecalculateNormals();
643+
editMeshVertexSenior._VertexNumber = editMeshVertexSenior._Vertices.Length;
644+
Selection.activeGameObject = targetClone;
645+
#endregion
508646
}
509647
#endregion
510648
}

‎MeshEditor.suo‎

29 KB
Binary file not shown.

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /