Esempio n. 1
0
 public static extern void FNA3D_SetBlendState(
     IntPtr device,
     ref FNA3D_BlendState blendState
     );
Esempio n. 2
0
        //
        // FNA3D_SetBlendState
        //

        public static void FNA3D_SetBlendState(IntPtr device, ref FNA3D_BlendState blendState)
        {
            var input    = blendState;
            var renderer = Renderer.Get(device);

            Renderer.Get(device).Send(false, () =>
            {
                var state = (State)renderer.UserData;

                if (input.colorSourceBlend != Blend.One ||
                    input.colorDestinationBlend != Blend.Zero ||
                    input.alphaSourceBlend != Blend.One ||
                    input.alphaDestinationBlend != Blend.Zero)
                {
                    //
                    // blend state
                    //

                    if (!state.BlendEnable)
                    {
                        state.BlendEnable = true;
                        GLES20.glEnable(GLES20.GL_BLEND);
                    }

                    //
                    // XNA blend factor / GL blend color
                    //

                    if (input.blendFactor != state.BlendColor)
                    {
                        state.BlendColor = input.blendFactor;

                        GLES20.glBlendColor(state.BlendColor.R / 255f, state.BlendColor.G / 255f,
                                            state.BlendColor.B / 255f, state.BlendColor.A / 255f);
                    }

                    //
                    // XNA blend mode / GL blend function
                    //

                    if (input.colorSourceBlend != state.BlendSrcColor ||
                        input.colorDestinationBlend != state.BlendDstColor ||
                        input.alphaSourceBlend != state.BlendSrcAlpha ||
                        input.alphaDestinationBlend != state.BlendDstAlpha)
                    {
                        state.BlendSrcColor = input.colorSourceBlend;
                        state.BlendDstColor = input.colorDestinationBlend;
                        state.BlendSrcAlpha = input.alphaSourceBlend;
                        state.BlendDstAlpha = input.alphaDestinationBlend;

                        GLES20.glBlendFuncSeparate(
                            BlendModeToBlendFunc[(int)state.BlendSrcColor],
                            BlendModeToBlendFunc[(int)state.BlendDstColor],
                            BlendModeToBlendFunc[(int)state.BlendSrcAlpha],
                            BlendModeToBlendFunc[(int)state.BlendDstAlpha]);
                    }

                    //
                    // XNA blend function / GL blend equation
                    //

                    if (input.colorBlendFunction != state.BlendFuncColor ||
                        input.alphaBlendFunction != state.BlendFuncAlpha)
                    {
                        state.BlendFuncColor = input.colorBlendFunction;
                        state.BlendFuncAlpha = input.alphaBlendFunction;

                        GLES20.glBlendEquationSeparate(
                            BlendFunctionToBlendEquation[(int)state.BlendFuncColor],
                            BlendFunctionToBlendEquation[(int)state.BlendFuncAlpha]);
                    }

                    //
                    // color write mask
                    //

                    bool inputRed   = ((input.colorWriteEnable & ColorWriteChannels.Red) != 0);
                    bool inputGreen = ((input.colorWriteEnable & ColorWriteChannels.Green) != 0);
                    bool inputBlue  = ((input.colorWriteEnable & ColorWriteChannels.Blue) != 0);
                    bool inputAlpha = ((input.colorWriteEnable & ColorWriteChannels.Alpha) != 0);
                    var WriteMask   = state.WriteMask;

                    if (inputRed != ((WriteMask & RED_MASK) != 0) ||
                        inputGreen != ((WriteMask & GREEN_MASK) != 0) ||
                        inputBlue != ((WriteMask & BLUE_MASK) != 0) ||
                        inputAlpha != ((WriteMask & ALPHA_MASK) != 0))
                    {
                        state.WriteMask = (inputRed   ? RED_MASK   : 0)
                                          | (inputGreen ? GREEN_MASK : 0)
                                          | (inputBlue  ? BLUE_MASK  : 0)
                                          | (inputAlpha ? ALPHA_MASK : 0);

                        GLES20.glColorMask(inputRed, inputGreen, inputBlue, inputAlpha);
                    }
                }
                else
                {
                    state.BlendEnable = false;
                    GLES20.glDisable(GLES20.GL_BLEND);
                }
            });
        }