Subversion Repositories AndroidProjects

Rev

Blame | Last modification | View Log | RSS feed

package com.gebauz.bauzoid.graphics.renderstates;

import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.graphics.GL20;

/** Manages renderstates for blending. */
public class BlendingStates extends RenderStatesObject
{
       
        public enum BlendingMode
        {
                ADD,
                ALPHABLEND,
                SUBTRACT,
//              MIN,    // unsupported on OpenGL ES
//              MAX,    // unsupported on OpenGL ES
                MULTIPLY
        };
       
        private boolean mEnabled = false;
        private BlendingMode mBlendingMode = BlendingMode.ALPHABLEND;
        private boolean mCurrentlyEnabled = false;
        private BlendingMode mCurrentBlendingMode = BlendingMode.ALPHABLEND;
        private boolean mDefaultEnabled = false;
        private BlendingMode mDefaultBlendingMode = BlendingMode.ALPHABLEND;
       
        /** Constructor. */
        public BlendingStates(RenderStates renderStates)
        {
                super(renderStates);
        }

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

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

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