1import numpy
2
3from UM.Math.Color import Color
4from UM.Math.Vector import Vector
5from UM.Mesh.MeshBuilder import MeshBuilder
6from UM.Mesh.MeshData import MeshType
7
8
9def test_addVertexWithNormal():
10    builder = MeshBuilder()
11    builder.addVertexWithNormal(10, 20, 30, -1, -2, -3)
12
13    assert builder.getVertex(0)[0] == 10
14    assert builder.getVertex(0)[1] == 20
15    assert builder.getVertex(0)[2] == 30
16
17    assert builder.hasNormals()  # We just added a vert with a normal, so we should have em
18    assert builder.getNormals()[0][0] == -1
19    assert builder.getNormals()[0][1] == -2
20    assert builder.getNormals()[0][2] == -3
21
22    assert builder.getVertexCount() == 1
23    # There is only one vertex, so we should get None back
24    assert builder.getVertex(22) is None
25
26
27def test_addFace():
28    builder = MeshBuilder()
29    builder.addFaceByPoints(0, 0, 0, 10, 0, 0, 10, 10, 0)
30
31    assert builder.getVertexCount() == 3
32    assert builder.getFaceCount() == 1
33    assert not builder.hasNormals()
34    # Check if all the data ended up where it should be
35    assert builder.getVertex(0)[0] == 0
36    assert builder.getVertex(0)[1] == 0
37    assert builder.getVertex(0)[2] == 0
38
39    assert builder.getVertex(1)[0] == 10
40    assert builder.getVertex(1)[1] == 0
41    assert builder.getVertex(1)[2] == 0
42
43    assert builder.getVertex(2)[0] == 10
44    assert builder.getVertex(2)[1] == 10
45    assert builder.getVertex(2)[2] == 0
46
47
48def test_addFaceWithNormals():
49    builder = MeshBuilder()
50    builder.addFaceWithNormals(0, 0, 0, 1, 0, 0, 10, 0, 0, 0, 1, 0, 10, 10, 0, 0, 0, 1)
51    assert builder.getVertexCount() == 3
52    assert builder.getFaceCount() == 1
53    assert builder.hasNormals()
54
55
56def test_setVertexColor():
57    builder = MeshBuilder()
58    builder.addVertex(1, 2, 3)
59    builder.setVertexColor(0, Color(1.0, 0.5, 0.2))
60    assert builder.hasColors()
61    assert builder.getColors()[0][0] == 1.0
62
63
64def test_calculateNormals():
65    builder = MeshBuilder()
66    # Builder shouldn't start off with normals
67    assert not builder.hasNormals()
68    # Ensure that if there are no vertices / faces that calling the calculate doesn't break anything.
69    builder.calculateNormals()
70    assert not builder.hasNormals()
71
72    builder.addFaceByPoints(0, 0, 0, 10, 0, 0, 10, 10, 0)
73
74    builder.calculateNormals()
75    assert builder.hasNormals()
76    assert numpy.array_equal(builder.getNormals(), numpy.array([[0., 0., 1.], [0., 0., 1.], [0., 0., 1.]]))
77
78    builder2 = MeshBuilder()
79    builder2.addFaceByPoints(0, 0, 0, 0, 10, 0, 0, 10, 10)
80    builder2.calculateNormals(fast = True)
81    assert numpy.array_equal(builder2.getNormals(), numpy.array([[1., 0., 0], [1., 0., 0.], [1., 0., 0.]]))
82
83
84def test_addLine():
85    builder = MeshBuilder()
86    builder.addLine(Vector(0, 0, 0), Vector(10, 11, 12))
87
88    assert builder.getVertexCount() == 2
89    assert builder.getVertex(1)[0] == 10
90    assert builder.getVertex(1)[1] == 11
91    assert builder.getVertex(1)[2] == 12
92
93
94def test_addLineWithColor():
95    builder = MeshBuilder()
96    builder.addLine(Vector(0, 0, 0), Vector(10, 11, 12), Color(1.0, 0.5, 0.25))
97
98    assert builder.getColors()[0][0] == 1.0
99    assert builder.getColors()[0][1] == 0.5
100    assert builder.getColors()[0][2] == 0.25
101
102    assert builder.getColors()[1][0] == 1.0
103    assert builder.getColors()[1][1] == 0.5
104    assert builder.getColors()[1][2] == 0.25
105
106
107def test_reserveFaceCount():
108    builder = MeshBuilder()
109    builder.addVertex(1, 2, 3)
110
111    builder.reserveFaceCount(200)
112    # Reserving face count should reset the verts
113    assert builder.getVertexCount() == 0
114
115
116def test_reserveFaceAndVertexCount():
117    builder = MeshBuilder()
118    builder.addVertex(1, 2, 3)
119
120    builder.reserveFaceAndVertexCount(200, 20)
121    # Reserving face count should reset the verts
122    assert builder.getVertexCount() == 0
123
124
125def test_reserveVertexCount():
126    builder = MeshBuilder()
127    assert builder.getVertices() is None
128    builder.addVertex(1, 2, 3)
129
130    builder.reserveVertexCount(10)
131    # Reserving face count should reset the verts
132    assert builder.getVertexCount() == 0
133
134
135def test_getSetCenterPosition():
136    builder = MeshBuilder()
137    builder.setCenterPosition(Vector(100, 200, 300))
138    assert builder.getCenterPosition() == Vector(100, 200, 300)
139
140
141def test_getSetType():
142    builder = MeshBuilder()
143    builder.setType(MeshType.faces)
144    assert builder.getType() == MeshType.faces
145
146    # Should have no effect
147    builder.setType("ZOMG")
148    assert builder.getType() == MeshType.faces
149
150
151def test_setVertices():
152    builder = MeshBuilder()
153    builder.setVertices(numpy.zeros(3))
154    assert builder.getVertexCount() == 1
155    assert builder.getVertices()[0] == 0
156
157
158def test_setIndices():
159    builder = MeshBuilder()
160    builder.setIndices(numpy.zeros(3))
161    assert builder.getFaceCount() == 1
162    assert builder.getIndices()[0] == 0
163
164
165def test_addIndices():
166    builder = MeshBuilder()
167    builder.addIndices(numpy.zeros(3))
168    assert builder.getFaceCount() == 3
169    assert builder.getIndices()[0] == 0
170
171    builder.addIndices(numpy.zeros(3))
172    assert builder.getFaceCount() == 6
173
174
175def test_addVertices():
176    builder = MeshBuilder()
177    builder.addVertices(numpy.zeros(3))
178    assert builder.getVertexCount() == 3
179
180    builder.addVertices(numpy.zeros(3))
181    assert builder.getVertexCount() == 6
182
183
184def test_setUVCoordinates():
185    builder = MeshBuilder()
186    builder.setVertices(numpy.zeros((10 * 3, 3), dtype=numpy.float32))
187    builder.setVertexUVCoordinates(5, 20, 22)
188    assert builder.hasUVCoordinates()
189    assert builder.getUVCoordinates()[5, 0] == 20
190    assert builder.getUVCoordinates()[5, 1] == 22
191
192
193def test_getSetFilename():
194    builder = MeshBuilder()
195    builder.setFileName("HERPDERP")
196
197    assert builder.getFileName() == "HERPDERP"
198