コード例 #1
0
ファイル: ImageNode.cpp プロジェクト: HughMacdonald/gaffer
void ImageNode::compute( ValuePlug *output, const Context *context ) const
{
	ImagePlug *imagePlug = output->parent<ImagePlug>();
	if( !imagePlug )
	{
		ComputeNode::compute( output, context );
		return;
	}

	// we're computing part of an ImagePlug

	if( !enabled() )
	{
		// disabled nodes just output a default black image.
		output->setToDefault();
		return;
	}

	// node is enabled - defer to our derived classes to perform the appropriate computation

	if( output == imagePlug->formatPlug() )
	{
		static_cast<AtomicFormatPlug *>( output )->setValue(
			computeFormat( context, imagePlug )
		);
	}
	else if( output == imagePlug->dataWindowPlug() )
	{
		static_cast<AtomicBox2iPlug *>( output )->setValue(
			computeDataWindow( context, imagePlug )
		);
	}
	else if( output == imagePlug->metadataPlug() )
	{
		static_cast<CompoundObjectPlug *>( output )->setValue(
			computeMetadata( context, imagePlug )
		);
	}
	else if( output == imagePlug->channelNamesPlug() )
	{
		static_cast<StringVectorDataPlug *>( output )->setValue(
			computeChannelNames( context, imagePlug )
		);
	}
	else if( output == imagePlug->channelDataPlug() )
	{
		std::string channelName = context->get<string>( ImagePlug::channelNameContextName );
		if( channelEnabled( channelName ) )
		{
			V2i tileOrigin = context->get<V2i>( ImagePlug::tileOriginContextName );
			if( tileOrigin.x % ImagePlug::tileSize() || tileOrigin.y % ImagePlug::tileSize() )
			{
				throw Exception( "The image:tileOrigin must be a multiple of ImagePlug::tileSize()" );
			}
			static_cast<FloatVectorDataPlug *>( output )->setValue(
				computeChannelData( channelName, tileOrigin, context, imagePlug )
			);
		}
		else
		{
			output->setToDefault();
		}
	}
}