@@ -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 }
0 commit comments