Subversion Repositories AndroidProjects

Rev

Blame | Last modification | View Log | RSS feed

package com.gebauz.bauzoid.graphics.shader;

import com.badlogic.gdx.graphics.Texture;
import com.gebauz.bauzoid.graphics.Graphics;
import com.gebauz.bauzoid.graphics.GraphicsObject;
import com.gebauz.bauzoid.math.Vector2;
import com.gebauz.bauzoid.math.Vector3;
import com.gebauz.bauzoid.math.Vector4;

/** An effect containing shaders, variables, render states, techniques. */
public class Effect extends GraphicsObject
{
        //================================= Effect Variables ======================================================
       
        /** Effect variable base class. */
        public abstract class Variable
        {
                public static final int TYPE_TEXTURE2D = 0;
                public static final int TYPE_TEXTURE3D = 1; // not supported on Android
                public static final int TYPE_TEXTURECUBE = 2;
                public static final int TYPE_BOOL = 3;
                public static final int TYPE_INT = 4;
                public static final int TYPE_FLOAT = 5;
                public static final int TYPE_VECTOR2 = 6;
                public static final int TYPE_VECTOR3 = 7;
                public static final int TYPE_VECTOR4 = 8;
               
                private String mName;
                private int mType;
               
                /** Constructor. */
                public Variable(String name, int type)
                {
                        mType = type;
                        mName = name;                  
                }
               
                /** Destroy internal resources (if any). */
                public void dispose() {}
               
                /** Obtain name. */
                public final String getName()
                {
                        return mName;
                }
               
                /** Apply to uniform handle. */
                public abstract void apply(ShaderUniform uniform);
               
                /** Return type of Variable. */
                public final int getType()
                {
                        return mType;
                }
        }
       
        /** Effect variable for texture. */
        public class VariableTexture extends Variable
        {
                private Texture mTexture = null;
                private int mTextureStage = 0;
               
                /** Constructor. */
                public VariableTexture(String name, Texture texture)
                {
                        super(name, TYPE_TEXTURE2D);
                        mTexture = texture;
                }
               
                /** Destroy internal texture. */
                public void dispose()
                {
                        if (mTexture != null)
                        {
                                mTexture.dispose();
                                mTexture = null;
                        }
                }
               
                /** Apply to shader uniform. */
                public void apply(ShaderUniform uniform)
                {
                        uniform.set(mTextureStage);
                        getRenderStates().getTextureStage(mTextureStage).bindTexture(mTexture);        
                }
               
                /** Set the texture stage used. */
                public final void setTextureStage(int stage)
                {
                        mTextureStage = stage;
                }
        }
       
        /** Effect variable for bool value. */
        public class VariableBool extends Variable
        {
                private boolean mValue = false;
               
                public VariableBool(String name, boolean value)
                {
                        super(name, TYPE_BOOL);
                        mValue = value;
                }
               
                public void apply(ShaderUniform uniform)
                {
                        uniform.set(mValue);
                }
        }
       
        /** Effect variable for integer value. */
        public class VariableInt extends Variable
        {
                private int mValue = 0;
               
                public VariableInt(String name, int value)
                {
                        super(name, TYPE_INT);
                        mValue = value;
                }
               
                public void apply(ShaderUniform uniform)
                {
                        uniform.set(mValue);
                }
        }
       
        /** Effect variable for float value. */
        public class VariableFloat extends Variable
        {
                private float mValue = 0.0f;
               
                public VariableFloat(String name, float value)
                {
                        super(name, TYPE_FLOAT);
                        mValue = value;
                }
               
                public void apply(ShaderUniform uniform)
                {
                        uniform.set(mValue);
                }
        }
       
        /** Effect variable for Vector2 value. */
        public class VariableVector2 extends Variable
        {
                private Vector2 mValue;
               
                public VariableVector2(String name, Vector2 v2)
                {
                        super(name, TYPE_VECTOR2);
                        mValue = v2;
                }
               
                public void apply(ShaderUniform uniform)
                {
                        uniform.set(mValue);
                }
        }
       
        /** Effect variable for Vector3 value. */
        public class VariableVector3 extends Variable
        {
                private Vector3 mValue;
               
                public VariableVector3(String name, Vector3 value)
                {
                        super(name, TYPE_VECTOR3);
                        mValue = value;
                }
               
                public void apply(ShaderUniform uniform)
                {
                        uniform.set(mValue);
                }
        }

        /** Effect variable for Vector4 value. */
        public class VariableVector4 extends Variable
        {
                private Vector4 mValue;
               
                public VariableVector4(String name, Vector4 value)
                {
                        super(name, TYPE_VECTOR4);
                        mValue = value;
                }
               
                public void apply(ShaderUniform uniform)
                {
                        uniform.set(mValue);
                }
        }
       
        //================================= Effect class implementation ======================================================
       
        private Technique[] mTechniques = null;
        private Variable[] mVariables = null;
       
        /** Constructor. */
        public Effect(Graphics graphics, String name)
        {
                super(graphics);
               
        }
       
        /** Dispose techniques. */
        public void dispose()
        {
                clearTechniques();
                clearVariables();
        }
       
       
        /** Connect variables to techniques after techs/vars have been set. */
        public void connectVariables()
        {
                if ((mTechniques == null) || (mVariables == null))
                        return;
               
                for (Technique tech : mTechniques)
                {
                        tech.connectVariables();
                }
        }
       
        /** Set the techniques. */
        public void setTechniques(Technique[] techniques)
        {
                if (techniques == null)
                        clearTechniques();
               
                mTechniques = techniques;              
        }
       
        /** Destroy techniques. */
        public void clearTechniques()
        {
                if (mTechniques != null)
                {
                        mTechniques = null;
                }
        }
       
        /** Set the variables. */
        public void setVariables(Variable[] variables)
        {
                if (variables == null)
                        clearVariables();
               
                mVariables = variables;
        }
       
        /** Destroy variables. */
        public void clearVariables()
        {
                if (mVariables != null)
                {
                        for (int i = 0; i < mVariables.length; i++)
                        {
                                if (mVariables[i] != null)
                                        mVariables[i].dispose();
                        }
                       
                        mVariables = null;
                }
        }
       
        /** Get variable by name. */
        public Variable getVariable(String name)
        {
                if (mVariables == null)
                        return null;
               
                for (Variable v : mVariables)
                {
                        if (v.getName().equalsIgnoreCase(name))
                                return v;
                }
               
                return null;
        }
       
        /** Get variable by index. */
        public Variable getVariable(int index)
        {
                if ((mVariables == null) || (index >= mVariables.length))
                        return null;
               
                return mVariables[index];              
        }
       
        /** Get variable count. */
        public int getVariableCount()
        {
                if (mVariables == null)
                        return 0;
               
                return mVariables.length;
        }

}