Subversion Repositories AndroidProjects

Rev

Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

using Tao.OpenGl;

namespace BauzoidNET.graphics.renderstates
{
    public class BlendingStates : RenderStatesObject
    {
        public enum BlendingMode
            {
                    ADD,
                    ALPHABLEND,
                    SUBTRACT,
    //          MIN,    // unsupported on OpenGL ES
    //          MAX,    // unsupported on OpenGL ES
                    MULTIPLY
            };
       
            private bool mEnabled = false;
            private BlendingMode mBlendingMode = BlendingMode.ALPHABLEND;
            private bool mCurrentlyEnabled = false;
            private BlendingMode mCurrentBlendingMode = BlendingMode.ALPHABLEND;
            private bool mDefaultEnabled = false;
            private BlendingMode mDefaultBlendingMode = BlendingMode.ALPHABLEND;
       
            /** Constructor. */
            public BlendingStates(RenderStates renderStates) : base(renderStates)
            {
            }

            /** Activate the render state. Manages multiple same-state changes. */
            public override void activate(bool force)
            {
                    if ((force) || (mBlendingMode != mCurrentBlendingMode))
                    {
                            mCurrentBlendingMode = mBlendingMode;
                            switch (mBlendingMode)
                            {
                            case BlendingMode.ADD:
                                    {
                                            Gl.glBlendFunc(Gl.GL_SRC_ALPHA, Gl.GL_ONE);
                                            break;
                                    }
                            case BlendingMode.ALPHABLEND:
                                    {
                                            Gl.glBlendFunc(Gl.GL_SRC_ALPHA, Gl.GL_ONE_MINUS_SRC_ALPHA);
                                            break;
                                    }
                            case BlendingMode.SUBTRACT:
                                    {
                                            Gl.glBlendFunc(Gl.GL_ZERO, Gl.GL_SRC_ALPHA);
                                            break;
                                    }
                            case BlendingMode.MULTIPLY:
                                    {
                                            Gl.glBlendFunc(Gl.GL_ZERO, Gl.GL_SRC_COLOR);
                                            break;
                                    }
                            }
                    }

                    if ((force) || (mEnabled != mCurrentlyEnabled))
                    {
                            mCurrentlyEnabled = mEnabled;
                            if (mEnabled)
                            {
                                    Gl.glEnable(Gl.GL_BLEND);
                            }
                            else
                            {
                                    Gl.glDisable(Gl.GL_BLEND);
                            }
                    }
            }

            /** Reset to default values. */
        public override void reset()
            {  
                    if ((mLocked) || (mRenderStates.isLocked()))
                            return;
                    mEnabled = mDefaultEnabled;
                    mBlendingMode = mDefaultBlendingMode;
            }  
       
            /** Check if blending is enabled. */
            public bool isEnabled()
            {
                    return mEnabled;
            }
       
            /** Check if blending is enabled by default. */
            public bool isDefaultEnabled()
            {
                    return mEnabled;
            }
       
            /** Check blending mode. */
            public BlendingMode getBlendingMode()
            {
                    return mBlendingMode;
            }
       
            /** Check default blending mode. */
            public BlendingMode getDefaultBlendingMode()
            {
                    return mDefaultBlendingMode;
            }
       
            /** Set enabled state. */
            public void setEnabled(bool value)
            {
                    if ((mLocked) || (mRenderStates.isLocked()))
                            return;
               
                    mEnabled = value;
            }
       
            /** Set default enabled state. */
            public void setDefaultEnabled(bool value)
            {
                    if ((mLocked) || (mRenderStates.isLocked()))
                            return;
               
                    mDefaultEnabled = value;
            }
       
            /** Set blending mode. */
            public void setBlendingMode(BlendingMode value)
            {
                    if ((mLocked) || (mRenderStates.isLocked()))
                            return;
               
                    mBlendingMode = value;
            }
       
            /** Set default blending mode. */
            public void setDefaultBlendingMode(BlendingMode value)
            {
                    if ((mLocked) || (mRenderStates.isLocked()))
                            return;
               
                    mDefaultBlendingMode = value;
            }
       
    }
}