Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions Changes
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ API
---

- TypeIds : Claimed range for AtomsGaffer.
- CurvesPrimitiveEvaluator.Result : Add accessors for interpolation coefficients and data indices.

10.6.0.1 (relative to 10.6.0.0)
========
Expand Down
14 changes: 10 additions & 4 deletions include/IECoreScene/CurvesPrimitiveEvaluator.h
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@

#include "IECore/BoundedKDTree.h"

#include <array>
#include <mutex>

namespace IECoreScene
Expand Down Expand Up @@ -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<float, 4> &coefficients() const;
const std::array<float, 4> &derivativeCoefficients() const;
const std::array<unsigned, 4> &vertexDataIndices() const;
const std::array<unsigned, 2> &varyingDataIndices() const;
bool linear() const;

Imath::V3f vectorPrimVar( const PrimitiveVariable &pv ) const override;
Imath::V2f vec2PrimVar( const PrimitiveVariable &pv ) const override;
Expand All @@ -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<float, 4> m_coefficients;
std::array<float, 4> m_derivativeCoefficients;
std::array<unsigned, 4> m_vertexDataIndices;
std::array<unsigned, 2> m_varyingDataIndices;
PrimitiveVariable m_p;
bool m_linear;
InitFunction m_init;
Expand Down
45 changes: 35 additions & 10 deletions src/IECoreScene/CurvesPrimitiveEvaluator.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -136,7 +136,7 @@ T CurvesPrimitiveEvaluator::Result::primVar( const PrimitiveVariable &primVar, c

Imath::V3f CurvesPrimitiveEvaluator::Result::point() const
{
return primVar<V3f>( m_p, m_coefficients );
return primVar<V3f>( m_p, m_coefficients.data() );
}

Imath::V3f CurvesPrimitiveEvaluator::Result::normal() const
Expand All @@ -156,32 +156,57 @@ Imath::V3f CurvesPrimitiveEvaluator::Result::uTangent() const

Imath::V3f CurvesPrimitiveEvaluator::Result::vTangent() const
{
return primVar<V3f>( m_p, m_derivativeCoefficients );
return primVar<V3f>( m_p, m_derivativeCoefficients.data() );
}

unsigned CurvesPrimitiveEvaluator::Result::curveIndex() const
{
return m_curveIndex;
}

const std::array<float, 4> &CurvesPrimitiveEvaluator::Result::coefficients() const
{
return m_coefficients;
}

const std::array<float, 4> &CurvesPrimitiveEvaluator::Result::derivativeCoefficients() const
{
return m_derivativeCoefficients;
}

const std::array<unsigned, 4> &CurvesPrimitiveEvaluator::Result::vertexDataIndices() const
{
return m_vertexDataIndices;
}

const std::array<unsigned, 2> &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<V3f>( pv, m_coefficients );
return primVar<V3f>( pv, m_coefficients.data() );
}

V2f CurvesPrimitiveEvaluator::Result::vec2PrimVar( const PrimitiveVariable &pv ) const
{
return primVar<V2f>( pv, m_coefficients );
return primVar<V2f>( pv, m_coefficients.data() );
}

float CurvesPrimitiveEvaluator::Result::floatPrimVar( const PrimitiveVariable &pv ) const
{
return primVar<float>( pv, m_coefficients );
return primVar<float>( pv, m_coefficients.data() );
}

int CurvesPrimitiveEvaluator::Result::intPrimVar( const PrimitiveVariable &pv ) const
{
return primVar<int>( pv, m_coefficients );
return primVar<int>( pv, m_coefficients.data() );
}

const std::string &CurvesPrimitiveEvaluator::Result::stringPrimVar( const PrimitiveVariable &pv ) const
Expand All @@ -208,12 +233,12 @@ const std::string &CurvesPrimitiveEvaluator::Result::stringPrimVar( const Primit

Imath::Color3f CurvesPrimitiveEvaluator::Result::colorPrimVar( const PrimitiveVariable &pv ) const
{
return primVar<Color3f>( pv, m_coefficients );
return primVar<Color3f>( pv, m_coefficients.data() );
}

half CurvesPrimitiveEvaluator::Result::halfPrimVar( const PrimitiveVariable &pv ) const
{
return primVar<half>( pv, m_coefficients );
return primVar<half>( pv, m_coefficients.data() );
}

template<bool linear, bool periodic>
Expand Down Expand Up @@ -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 )
{
Expand Down
29 changes: 29 additions & 0 deletions src/IECoreScene/bindings/CurvesPrimitiveEvaluatorBinding.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -83,6 +83,30 @@ IntVectorDataPtr varyingDataOffsets( const CurvesPrimitiveEvaluator &e )
return new IntVectorData( e.varyingDataOffsets() );
}

tuple coefficients( const CurvesPrimitiveEvaluator::Result &r )
{
const std::array<float, 4> &c = r.coefficients();
return make_tuple( c[0], c[1], c[2], c[3] );
}

tuple derivativeCoefficients( const CurvesPrimitiveEvaluator::Result &r )
{
const std::array<float, 4> &c = r.derivativeCoefficients();
return make_tuple( c[0], c[1], c[2], c[3] );
}

tuple vertexDataIndices( const CurvesPrimitiveEvaluator::Result &r )
{
const std::array<unsigned, 4> &o = r.vertexDataIndices();
return make_tuple( o[0], o[1], o[2], o[3] );
}

tuple varyingDataIndices( const CurvesPrimitiveEvaluator::Result &r )
{
const std::array<unsigned, 2> &o = r.varyingDataIndices();
return make_tuple( o[0], o[1] );
}

} // namespace

//////////////////////////////////////////////////////////////////////////
Expand Down Expand Up @@ -233,6 +257,11 @@ void bindCurvesPrimitiveEvaluator()

RefCountedClass<CurvesPrimitiveEvaluator::Result, PrimitiveEvaluator::Result>( "Result" )
.def( "curveIndex", &CurvesPrimitiveEvaluator::Result::curveIndex )
.def( "coefficients", &coefficients )
.def( "derivativeCoefficients", &derivativeCoefficients )
.def( "vertexDataIndices", &vertexDataIndices )
.def( "varyingDataIndices", &varyingDataIndices )
.def( "linear", &CurvesPrimitiveEvaluator::Result::linear )
;

}
Expand Down
Loading