File: test_geometry.py

package info (click to toggle)
pycollada 0.8-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 9,116 kB
  • sloc: xml: 11,085; python: 6,859; makefile: 87
file content (203 lines) | stat: -rw-r--r-- 11,357 bytes parent folder | download | duplicates (2)
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
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
import numpy

import collada
from collada.util import unittest
from collada.xmlutil import etree

fromstring = etree.fromstring
tostring = etree.tostring


class TestGeometry(unittest.TestCase):

    def setUp(self):
        self.dummy = collada.Collada(validate_output=True)

    def test_empty_geometry_saving(self):
        floatsource = collada.source.FloatSource("myfloatsource", numpy.array([0.1, 0.2, 0.3]), ('X', 'Y', 'Z'))
        geometry = collada.geometry.Geometry(self.dummy, "geometry0", "mygeometry", {"myfloatsource": floatsource})
        self.assertEqual(geometry.id, "geometry0")
        self.assertEqual(geometry.name, "mygeometry")
        self.assertEqual(len(geometry.primitives), 0)
        self.assertDictEqual(geometry.sourceById, {"myfloatsource": floatsource})
        self.assertIsNotNone(str(geometry))

        geometry.id = "geometry1"
        geometry.name = "yourgeometry"
        othersource1 = collada.source.FloatSource("yourfloatsource", numpy.array([0.4, 0.5, 0.6]), ('X', 'Y', 'Z'))
        othersource2 = collada.source.FloatSource("hisfloatsource", numpy.array([0.7, 0.8, 0.9]), ('X', 'Y', 'Z'))
        geometry.sourceById[othersource1.id] = othersource1
        geometry.sourceById[othersource2.id] = othersource2
        del geometry.sourceById[floatsource.id]
        geometry.save()

        loaded_geometry = collada.geometry.Geometry.load(collada, {}, fromstring(tostring(geometry.xmlnode)))
        self.assertEqual(loaded_geometry.id, "geometry1")
        self.assertEqual(loaded_geometry.name, "yourgeometry")
        self.assertEqual(len(loaded_geometry.primitives), 0)
        self.assertIn(othersource1.id, loaded_geometry.sourceById)
        self.assertIn(othersource2.id, loaded_geometry.sourceById)
        self.assertNotIn(floatsource.id, loaded_geometry.sourceById)

    def test_geometry_lineset_adding_with_material(self):
        linefloats = [1, 1, -1, 1, -1, -1, -1, -0.9999998, -1, -0.9999997, 1, -1, 1, 0.9999995, 1, 0.9999994, -1.000001, 1]
        linefloatsrc = collada.source.FloatSource("mylinevertsource", numpy.array(linefloats), ('X', 'Y', 'Z'))
        geometry = collada.geometry.Geometry(self.dummy, "geometry0", "mygeometry", [linefloatsrc])
        input_list = collada.source.InputList()
        input_list.addInput(0, 'VERTEX', "#mylinevertsource")
        indices = numpy.array([0, 1, 1, 2, 2, 3, 3, 4, 4, 5])
        lineset1 = geometry.createLineSet(indices, input_list, "mymaterial")
        lineset2 = geometry.createLineSet(indices, input_list, "mymaterial")
        geometry.primitives.append(lineset1)
        geometry.primitives.append(lineset2)
        self.assertEqual(len(geometry.primitives), 2)
        self.assertIsNotNone(str(lineset1))
        self.assertIsNotNone(str(input_list))
        geometry.save()

        loaded_geometry = collada.geometry.Geometry.load(self.dummy, {}, fromstring(tostring(geometry.xmlnode)))
        self.assertEqual(len(loaded_geometry.primitives), 2)

        loaded_geometry.primitives.pop(0)
        lineset3 = loaded_geometry.createLineSet(indices, input_list, "mymaterial")

        loaded_lineset = collada.lineset.LineSet.load(self.dummy, geometry.sourceById, fromstring(tostring(lineset3.xmlnode)))
        self.assertEqual(len(loaded_lineset), 5)

        loaded_geometry.primitives.append(lineset3)
        loaded_geometry.save()
        loaded_geometry2 = collada.geometry.Geometry.load(self.dummy, {}, fromstring(tostring(loaded_geometry.xmlnode)))

        self.assertEqual(len(loaded_geometry2.primitives), 2)
        self.assertEqual(loaded_geometry2.primitives[0].material, lineset2.material)
        self.assertEqual(loaded_geometry2.primitives[1].material, lineset3.material)

    def test_geometry_lineset_adding_without_material(self):
        linefloats = [1, 1, -1, 1, -1, -1, -1, -0.9999998, -1, -0.9999997, 1, -1, 1, 0.9999995, 1, 0.9999994, -1.000001, 1]
        linefloatsrc = collada.source.FloatSource("mylinevertsource", numpy.array(linefloats), ('X', 'Y', 'Z'))
        geometry = collada.geometry.Geometry(self.dummy, "geometry0", "mygeometry", [linefloatsrc])
        input_list = collada.source.InputList()
        input_list.addInput(0, 'VERTEX', "#mylinevertsource")
        indices = numpy.array([0, 1, 1, 2, 2, 3, 3, 4, 4, 5])
        lineset1 = geometry.createLineSet(indices, input_list)
        lineset2 = geometry.createLineSet(indices, input_list)
        geometry.primitives.append(lineset1)
        geometry.primitives.append(lineset2)
        self.assertEqual(len(geometry.primitives), 2)
        self.assertIsNotNone(str(lineset1))
        self.assertIsNotNone(str(input_list))
        geometry.save()

        loaded_geometry = collada.geometry.Geometry.load(self.dummy, {}, fromstring(tostring(geometry.xmlnode)))
        self.assertEqual(len(loaded_geometry.primitives), 2)

        loaded_geometry.primitives.pop(0)
        lineset3 = loaded_geometry.createLineSet(indices, input_list)

        loaded_lineset = collada.lineset.LineSet.load(self.dummy, geometry.sourceById, fromstring(tostring(lineset3.xmlnode)))
        self.assertEqual(len(loaded_lineset), 5)

        loaded_geometry.primitives.append(lineset3)
        loaded_geometry.save()
        loaded_geometry2 = collada.geometry.Geometry.load(self.dummy, {}, fromstring(tostring(loaded_geometry.xmlnode)))

        self.assertEqual(len(loaded_geometry2.primitives), 2)

    def test_geometry_triangleset_adding(self):
        vert_floats = [-50, 50, 50, 50, 50, 50, -50, -50, 50, 50, -50, 50, -50, 50, -50, 50, 50, -50, -50, -50, -50, 50, -50, -50]
        normal_floats = [0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, -1, 0, 0,
                         -1, 0, 0, -1, 0, 0, -1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1]
        vert_src = collada.source.FloatSource("cubeverts-array", numpy.array(vert_floats), ('X', 'Y', 'Z'))
        normal_src = collada.source.FloatSource("cubenormals-array", numpy.array(normal_floats), ('X', 'Y', 'Z'))
        self.assertEqual(len(vert_src), 8)
        self.assertEqual(len(normal_src), 24)

        geometry = collada.geometry.Geometry(self.dummy, "geometry0", "mycube", [vert_src, normal_src], [])

        input_list = collada.source.InputList()
        input_list.addInput(0, 'VERTEX', "#cubeverts-array")
        input_list.addInput(1, 'NORMAL', "#cubenormals-array")

        indices = numpy.array([0, 0, 2, 1, 3, 2, 0, 0, 3, 2, 1, 3, 0, 4, 1, 5, 5, 6, 0, 4, 5, 6, 4, 7, 6, 8, 7, 9, 3, 10, 6, 8, 3, 10, 2, 11, 0, 12,
                               4, 13, 6, 14, 0, 12, 6, 14, 2, 15, 3, 16, 7, 17, 5, 18, 3, 16, 5, 18, 1, 19, 5, 20, 7, 21, 6, 22, 5, 20, 6, 22, 4, 23])
        triangleset = geometry.createTriangleSet(indices, input_list)
        self.assertIsNotNone(str(triangleset))

        loaded_triangleset = collada.triangleset.TriangleSet.load(self.dummy, geometry.sourceById, fromstring(tostring(triangleset.xmlnode)))
        self.assertEqual(len(loaded_triangleset), 12)

        geometry.primitives.append(triangleset)
        geometry.save()

        loaded_geometry = collada.geometry.Geometry.load(self.dummy, {}, fromstring(tostring(geometry.xmlnode)))
        self.assertEqual(len(loaded_geometry.primitives), 1)
        self.assertEqual(len(loaded_geometry.primitives[0]), 12)

    def test_geometry_polylist_adding(self):
        vert_floats = [-50, 50, 50, 50, 50, 50, -50, -50, 50, 50, -50, 50, -50, 50, -50, 50, 50, -50, -50, -50, -50, 50, -50, -50]
        normal_floats = [0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, -1, 0, 0,
                         -1, 0, 0, -1, 0, 0, -1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1]
        vert_src = collada.source.FloatSource("cubeverts-array", numpy.array(vert_floats), ('X', 'Y', 'Z'))
        normal_src = collada.source.FloatSource("cubenormals-array", numpy.array(normal_floats), ('X', 'Y', 'Z'))

        geometry = collada.geometry.Geometry(self.dummy, "geometry0", "mycube", [vert_src, normal_src], [])

        input_list = collada.source.InputList()
        input_list.addInput(0, 'VERTEX', "#cubeverts-array")
        input_list.addInput(1, 'NORMAL', "#cubenormals-array")

        vcounts = numpy.array([4, 4, 4, 4, 4, 4])
        indices = numpy.array([0, 0, 2, 1, 3, 2, 1, 3, 0, 4, 1, 5, 5, 6, 4, 7, 6, 8, 7, 9, 3, 10, 2, 11, 0, 12, 4, 13, 6, 14, 2,
                               15, 3, 16, 7, 17, 5, 18, 1, 19, 5, 20, 7, 21, 6, 22, 4, 23])
        polylist = geometry.createPolylist(indices, vcounts, input_list)
        self.assertIsNotNone(str(polylist))

        loaded_polylist = collada.polylist.Polylist.load(self.dummy, geometry.sourceById, fromstring(tostring(polylist.xmlnode)))
        self.assertEqual(len(loaded_polylist), 6)

        geometry.primitives.append(polylist)
        geometry.save()

        loaded_geometry = collada.geometry.Geometry.load(self.dummy, {}, fromstring(tostring(geometry.xmlnode)))

        self.assertEqual(len(loaded_geometry.primitives), 1)
        self.assertEqual(len(loaded_geometry.primitives[0]), 6)

    def test_geometry_polygons_adding(self):
        vert_floats = [-50, 50, 50, 50, 50, 50, -50, -50, 50, 50, -50, 50, -50, 50, -50, 50, 50, -50, -50, -50, -50, 50, -50, -50]
        normal_floats = [0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, -1, 0, 0,
                         -1, 0, 0, -1, 0, 0, -1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1]
        vert_src = collada.source.FloatSource("cubeverts-array", numpy.array(vert_floats), ('X', 'Y', 'Z'))
        normal_src = collada.source.FloatSource("cubenormals-array", numpy.array(normal_floats), ('X', 'Y', 'Z'))

        geometry = collada.geometry.Geometry(self.dummy, "geometry0", "mycube", [vert_src, normal_src], [])

        input_list = collada.source.InputList()
        input_list.addInput(0, 'VERTEX', "#cubeverts-array")
        input_list.addInput(1, 'NORMAL', "#cubenormals-array")

        indices = []
        indices.append(numpy.array([0, 0, 2, 1, 3, 2, 1, 3], dtype=numpy.int32))
        indices.append(numpy.array([0, 4, 1, 5, 5, 6, 4, 7], dtype=numpy.int32))
        indices.append(numpy.array([6, 8, 7, 9, 3, 10, 2, 11], dtype=numpy.int32))
        indices.append(numpy.array([0, 12, 4, 13, 6, 14, 2, 15], dtype=numpy.int32))
        indices.append(numpy.array([3, 16, 7, 17, 5, 18, 1, 19], dtype=numpy.int32))
        indices.append(numpy.array([5, 20, 7, 21, 6, 22, 4, 23], dtype=numpy.int32))

        polygons = geometry.createPolygons(indices, input_list)
        self.assertIsNotNone(str(polygons))

        loaded_polygons = collada.polygons.Polygons.load(self.dummy, geometry.sourceById, fromstring(tostring(polygons.xmlnode)))
        self.assertEqual(len(loaded_polygons), 6)

        geometry.primitives.append(polygons)
        geometry.save()

        loaded_geometry = collada.geometry.Geometry.load(self.dummy, {}, fromstring(tostring(geometry.xmlnode)))

        self.assertEqual(len(loaded_geometry.primitives), 1)
        self.assertEqual(len(loaded_geometry.primitives[0]), 6)


if __name__ == '__main__':
    unittest.main()