diff --git a/Changes b/Changes index 18df9e2db6..10482106f7 100644 --- a/Changes +++ b/Changes @@ -5,6 +5,7 @@ Improvements ------------ - ShaderNetwork : Optimised applySubstitutions() for cases where not all shaders need them. +- CurvesPrimitiveEvaluator : Added accessors for getting interpolation coefficients and data indices from Result. Fixes ----- diff --git a/include/IECoreScene/CurvesPrimitiveEvaluator.h b/include/IECoreScene/CurvesPrimitiveEvaluator.h index 7370225c11..2154557533 100644 --- a/include/IECoreScene/CurvesPrimitiveEvaluator.h +++ b/include/IECoreScene/CurvesPrimitiveEvaluator.h @@ -40,6 +40,7 @@ #include "IECore/BoundedKDTree.h" +#include #include namespace IECoreScene @@ -74,6 +75,11 @@ class IECORESCENE_API CurvesPrimitiveEvaluator : public PrimitiveEvaluator Imath::V3f uTangent() const override; Imath::V3f vTangent() const override; unsigned curveIndex() const; + const std::array &coefficients() const; + const std::array &derivativeCoefficients() const; + const std::array &vertexDataIndices() const; + const std::array &varyingDataIndices() const; + bool linear() const; Imath::V3f vectorPrimVar( const PrimitiveVariable &pv ) const override; Imath::V2f vec2PrimVar( const PrimitiveVariable &pv ) const override; @@ -100,10 +106,10 @@ class IECORESCENE_API CurvesPrimitiveEvaluator : public PrimitiveEvaluator unsigned m_curveIndex; float m_v; float m_segmentV; - float m_coefficients[4]; - float m_derivativeCoefficients[4]; - unsigned m_vertexDataIndices[4]; - unsigned m_varyingDataIndices[2]; + std::array m_coefficients; + std::array m_derivativeCoefficients; + std::array m_vertexDataIndices; + std::array m_varyingDataIndices; PrimitiveVariable m_p; bool m_linear; InitFunction m_init; diff --git a/src/IECoreScene/CurvesPrimitiveEvaluator.cpp b/src/IECoreScene/CurvesPrimitiveEvaluator.cpp index 6eddf07dad..3191c8e5e3 100644 --- a/src/IECoreScene/CurvesPrimitiveEvaluator.cpp +++ b/src/IECoreScene/CurvesPrimitiveEvaluator.cpp @@ -136,7 +136,7 @@ T CurvesPrimitiveEvaluator::Result::primVar( const PrimitiveVariable &primVar, c Imath::V3f CurvesPrimitiveEvaluator::Result::point() const { - return primVar( m_p, m_coefficients ); + return primVar( m_p, m_coefficients.data() ); } Imath::V3f CurvesPrimitiveEvaluator::Result::normal() const @@ -156,7 +156,7 @@ Imath::V3f CurvesPrimitiveEvaluator::Result::uTangent() const Imath::V3f CurvesPrimitiveEvaluator::Result::vTangent() const { - return primVar( m_p, m_derivativeCoefficients ); + return primVar( m_p, m_derivativeCoefficients.data() ); } unsigned CurvesPrimitiveEvaluator::Result::curveIndex() const @@ -164,24 +164,49 @@ unsigned CurvesPrimitiveEvaluator::Result::curveIndex() const return m_curveIndex; } +const std::array &CurvesPrimitiveEvaluator::Result::coefficients() const +{ + return m_coefficients; +} + +const std::array &CurvesPrimitiveEvaluator::Result::derivativeCoefficients() const +{ + return m_derivativeCoefficients; +} + +const std::array &CurvesPrimitiveEvaluator::Result::vertexDataIndices() const +{ + return m_vertexDataIndices; +} + +const std::array &CurvesPrimitiveEvaluator::Result::varyingDataIndices() const +{ + return m_varyingDataIndices; +} + +bool CurvesPrimitiveEvaluator::Result::linear() const +{ + return m_linear; +} + Imath::V3f CurvesPrimitiveEvaluator::Result::vectorPrimVar( const PrimitiveVariable &pv ) const { - return primVar( pv, m_coefficients ); + return primVar( pv, m_coefficients.data() ); } V2f CurvesPrimitiveEvaluator::Result::vec2PrimVar( const PrimitiveVariable &pv ) const { - return primVar( pv, m_coefficients ); + return primVar( pv, m_coefficients.data() ); } float CurvesPrimitiveEvaluator::Result::floatPrimVar( const PrimitiveVariable &pv ) const { - return primVar( pv, m_coefficients ); + return primVar( pv, m_coefficients.data() ); } int CurvesPrimitiveEvaluator::Result::intPrimVar( const PrimitiveVariable &pv ) const { - return primVar( pv, m_coefficients ); + return primVar( pv, m_coefficients.data() ); } const std::string &CurvesPrimitiveEvaluator::Result::stringPrimVar( const PrimitiveVariable &pv ) const @@ -208,12 +233,12 @@ const std::string &CurvesPrimitiveEvaluator::Result::stringPrimVar( const Primit Imath::Color3f CurvesPrimitiveEvaluator::Result::colorPrimVar( const PrimitiveVariable &pv ) const { - return primVar( pv, m_coefficients ); + return primVar( pv, m_coefficients.data() ); } half CurvesPrimitiveEvaluator::Result::halfPrimVar( const PrimitiveVariable &pv ) const { - return primVar( pv, m_coefficients ); + return primVar( pv, m_coefficients.data() ); } template @@ -274,8 +299,8 @@ void CurvesPrimitiveEvaluator::Result::init( unsigned curveIndex, float v, const } else { - basis.coefficients( m_segmentV, m_coefficients ); - basis.derivativeCoefficients( m_segmentV, m_derivativeCoefficients ); + basis.coefficients( m_segmentV, m_coefficients.data() ); + basis.derivativeCoefficients( m_segmentV, m_derivativeCoefficients.data() ); if( periodic ) { diff --git a/src/IECoreScene/bindings/CurvesPrimitiveEvaluatorBinding.cpp b/src/IECoreScene/bindings/CurvesPrimitiveEvaluatorBinding.cpp index 1ac58c5d4b..7bca84fced 100644 --- a/src/IECoreScene/bindings/CurvesPrimitiveEvaluatorBinding.cpp +++ b/src/IECoreScene/bindings/CurvesPrimitiveEvaluatorBinding.cpp @@ -83,6 +83,30 @@ IntVectorDataPtr varyingDataOffsets( const CurvesPrimitiveEvaluator &e ) return new IntVectorData( e.varyingDataOffsets() ); } +tuple coefficients( const CurvesPrimitiveEvaluator::Result &r ) +{ + const std::array &c = r.coefficients(); + return make_tuple( c[0], c[1], c[2], c[3] ); +} + +tuple derivativeCoefficients( const CurvesPrimitiveEvaluator::Result &r ) +{ + const std::array &c = r.derivativeCoefficients(); + return make_tuple( c[0], c[1], c[2], c[3] ); +} + +tuple vertexDataIndices( const CurvesPrimitiveEvaluator::Result &r ) +{ + const std::array &o = r.vertexDataIndices(); + return make_tuple( o[0], o[1], o[2], o[3] ); +} + +tuple varyingDataIndices( const CurvesPrimitiveEvaluator::Result &r ) +{ + const std::array &o = r.varyingDataIndices(); + return make_tuple( o[0], o[1] ); +} + } // namespace ////////////////////////////////////////////////////////////////////////// @@ -233,6 +257,11 @@ void bindCurvesPrimitiveEvaluator() RefCountedClass( "Result" ) .def( "curveIndex", &CurvesPrimitiveEvaluator::Result::curveIndex ) + .def( "coefficients", &coefficients ) + .def( "derivativeCoefficients", &derivativeCoefficients ) + .def( "vertexDataIndices", &vertexDataIndices ) + .def( "varyingDataIndices", &varyingDataIndices ) + .def( "linear", &CurvesPrimitiveEvaluator::Result::linear ) ; }