@@ -61,6 +61,20 @@ def temporaryDirectory( self ) :
6161
6262 return self .__temporaryDirectory
6363
64+ def testWriteEmptyScene ( self ):
65+
66+ outputFile = os .path .join ( self .temporaryDirectory (), "empty.scc" )
67+
68+ writer = nuke .createNode ( "WriteGeo" )
69+ writer ["file" ].fromScript ( outputFile )
70+
71+ nuke .execute ( writer , 1001 , 1001 )
72+
73+ self .assertTrue ( os .path .exists ( outputFile ) )
74+
75+ scene = IECoreScene .SharedSceneInterfaces .get ( outputFile )
76+ self .assertEqual ( scene .childNames (), [] )
77+
6478 def testWriteSimpleSphere ( self ):
6579
6680 outputFile = os .path .join ( self .temporaryDirectory (), "sphere.scc" )
@@ -88,7 +102,6 @@ def testWriteSimpleSphere( self ):
88102
89103 self .assertEqual ( mesh .topologyHash (), liveSceneMesh .topologyHash () )
90104
91-
92105 def testWriteSceneCacheReader ( self ):
93106 import random
94107 import IECoreScene
@@ -121,6 +134,49 @@ def testWriteSceneCacheReader( self ):
121134 pointIndex = random .choice ( range ( len ( mesh ["P" ].data ) ) )
122135 self .assertAlmostEqual ( mesh ["P" ].data [pointIndex ], expectedMesh ["P" ].data [pointIndex ], 4 )
123136
137+ def testWriteParticle ( self ):
138+
139+ outputFile = os .path .join ( self .temporaryDirectory (), "particle.scc" )
140+
141+ noise = nuke .createNode ( "Noise" )
142+ card = nuke .createNode ( "Card2" )
143+ card .setInput ( 0 , noise )
144+ particle = nuke .createNode ( "ParticleEmitter" )
145+ particle .setInput ( 1 , card )
146+ particle ["size_variation" ].setValue ( 2 )
147+ particle ["color_from_texture" ].setValue ( True )
148+ particle ["spread" ].setValue ( .3 )
149+ writer = nuke .createNode ( "WriteGeo" )
150+ writer ["file" ].fromScript ( outputFile )
151+
152+ nuke .execute ( writer , 0 , 24 )
153+
154+ self .assertTrue ( os .path .exists ( outputFile ) )
155+
156+ scene = IECoreScene .SharedSceneInterfaces .get ( outputFile )
157+
158+ self .assertEqual ( scene .childNames (), ["object0" ] )
159+
160+ pointsPrim = scene .scene ( ["object0" ,] ).readObject ( 1 )
161+ self .assertEqual ( set ( pointsPrim .keys () ), set ( ["Cs" , "P" , "pid" , "width" , "velocity" , "alpha" ] ) )
162+
163+ self .assertEqual ( pointsPrim .numPoints , 100 )
164+ self .assertEqual ( scene .scene ( ["object0" ,] ).readObject ( 0.04 ).numPoints , 10 )
165+ self .assertEqual ( scene .scene ( ["object0" ,] ).readObject ( 0.5 ).numPoints , 100 )
166+
167+ self .assertAlmostEqual ( pointsPrim ["P" ].data [12 ], imath .V3f (- 0.559 , 1.797 , 1.677 ), delta = .015 )
168+ self .assertAlmostEqual ( pointsPrim ["Cs" ].data [21 ], imath .Color4f (0.241325 , 0.241325 , 0.241325 , 1 ), delta = .015 )
169+ self .assertAlmostEqual ( pointsPrim ["alpha" ].data [72 ], 1.0 , delta = .015 )
170+ self .assertAlmostEqual ( pointsPrim ["width" ].data [99 ], .105 , delta = .015 )
171+ self .assertAlmostEqual ( pointsPrim ["pid" ].data [92 ], 197 , delta = .015 )
172+ self .assertAlmostEqual ( pointsPrim ["velocity" ].data [72 ], imath .V3f (- 18.424 , 4.602 , 14.675 ), delta = .015 )
173+
174+ def assertAlmostEqual ( self , left , right , delta = None ):
175+ if isinstance ( left , ( imath .V3f , imath .Color3f , imath .Color4f ) ):
176+ for index , _ in enumerate ( left ):
177+ super ( SceneCacheWriterTest , self ).assertAlmostEqual ( left [index ], right [index ], delta = delta )
178+ else :
179+ super ( SceneCacheWriterTest , self ).assertAlmostEqual ( left , right , delta = delta )
124180
125181if __name__ == "__main__" :
126182 unittest .main ()
0 commit comments