void AlphaOverNode::convertToOperations(NodeConverter &converter, const CompositorContext &/*context*/) const
{
	NodeInput *color1Socket = this->getInputSocket(1);
	NodeInput *color2Socket = this->getInputSocket(2);
	bNode *editorNode = this->getbNode();

	MixBaseOperation *convertProg;
	NodeTwoFloats *ntf = (NodeTwoFloats *)editorNode->storage;
	if (ntf->x != 0.0f) {
		AlphaOverMixedOperation *mixOperation  = new AlphaOverMixedOperation();
		mixOperation->setX(ntf->x);
		convertProg = mixOperation;

	}
	else if (editorNode->custom1) {
		convertProg = new AlphaOverKeyOperation();
	}
	else {
		convertProg = new AlphaOverPremultiplyOperation();
	}

	convertProg->setUseValueAlphaMultiply(false);
	if (color1Socket->isLinked()) {
		convertProg->setResolutionInputSocketIndex(1);
	}
	else if (color2Socket->isLinked()) {
		convertProg->setResolutionInputSocketIndex(2);
	}
	else {
		convertProg->setResolutionInputSocketIndex(0);
	}

	converter.addOperation(convertProg);
	converter.mapInputSocket(getInputSocket(0), convertProg->getInputSocket(0));
	converter.mapInputSocket(getInputSocket(1), convertProg->getInputSocket(1));
	converter.mapInputSocket(getInputSocket(2), convertProg->getInputSocket(2));
	converter.mapOutputSocket(getOutputSocket(0), convertProg->getOutputSocket(0));
}
void MixNode::convertToOperations(ExecutionSystem *graph, CompositorContext *context)
{
	InputSocket *valueSocket = this->getInputSocket(0);
	InputSocket *color1Socket = this->getInputSocket(1);
	InputSocket *color2Socket = this->getInputSocket(2);
	OutputSocket *outputSocket = this->getOutputSocket(0);
	bNode *editorNode = this->getbNode();
	bool useAlphaPremultiply = this->getbNode()->custom2 & 1;
	bool useClamp = this->getbNode()->custom2 & 2;
	
	MixBaseOperation *convertProg;
	
	switch (editorNode->custom1) {
		case MA_RAMP_ADD:
			convertProg = new MixAddOperation();
			break;
		case MA_RAMP_MULT:
			convertProg = new MixMultiplyOperation();
			break;
		case MA_RAMP_LIGHT:
			convertProg = new MixLightenOperation();
			break;
		case MA_RAMP_BURN:
			convertProg = new MixBurnOperation();
			break;
		case MA_RAMP_HUE:
			convertProg = new MixHueOperation();
			break;
		case MA_RAMP_COLOR:
			convertProg = new MixColorOperation();
			break;
		case MA_RAMP_SOFT:
			convertProg = new MixSoftLightOperation();
			break;
		case MA_RAMP_SCREEN:
			convertProg = new MixScreenOperation();
			break;
		case MA_RAMP_LINEAR:
			convertProg = new MixLinearLightOperation();
			break;
		case MA_RAMP_DIFF:
			convertProg = new MixDifferenceOperation();
			break;
		case MA_RAMP_SAT:
			convertProg = new MixSaturationOperation();
			break;
		case MA_RAMP_DIV:
			convertProg = new MixDivideOperation();
			break;
		case MA_RAMP_SUB:
			convertProg = new MixSubtractOperation();
			break;
		case MA_RAMP_DARK:
			convertProg = new MixDarkenOperation();
			break;
		case MA_RAMP_OVERLAY:
			convertProg = new MixOverlayOperation();
			break;
		case MA_RAMP_VAL:
			convertProg = new MixValueOperation();
			break;
		case MA_RAMP_DODGE:
			convertProg = new MixDodgeOperation();
			break;

		case MA_RAMP_BLEND:
		default:
			convertProg = new MixBlendOperation();
			break;
	}
	convertProg->setUseValueAlphaMultiply(useAlphaPremultiply);
	convertProg->setUseClamp(useClamp);

	if (color1Socket->isConnected()) {
		convertProg->setResolutionInputSocketIndex(1);
	}
	else {
		if (color2Socket->isConnected())
			convertProg->setResolutionInputSocketIndex(2);
		else
			convertProg->setResolutionInputSocketIndex(0);
	}

	valueSocket->relinkConnections(convertProg->getInputSocket(0), 0, graph);
	color1Socket->relinkConnections(convertProg->getInputSocket(1), 1, graph);
	color2Socket->relinkConnections(convertProg->getInputSocket(2), 2, graph);
	outputSocket->relinkConnections(convertProg->getOutputSocket(0));
	addPreviewOperation(graph, context, convertProg->getOutputSocket(0));
	
	convertProg->getInputSocket(2)->setResizeMode(color2Socket->getResizeMode());
	
	graph->addOperation(convertProg);
}
void MixNode::convertToOperations(NodeConverter &converter, const CompositorContext &/*context*/) const
{
	NodeInput *valueSocket = this->getInputSocket(0);
	NodeInput *color1Socket = this->getInputSocket(1);
	NodeInput *color2Socket = this->getInputSocket(2);
	NodeOutput *outputSocket = this->getOutputSocket(0);
	bNode *editorNode = this->getbNode();
	bool useAlphaPremultiply = (this->getbNode()->custom2 & 1) != 0;
	bool useClamp = (this->getbNode()->custom2 & 2) != 0;

	MixBaseOperation *convertProg;
	switch (editorNode->custom1) {
		case MA_RAMP_ADD:
			convertProg = new MixAddOperation();
			break;
		case MA_RAMP_MULT:
			convertProg = new MixMultiplyOperation();
			break;
		case MA_RAMP_LIGHT:
			convertProg = new MixLightenOperation();
			break;
		case MA_RAMP_BURN:
			convertProg = new MixBurnOperation();
			break;
		case MA_RAMP_HUE:
			convertProg = new MixHueOperation();
			break;
		case MA_RAMP_COLOR:
			convertProg = new MixColorOperation();
			break;
		case MA_RAMP_SOFT:
			convertProg = new MixSoftLightOperation();
			break;
		case MA_RAMP_SCREEN:
			convertProg = new MixScreenOperation();
			break;
		case MA_RAMP_LINEAR:
			convertProg = new MixLinearLightOperation();
			break;
		case MA_RAMP_DIFF:
			convertProg = new MixDifferenceOperation();
			break;
		case MA_RAMP_SAT:
			convertProg = new MixSaturationOperation();
			break;
		case MA_RAMP_DIV:
			convertProg = new MixDivideOperation();
			break;
		case MA_RAMP_SUB:
			convertProg = new MixSubtractOperation();
			break;
		case MA_RAMP_DARK:
			convertProg = new MixDarkenOperation();
			break;
		case MA_RAMP_OVERLAY:
			convertProg = new MixOverlayOperation();
			break;
		case MA_RAMP_VAL:
			convertProg = new MixValueOperation();
			break;
		case MA_RAMP_DODGE:
			convertProg = new MixDodgeOperation();
			break;

		case MA_RAMP_BLEND:
		default:
			convertProg = new MixBlendOperation();
			break;
	}
	convertProg->setUseValueAlphaMultiply(useAlphaPremultiply);
	convertProg->setUseClamp(useClamp);
	converter.addOperation(convertProg);

	converter.mapInputSocket(valueSocket, convertProg->getInputSocket(0));
	converter.mapInputSocket(color1Socket, convertProg->getInputSocket(1));
	converter.mapInputSocket(color2Socket, convertProg->getInputSocket(2));
	converter.mapOutputSocket(outputSocket, convertProg->getOutputSocket(0));

	converter.addPreview(convertProg->getOutputSocket(0));
}