Skip to content
Draft
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
5 changes: 3 additions & 2 deletions contrib/IECoreUSD/src/IECoreUSD/ShaderAlgo.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -206,6 +206,7 @@ IECore::InternedString readShaderNetworkWalk( const pxr::SdfPath &anchorPath, co
{
prefix = "ai";
}

shaderType = prefix + ":shader";
}
shaderName = name;
Expand Down Expand Up @@ -311,15 +312,15 @@ pxr::UsdShadeConnectableAPI createShaderPrim( const IECoreScene::Shader *shader,
}
const std::string type = shader->getType();
std::string typePrefix;
size_t typeColonPos = type.find( ":" );
/*size_t typeColonPos = type.find( ":" );
if( typeColonPos != std::string::npos )
{
typePrefix = type.substr( 0, typeColonPos ) + ":";
if( typePrefix == "ai:" )
{
typePrefix = "arnold:";
}
}
}*/
usdShader.SetShaderId( pxr::TfToken( typePrefix + shader->getName() ) );

return usdShader.ConnectableAPI();
Expand Down
6 changes: 4 additions & 2 deletions include/IECoreScene/ShaderNetworkAlgo.h
Original file line number Diff line number Diff line change
Expand Up @@ -148,10 +148,12 @@ IECORESCENE_API void collapseSplines( ShaderNetwork *network, std::string target
IECORESCENE_API void expandSplines( ShaderNetwork *network, std::string targetPrefix = "" );


/// \deprecated: Use collapseSplines on the whole network, which can handle input connections
/// \deprecated: Use collapseSplines on the whole network, which can handle input connections, and supports
/// different spline conventions for different renderers shader libraries
IECORESCENE_API IECore::ConstCompoundDataPtr collapseSplineParameters( const IECore::ConstCompoundDataPtr& parametersData );

/// \deprecated: Use expandSplines on the whole network, which can handle input connections
/// \deprecated: Use expandSplines on the whole network, which can handle input connections, and supports
/// different spline conventions for different renderers shader libraries
IECORESCENE_API IECore::ConstCompoundDataPtr expandSplineParameters( const IECore::ConstCompoundDataPtr& parametersData );


Expand Down
224 changes: 130 additions & 94 deletions src/IECoreScene/ShaderNetworkAlgo.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -811,8 +811,34 @@ std::pair< size_t, size_t > getEndPointDuplication( const T &basis )
return std::make_pair( 0, 0 );
}

std::tuple< const std::string*, const std::string*, const std::string* >
lookupSplinePlugSuffixes( const std::string &shaderType, const std::string &shaderName )
{
// TODO - it would make sense to check if this is an OSL shader before using the OSL shader
// translation, but the shader type isn't preserved when round tripping to USD, so that doesn't seem
// to work
//if( shaderType == "osl:shader" && boost::starts_with( shaderName, "Pxr" ) )

if( boost::starts_with( shaderName, "Pxr" ) )
{
static const std::string positions( "_Knots" );
static const std::string values( "_Colors" );
static const std::string basis( "_Interpolation" );
//return std::make_tuple<const std::string &, const std::string &, const std::string &>( positions, values, basis );
return { &positions, &values, &basis };
}
else
{
static const std::string positions( "Positions" );
static const std::string values( "Values" );
static const std::string basis( "Basis" );
//return std::make_tuple<const std::string &, const std::string &, const std::string &>( positions, values, basis );
return { &positions, &values, &basis };
}
}

template<typename Spline>
void expandSpline( const InternedString &name, const Spline &spline, CompoundDataMap &newParameters )
void expandSpline( const InternedString &name, const Spline &spline, CompoundDataMap &newParameters, const std::string &shaderType, const std::string &shaderName )
{
const char *basis = "catmull-rom";
if( spline.basis == Spline::Basis::bezier() )
Expand Down Expand Up @@ -866,9 +892,11 @@ void expandSpline( const InternedString &name, const Spline &spline, CompoundDat
}
}

newParameters[ name.string() + "Positions" ] = positionsData;
newParameters[ name.string() + "Values" ] = valuesData;
newParameters[ name.string() + "Basis" ] = new StringData( basis );
auto [ positionsSuffix, valuesSuffix, basisSuffix ] = lookupSplinePlugSuffixes( shaderType, shaderName );

newParameters[ name.string() + *positionsSuffix ] = positionsData;
newParameters[ name.string() + *valuesSuffix ] = valuesData;
newParameters[ name.string() + *basisSuffix ] = new StringData( basis );
}

template<typename SplineData>
Expand Down Expand Up @@ -929,6 +957,96 @@ IECore::DataPtr loadSpline(
return resultData;
}

void ensureParametersCopy(
const IECore::CompoundDataMap &parameters,
IECore::CompoundDataPtr &parametersDataCopy, CompoundDataMap *&parametersCopy
)
{
if( !parametersDataCopy )
{
parametersDataCopy = new CompoundData();
parametersCopy = &parametersDataCopy->writable();
*parametersCopy = parameters;
}
}

IECore::ConstCompoundDataPtr collapseSplineParametersInternal( const IECore::ConstCompoundDataPtr &parametersData, const std::string &shaderType, const std::string &shaderName )
{

auto [ positionsSuffix, valuesSuffix, basisSuffix ] = lookupSplinePlugSuffixes( shaderType, shaderName );

const CompoundDataMap &parameters( parametersData->readable() );
CompoundDataPtr newParametersData;
CompoundDataMap *newParameters = nullptr;

for( const auto &maybeBasis : parameters )
{
if( !boost::ends_with( maybeBasis.first.string(), *basisSuffix ) )
{
continue;
}
const StringData *basis = runTimeCast<const StringData>( maybeBasis.second.get() );
if( !basis )
{
continue;
}


std::string prefix = maybeBasis.first.string().substr( 0, maybeBasis.first.string().size() - basisSuffix->size() );
IECore::InternedString positionsName = prefix + *positionsSuffix;
const auto positionsIter = parameters.find( positionsName );
const FloatVectorData *floatPositions = nullptr;

if( positionsIter != parameters.end() )
{
floatPositions = runTimeCast<const FloatVectorData>( positionsIter->second.get() );
}

if( !floatPositions )
{
continue;
}

IECore::InternedString valuesName = prefix + *valuesSuffix;
const auto valuesIter = parameters.find( valuesName );

IECore::DataPtr foundSpline;
if( valuesIter != parameters.end() )
{
if( const FloatVectorData *floatValues = runTimeCast<const FloatVectorData>( valuesIter->second.get() ) )
{
foundSpline = loadSpline<SplineffData>( basis, floatPositions, floatValues );
}
else if( const Color3fVectorData *color3Values = runTimeCast<const Color3fVectorData>( valuesIter->second.get() ) )
{
foundSpline = loadSpline<SplinefColor3fData>( basis, floatPositions, color3Values );
}
else if( const Color4fVectorData *color4Values = runTimeCast<const Color4fVectorData>( valuesIter->second.get() ) )
{
foundSpline = loadSpline<SplinefColor4fData>( basis, floatPositions, color4Values );
}
}

if( foundSpline )
{
ensureParametersCopy( parameters, newParametersData, newParameters );
(*newParameters)[prefix] = foundSpline;
newParameters->erase( maybeBasis.first );
newParameters->erase( positionsName );
newParameters->erase( valuesName );
}
}

if( newParametersData )
{
return newParametersData;
}
else
{
return parametersData;
}
}

const std::string g_oslShader( "osl:shader" );

const std::string g_colorToArrayAdapter( "Utility/__ColorToArray" );
Expand Down Expand Up @@ -1003,19 +1121,6 @@ std::pair< InternedString, int > createSplineInputAdapter(
return std::make_pair( adapterHandle, getEndPointDuplication( splineData->readable().basis ).first );
}

void ensureParametersCopy(
const IECore::CompoundDataMap &parameters,
IECore::CompoundDataPtr &parametersDataCopy, CompoundDataMap *&parametersCopy
)
{
if( !parametersDataCopy )
{
parametersDataCopy = new CompoundData();
parametersCopy = &parametersDataCopy->writable();
*parametersCopy = parameters;
}
}

} // namespace

void ShaderNetworkAlgo::collapseSplines( ShaderNetwork *network, std::string targetPrefix )
Expand All @@ -1040,12 +1145,12 @@ void ShaderNetworkAlgo::collapseSplines( ShaderNetwork *network, std::string tar
}

// For nodes which aren't spline adapters, we just need to deal with any parameters that are splines
ConstCompoundDataPtr collapsed = collapseSplineParameters( shader->parametersData() );
ConstCompoundDataPtr collapsed = collapseSplineParametersInternal( shader->parametersData(), shader->getType(), shader->getName() );
if( collapsed != shader->parametersData() )
{
// \todo - this const_cast is ugly, although safe because if the return from collapseSplineParameters
// \todo - this const_cast is ugly, although safe because if the return from collapseSplineParameterInternals
// doesn't match the input, it is freshly allocated. Once collapseSplineParameters is fully
// deprecated, and no longer visible publicly, an internal version of collapseSplineParameters could
// deprecated, and no longer visible publicly, an internal version of collapseSplineParametersInternal could
// just return a non-const new parameter data, or nullptr if no changes are needed.
network->setShader( name, std::move( new Shader( shader->getName(), shader->getType(), const_cast< CompoundData *>( collapsed.get() ) ) ) );
}
Expand Down Expand Up @@ -1167,13 +1272,13 @@ void ShaderNetworkAlgo::expandSplines( ShaderNetwork *network, std::string targe
{
ensureParametersCopy( origParameters, newParametersData, newParameters );
newParameters->erase( name );
expandSpline( name, colorSpline->readable(), *newParameters );
expandSpline( name, colorSpline->readable(), *newParameters, s.second->getType(), s.second->getName() );
}
else if( const SplineffData *floatSpline = runTimeCast<const SplineffData>( value.get() ) )
{
ensureParametersCopy( origParameters, newParametersData, newParameters );
newParameters->erase( name );
expandSpline( name, floatSpline->readable(), *newParameters );
expandSpline( name, floatSpline->readable(), *newParameters, s.second->getType(), s.second->getName() );
}
}

Expand Down Expand Up @@ -1291,76 +1396,7 @@ void ShaderNetworkAlgo::expandSplines( ShaderNetwork *network, std::string targe

IECore::ConstCompoundDataPtr ShaderNetworkAlgo::collapseSplineParameters( const IECore::ConstCompoundDataPtr &parametersData )
{
const CompoundDataMap &parameters( parametersData->readable() );
CompoundDataPtr newParametersData;
CompoundDataMap *newParameters = nullptr;

for( const auto &maybeBasis : parameters )
{
if( !boost::ends_with( maybeBasis.first.string(), "Basis" ) )
{
continue;
}
const StringData *basis = runTimeCast<const StringData>( maybeBasis.second.get() );
if( !basis )
{
continue;
}


std::string prefix = maybeBasis.first.string().substr( 0, maybeBasis.first.string().size() - 5 );
IECore::InternedString positionsName = prefix + "Positions";
const auto positionsIter = parameters.find( positionsName );
const FloatVectorData *floatPositions = nullptr;

if( positionsIter != parameters.end() )
{
floatPositions = runTimeCast<const FloatVectorData>( positionsIter->second.get() );
}

if( !floatPositions )
{
continue;
}

IECore::InternedString valuesName = prefix + "Values";
const auto valuesIter = parameters.find( valuesName );

IECore::DataPtr foundSpline;
if( valuesIter != parameters.end() )
{
if( const FloatVectorData *floatValues = runTimeCast<const FloatVectorData>( valuesIter->second.get() ) )
{
foundSpline = loadSpline<SplineffData>( basis, floatPositions, floatValues );
}
else if( const Color3fVectorData *color3Values = runTimeCast<const Color3fVectorData>( valuesIter->second.get() ) )
{
foundSpline = loadSpline<SplinefColor3fData>( basis, floatPositions, color3Values );
}
else if( const Color4fVectorData *color4Values = runTimeCast<const Color4fVectorData>( valuesIter->second.get() ) )
{
foundSpline = loadSpline<SplinefColor4fData>( basis, floatPositions, color4Values );
}
}

if( foundSpline )
{
ensureParametersCopy( parameters, newParametersData, newParameters );
(*newParameters)[prefix] = foundSpline;
newParameters->erase( maybeBasis.first );
newParameters->erase( positionsName );
newParameters->erase( valuesName );
}
}

if( newParametersData )
{
return newParametersData;
}
else
{
return parametersData;
}
return collapseSplineParametersInternal( parametersData, "", "" );
}

IECore::ConstCompoundDataPtr ShaderNetworkAlgo::expandSplineParameters( const IECore::ConstCompoundDataPtr &parametersData )
Expand All @@ -1376,13 +1412,13 @@ IECore::ConstCompoundDataPtr ShaderNetworkAlgo::expandSplineParameters( const IE
{
ensureParametersCopy( parameters, newParametersData, newParameters );
newParameters->erase( i.first );
expandSpline( i.first, colorSpline->readable(), *newParameters );
expandSpline( i.first, colorSpline->readable(), *newParameters, "", "" );
}
else if( const SplineffData *floatSpline = runTimeCast<const SplineffData>( i.second.get() ) )
{
ensureParametersCopy( parameters, newParametersData, newParameters );
newParameters->erase( i.first );
expandSpline( i.first, floatSpline->readable(), *newParameters );
expandSpline( i.first, floatSpline->readable(), *newParameters, "", "" );
}
}

Expand Down
Loading