1#-******************************************************************************
2#
3# Copyright (c) 2012,
4#  Sony Pictures Imageworks Inc. and
5#  Industrial Light & Magic, a division of Lucasfilm Entertainment Company Ltd.
6#
7# All rights reserved.
8#
9# Redistribution and use in source and binary forms, with or without
10# modification, are permitted provided that the following conditions are
11# met:
12# *       Redistributions of source code must retain the above copyright
13# notice, this list of conditions and the following disclaimer.
14# *       Redistributions in binary form must reproduce the above
15# copyright notice, this list of conditions and the following disclaimer
16# in the documentation and/or other materials provided with the
17# distribution.
18# *       Neither the name of Sony Pictures Imageworks, nor
19# Industrial Light & Magic, nor the names of their contributors may be used
20# to endorse or promote products derived from this software without specific
21# prior written permission.
22#
23# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
24# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
25# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
26# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
27# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
28# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
29# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
30# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
31# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
32# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
33# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
34#
35#-******************************************************************************
36
37import unittest
38from imath import *
39from alembic.Abc import *
40from alembic.AbcGeom import *
41
42class PointsTest(unittest.TestCase):
43    def testPointsExport(self):
44        """write out points archive"""
45
46        archive = OArchive("particlesOut2.abc")
47        topObj = archive.getTop()
48        ptsObj = OPoints(topObj, "somePoints")
49
50        positions = V3fArray(100)
51        velocities = V3fArray(100)
52        ids = IntArray(100)
53        widths = FloatArray(100)
54
55        for i in range(100):
56            widthSamp = OFloatGeomParamSample()
57            widthSamp.setScope(GeometryScope.kVertexScope)
58            widthSamp.setVals(widths)
59
60            psamp = OPointsSchemaSample()
61            psamp.setPositions(positions)
62            psamp.setIds(ids)
63            psamp.setVelocities(velocities)
64            psamp.setWidths(widthSamp)
65            ptsObj.getSchema().set(psamp)
66
67            positions[i] = V3f(i, i, i)
68            velocities[i] = V3f(100.0-i, 0, 0)
69            ids[i] = i * 10
70            widths[i] = 0.1 + i * 0.05
71
72    def testPointsImport(self):
73        """read in points archive"""
74
75        archive = IArchive("particlesOut2.abc")
76        topObj = archive.getTop()
77        points = IPoints(topObj, "somePoints")
78        pointsSchema = points.getSchema()
79
80        self.assertTrue(pointsSchema.valid())
81
82        widthProp = pointsSchema.getWidthsParam()
83
84        self.assertEqual(widthProp.getScope(), GeometryScope.kVertexScope)
85
86        for i in range(100):
87            pointsSamp = pointsSchema.getValue(ISampleSelector(i))
88            widthSamp = widthProp.getExpandedValue(ISampleSelector(i))
89
90            for j in range(i):
91                self.assertEqual(pointsSamp.getPositions()[j], V3f(j, j, j))
92                self.assertEqual(pointsSamp.getVelocities()[j], V3f(100-j, 0, 0))
93                self.assertEqual(pointsSamp.getIds()[j], j * 10)
94                self.assertAlmostEqual(widthSamp.getVals()[j], 0.1 + j * 0.05, 6)
95
96