Skip to content

Commit ac86d9b

Browse files
authored
Merge pull request #1429 from danieldresser-ie/resampleCurves
CurvesAlgo::resamplePrimitiveVariables : Support periodic curves
2 parents 341b3de + 2c37ad1 commit ac86d9b

File tree

2 files changed

+91
-3
lines changed

2 files changed

+91
-3
lines changed

src/IECoreScene/CurvesAlgo.cpp

+6-3
Original file line numberDiff line numberDiff line change
@@ -200,7 +200,8 @@ struct CurvesUniformToVarying
200200
for( size_t i = 0; i < numCurves; ++i, ++srcIt )
201201
{
202202
Canceller::check( m_canceller );
203-
for( size_t j = 0; j < m_curves->numSegments( i ) + 1; ++j )
203+
const size_t varyingSize = m_curves->variableSize( PrimitiveVariable::Varying, i );
204+
for( size_t j = 0; j < varyingSize; ++j )
204205
{
205206
trg.push_back( *srcIt );
206207
}
@@ -241,7 +242,7 @@ struct CurvesVaryingToUniform
241242
typename From::ValueType::value_type total = *srcIt;
242243
++srcIt;
243244

244-
size_t varyingSize = m_curves->numSegments( i ) + 1;
245+
const size_t varyingSize = m_curves->variableSize( PrimitiveVariable::Varying, i );
245246
for( size_t j = 1; j < varyingSize; ++j, ++srcIt )
246247
{
247248
total += *srcIt;
@@ -300,7 +301,9 @@ struct CurvesVertexToVarying
300301
Canceller::check( m_canceller );
301302
size_t numSegments = m_curves->numSegments( i );
302303
float step = 1.0f / numSegments;
303-
for( size_t j = 0; j < numSegments + 1; ++j )
304+
305+
const size_t varyingSize = m_curves->variableSize( PrimitiveVariable::Varying, i );
306+
for( size_t j = 0; j < varyingSize; ++j )
304307
{
305308
evaluator->pointAtV( i, j * step, evaluatorResult.get() );
306309
trg.push_back( evalPrimVar<typename From::ValueType::value_type>( evaluatorResult.get(), *primVar ) );

test/IECoreScene/CurvesAlgoTest.py

+85
Original file line numberDiff line numberDiff line change
@@ -470,6 +470,41 @@ def testBSplineCurvesIndexedFaceVaryingToVarying( self ) :
470470
self.assertEqual( p.interpolation, IECoreScene.PrimitiveVariable.Interpolation.Varying )
471471
self.assertEqual( p.data, IECore.FloatVectorData( range( 0, 3 ) ) )
472472
self.assertEqual( p.indices, IECore.IntVectorData( [ 0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2 ] ) )
473+
474+
def testBSplineCurvesPeriodic( self ) :
475+
# Periodic curves are a corner case that we don't test much, but we should at least make sure that
476+
# we produce valid primvars
477+
478+
curves = self.curvesBSpline()
479+
for q in [ "d", "e", "h", "i", "varying_Color_V3f", "facevarying_Normal_V3f" ]:
480+
del curves[q]
481+
482+
curves.setTopology( curves.verticesPerCurve(), curves.basis(), True )
483+
484+
p = IECoreScene.PrimitiveVariable( IECoreScene.PrimitiveVariable.Interpolation.Uniform, curves["c"].data )
485+
IECoreScene.CurvesAlgo.resamplePrimitiveVariable(curves, p, IECoreScene.PrimitiveVariable.Interpolation.Varying )
486+
487+
self.assertTrue( curves.isPrimitiveVariableValid( p ) )
488+
489+
IECoreScene.CurvesAlgo.resamplePrimitiveVariable(curves, p, IECoreScene.PrimitiveVariable.Interpolation.Uniform )
490+
self.assertEqual( curves["c"], p )
491+
492+
p = IECoreScene.PrimitiveVariable( IECoreScene.PrimitiveVariable.Interpolation.Vertex, IECore.FloatVectorData( [ i for i in range( curves.variableSize( IECoreScene.PrimitiveVariable.Interpolation.Vertex ) ) ] ) )
493+
494+
# Work around weird limitation that for resampling Varying -> Vertex the primvar must be stored on curves.
495+
# Note that there may no longer be any reason for this limitation ( CurvesPrimitiveEvaluator looks like
496+
# it should work fine with arbitrary prim vars ), but we're still doing something weird in
497+
# CurvesVaryingToVertex in CurvesAlgo.cpp line 366
498+
curves["dummy"] = p
499+
IECoreScene.CurvesAlgo.resamplePrimitiveVariable(curves, p, IECoreScene.PrimitiveVariable.Interpolation.Varying )
500+
501+
self.assertTrue( curves.isPrimitiveVariableValid( p ) )
502+
503+
curves["dummy"] = p
504+
505+
IECoreScene.CurvesAlgo.resamplePrimitiveVariable(curves, p, IECoreScene.PrimitiveVariable.Interpolation.Vertex )
506+
self.assertTrue( curves.isPrimitiveVariableValid( p ) )
507+
473508
# endregion
474509

475510
# region catmullrom
@@ -930,6 +965,56 @@ def testLinearCurvesFaceVaryingToVarying( self ) :
930965
self.assertEqual( p.interpolation, IECoreScene.PrimitiveVariable.Interpolation.Varying )
931966
self.assertEqual( p.data, IECore.FloatVectorData( range( 0, 4 ) ) )
932967

968+
def testLinearCurvesPeriodic( self ) :
969+
# Periodic curves are a corner case that we don't test much, but we should at least make sure that
970+
# we produce valid primvars
971+
972+
curves = IECoreScene.CurvesPrimitive(
973+
974+
IECore.IntVectorData( [ 3, 3 ] ),
975+
IECore.CubicBasisf.linear(),
976+
True,
977+
IECore.V3fVectorData(
978+
[
979+
imath.V3f( 0, 0, 0 ),
980+
imath.V3f( 0, 1, 0 ),
981+
imath.V3f( 0, 0, 1 ),
982+
imath.V3f( 0, 0, 0 ),
983+
imath.V3f( 1, 0, 0 ),
984+
imath.V3f( 0, 0, 1 )
985+
]
986+
)
987+
)
988+
989+
curves["c"] = IECoreScene.PrimitiveVariable( IECoreScene.PrimitiveVariable.Interpolation.Uniform, IECore.FloatVectorData( range( 0, 2 ) ) )
990+
991+
p = IECoreScene.PrimitiveVariable( IECoreScene.PrimitiveVariable.Interpolation.Uniform, curves["c"].data )
992+
IECoreScene.CurvesAlgo.resamplePrimitiveVariable(curves, p, IECoreScene.PrimitiveVariable.Interpolation.Varying )
993+
994+
self.assertTrue( curves.isPrimitiveVariableValid( p ) )
995+
996+
IECoreScene.CurvesAlgo.resamplePrimitiveVariable(curves, p, IECoreScene.PrimitiveVariable.Interpolation.Uniform )
997+
self.assertEqual( curves["c"], p )
998+
999+
origP = IECoreScene.PrimitiveVariable( IECoreScene.PrimitiveVariable.Interpolation.Vertex, IECore.FloatVectorData( [ i for i in range( curves.variableSize( IECoreScene.PrimitiveVariable.Interpolation.Vertex ) ) ] ) )
1000+
p = IECoreScene.PrimitiveVariable( IECoreScene.PrimitiveVariable.Interpolation.Vertex, origP.data )
1001+
1002+
# Work around weird limitation that for resampling Varying -> Vertex the primvar must be stored on curves
1003+
curves["dummy"] = p
1004+
IECoreScene.CurvesAlgo.resamplePrimitiveVariable(curves, p, IECoreScene.PrimitiveVariable.Interpolation.Varying )
1005+
1006+
self.assertTrue( curves.isPrimitiveVariableValid( p ) )
1007+
1008+
# Linear curves are a special case where the data shouldn't actually change when resampling from Vertex
1009+
# to Varying
1010+
self.assertEqual( p.data, origP.data )
1011+
1012+
curves["dummy"] = p
1013+
1014+
IECoreScene.CurvesAlgo.resamplePrimitiveVariable(curves, p, IECoreScene.PrimitiveVariable.Interpolation.Vertex )
1015+
self.assertTrue( curves.isPrimitiveVariableValid( p ) )
1016+
self.assertEqual( p.data, origP.data )
1017+
9331018
def testCanSegmentUsingIntegerPrimvar( self ) :
9341019
curves = self.curvesLinear()
9351020

0 commit comments

Comments
 (0)