@@ -129,10 +129,10 @@ const InternedString g_swizzleHandle( "swizzle" );
129129const InternedString g_packHandle ( " pack" );
130130const InternedString g_inParameterName ( " in" );
131131const InternedString g_outParameterName ( " out" );
132- const InternedString g_packInParameterNames[3 ] = { " in1" , " in2" , " in3" };
133- const boost::regex g_componentRegex ( " ^(.*)\\ .([rgbxyz ])$" );
134- static const char *g_vectorComponents[3 ] = { " x" , " y" , " z" };
135- static const char *g_colorComponents[3 ] = { " r" , " g" , " b" };
132+ const InternedString g_packInParameterNames[4 ] = { " in1" , " in2" , " in3" , " in4 " };
133+ const boost::regex g_componentRegex ( " ^(.*)\\ .([rgbaxyz ])$" );
134+ const char *g_vectorComponents[3 ] = { " x" , " y" , " z" };
135+ const char *g_colorComponents[4 ] = { " r" , " g" , " b" , " a " };
136136
137137ShaderNetwork::Parameter convertComponentSuffix ( const ShaderNetwork::Parameter ¶meter, const std::string &suffix )
138138{
@@ -240,22 +240,26 @@ void ShaderNetworkAlgo::addComponentConnectionAdapters( ShaderNetwork *network,
240240
241241 // All components won't necessarily have connections, so get
242242 // the values to fall back on for those that don't.
243- V3f value ( 0 );
243+ Color4f value ( 0 );
244244 const Data *d = shader.second ->parametersData ()->member <Data>( parameterName );
245245 if ( const V3fData *vd = runTimeCast<const V3fData>( d ) )
246246 {
247- value = vd->readable ();
247+ value = Color4f ( vd->readable ()[ 0 ], vd-> readable ()[ 1 ], vd-> readable ()[ 2 ], 0 . 0f );
248248 }
249249 else if ( const Color3fData *cd = runTimeCast<const Color3fData>( d ) )
250250 {
251- value = cd->readable ();
251+ value = Color4f ( cd->readable ()[0 ], cd->readable ()[1 ], cd->readable ()[2 ], 0 .0f );
252+ }
253+ else if ( auto c4d = runTimeCast<const Color4fData>( d ) )
254+ {
255+ value = c4d->readable ();
252256 }
253257
254258 // Make shader and set fallback values
255259
256260 ShaderPtr packShader = new Shader ( " MaterialX/mx_pack_color" , " osl:shader" );
257261 packShader->blindData ()->writable ()[ componentConnectionAdapterLabel () ] = g_trueData;
258- for ( int i = 0 ; i < 3 ; ++i )
262+ for ( int i = 0 ; i < 4 ; ++i )
259263 {
260264 packShader->parameters ()[g_packInParameterNames[i]] = new FloatData ( value[i] );
261265 }
@@ -266,12 +270,12 @@ void ShaderNetworkAlgo::addComponentConnectionAdapters( ShaderNetwork *network,
266270
267271 network->addConnection ( { { packHandle, g_outParameterName }, { shader.first , parameterName } } );
268272
269- for ( int i = 0 ; i < 3 ; ++i )
273+ for ( int i = 0 ; i < 4 ; ++i )
270274 {
271- ShaderNetwork::Parameter source = network->input ( { shader.first , parameterName.string () + " ." + g_vectorComponents [i] } );
272- if ( !source )
275+ ShaderNetwork::Parameter source = network->input ( { shader.first , parameterName.string () + " ." + g_colorComponents [i] } );
276+ if ( !source && i < 3 )
273277 {
274- source = network->input ( { shader.first , parameterName.string () + " ." + g_colorComponents [i] } );
278+ source = network->input ( { shader.first , parameterName.string () + " ." + g_vectorComponents [i] } );
275279 }
276280 if ( source )
277281 {
@@ -330,7 +334,7 @@ void ShaderNetworkAlgo::removeComponentConnectionAdapters( ShaderNetwork *networ
330334 {
331335 const IECore::InternedString &inputName = inputIt->destination .name ;
332336 int inputIndex = -1 ;
333- for ( int i = 0 ; i < 3 ; i++ )
337+ for ( int i = 0 ; i < 4 ; i++ )
334338 {
335339 if ( inputName == g_packInParameterNames[i] )
336340 {
@@ -348,7 +352,10 @@ void ShaderNetworkAlgo::removeComponentConnectionAdapters( ShaderNetwork *networ
348352 }
349353
350354 ShaderNetwork::Parameter componentDest;
351- if ( targetShader->parametersData ()->member <Color3fData>( connection.destination .name ) )
355+ if (
356+ targetShader->parametersData ()->member <Color4fData>( connection.destination .name ) ||
357+ targetShader->parametersData ()->member <Color3fData>( connection.destination .name )
358+ )
352359 {
353360 componentDest = { connection.destination .shader , IECore::InternedString ( connection.destination .name .string () + " ." + g_colorComponents[inputIndex] ) };
354361 }
@@ -360,7 +367,7 @@ void ShaderNetworkAlgo::removeComponentConnectionAdapters( ShaderNetwork *networ
360367 {
361368 throw IECore::Exception ( boost::str (
362369 boost::format (
363- " removeComponentConnectionAdapters : Unrecognized type for targe parameter \" %1%.%2%\" "
370+ " removeComponentConnectionAdapters : Unrecognized type for target parameter \" %1%.%2%\" "
364371 ) % connection.destination .shader .string () % connection.destination .name .string ()
365372 ) );
366373 }
0 commit comments