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