Skip to content

Commit

Permalink
Merge pull request #162 from andrewkaufman/sceneNodeInterfaceBinding
Browse files Browse the repository at this point in the history
Adding wrapper class for SceneCacheNodes and binding scene() method
  • Loading branch information
johnhaddon committed Nov 1, 2013
2 parents 00828c8 + e8db573 commit d7c0f78
Show file tree
Hide file tree
Showing 2 changed files with 88 additions and 1 deletion.
72 changes: 71 additions & 1 deletion src/IECoreHoudini/bindings/SceneCacheNodeBinding.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -36,22 +36,92 @@

#include "OP/OP_Node.h"

#include "IECore/MessageHandler.h"

#include "IECorePython/RunTimeTypedBinding.h"

#include "IECoreHoudini/SceneCacheNode.h"
#include "IECoreHoudini/OBJ_SceneCacheTransform.h"
#include "IECoreHoudini/NodeHandle.h"

#include "IECoreHoudini/bindings/SceneCacheNodeBinding.h"

using namespace boost::python;
using namespace IECoreHoudini;

class SceneCacheNodeHelper
{
public :

SceneCacheNodeHelper( OP_Node *node = 0 )
{
if ( !node )
{
return;
}

if ( sceneNode( node ) )
{
m_handle = node;
}
else
{
UT_String path;
node->getFullPath( path );
IECore::msg( IECore::MessageHandler::Error, "SceneCacheNode", path.toStdString() + " was not a valid SceneCacheNode" );
}
}

~SceneCacheNodeHelper()
{
}

bool hasNode() const
{
return m_handle.alive();
}

SceneCacheNode<OP_Node> *sceneNode( OP_Node *node ) const
{
// make sure its a SceneCacheNode
if ( !node || !node->hasParm( SceneCacheNode<OP_Node>::pFile.getToken() ) || !node->hasParm( SceneCacheNode<OP_Node>::pRoot.getToken() ) )
{
return 0;
}

return reinterpret_cast<SceneCacheNode<OP_Node>* >( node );
}

IECore::SceneInterfacePtr scene() const
{
if ( !hasNode() )
{
return 0;
}

if ( SceneCacheNode<OP_Node> *node = sceneNode( m_handle.node() ) )
{
if ( IECore::ConstSceneInterfacePtr s = node->scene() )
{
return const_cast<IECore::SceneInterface*>( s.get() );
}
}

return 0;
}

private :

NodeHandle m_handle;

};

void IECoreHoudini::bindSceneCacheNode()
{
scope modeCacheNodeScope = class_<SceneCacheNodeHelper>( "SceneCacheNode" );
scope modeCacheNodeScope = class_<SceneCacheNodeHelper>( "SceneCacheNode" )
.def( init<OP_Node*>() )
.def( "scene", &SceneCacheNodeHelper::scene )
;

enum_<SceneCacheNode<OP_Node>::Space>( "Space" )
.value( "World", SceneCacheNode<OP_Node>::World )
Expand Down
17 changes: 17 additions & 0 deletions test/IECoreHoudini/SceneCacheTest.py
Original file line number Diff line number Diff line change
Expand Up @@ -2380,6 +2380,23 @@ def testTimeDependent( self ) :
self.assertTrue( hou.node( xform.path()+"/1/2/3/geo" ).isTimeDependent() )
self.assertFalse( hou.node( xform.path()+"/1/2/3/geo/3" ).isTimeDependent() )

def testSceneMethod( self ) :

def testNode( node ) :

sceneNode = IECoreHoudini.SceneCacheNode( node )
shared = IECore.SharedSceneInterfaces.get( TestSceneCache.__testFile )
self.assertTrue( sceneNode.scene().isSame( shared ) )
node.parm( "root" ).set( "/1/fake" )
self.assertEqual( sceneNode.scene(), None )
node.parm( "root" ).set( "/1/2" )
self.compareScene( sceneNode.scene(), shared.scene( [ "1", "2" ] ) )

self.writeSCC()
testNode( self.sop() )
testNode( self.xform() )
testNode( self.geometry() )

def tearDown( self ) :

for f in [ TestSceneCache.__testFile, TestSceneCache.__testOutFile, TestSceneCache.__testLinkedOutFile, TestSceneCache.__testHip, TestSceneCache.__testBgeo, TestSceneCache.__testBgeoGz, TestSceneCache.__testGeo ] :
Expand Down

0 comments on commit d7c0f78

Please sign in to comment.