Class ShaderState
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)
.
-
Field Summary
Fields -
Constructor Summary
Constructors -
Method Summary
Modifier and TypeMethodDescriptionfinal 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 programvoid
bindAttribLocation
(GL2ES2 gl, int location, GLArrayData data) Binds a shaderGLArrayData
attribute to a location.void
bindAttribLocation
(GL2ES2 gl, int location, String name) Binds a shader attribute to a location.void
final 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 theGLArrayData
's location if set and is the preferred alternative todisableVertexAttribArray(GL2ES2, String)
.boolean
disableVertexAttribArray
(GL2ES2 gl, String name) Disables a vertex attribute array This method retrieves the the location viagetAttribLocation(GL2ES2, GLArrayData)
hencedisableVertexAttribArray(GL2ES2, GLArrayData)
shall be preferred.boolean
enableVertexAttribArray
(GL2ES2 gl, GLArrayData data) Enables a vertex attribute array, usually invoked byGLArrayDataEditable.enableBuffer(GL, boolean)
.boolean
enableVertexAttribArray
(GL2ES2 gl, String name) Enables a vertex attribute array.final 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 valuegetCachedAttribLocation(String)
if valid, or the GLSL queried viaGL2ES2.glGetAttribLocation(int, String)
.
The location will be cached and set in theGLArrayData
object.int
getAttribLocation
(GL2ES2 gl, String name) Gets the location of a shader attribute with givenname
.
Uses either the cached valuegetCachedAttribLocation(String)
if valid, or the GLSL queried viaGL2ES2.glGetAttribLocation(int, String)
.
The location will be cached.getAttribute
(String name) Get the previous cached vertex attribute data.int
Gets the cached location of a shader attribute.final int
Gets the cached location of the shader uniform.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 valuegetCachedUniformLocation(String)
if valid, or the GLSL queried viaGL2ES2.glGetUniformLocation(int, String)
.
The location will be cached and set in theGLUniformData
object.final int
getUniformLocation
(GL2ES2 gl, String name) Gets the location of a shader uniform with givenname
.
Uses either the cached valuegetCachedUniformLocation(String)
if valid, or the GLSL queried viaGL2ES2.glGetUniformLocation(int, String)
.
The location will be cached.boolean
inUse()
boolean
isActiveAttribute
(GLArrayData attribute) final boolean
final boolean
boolean
linked()
void
ownAttribute
(GLArrayData attribute, boolean own) Binds or unbinds theGLArrayData
lifecycle to this ShaderState.boolean
ownsAttribute
(GLArrayData attribute) boolean
ownsUniform
(GLUniformData uniform) void
ownUniform
(GLUniformData uniform) Bind theGLUniform
lifecycle to this ShaderState.void
release
(GL2ES2 gl, boolean destroyBoundAttributes, boolean destroyShaderProgram, boolean destroyShaderCode) void
Releases all mapped vertex attribute data, disables all enabled attributes and loses all indicesvoid
releaseAllData
(GL2ES2 gl) void
Releases all mapped uniform data and loses all indicesvoid
setVerbose
(boolean v) toString()
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 theGLArrayData
vertex attribute data, if it's location is valid, i.e.
-
Field Details
-
DEBUG
public static final boolean DEBUG
-
-
Constructor Details
-
ShaderState
public ShaderState()
-
-
Method Details
-
verbose
public boolean verbose() -
setVerbose
public void setVerbose(boolean v) -
getAttachedObject
Returns the attached user object for the given name to this ShaderState. -
attachObject
Attach user object for the given name to this ShaderState. Returns the previously set object or null.- Returns:
- the previous mapped object or null if none
-
detachObject
- Parameters:
name
- name of the mapped object to detach- Returns:
- the previous mapped object or null if none
-
useProgram
Turns the shader program on or off.- Throws:
GLException
- if no program is attached- See Also:
-
linked
public boolean linked() -
inUse
public boolean inUse() -
attachShaderProgram
public boolean attachShaderProgram(GL2ES2 gl, ShaderProgram prog, boolean enable) throws GLException Attach or switch a shader programAttaching 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)
, ifenable
istrue
.- Returns:
- true if shader program was attached, otherwise false (already attached)
- Throws:
GLException
- if program was not linked and linking fails
-
shaderProgram
-
destroy
- See Also:
-
#glReleaseAllVertexAttributes
#glReleaseAllUniforms
release(GL2ES2, boolean, boolean, boolean)
-
releaseAllData
- See Also:
-
#glReleaseAllVertexAttributes
#glReleaseAllUniforms
release(GL2ES2, boolean, boolean, boolean)
-
release
public void release(GL2ES2 gl, boolean destroyBoundAttributes, boolean destroyShaderProgram, boolean destroyShaderCode) - See Also:
-
#glReleaseAllVertexAttributes
#glReleaseAllUniforms
ShaderProgram.release(GL2ES2, boolean)
-
getCachedAttribLocation
Gets the cached location of a shader attribute.- Returns:
- -1 if there is no such attribute available, otherwise >= 0
- See Also:
-
getAttribute
Get the previous cached vertex attribute data.- Returns:
- the GLArrayData object, null if not previously set.
- See Also:
-
ownAttribute(GLArrayData, boolean)
#glEnableVertexAttribArray
#glDisableVertexAttribArray
#glVertexAttribPointer
#getVertexAttribPointer
#glReleaseAllVertexAttributes
#glResetAllVertexAttributes
ShaderProgram#glReplaceShader
-
isActiveAttribute
-
ownAttribute
Binds or unbinds theGLArrayData
lifecycle to this ShaderState.If an attribute location is cached (ie
bindAttribLocation(GL2ES2, int, String)
) it is promoted to theGLArrayData
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.- Parameters:
attribute
- theGLArrayData
which lifecycle shall be managedown
- true if owning shall be performs, false if disowning.- See Also:
-
ownsAttribute
-
bindAttribLocation
Binds a shader attribute to a location. Multiple names can be bound to one location. The value will be cached and can be retrieved viagetCachedAttribLocation(String)
before or after linking.- Throws:
GLException
- if no program is attachedGLException
- if the program is already linked- See Also:
-
bindAttribLocation
Binds a shaderGLArrayData
attribute to a location. Multiple names can be bound to one location. The value will be cached and can be retrieved viagetCachedAttribLocation(String)
andgetAttribute(String)
before or after linking. TheGLArrayData
's location will be set as well.- Throws:
GLException
- if no program is attachedGLException
- if the program is already linked- See Also:
-
getAttribLocation
Gets the location of a shader attribute with givenname
.
Uses either the cached valuegetCachedAttribLocation(String)
if valid, or the GLSL queried viaGL2ES2.glGetAttribLocation(int, String)
.
The location will be cached.- Returns:
- -1 if there is no such attribute available, otherwise >= 0
- Throws:
GLException
- if no program is attachedGLException
- if the program is not linked and no location was cached.- See Also:
-
getAttribLocation
Validates and returns the location of a shader attribute.
Uses either the cached valuegetCachedAttribLocation(String)
if valid, or the GLSL queried viaGL2ES2.glGetAttribLocation(int, String)
.
The location will be cached and set in theGLArrayData
object.- Returns:
- -1 if there is no such attribute available, otherwise >= 0
- Throws:
GLException
- if no program is attachedGLException
- if the program is not linked and no location was cached.- See Also:
-
isVertexAttribArrayEnabled
- Returns:
- true if the named attribute is enable
-
isVertexAttribArrayEnabled
- Returns:
- true if the
GLArrayData
attribute is enable
-
enableVertexAttribArray
Enables a vertex attribute array. This method retrieves the the location viagetAttribLocation(GL2ES2, GLArrayData)
henceenableVertexAttribArray(GL2ES2, GLArrayData)
shall be preferred. Even if the attribute is not found in the current shader, it is marked enabled in this state.- Returns:
- false, if the name is not found, otherwise true
- Throws:
GLException
- if the program is not linked and no location was cached.- See Also:
-
#glEnableVertexAttribArray
#glDisableVertexAttribArray
#glVertexAttribPointer
#getVertexAttribPointer
-
enableVertexAttribArray
Enables a vertex attribute array, usually invoked byGLArrayDataEditable.enableBuffer(GL, boolean)
. This method uses theGLArrayData
's location if set and is the preferred alternative toenableVertexAttribArray(GL2ES2, String)
. If data location is unset it will be retrieved viagetAttribLocation(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.- Returns:
- false, if the name is not found, otherwise true
- Throws:
GLException
- if the program is not linked and no location was cached.- See Also:
-
#glEnableVertexAttribArray
#glDisableVertexAttribArray
#glVertexAttribPointer
#getVertexAttribPointer
GLArrayDataEditable.enableBuffer(GL, boolean)
-
disableVertexAttribArray
Disables a vertex attribute array This method retrieves the the location viagetAttribLocation(GL2ES2, GLArrayData)
hencedisableVertexAttribArray(GL2ES2, GLArrayData)
shall be preferred. Even if the attribute is not found in the current shader, it is removed from this state enabled list.- Returns:
- false, if the name is not found, otherwise true
- Throws:
GLException
- if no program is attachedGLException
- if the program is not linked and no location was cached.- See Also:
-
#glEnableVertexAttribArray
#glDisableVertexAttribArray
#glVertexAttribPointer
#getVertexAttribPointer
-
disableVertexAttribArray
Disables a vertex attribute array This method uses theGLArrayData
's location if set and is the preferred alternative todisableVertexAttribArray(GL2ES2, String)
. If data location is unset it will be retrieved viagetAttribLocation(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.- Returns:
- false, if the name is not found, otherwise true
- Throws:
GLException
- if no program is attachedGLException
- if the program is not linked and no location was cached.- See Also:
-
#glEnableVertexAttribArray
#glDisableVertexAttribArray
#glVertexAttribPointer
#getVertexAttribPointer
-
vertexAttribPointer
Set theGLArrayData
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 viagetAttribLocation(GL2ES2, GLArrayData)
, set and cached in this state.- Returns:
- false, if the location could not be determined, otherwise true
- Throws:
GLException
- if no program is attachedGLException
- if the program is not linked and no location was cached.- See Also:
-
#glEnableVertexAttribArray
#glDisableVertexAttribArray
#glVertexAttribPointer
#getVertexAttribPointer
-
releaseAllAttributes
Releases all mapped vertex attribute data, disables all enabled attributes and loses all indices- See Also:
-
#glEnableVertexAttribArray
#glDisableVertexAttribArray
#glVertexAttribPointer
#getVertexAttribPointer
#glReleaseAllVertexAttributes
#glResetAllVertexAttributes
#glResetAllVertexAttributes
ShaderProgram#glReplaceShader
-
disableAllVertexAttributeArrays
Disables all vertex attribute arrays. Their enabled stated will be removed from this state only if 'removeFromState' is true. This method purpose is more for debugging.- See Also:
-
#glEnableVertexAttribArray
#glDisableVertexAttribArray
#glVertexAttribPointer
#getVertexAttribPointer
#glReleaseAllVertexAttributes
#glResetAllVertexAttributes
#glResetAllVertexAttributes
ShaderProgram#glReplaceShader
-
getCachedUniformLocation
Gets the cached location of the shader uniform.- Returns:
- -1 if there is no such uniform available, otherwise >= 0
-
ownUniform
Bind theGLUniform
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.- Parameters:
uniform
- theGLUniformData
which lifecycle shall be managed- See Also:
-
ownsUniform
-
getUniformLocation
Gets the location of a shader uniform with givenname
.
Uses either the cached valuegetCachedUniformLocation(String)
if valid, or the GLSL queried viaGL2ES2.glGetUniformLocation(int, String)
.
The location will be cached.The current shader program (
#attachShaderProgram(GL2ES2, ShaderProgram)
) must be in use (useProgram(GL2ES2, boolean)
) !- Returns:
- -1 if there is no such attribute available, otherwise >= 0
- Throws:
GLException
- is the program is not linked- See Also:
-
#glGetUniformLocation
GL2ES2.glGetUniformLocation(int, java.lang.String)
getUniformLocation(com.jogamp.opengl.GL2ES2, java.lang.String)
ShaderProgram#glReplaceShader
-
getUniformLocation
Validates and returns the location of a shader uniform.
Uses either the cached valuegetCachedUniformLocation(String)
if valid, or the GLSL queried viaGL2ES2.glGetUniformLocation(int, String)
.
The location will be cached and set in theGLUniformData
object.The current shader program (
#attachShaderProgram(GL2ES2, ShaderProgram)
) must be in use (useProgram(GL2ES2, boolean)
) !- Returns:
- -1 if there is no such attribute available, otherwise >= 0
- Throws:
GLException
- is the program is not linked- See Also:
-
#glGetUniformLocation
GL2ES2.glGetUniformLocation(int, java.lang.String)
getUniformLocation(com.jogamp.opengl.GL2ES2, java.lang.String)
ShaderProgram#glReplaceShader
-
uniform
Set the uniform data, if it's location is valid, i.e. ≥ 0.This method uses the
GLUniformData
's location if valid, i.e. ≥ 0.
If data's location is invalid, it will be retrieved viagetUniformLocation(GL2ES2, GLUniformData)
, set and cached in this state.- Returns:
- false, if the location could not be determined, otherwise true
- See Also:
-
#glGetUniformLocation
GL2ES2.glGetUniformLocation(int, java.lang.String)
GL2ES2.glUniform(com.jogamp.opengl.GLUniformData)
getUniformLocation(com.jogamp.opengl.GL2ES2, java.lang.String)
ShaderProgram#glReplaceShader
-
getUniform
Get the uniform data, previously set.- Returns:
- the GLUniformData object, null if not previously set.
-
releaseAllUniforms
Releases all mapped uniform data and loses all indices -
toString
-
toString
-