diff --git a/SConstruct b/SConstruct index a5a0786324..2d7093e87b 100644 --- a/SConstruct +++ b/SConstruct @@ -47,6 +47,7 @@ import os import re import subprocess import platform +import distutils EnsureSConsVersion( 3, 0, 2 ) # Substfile is a default builder as of 3.0.2 SConsignFile() diff --git a/src/IECoreNuke/LiveScene.cpp b/src/IECoreNuke/LiveScene.cpp index cd455180b4..b15c26cd31 100644 --- a/src/IECoreNuke/LiveScene.cpp +++ b/src/IECoreNuke/LiveScene.cpp @@ -498,11 +498,15 @@ ConstObjectPtr LiveScene::readObject( double time, const IECore::Canceller *canc if ( result == IECore::PathMatcher::ExactMatch ) { auto geoInfo = object( i, &time ); - if ( !geoInfo ) + if ( !geoInfo || geoInfo->primitives() == 0 ) { return IECore::NullObject::defaultNullObject(); } - if ( geoInfo->primitives() == 1 && ( geoInfo->primitive( 0 )->getPrimitiveType() == DD::Image::PrimitiveType::eParticlesSprite ) ) + + auto primitiveType = geoInfo->primitive( 0 )->getPrimitiveType(); + if ( primitiveType == DD::Image::PrimitiveType::eParticlesSprite + || primitiveType == DD::Image::PrimitiveType::eParticles + || primitiveType == DD::Image::PrimitiveType::ePoint ) { auto converter = new IECoreNuke::FromNukePointsConverter( geoInfo, m_op->input0() ); return converter->convert(); diff --git a/test/IECoreNuke/LiveSceneKnobTest.py b/test/IECoreNuke/LiveSceneKnobTest.py index 581484643d..d31dbe009c 100644 --- a/test/IECoreNuke/LiveSceneKnobTest.py +++ b/test/IECoreNuke/LiveSceneKnobTest.py @@ -377,6 +377,73 @@ def testReadObjet( self ): self.assertEqual( objectA.topologyHash(), expectedObjectA.topologyHash() ) self.assertEqual( objectA.keys(), [ "P", "uv" ] ) + def testReadObjectParticles(self): + import IECoreScene + import tempfile, os + + noise = nuke.createNode("Noise") + card = nuke.createNode("Card2") + card.setInput(0, noise) + particle = nuke.createNode("ParticleEmitter") + particle.setInput(1, card) + + # Read through ieLiveScene at frame 5 (after simulation) + nuke.frame(5) + n = nuke.createNode("ieLiveScene") + n.setInput(0, particle) + n.forceValidate() + + liveScene = n.knob("scene").getValue() + self.assertGreater(len(liveScene.childNames()), 0) + + child = liveScene.scene(["object0"]) + self.assertTrue(child.hasObject()) + + obj = child.readObject(1.0) + self.assertIsInstance(obj, IECoreScene.PointsPrimitive) + + def testReadObjectDeepToPoints(self): + import IECoreScene + + checker = nuke.createNode("CheckerBoard2") + deepFromImage = nuke.createNode("DeepFromImage") + deepFromImage["z"].setValue(1000) + deepFromImage["set_z"].setValue(True) + deepFromImage.setInput(0, checker) + + camera = nuke.createNode("Camera") + + deepToPoints = nuke.createNode("DeepToPoints") + deepToPoints.setInput(0, deepFromImage) + deepToPoints.setInput(1, camera) + + n = nuke.createNode("ieLiveScene") + n.setInput(0, deepToPoints) + n.forceValidate() + + liveScene = n.knob("scene").getValue() + self.assertGreater(len(liveScene.childNames()), 0) + + child = liveScene.scene(["object0"]) + self.assertTrue(child.hasObject()) + + obj = child.readObject(0) + self.assertIsInstance(obj, IECoreScene.PointsPrimitive) + + def testReadObjectMesh(self): + import IECoreScene + + sphere = nuke.createNode("Sphere") + + n = nuke.createNode("ieLiveScene") + n.setInput(0, sphere) + + liveScene = n.knob("scene").getValue() + child = liveScene.scene(["object0"]) + self.assertTrue(child.hasObject()) + + obj = child.readObject(0) + self.assertIsInstance(obj, IECoreScene.MeshPrimitive) if __name__ == "__main__": unittest.main()