public class ShaderState extends Object
This allows seamless switching of programs using almost same data but performing different artifacts.
A used
ShaderState is attached to the current GL context
and can be retrieved via #getShaderState(GL)
.
Modifier and Type | Field and Description |
---|---|
static boolean |
DEBUG |
Constructor and Description |
---|
ShaderState() |
Modifier and Type | Method and Description |
---|---|
Object |
attachObject(String name,
Object obj)
Attach user object for the given name to this ShaderState.
|
boolean |
attachShaderProgram(GL2ES2 gl,
ShaderProgram prog,
boolean enable)
Attach or switch a shader program
|
void |
bindAttribLocation(GL2ES2 gl,
int location,
GLArrayData data)
Binds a shader
GLArrayData attribute to a location. |
void |
bindAttribLocation(GL2ES2 gl,
int location,
String name)
Binds a shader attribute to a location.
|
void |
destroy(GL2ES2 gl)
|
Object |
detachObject(String name) |
void |
disableAllVertexAttributeArrays(GL2ES2 gl,
boolean removeFromState)
Disables all vertex attribute arrays.
|
boolean |
disableVertexAttribArray(GL2ES2 gl,
GLArrayData data)
Disables a vertex attribute array
This method uses the
GLArrayData 's location if set
and is the preferred alternative to disableVertexAttribArray(GL2ES2, String) . |
boolean |
disableVertexAttribArray(GL2ES2 gl,
String name)
Disables a vertex attribute array
This method retrieves the the location via
getAttribLocation(GL2ES2, GLArrayData)
hence disableVertexAttribArray(GL2ES2, GLArrayData) shall be preferred. |
boolean |
enableVertexAttribArray(GL2ES2 gl,
GLArrayData data)
Enables a vertex attribute array, usually invoked by
GLArrayDataEditable.enableBuffer(GL, boolean) . |
boolean |
enableVertexAttribArray(GL2ES2 gl,
String name)
Enables a vertex attribute array.
|
Object |
getAttachedObject(String name)
Returns the attached user object for the given name to this ShaderState.
|
int |
getAttribLocation(GL2ES2 gl,
GLArrayData data)
Validates and returns the location of a shader attribute.
Uses either the cached value getCachedAttribLocation(String) if valid,
or the GLSL queried via GL2ES2.glGetAttribLocation(int, String) .The location will be cached and set in the GLArrayData object. |
int |
getAttribLocation(GL2ES2 gl,
String name)
Gets the location of a shader attribute with given
name .Uses either the cached value getCachedAttribLocation(String) if valid,
or the GLSL queried via GL2ES2.glGetAttribLocation(int, String) .The location will be cached. |
GLArrayData |
getAttribute(String name)
Get the previous cached vertex attribute data.
|
int |
getCachedAttribLocation(String name)
Gets the cached location of a shader attribute.
|
int |
getCachedUniformLocation(String name)
Gets the cached location of the shader uniform.
|
GLUniformData |
getUniform(String name)
Get the uniform data, previously set.
|
int |
getUniformLocation(GL2ES2 gl,
GLUniformData data)
Validates and returns the location of a shader uniform.
Uses either the cached value getCachedUniformLocation(String) if valid,
or the GLSL queried via GL2ES2.glGetUniformLocation(int, String) .The location will be cached and set in the GLUniformData object. |
int |
getUniformLocation(GL2ES2 gl,
String name)
Gets the location of a shader uniform with given
name .Uses either the cached value getCachedUniformLocation(String) if valid,
or the GLSL queried via GL2ES2.glGetUniformLocation(int, String) .The location will be cached. |
boolean |
inUse() |
boolean |
isActiveAttribute(GLArrayData attribute) |
boolean |
isVertexAttribArrayEnabled(GLArrayData data) |
boolean |
isVertexAttribArrayEnabled(String name) |
boolean |
linked() |
void |
ownAttribute(GLArrayData attribute,
boolean own)
Binds or unbinds the
GLArrayData lifecycle to this ShaderState. |
boolean |
ownsAttribute(GLArrayData attribute) |
boolean |
ownsUniform(GLUniformData uniform) |
void |
ownUniform(GLUniformData uniform)
Bind the
GLUniform lifecycle to this ShaderState. |
void |
release(GL2ES2 gl,
boolean destroyBoundAttributes,
boolean destroyShaderProgram,
boolean destroyShaderCode) |
void |
releaseAllAttributes(GL2ES2 gl)
Releases all mapped vertex attribute data,
disables all enabled attributes and loses all indices
|
void |
releaseAllData(GL2ES2 gl)
|
void |
releaseAllUniforms(GL2ES2 gl)
Releases all mapped uniform data
and loses all indices
|
void |
setVerbose(boolean v) |
ShaderProgram |
shaderProgram() |
String |
toString() |
StringBuilder |
toString(StringBuilder sb,
boolean alsoUnlocated) |
boolean |
uniform(GL2ES2 gl,
GLUniformData data)
Set the uniform data, if it's location is valid, i.e.
|
void |
useProgram(GL2ES2 gl,
boolean on)
Turns the shader program on or off.
|
boolean |
verbose() |
boolean |
vertexAttribPointer(GL2ES2 gl,
GLArrayData data)
Set the
GLArrayData vertex attribute data, if it's location is valid, i.e. |
public boolean verbose()
public void setVerbose(boolean v)
public final Object getAttachedObject(String name)
public final Object attachObject(String name, Object obj)
public final Object detachObject(String name)
name
- name of the mapped object to detachpublic void useProgram(GL2ES2 gl, boolean on) throws GLException
GLException
- if no program is attacheduseProgram(GL2ES2, boolean)
public boolean linked()
public boolean inUse()
public boolean attachShaderProgram(GL2ES2 gl, ShaderProgram prog, boolean enable) throws GLException
Attaching a shader program the first time, as well as switching to another program on the fly, while managing all attribute and uniform data.
[Re]sets all data and use program in case of a program switch.
Use program, useProgram(GL2ES2, boolean)
,
if enable
is true
.
GLException
- if program was not linked and linking failspublic ShaderProgram shaderProgram()
public void destroy(GL2ES2 gl)
#glReleaseAllVertexAttributes
,
#glReleaseAllUniforms
,
release(GL2ES2, boolean, boolean, boolean)
public void releaseAllData(GL2ES2 gl)
#glReleaseAllVertexAttributes
,
#glReleaseAllUniforms
,
release(GL2ES2, boolean, boolean, boolean)
public void release(GL2ES2 gl, boolean destroyBoundAttributes, boolean destroyShaderProgram, boolean destroyShaderCode)
#glReleaseAllVertexAttributes
,
#glReleaseAllUniforms
,
ShaderProgram.release(GL2ES2, boolean)
public int getCachedAttribLocation(String name)
bindAttribLocation(GL2ES2, int, String)
,
bindAttribLocation(GL2ES2, int, GLArrayData)
,
getAttribLocation(GL2ES2, String)
,
GL2ES2.glGetAttribLocation(int, String)
public GLArrayData getAttribute(String name)
ownAttribute(GLArrayData, boolean)
,
#glEnableVertexAttribArray
,
#glDisableVertexAttribArray
,
#glVertexAttribPointer
,
#getVertexAttribPointer
,
#glReleaseAllVertexAttributes
,
#glResetAllVertexAttributes
,
ShaderProgram#glReplaceShader
public boolean isActiveAttribute(GLArrayData attribute)
public void ownAttribute(GLArrayData attribute, boolean own)
GLArrayData
lifecycle to this ShaderState.
If an attribute location is cached (ie bindAttribLocation(GL2ES2, int, String)
)
it is promoted to the GLArrayData
instance.
The attribute will be destroyed with destroy(GL2ES2)
and it's location will be reset when switching shader with #attachShaderProgram(GL2ES2, ShaderProgram)
.
The data will not be transfered to the GPU, use vertexAttribPointer(GL2ES2, GLArrayData)
additionally.
The data will also be associated
with this ShaderState.
attribute
- the GLArrayData
which lifecycle shall be managedown
- true if owning shall be performs, false if disowning.bindAttribLocation(GL2ES2, int, String)
,
getAttribute(String)
,
GLArrayData.associate(Object, boolean)
public boolean ownsAttribute(GLArrayData attribute)
public void bindAttribLocation(GL2ES2 gl, int location, String name)
getCachedAttribLocation(String)
before or after linking.GLException
- if no program is attachedGLException
- if the program is already linkedGL2ES2.glBindAttribLocation(int, int, String)
,
getAttribLocation(GL2ES2, String)
,
getCachedAttribLocation(String)
public void bindAttribLocation(GL2ES2 gl, int location, GLArrayData data)
GLArrayData
attribute to a location.
Multiple names can be bound to one location.
The value will be cached and can be retrieved via getCachedAttribLocation(String)
and getAttribute(String)
before or after linking.
The GLArrayData
's location will be set as well.GLException
- if no program is attachedGLException
- if the program is already linkedGL2ES2.glBindAttribLocation(int, int, String)
,
getAttribLocation(GL2ES2, String)
,
getCachedAttribLocation(String)
,
getAttribute(String)
public int getAttribLocation(GL2ES2 gl, String name)
name
.getCachedAttribLocation(String)
if valid,
or the GLSL queried via GL2ES2.glGetAttribLocation(int, String)
.GLException
- if no program is attachedGLException
- if the program is not linked and no location was cached.getCachedAttribLocation(String)
,
bindAttribLocation(GL2ES2, int, GLArrayData)
,
bindAttribLocation(GL2ES2, int, String)
,
GL2ES2.glGetAttribLocation(int, String)
public int getAttribLocation(GL2ES2 gl, GLArrayData data)
getCachedAttribLocation(String)
if valid,
or the GLSL queried via GL2ES2.glGetAttribLocation(int, String)
.GLArrayData
object.GLException
- if no program is attachedGLException
- if the program is not linked and no location was cached.getCachedAttribLocation(String)
,
bindAttribLocation(GL2ES2, int, GLArrayData)
,
bindAttribLocation(GL2ES2, int, String)
,
GL2ES2.glGetAttribLocation(int, String)
,
getAttribute(String)
public final boolean isVertexAttribArrayEnabled(String name)
public final boolean isVertexAttribArrayEnabled(GLArrayData data)
GLArrayData
attribute is enablepublic boolean enableVertexAttribArray(GL2ES2 gl, String name)
getAttribLocation(GL2ES2, GLArrayData)
hence enableVertexAttribArray(GL2ES2, GLArrayData)
shall be preferred.
Even if the attribute is not found in the current shader,
it is marked enabled in this state.GLException
- if the program is not linked and no location was cached.#glEnableVertexAttribArray
,
#glDisableVertexAttribArray
,
#glVertexAttribPointer
,
#getVertexAttribPointer
public boolean enableVertexAttribArray(GL2ES2 gl, GLArrayData data)
GLArrayDataEditable.enableBuffer(GL, boolean)
.
This method uses the GLArrayData
's location if set
and is the preferred alternative to enableVertexAttribArray(GL2ES2, String)
.
If data location is unset it will be retrieved via getAttribLocation(GL2ES2, GLArrayData)
set
and cached in this state.
Even if the attribute is not found in the current shader,
it is marked enabled in this state.GLException
- if the program is not linked and no location was cached.#glEnableVertexAttribArray
,
#glDisableVertexAttribArray
,
#glVertexAttribPointer
,
#getVertexAttribPointer
,
GLArrayDataEditable.enableBuffer(GL, boolean)
public boolean disableVertexAttribArray(GL2ES2 gl, String name)
getAttribLocation(GL2ES2, GLArrayData)
hence disableVertexAttribArray(GL2ES2, GLArrayData)
shall be preferred.
Even if the attribute is not found in the current shader,
it is removed from this state enabled list.GLException
- if no program is attachedGLException
- if the program is not linked and no location was cached.#glEnableVertexAttribArray
,
#glDisableVertexAttribArray
,
#glVertexAttribPointer
,
#getVertexAttribPointer
public boolean disableVertexAttribArray(GL2ES2 gl, GLArrayData data)
GLArrayData
's location if set
and is the preferred alternative to disableVertexAttribArray(GL2ES2, String)
.
If data location is unset it will be retrieved via getAttribLocation(GL2ES2, GLArrayData)
set
and cached in this state.
Even if the attribute is not found in the current shader,
it is removed from this state enabled list.GLException
- if no program is attachedGLException
- if the program is not linked and no location was cached.#glEnableVertexAttribArray
,
#glDisableVertexAttribArray
,
#glVertexAttribPointer
,
#getVertexAttribPointer
public boolean vertexAttribPointer(GL2ES2 gl, GLArrayData data)
GLArrayData
vertex attribute data, if it's location is valid, i.e. ≥ 0.
This method uses the GLArrayData
's location if valid, i.e. ≥ 0.
If data's location is invalid, it will be retrieved via getAttribLocation(GL2ES2, GLArrayData)
,
set and cached in this state.
GLException
- if no program is attachedGLException
- if the program is not linked and no location was cached.#glEnableVertexAttribArray
,
#glDisableVertexAttribArray
,
#glVertexAttribPointer
,
#getVertexAttribPointer
public void releaseAllAttributes(GL2ES2 gl)
#glEnableVertexAttribArray
,
#glDisableVertexAttribArray
,
#glVertexAttribPointer
,
#getVertexAttribPointer
,
#glReleaseAllVertexAttributes
,
#glResetAllVertexAttributes
,
#glResetAllVertexAttributes
,
ShaderProgram#glReplaceShader
public void disableAllVertexAttributeArrays(GL2ES2 gl, boolean removeFromState)
#glEnableVertexAttribArray
,
#glDisableVertexAttribArray
,
#glVertexAttribPointer
,
#getVertexAttribPointer
,
#glReleaseAllVertexAttributes
,
#glResetAllVertexAttributes
,
#glResetAllVertexAttributes
,
ShaderProgram#glReplaceShader
public final int getCachedUniformLocation(String name)
public void ownUniform(GLUniformData uniform)
GLUniform
lifecycle to this ShaderState.
If a uniform location is cached it is promoted to the GLUniformData
instance.
The attribute will be destroyed with destroy(GL2ES2)
and it's location will be reset when switching shader with #attachShaderProgram(GL2ES2, ShaderProgram)
.
The data will not be transfered to the GPU, use uniform(GL2ES2, GLUniformData)
additionally.
uniform
- the GLUniformData
which lifecycle shall be managedgetUniform(String)
public boolean ownsUniform(GLUniformData uniform)
public final int getUniformLocation(GL2ES2 gl, String name)
name
.getCachedUniformLocation(String)
if valid,
or the GLSL queried via GL2ES2.glGetUniformLocation(int, String)
.
The current shader program (#attachShaderProgram(GL2ES2, ShaderProgram)
)
must be in use (useProgram(GL2ES2, boolean)
) !
GLException
- is the program is not linked#glGetUniformLocation
,
GL2ES2.glGetUniformLocation(int, java.lang.String)
,
getUniformLocation(com.jogamp.opengl.GL2ES2, java.lang.String)
,
ShaderProgram#glReplaceShader
public int getUniformLocation(GL2ES2 gl, GLUniformData data)
getCachedUniformLocation(String)
if valid,
or the GLSL queried via GL2ES2.glGetUniformLocation(int, String)
.GLUniformData
object.
The current shader program (#attachShaderProgram(GL2ES2, ShaderProgram)
)
must be in use (useProgram(GL2ES2, boolean)
) !
GLException
- is the program is not linked#glGetUniformLocation
,
GL2ES2.glGetUniformLocation(int, java.lang.String)
,
getUniformLocation(com.jogamp.opengl.GL2ES2, java.lang.String)
,
ShaderProgram#glReplaceShader
public boolean uniform(GL2ES2 gl, GLUniformData data)
This method uses the GLUniformData
's location if valid, i.e. ≥ 0.
If data's location is invalid, it will be retrieved via getUniformLocation(GL2ES2, GLUniformData)
,
set and cached in this state.
#glGetUniformLocation
,
GL2ES2.glGetUniformLocation(int, java.lang.String)
,
GL2ES2.glUniform(com.jogamp.opengl.GLUniformData)
,
getUniformLocation(com.jogamp.opengl.GL2ES2, java.lang.String)
,
ShaderProgram#glReplaceShader
public GLUniformData getUniform(String name)
public void releaseAllUniforms(GL2ES2 gl)
public StringBuilder toString(StringBuilder sb, boolean alsoUnlocated)
Copyright 2010 JogAmp Community.