private void PrepareState_Blend(GpuStateStruct* GpuState)
{
var BlendingState = &GpuState->BlendingState;
if (!GL.EnableDisable(GL.GL_BLEND, BlendingState->Enabled))
{
return;
}
//Console.WriteLine("Blend!");
var OpenglFunctionSource = OpenglGpuImplConversionTables.BlendFuncSrcTranslate[(int)BlendingState->FunctionSource];
//var OpenglFunctionDestination = BlendFuncDstTranslate[(int)BlendingState->FunctionDestination];
var OpenglFunctionDestination = OpenglGpuImplConversionTables.BlendFuncSrcTranslate[(int)BlendingState->FunctionDestination];
Func<ColorfStruct, int> getBlendFix = (Color) =>
{
if (Color.IsColorf(0, 0, 0)) return GL.GL_ZERO;
if (Color.IsColorf(1, 1, 1)) return GL.GL_ONE;
return GL.GL_CONSTANT_COLOR;
};
if (BlendingState->FunctionSource == GuBlendingFactorSource.GU_FIX)
{
OpenglFunctionSource = getBlendFix(BlendingState->FixColorSource);
}
if (BlendingState->FunctionDestination == GuBlendingFactorDestination.GU_FIX)
{
if (((int)OpenglFunctionSource == GL.GL_CONSTANT_COLOR) && (BlendingState->FixColorSource + BlendingState->FixColorDestination).IsColorf(1, 1, 1))
{
OpenglFunctionDestination = GL.GL_ONE_MINUS_CONSTANT_COLOR;
}
else
{
OpenglFunctionDestination = getBlendFix(BlendingState->FixColorDestination);
}
}
//Console.WriteLine("{0}, {1}", OpenglFunctionSource, OpenglFunctionDestination);
var OpenglBlendEquation = OpenglGpuImplConversionTables.BlendEquationTranslate[(int)BlendingState->Equation];
/*
Console.WriteLine(
"{0} : {1} -> {2}",
OpenglBlendEquation, OpenglFunctionSource, OpenglFunctionDestination
);
*/
GL.glBlendEquation(OpenglBlendEquation);
GL.glBlendFunc(OpenglFunctionSource, OpenglFunctionDestination);
GL.glBlendColor(
BlendingState->FixColorDestination.Red,
BlendingState->FixColorDestination.Green,
BlendingState->FixColorDestination.Blue,
BlendingState->FixColorDestination.Alpha
);
}