void AppleseedLight::setupPlugs( const std::string &shaderName, const asf::DictionaryArray &metadata )
{
	bool needsRadianceTexture = shaderName.find( "map" ) != std::string::npos;

	for( size_t i = 0, e = metadata.size(); i < e; ++i )
	{
		const asf::Dictionary &inputMetadata = metadata[i];
		std::string inputName = inputMetadata.get( "name" );
		std::string inputType = inputMetadata.get( "type" );

		Gaffer::Plug *plug = nullptr;

		// some environment lights need their radiance color input
		// replaced by a texture input: latlong map and mirrorball map.
		if( needsRadianceTexture && inputName == "radiance" )
		{
			plug = new Gaffer::StringPlug( "radiance_map", Gaffer::Plug::In );
		}
		else
		{
			if( inputType == "numeric" )
			{
				float defaultValue = inputMetadata.get<float>( "default" );
				float minValue = get_min_max_value( inputMetadata, "min" );
				float maxValue = get_min_max_value( inputMetadata, "max" );
				plug = new Gaffer::FloatPlug( inputName, Gaffer::Plug::In, defaultValue, minValue, maxValue );
			}
			else if( inputType == "colormap" )
			{
				// override the plug type for the exposure param (usually it's a color in appleseed).
				if ( inputName == "exposure" )
				{
					plug = new Gaffer::FloatPlug( inputName, Gaffer::Plug::In, 0.0f );
				}
				// multiplier inputs make more sense in Gaffer as float plugs.
				else if( inputName.find( "multiplier" ) != std::string::npos )
				{
					plug = new Gaffer::FloatPlug( inputName, Gaffer::Plug::In, 1.0f, 0.0f );
				}
				else
				{
					plug = new Gaffer::Color3fPlug( inputName, Gaffer::Plug::In, Imath::Color3f( 1.0f ) );
				}
			}
			else if( inputType == "boolean" )
			{
				bool defaultValue = strcmp( inputMetadata.get( "default" ), "true" ) == 0;
				plug = new Gaffer::BoolPlug( inputName, Gaffer::Plug::In, defaultValue );
			}
			// text are non-texturable float inputs.
			else if( inputType == "text" )
			{
				float defaultValue = inputMetadata.get<float>( "default" );
				plug = new Gaffer::FloatPlug( inputName, Gaffer::Plug::In, defaultValue );
			}
		}

		if( plug )
		{
			plug->setFlags( Gaffer::Plug::Dynamic, true );
			parametersPlug()->addChild( plug );
		}
	}
}
void AppleseedLight::setupPlugs( const std::string &shaderName, const asf::DictionaryArray &metadata )
{
	bool needsRadianceTexture = shaderName.find( "map" ) != std::string::npos;

	for( size_t i = 0, e = metadata.size(); i < e; ++i )
	{
		const asf::Dictionary &inputMetadata = metadata[i];
		std::string inputName = inputMetadata.get( "name" );
		std::string inputType = inputMetadata.get( "type" );

		Gaffer::Plug *plug = 0;

		// some environment lights need their radiance color input
		// replaced by a texture input: latlong map and mirrorball map.
		if( needsRadianceTexture && inputName == "radiance" )
		{
			plug = new Gaffer::StringPlug( "radiance_map", Gaffer::Plug::In );
		}
		else
		{
			if( inputType == "numeric" )
			{
				float defaultValue = boost::lexical_cast<float>( inputMetadata.get( "default" ) );
				float minValue = boost::lexical_cast<float>( inputMetadata.get( "min_value" ) );
				float maxValue = boost::lexical_cast<float>( inputMetadata.get( "max_value" ) );
				plug = new Gaffer::FloatPlug( inputName, Gaffer::Plug::In, defaultValue, minValue, maxValue );
			}
			else if( inputType == "colormap" )
			{
				// multiplier inputs make more sense is Gaffer as float plugs.
				if( inputName.find( "multiplier" ) != std::string::npos )
				{
					plug = new Gaffer::FloatPlug( inputName, Gaffer::Plug::In, 1.0f, 0.0f );
				}
				else
				{
					plug = new Gaffer::Color3fPlug( inputName, Gaffer::Plug::In, Imath::Color3f( 1.0f ) );
				}
			}
			else if( inputType == "boolean" )
			{
				bool defaultValue = strcmp( inputMetadata.get( "default" ), "true" ) == 0;
				plug = new Gaffer::BoolPlug( inputName, Gaffer::Plug::In, defaultValue );
			}
			// text are non-texturable float inputs.
			else if( inputType == "text" )
			{
				float defaultValue = boost::lexical_cast<float>( inputMetadata.get( "default" ) );
				plug = new Gaffer::FloatPlug( inputName, Gaffer::Plug::In, defaultValue );
			}
			// entity represent connections between entities that can work together,
			// like the sky environments and the sun light.
			else if( inputType == "entity" )
			{
				plug = new Gaffer::StringPlug( inputName, Gaffer::Plug::In );
			}
		}

		if( plug )
		{
			plug->setFlags( Gaffer::Plug::Dynamic, true );
			parametersPlug()->addChild( plug );
		}
	}
}