117 lines
3.6 KiB
C#
117 lines
3.6 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using ProBuilder2.Common;
|
|
using UnityEngine;
|
|
|
|
namespace ProBuilder2.MeshOperations
|
|
{
|
|
// Token: 0x02000011 RID: 17
|
|
public static class pb_GrowShrink
|
|
{
|
|
// Token: 0x06000096 RID: 150 RVA: 0x0000C8EC File Offset: 0x0000ACEC
|
|
public static HashSet<pb_Face> GrowSelection(pb_Object pb, IList<pb_Face> faces, float maxAngleDiff = -1f)
|
|
{
|
|
List<pb_WingedEdge> wingedEdges = pb_WingedEdge.GetWingedEdges(pb, true);
|
|
HashSet<pb_Face> hashSet = new HashSet<pb_Face>(faces);
|
|
HashSet<pb_Face> hashSet2 = new HashSet<pb_Face>();
|
|
Vector3 vector = Vector3.zero;
|
|
bool flag = maxAngleDiff > 0f;
|
|
for (int i = 0; i < wingedEdges.Count; i++)
|
|
{
|
|
if (hashSet.Contains(wingedEdges[i].face))
|
|
{
|
|
if (flag)
|
|
{
|
|
vector = pb_Math.Normal(pb, wingedEdges[i].face);
|
|
}
|
|
pb_WingedEdgeEnumerator enumerator = wingedEdges[i].GetEnumerator();
|
|
try
|
|
{
|
|
while (enumerator.MoveNext())
|
|
{
|
|
pb_WingedEdge pb_WingedEdge = enumerator.Current;
|
|
if (pb_WingedEdge.opposite != null && !hashSet.Contains(pb_WingedEdge.opposite.face))
|
|
{
|
|
if (flag)
|
|
{
|
|
Vector3 vector2 = pb_Math.Normal(pb, pb_WingedEdge.opposite.face);
|
|
if (Vector3.Angle(vector, vector2) < maxAngleDiff)
|
|
{
|
|
hashSet2.Add(pb_WingedEdge.opposite.face);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
hashSet2.Add(pb_WingedEdge.opposite.face);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
finally
|
|
{
|
|
IDisposable disposable;
|
|
if ((disposable = enumerator as IDisposable) != null)
|
|
{
|
|
disposable.Dispose();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return hashSet2;
|
|
}
|
|
|
|
// Token: 0x06000097 RID: 151 RVA: 0x0000CA40 File Offset: 0x0000AE40
|
|
public static void Flood(pb_WingedEdge wing, HashSet<pb_Face> selection)
|
|
{
|
|
pb_GrowShrink.Flood(null, wing, pb_GrowShrink.Vector3_Zero, -1f, selection);
|
|
}
|
|
|
|
// Token: 0x06000098 RID: 152 RVA: 0x0000CA54 File Offset: 0x0000AE54
|
|
public static void Flood(pb_Object pb, pb_WingedEdge wing, Vector3 wingNrm, float maxAngle, HashSet<pb_Face> selection)
|
|
{
|
|
pb_WingedEdge pb_WingedEdge = wing;
|
|
do
|
|
{
|
|
pb_WingedEdge opposite = pb_WingedEdge.opposite;
|
|
if (opposite != null && !selection.Contains(opposite.face))
|
|
{
|
|
if (maxAngle > 0f)
|
|
{
|
|
Vector3 vector = pb_Math.Normal(pb, opposite.face);
|
|
if (Vector3.Angle(wingNrm, vector) < maxAngle && selection.Add(opposite.face))
|
|
{
|
|
pb_GrowShrink.Flood(pb, opposite, vector, maxAngle, selection);
|
|
}
|
|
}
|
|
else if (selection.Add(opposite.face))
|
|
{
|
|
pb_GrowShrink.Flood(pb, opposite, wingNrm, maxAngle, selection);
|
|
}
|
|
}
|
|
pb_WingedEdge = pb_WingedEdge.next;
|
|
}
|
|
while (pb_WingedEdge != wing);
|
|
}
|
|
|
|
// Token: 0x06000099 RID: 153 RVA: 0x0000CAF4 File Offset: 0x0000AEF4
|
|
public static HashSet<pb_Face> FloodSelection(pb_Object pb, IList<pb_Face> faces, float maxAngleDiff)
|
|
{
|
|
List<pb_WingedEdge> wingedEdges = pb_WingedEdge.GetWingedEdges(pb, true);
|
|
HashSet<pb_Face> hashSet = new HashSet<pb_Face>(faces);
|
|
HashSet<pb_Face> hashSet2 = new HashSet<pb_Face>();
|
|
for (int i = 0; i < wingedEdges.Count; i++)
|
|
{
|
|
if (!hashSet2.Contains(wingedEdges[i].face) && hashSet.Contains(wingedEdges[i].face))
|
|
{
|
|
hashSet2.Add(wingedEdges[i].face);
|
|
pb_GrowShrink.Flood(pb, wingedEdges[i], (maxAngleDiff <= 0f) ? pb_GrowShrink.Vector3_Zero : pb_Math.Normal(pb, wingedEdges[i].face), maxAngleDiff, hashSet2);
|
|
}
|
|
}
|
|
return hashSet2;
|
|
}
|
|
|
|
// Token: 0x0400002E RID: 46
|
|
private static readonly Vector3 Vector3_Zero = new Vector3(0f, 0f, 0f);
|
|
}
|
|
}
|