File: test_scene.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 (340 lines) | stat: -rw-r--r-- 17,086 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
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
import numpy

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

fromstring = etree.fromstring
tostring = etree.tostring


class TestScene(unittest.TestCase):

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

        self.yourcam = collada.camera.PerspectiveCamera("yourcam", 45.0, 0.01, 1000.0)
        self.dummy.cameras.append(self.yourcam)

        self.yourdirlight = collada.light.DirectionalLight("yourdirlight", (1, 1, 1))
        self.dummy.lights.append(self.yourdirlight)

        cimage = collada.material.CImage("mycimage", "./whatever.tga", self.dummy)
        surface = collada.material.Surface("mysurface", cimage)
        sampler2d = collada.material.Sampler2D("mysampler2d", surface)
        mymap = collada.material.Map(sampler2d, "TEX0")
        self.effect = collada.material.Effect("myeffect", [surface, sampler2d], "phong",
                                              emission=(0.1, 0.2, 0.3),
                                              ambient=(0.4, 0.5, 0.6),
                                              diffuse=mymap,
                                              specular=(0.3, 0.2, 0.1))
        self.effect2 = collada.material.Effect("youreffect", [], "phong",
                                               emission=(0.1, 0.2, 0.3),
                                               ambient=(0.4, 0.5, 0.6),
                                               specular=(0.3, 0.2, 0.1))
        self.dummy.materials.append(self.effect)
        self.dummy.materials.append(self.effect2)

        self.floatsource = collada.source.FloatSource("myfloatsource", numpy.array([0.1, 0.2, 0.3]), ('X', 'Y', 'Z'))
        self.geometry = collada.geometry.Geometry(self.dummy, "geometry0", "mygeometry", {"myfloatsource": self.floatsource})
        self.geometry2 = collada.geometry.Geometry(self.dummy, "geometry1", "yourgeometry", {"myfloatsource": self.floatsource})
        self.dummy.geometries.append(self.geometry)
        self.dummy.geometries.append(self.geometry2)

    def test_scene_light_node_saving(self):
        dirlight = collada.light.DirectionalLight("mydirlight", (1, 1, 1))
        lightnode = collada.scene.LightNode(dirlight)
        bindtest = list(lightnode.objects('light'))
        self.assertEqual(lightnode.light, dirlight)
        self.assertEqual(len(bindtest), 1)
        self.assertEqual(bindtest[0].original, dirlight)
        self.assertIsNotNone(str(lightnode))

        lightnode.light = self.yourdirlight
        lightnode.save()

        loadedlightnode = collada.scene.LightNode.load(self.dummy, fromstring(tostring(lightnode.xmlnode)))
        self.assertEqual(loadedlightnode.light.id, 'yourdirlight')

    def test_scene_camera_node_saving(self):
        cam = collada.camera.PerspectiveCamera("mycam", 45.0, 0.01, 1000.0)
        camnode = collada.scene.CameraNode(cam)
        bindtest = list(camnode.objects('camera'))
        self.assertEqual(camnode.camera, cam)
        self.assertEqual(len(bindtest), 1)
        self.assertEqual(bindtest[0].original, cam)
        self.assertIsNotNone(str(camnode))

        camnode.camera = self.yourcam
        camnode.save()

        loadedcamnode = collada.scene.CameraNode.load(self.dummy, fromstring(tostring(camnode.xmlnode)))
        self.assertEqual(loadedcamnode.camera.id, 'yourcam')

    def test_scene_translate_node(self):
        translate = collada.scene.TranslateTransform(0.1, 0.2, 0.3)
        self.assertAlmostEqual(translate.x, 0.1)
        self.assertAlmostEqual(translate.y, 0.2)
        self.assertAlmostEqual(translate.z, 0.3)
        self.assertIsNotNone(str(translate))
        loaded_translate = collada.scene.TranslateTransform.load(self.dummy, fromstring(tostring(translate.xmlnode)))
        self.assertAlmostEqual(loaded_translate.x, 0.1)
        self.assertAlmostEqual(loaded_translate.y, 0.2)
        self.assertAlmostEqual(loaded_translate.z, 0.3)

    def test_scene_rotate_node(self):
        rotate = collada.scene.RotateTransform(0.1, 0.2, 0.3, 90)
        self.assertAlmostEqual(rotate.x, 0.1)
        self.assertAlmostEqual(rotate.y, 0.2)
        self.assertAlmostEqual(rotate.z, 0.3)
        self.assertAlmostEqual(rotate.angle, 90)
        self.assertIsNotNone(str(rotate))
        loaded_rotate = collada.scene.RotateTransform.load(self.dummy, fromstring(tostring(rotate.xmlnode)))
        self.assertAlmostEqual(loaded_rotate.x, 0.1)
        self.assertAlmostEqual(loaded_rotate.y, 0.2)
        self.assertAlmostEqual(loaded_rotate.z, 0.3)
        self.assertAlmostEqual(loaded_rotate.angle, 90)

    def test_scene_scale_node(self):
        scale = collada.scene.ScaleTransform(0.1, 0.2, 0.3)
        self.assertAlmostEqual(scale.x, 0.1)
        self.assertAlmostEqual(scale.y, 0.2)
        self.assertAlmostEqual(scale.z, 0.3)
        self.assertIsNotNone(str(scale))
        loaded_scale = collada.scene.ScaleTransform.load(self.dummy, fromstring(tostring(scale.xmlnode)))
        self.assertAlmostEqual(loaded_scale.x, 0.1)
        self.assertAlmostEqual(loaded_scale.y, 0.2)
        self.assertAlmostEqual(loaded_scale.z, 0.3)

    def test_scene_matrix_node(self):
        matrix = collada.scene.MatrixTransform(numpy.array([1.0, 0, 0, 2, 0, 1, 0, 3, 0, 0, 1, 4, 0, 0, 0, 1]))
        self.assertAlmostEqual(matrix.matrix[0][0], 1.0)
        self.assertIsNotNone(str(matrix))
        loaded_matrix = collada.scene.MatrixTransform.load(self.dummy, fromstring(tostring(matrix.xmlnode)))
        self.assertAlmostEqual(loaded_matrix.matrix[0][0], 1.0)

    def test_scene_lookat_node(self):
        eye = numpy.array([2.0, 0, 3])
        interest = numpy.array([0.0, 0, 0])
        upvector = numpy.array([0.0, 1, 0])
        lookat = collada.scene.LookAtTransform(eye, interest, upvector)
        self.assertListEqual(list(lookat.eye), list(eye))
        self.assertListEqual(list(lookat.interest), list(interest))
        self.assertListEqual(list(lookat.upvector), list(upvector))
        self.assertIsNotNone(str(lookat))
        loaded_lookat = collada.scene.LookAtTransform.load(self.dummy, fromstring(tostring(lookat.xmlnode)))
        self.assertListEqual(list(loaded_lookat.eye), list(eye))
        self.assertListEqual(list(loaded_lookat.interest), list(interest))
        self.assertListEqual(list(loaded_lookat.upvector), list(upvector))

    def test_scene_node_combos(self):
        emptynode = collada.scene.Node('myemptynode')
        self.assertEqual(len(emptynode.children), 0)
        self.assertEqual(len(emptynode.transforms), 0)
        self.assertIsNotNone(str(emptynode))
        loadedempty = collada.scene.Node.load(self.dummy, fromstring(tostring(emptynode.xmlnode)), {})
        self.assertEqual(len(loadedempty.children), 0)
        self.assertEqual(len(loadedempty.transforms), 0)

        justchildren = collada.scene.Node('myjustchildrennode', children=[emptynode])
        self.assertEqual(len(justchildren.children), 1)
        self.assertEqual(len(justchildren.transforms), 0)
        self.assertEqual(justchildren.children[0], emptynode)
        loadedjustchildren = collada.scene.Node.load(self.dummy, fromstring(tostring(justchildren.xmlnode)), {})
        self.assertEqual(len(loadedjustchildren.children), 1)
        self.assertEqual(len(loadedjustchildren.transforms), 0)

        scale = collada.scene.ScaleTransform(0.1, 0.2, 0.3)
        justtransform = collada.scene.Node('myjusttransformnode', transforms=[scale])
        self.assertEqual(len(justtransform.children), 0)
        self.assertEqual(len(justtransform.transforms), 1)
        self.assertEqual(justtransform.transforms[0], scale)
        loadedjusttransform = collada.scene.Node.load(self.dummy, fromstring(tostring(justtransform.xmlnode)), {})
        self.assertEqual(len(loadedjusttransform.children), 0)
        self.assertEqual(len(loadedjusttransform.transforms), 1)

        both = collada.scene.Node('mybothnode', children=[justchildren, justtransform], transforms=[scale])
        self.assertEqual(len(both.children), 2)
        self.assertEqual(len(both.transforms), 1)
        self.assertEqual(both.transforms[0], scale)
        self.assertEqual(both.children[0], justchildren)
        self.assertEqual(both.children[1], justtransform)
        collada.scene.Node.load(self.dummy, fromstring(tostring(both.xmlnode)), {})
        self.assertEqual(len(both.children), 2)
        self.assertEqual(len(both.transforms), 1)

    def test_scene_node_saving(self):
        myemptynode = collada.scene.Node('myemptynode')
        rotate = collada.scene.RotateTransform(0.1, 0.2, 0.3, 90)
        scale = collada.scene.ScaleTransform(0.1, 0.2, 0.3)
        mynode = collada.scene.Node('mynode', children=[myemptynode], transforms=[rotate, scale])
        self.assertEqual(mynode.id, 'mynode')
        self.assertEqual(mynode.name, 'mynode')
        self.assertEqual(mynode.children[0], myemptynode)
        self.assertEqual(mynode.transforms[0], rotate)
        self.assertEqual(mynode.transforms[1], scale)

        translate = collada.scene.TranslateTransform(0.1, 0.2, 0.3)
        mynode.transforms.append(translate)
        mynode.transforms.pop(0)
        youremptynode = collada.scene.Node('youremptynode')
        mynode.children.append(youremptynode)
        mynode.id = 'yournode'
        mynode.save()

        yournode = collada.scene.Node.load(self.dummy, fromstring(tostring(mynode.xmlnode)), {})
        self.assertEqual(yournode.id, 'yournode')
        self.assertEqual(yournode.name, 'mynode')
        self.assertEqual(len(yournode.children), 2)
        self.assertEqual(len(yournode.transforms), 2)
        self.assertEqual(yournode.children[0].id, 'myemptynode')
        self.assertEqual(yournode.children[1].id, 'youremptynode')
        self.assertTrue(isinstance(yournode.transforms[0], collada.scene.ScaleTransform))
        self.assertTrue(isinstance(yournode.transforms[1], collada.scene.TranslateTransform))

        translate = collada.scene.TranslateTransform(0.1, 0.2, 0.3)
        mynode.transforms.append(translate)
        mynode.transforms.pop(0)
        youremptynode = collada.scene.Node('youremptynode')
        mynode.children.append(youremptynode)
        mynode.id = 'yournode'
        mynode.name = 'yourname'
        mynode.save()

        yournode = collada.scene.Node.load(self.dummy, fromstring(tostring(mynode.xmlnode)), {})
        self.assertEqual(yournode.id, 'yournode')
        self.assertEqual(yournode.name, 'yourname')

        myemptynode = collada.scene.Node('myemptynode')
        rotate = collada.scene.RotateTransform(0.1, 0.2, 0.3, 90)
        scale = collada.scene.ScaleTransform(0.1, 0.2, 0.3)
        mynode = collada.scene.Node('mynode', children=[myemptynode], transforms=[rotate, scale])
        self.assertEqual(mynode.id, 'mynode')
        self.assertEqual(mynode.name, 'mynode')
        mynode = collada.scene.Node('othernode', children=[myemptynode], transforms=[rotate, scale], name='othername')
        self.assertEqual(mynode.id, 'othernode')
        self.assertEqual(mynode.name, 'othername')

    def test_scene_material_node(self):
        binding1 = ("TEX0", "TEXCOORD", "0")
        binding2 = ("TEX1", "TEXCOORD", "1")
        binding3 = ("TEX2", "TEXCOORD", "2")
        matnode = collada.scene.MaterialNode("mygeommatref", self.effect, [binding1, binding2])

        self.assertEqual(matnode.target, self.effect)
        self.assertEqual(matnode.symbol, "mygeommatref")
        self.assertListEqual(matnode.inputs, [binding1, binding2])
        self.assertIsNotNone(str(matnode))
        matnode.save()
        self.assertEqual(matnode.target, self.effect)
        self.assertEqual(matnode.symbol, "mygeommatref")
        self.assertListEqual(matnode.inputs, [binding1, binding2])

        matnode.symbol = 'yourgeommatref'
        matnode.target = self.effect2
        matnode.inputs.append(binding3)
        matnode.inputs.pop(0)
        matnode.save()

        loaded_matnode = collada.scene.MaterialNode.load(self.dummy, fromstring(tostring(matnode.xmlnode)))
        self.assertEqual(loaded_matnode.target.id, self.effect2.id)
        self.assertEqual(loaded_matnode.symbol, "yourgeommatref")
        self.assertListEqual(loaded_matnode.inputs, [binding2, binding3])

    def test_scene_geometry_node(self):
        binding = ("TEX0", "TEXCOORD", "0")
        matnode = collada.scene.MaterialNode("mygeommatref", self.effect, [binding])
        geomnode = collada.scene.GeometryNode(self.geometry, [matnode])

        bindtest = list(geomnode.objects('geometry'))
        self.assertEqual(len(bindtest), 1)
        self.assertEqual(bindtest[0].original, self.geometry)
        self.assertEqual(geomnode.geometry, self.geometry)
        self.assertListEqual(geomnode.materials, [matnode])
        self.assertIsNotNone(str(geomnode))
        geomnode.save()
        bindtest = list(geomnode.objects('geometry'))
        self.assertEqual(len(bindtest), 1)
        self.assertEqual(bindtest[0].original, self.geometry)
        self.assertEqual(geomnode.geometry, self.geometry)
        self.assertListEqual(geomnode.materials, [matnode])

        matnode2 = collada.scene.MaterialNode("yourgeommatref", self.effect, [binding])
        geomnode.materials.append(matnode2)
        geomnode.materials.pop(0)
        geomnode.geometry = self.geometry2
        geomnode.save()

        loaded_geomnode = collada.scene.loadNode(self.dummy, fromstring(tostring(geomnode.xmlnode)), {})
        self.assertEqual(loaded_geomnode.geometry.id, self.geometry2.id)
        self.assertEqual(len(loaded_geomnode.materials), 1)
        self.assertEqual(loaded_geomnode.materials[0].target, matnode2.target)
        self.assertEqual(loaded_geomnode.materials[0].symbol, "yourgeommatref")
        self.assertListEqual(loaded_geomnode.materials[0].inputs, [binding])

    def test_scene_node_with_instances(self):
        binding = ("TEX0", "TEXCOORD", "0")
        matnode = collada.scene.MaterialNode("mygeommatref", self.effect, [binding])
        geomnode = collada.scene.GeometryNode(self.geometry, [matnode])
        camnode = collada.scene.CameraNode(self.yourcam)
        lightnode = collada.scene.LightNode(self.yourdirlight)
        myemptynode = collada.scene.Node('myemptynode')
        rotate = collada.scene.RotateTransform(0.1, 0.2, 0.3, 90)
        scale = collada.scene.ScaleTransform(0.1, 0.2, 0.3)
        mynode = collada.scene.Node('mynode',
                                    children=[myemptynode, geomnode, camnode, lightnode],
                                    transforms=[rotate, scale])

        self.assertEqual(len(mynode.children), 4)
        self.assertEqual(mynode.children[0], myemptynode)
        self.assertEqual(mynode.children[1], geomnode)
        self.assertEqual(mynode.children[2], camnode)
        self.assertEqual(mynode.children[3], lightnode)
        self.assertEqual(mynode.transforms[0], rotate)
        self.assertEqual(mynode.transforms[1], scale)

        mynode.id = 'yournode'
        mynode.children.pop(0)
        mynode.save()

        yournode = collada.scene.Node.load(self.dummy, fromstring(tostring(mynode.xmlnode)), {})
        self.assertEqual(yournode.id, 'yournode')
        self.assertEqual(len(yournode.children), 3)
        self.assertEqual(len(yournode.transforms), 2)
        self.assertEqual(yournode.children[0].geometry.id, self.geometry.id)
        self.assertEqual(yournode.children[1].camera.id, self.yourcam.id)
        self.assertEqual(yournode.children[2].light.id, self.yourdirlight.id)
        self.assertTrue(isinstance(yournode.transforms[0], collada.scene.RotateTransform))
        self.assertTrue(isinstance(yournode.transforms[1], collada.scene.ScaleTransform))

    def test_scene_with_nodes(self):
        rotate = collada.scene.RotateTransform(0.1, 0.2, 0.3, 90)
        scale = collada.scene.ScaleTransform(0.1, 0.2, 0.3)
        mynode = collada.scene.Node('mynode', children=[], transforms=[rotate, scale])
        yournode = collada.scene.Node('yournode', children=[], transforms=[])
        othernode = collada.scene.Node('othernode', children=[], transforms=[])
        scene = collada.scene.Scene('myscene', [mynode, yournode, othernode])

        self.assertEqual(scene.id, 'myscene')
        self.assertEqual(len(scene.nodes), 3)
        self.assertEqual(scene.nodes[0], mynode)
        self.assertEqual(scene.nodes[1], yournode)
        self.assertEqual(scene.nodes[2], othernode)

        scene.id = 'yourscene'
        scene.nodes.pop(1)
        anothernode = collada.scene.Node('anothernode')
        scene.nodes.append(anothernode)
        scene.save()

        loaded_scene = collada.scene.Scene.load(self.dummy, fromstring(tostring(scene.xmlnode)))

        self.assertEqual(loaded_scene.id, 'yourscene')
        self.assertEqual(len(loaded_scene.nodes), 3)
        self.assertEqual(loaded_scene.nodes[0].id, 'mynode')
        self.assertEqual(loaded_scene.nodes[1].id, 'othernode')
        self.assertEqual(loaded_scene.nodes[2].id, 'anothernode')


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