Skip to content

Commit

Permalink
PlugAlgo : Support array[1] -> scalar conversion for BoxPlugs
Browse files Browse the repository at this point in the history
  • Loading branch information
johnhaddon committed Apr 24, 2024
1 parent bcad042 commit e4f8665
Show file tree
Hide file tree
Showing 2 changed files with 83 additions and 0 deletions.
57 changes: 57 additions & 0 deletions python/GafferTest/PlugAlgoTest.py
Original file line number Diff line number Diff line change
Expand Up @@ -1120,6 +1120,63 @@ def testSetTypedValueFromVectorData( self ) :
self.assertFalse( Gaffer.PlugAlgo.setValueFromData( plug, data ) )
self.assertTrue( plug.isSetToDefault() )

def testSetBoxValueFromVectorData( self ) :

for plugType in [
Gaffer.Box2fPlug, Gaffer.Box3fPlug,
Gaffer.Box2iPlug, Gaffer.Box3iPlug,
] :

with self.subTest( plugType = plugType ) :

plug = plugType()

minValue = plugType.PointType()
maxValue = plugType.PointType()
for i in range( 0, minValue.dimensions() ) :
minValue[i] = i
maxValue[i] = i + 1
value = plugType.ValueType( minValue, maxValue )
data = IECore.DataTraits.dataFromElement( [ value ] )

# Array length 1, can set

self.assertTrue( Gaffer.PlugAlgo.canSetValueFromData( plug, data ) )
self.assertTrue( plug.isSetToDefault() )
self.assertTrue( Gaffer.PlugAlgo.setValueFromData( plug, data ) )
self.assertEqual( plug.getValue(), value )
self.assertFalse( plug.isSetToDefault() )

# And can set individual children

plug.setToDefault()
for childPlug in plug :
for componentPlug in childPlug :
self.assertTrue( Gaffer.PlugAlgo.setValueFromData( plug, data ) )
self.assertEqual( plug.getValue(), value )
self.assertFalse( plug.isSetToDefault() )

# Array length 2, can't set

data.append( data[0] )
plug.setToDefault()
self.assertFalse( Gaffer.PlugAlgo.canSetValueFromData( plug, data ) )
self.assertFalse( Gaffer.PlugAlgo.setValueFromData( plug, data ) )
for childPlug in plug :
for componentPlug in childPlug :
self.assertFalse( Gaffer.PlugAlgo.setValueFromData( plug, data ) )
self.assertTrue( plug.isSetToDefault() )

# Array length 0, can't set

data.resize( 0 )
self.assertFalse( Gaffer.PlugAlgo.canSetValueFromData( plug, data ) )
self.assertFalse( Gaffer.PlugAlgo.setValueFromData( plug, data ) )
for childPlug in plug :
for componentPlug in childPlug :
self.assertFalse( Gaffer.PlugAlgo.setValueFromData( plug, data ) )
self.assertTrue( plug.isSetToDefault() )

def testDependsOnCompute( self ) :

add = GafferTest.AddNode()
Expand Down
26 changes: 26 additions & 0 deletions src/Gaffer/PlugAlgo.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -838,6 +838,16 @@ bool setBoxChildPlugValue( const PlugType *plug, typename PlugType::ChildType::C
}
}

template<typename PlugType, typename DataType>
bool setBoxChildPlugValueFromVectorData( const PlugType *plug, typename PlugType::ChildType::ChildType *child, const DataType *data )
{
if( data->readable().size() != 1 )
{
return false;
}
return setBoxChildPlugValue( plug, child, data->readable()[0] );
}

template<typename PlugType>
bool setBoxPlugValue( const PlugType *plug, Gaffer::ValuePlug *leafPlug, const Data *value )
{
Expand All @@ -852,6 +862,14 @@ bool setBoxPlugValue( const PlugType *plug, Gaffer::ValuePlug *leafPlug, const D
return setBoxChildPlugValue( plug, typedPlug, static_cast<const Box3iData *>( value )->readable() );
case Box2iDataTypeId :
return setBoxChildPlugValue( plug, typedPlug, static_cast<const Box2iData *>( value )->readable() );
case Box3fVectorDataTypeId :
return setBoxChildPlugValueFromVectorData( plug, typedPlug, static_cast<const Box3fVectorData *>( value ) );
case Box2fVectorDataTypeId :
return setBoxChildPlugValueFromVectorData( plug, typedPlug, static_cast<const Box2fVectorData *>( value ) );
case Box3iVectorDataTypeId :
return setBoxChildPlugValueFromVectorData( plug, typedPlug, static_cast<const Box3iVectorData *>( value ) );
case Box2iVectorDataTypeId :
return setBoxChildPlugValueFromVectorData( plug, typedPlug, static_cast<const Box2iVectorData *>( value ) );
default :
return false;
}
Expand Down Expand Up @@ -1018,6 +1036,14 @@ bool canSetBoxPlugValue( const Data *value )
case Box3iDataTypeId :
case Box2iDataTypeId :
return true;
case Box3fVectorDataTypeId :
return static_cast<const Box3fVectorData *>( value )->readable().size() == 1;
case Box2fVectorDataTypeId :
return static_cast<const Box2fVectorData *>( value )->readable().size() == 1;
case Box3iVectorDataTypeId :
return static_cast<const Box3iVectorData *>( value )->readable().size() == 1;
case Box2iVectorDataTypeId :
return static_cast<const Box2iVectorData *>( value )->readable().size() == 1;
default :
return false;
}
Expand Down

0 comments on commit e4f8665

Please sign in to comment.