Subversion Repositories AndroidProjects

Rev

Rev 1795 | Blame | Compare with Previous | Last modification | View Log | RSS feed

package com.gebauz.bauzoid2.graphics.shader;

import java.nio.FloatBuffer;

import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.utils.BufferUtils;
import com.gebauz.bauzoid2.math.Matrix3;
import com.gebauz.bauzoid2.math.Matrix4;
import com.gebauz.bauzoid2.math.Vector2;
import com.gebauz.bauzoid2.math.Vector3;
import com.gebauz.bauzoid2.math.Vector4;

/** Encapsulates a shader uniform variable. */
public class ShaderUniform
{
        public static final int MATRIX_PALETTE_SIZE = 16;

        private ShaderProgram mShader;
        private String mName;
        //private int mHandle;
       
        /** Cache so that it does not need to be recreated every time. */
        private FloatBuffer mMatrixCache = null;
        private FloatBuffer mMatrixPaletteCache = null;
       
        /** Constructor. */
        public ShaderUniform(ShaderProgram shader, String name/*, int handle*/)
        {
                mShader = shader;
                mName = name;          
                //mHandle = handle;
                mMatrixCache = BufferUtils.newFloatBuffer(16);
                mMatrixPaletteCache = BufferUtils.newFloatBuffer(Matrix4.MATRIX_SIZE*Matrix4.MATRIX_SIZE*MATRIX_PALETTE_SIZE);
        }
       
        /** Set a boolean value. */
        public final void set(boolean value)
        {
                int handle = mShader.getUniformHandle(mName);
               
                Gdx.gl20.glUniform1i(handle, (value ? 1 : 0));         
        }
       
        /** Set an integer. */
        public final void set(int value)
        {
                int handle = mShader.getUniformHandle(mName);
               
                Gdx.gl20.glUniform1i(handle, value);
        }
       
        /** Set a float value. */
        public final void set(float value)
        {
                int handle = mShader.getUniformHandle(mName);
               
                Gdx.gl20.glUniform1f(handle, value);
        }
       
        /** Set a Vector2 value. */
        public final void set(Vector2 value)
        {
                int handle = mShader.getUniformHandle(mName);
               
                Gdx.gl20.glUniform2f(handle, value.x, value.y);
        }
       
        /** Set a Vector3 value. */
        public final void set(Vector3 value)
        {
                int handle = mShader.getUniformHandle(mName);
               
                Gdx.gl20.glUniform3f(handle, value.x, value.y, value.z);
        }
       
        /** Set a Vector4 value. */
        public final void set(Vector4 value)
        {
                int handle = mShader.getUniformHandle(mName);
               
                Gdx.gl20.glUniform4f(handle, value.x, value.y, value.z, value.w);
        }

    /** Set a 3x3 Matrix. */
    public final void set(Matrix3 value)
    {
        int handle = mShader.getUniformHandle(mName);

        float[] m = value.toGLMatrix();
        mMatrixCache.clear();
        BufferUtils.copy(m, mMatrixCache, m.length, 0);
        Gdx.gl20.glUniformMatrix3fv(handle, 1, false, mMatrixCache);
    }
       
        /** Set a 4x4 Matrix. */
        public final void set(Matrix4 value)
        {
                int handle = mShader.getUniformHandle(mName);
               
                float[] m = value.toGLMatrix();
                mMatrixCache.clear();
                BufferUtils.copy(m, mMatrixCache, m.length, 0);
                Gdx.gl20.glUniformMatrix4fv(handle, 1, false, mMatrixCache);
       
/*              float[] m = value.toGLMatrix();
                FloatBuffer fb = BufferUtils.newFloatBuffer(16);
                BufferUtils.copy(m, fb, 16, 0);
                Gdx.gl20.glUniformMatrix4fv(handle, 1, false, fb);
                */

        }

        /** Set a matrix palette. */
        public final void set(Matrix4[] matrices)
        {
                int handle = mShader.getUniformHandle(mName);

                float[] m = new float[16*matrices.length];
                for (int i = 0; i < matrices.length; i++)
                        System.arraycopy(matrices[i].toGLMatrix(), 0, m, i*16, 16);

                mMatrixPaletteCache.clear();
                BufferUtils.copy(m, mMatrixPaletteCache, 16*MATRIX_PALETTE_SIZE, 0);

                Gdx.gl20.glUniformMatrix4fv(handle, matrices.length, false, mMatrixPaletteCache);
        }
}