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
);
}
}