-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathFaceCornerFlags.cs
137 lines (117 loc) · 2.5 KB
/
FaceCornerFlags.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
using System;
namespace Fydar.Vox.Meshing
{
public struct FaceCornerFlags : IEquatable<FaceCornerFlags>
{
public static FaceCornerFlags None => new();
private static readonly string[] iconography = new string[]
{
" ",
"▘",
"▝",
"▀",
"▖",
"▍",
"▞",
"▛",
"▗",
"▚",
"▐",
"▜",
"▃",
"▙",
"▟",
"▉"
};
private byte data;
public bool TopLeft
{
get => GetBit(ref data, 0);
set => SetBit(ref data, 0, value);
}
public bool TopRight
{
get => GetBit(ref data, 1);
set => SetBit(ref data, 1, value);
}
public bool BottomLeft
{
get => GetBit(ref data, 2);
set => SetBit(ref data, 2, value);
}
public bool BottomRight
{
get => GetBit(ref data, 3);
set => SetBit(ref data, 3, value);
}
public FaceEdgeFlags TouchedEdges => new()
{
Top = TopLeft || TopRight,
Left = TopLeft || BottomLeft,
Right = TopRight || BottomRight,
Bottom = BottomLeft || BottomRight
};
public FaceEdgeFlags ConnectedEdges => new()
{
Top = TopLeft && TopRight,
Left = TopLeft && BottomLeft,
Right = TopRight && BottomRight,
Bottom = BottomLeft && BottomRight
};
public override string ToString()
{
return iconography[data];
}
public override bool Equals(object obj)
{
return obj is FaceCornerFlags flags && Equals(flags);
}
public bool Equals(FaceCornerFlags other)
{
return data == other.data;
}
public override int GetHashCode()
{
return 1768953197 + data.GetHashCode();
}
public static FaceCornerFlags operator |(FaceCornerFlags lhs, FaceCornerFlags rhs)
{
return new FaceCornerFlags()
{
data = (byte)(lhs.data | rhs.data)
};
}
public static FaceCornerFlags operator &(FaceCornerFlags lhs, FaceCornerFlags rhs)
{
return new FaceCornerFlags()
{
data = (byte)(lhs.data & rhs.data)
};
}
public static bool operator ==(FaceCornerFlags left, FaceCornerFlags right)
{
return left.Equals(right);
}
public static bool operator !=(FaceCornerFlags left, FaceCornerFlags right)
{
return !(left == right);
}
public static FaceCornerFlags operator !(FaceCornerFlags original)
{
return new FaceCornerFlags()
{
data = original.data ^= 0b_1111
};
}
private static bool GetBit(ref byte source, byte index)
{
return (source & (1 << index)) != 0;
}
private static void SetBit(ref byte data, byte index, bool value)
{
data = (byte)(value
? data | 1 << index
: data & ~(1 << index));
}
}
}