-
-
Notifications
You must be signed in to change notification settings - Fork 6
/
remove_null_faces_transformer.go
62 lines (49 loc) · 1.31 KB
/
remove_null_faces_transformer.go
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
package meshops
import (
"math"
"github.com/EliCDavis/polyform/modeling"
)
type RemoveNullFaces3DTransformer struct {
Attribute string
MinArea float64
}
func (rnft RemoveNullFaces3DTransformer) attribute() string {
return rnft.Attribute
}
func (rnft RemoveNullFaces3DTransformer) Transform(m modeling.Mesh) (results modeling.Mesh, err error) {
attribute := getAttribute(rnft, modeling.PositionAttribute)
if err = RequireV3Attribute(m, attribute); err != nil {
return
}
if err = RequireTopology(m, modeling.TriangleTopology); err != nil {
return
}
return RemoveNullFaces3D(m, attribute, rnft.MinArea), nil
}
func RemoveNullFaces3D(m modeling.Mesh, attribute string, minArea float64) modeling.Mesh {
if err := RequireTopology(m, modeling.TriangleTopology); err != nil {
panic(err)
}
if err := RequireV3Attribute(m, attribute); err != nil {
panic(err)
}
indices := m.Indices()
trisToKeep := make([]int, 0)
for i := 0; i < m.PrimitiveCount(); i++ {
tri := m.Tri(i)
area := tri.Area3D(attribute)
if !math.IsNaN(area) && area > minArea {
trisToKeep = append(
trisToKeep,
tri.P1(),
tri.P2(),
tri.P3(),
)
}
}
// nothing to remove, just return the mesh passed in
if len(trisToKeep) == indices.Len() {
return m
}
return RemovedUnreferencedVertices(m.SetIndices(trisToKeep))
}