/** * Copyright 2013 JogAmp Community. All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, are * permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, this list of * conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright notice, this list * of conditions and the following disclaimer in the documentation and/or other materials * provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY JogAmp Community ``AS IS'' AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JogAmp Community OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * The views and conclusions contained in the software and documentation are those of the * authors and should not be interpreted as representing official policies, either expressed * or implied, of JogAmp Community. */ package com.jogamp.opengl.util.texture; import javax.media.opengl.GL; import javax.media.opengl.GL2ES2; import javax.media.opengl.GL2GL3; import javax.media.opengl.GL3; import javax.media.opengl.GLException; /** * Preserves a [ texture-unit, texture-target ] state. *
* The states keys are the retrieved active texture-unit and the given texture-target * for which the following states are being queried: *
* - texture-object * - GL.GL_TEXTURE_MAG_FILTER * - GL.GL_TEXTURE_MIN_FILTER * - GL.GL_TEXTURE_WRAP_S * - GL.GL_TEXTURE_WRAP_T **/ public class TextureState { /** * Returns the
pname
to query the textureTarget
currently bound to the active texture-unit.
*
* Returns 0
is textureTarget
is not supported.
*
* 0 - unit * 1 - texture object * 2 - GL.GL_TEXTURE_MAG_FILTER * 3 - GL.GL_TEXTURE_MIN_FILTER * 4 - GL.GL_TEXTURE_WRAP_S * 5 - GL.GL_TEXTURE_WRAP_T **/ private final int[] state = new int[] { 0, 0, 0, 0, 0, 0 }; private static final String toHexString(final int i) { return "0x"+Integer.toHexString(i); } private static final int activeTexture(final GL gl) { final int[] vi = { 0 }; gl.glGetIntegerv(GL.GL_ACTIVE_TEXTURE, vi, 0); return vi[0]; } /** * Creates a texture state for the retrieved active texture-unit and the given texture-target. * See {@link TextureState}. * @param gl current GL context's GL object * @param textureTarget * @throws GLException if textureTarget is not supported */ public TextureState(final GL gl, final int textureTarget) throws GLException { this(gl, activeTexture(gl), textureTarget); } /** * Creates a texture state for the given active texture-unit and the given texture-target. * See {@link TextureState}. * @param gl current GL context's GL object * @param textureUnit of range [ {@link GL#GL_TEXTURE0}.. ] * @param textureTarget * @throws GLException if textureTarget is not supported */ public TextureState(final GL gl, final int textureUnit, final int textureTarget) throws GLException { target = textureTarget; state[0] = textureUnit; final int texBindQName = getTextureTargetQueryName(textureTarget); if( 0 == texBindQName ) { throw new GLException("Unsupported textureTarget "+toHexString(textureTarget)); } gl.glGetIntegerv(texBindQName, state, 1); gl.glGetTexParameteriv(target, GL.GL_TEXTURE_MAG_FILTER, state, 2); gl.glGetTexParameteriv(target, GL.GL_TEXTURE_MIN_FILTER, state, 3); gl.glGetTexParameteriv(target, GL.GL_TEXTURE_WRAP_S, state, 4); gl.glGetTexParameteriv(target, GL.GL_TEXTURE_WRAP_T, state, 5); } /** * Restores the texture-unit's texture-target state. *
* First the texture-unit is activated, then all states are restored. *
* @param gl current GL context's GL object */ public final void restore(final GL gl) { gl.glActiveTexture(state[0]); gl.glBindTexture(target, state[1]); gl.glTexParameteri(target, GL.GL_TEXTURE_MAG_FILTER, state[2]); gl.glTexParameteri(target, GL.GL_TEXTURE_MIN_FILTER, state[3]); gl.glTexParameteri(target, GL.GL_TEXTURE_WRAP_S, state[4]); gl.glTexParameteri(target, GL.GL_TEXTURE_WRAP_T, state[5]); } /** Returns the texture-unit of this state, key value. Unit is of range [ {@link GL#GL_TEXTURE0}.. ]. */ public final int getUnit() { return state[0]; } /** Returns the texture-target of this state, key value. */ public final int getTarget() { return target; } /** Returns the state's texture-object. */ public final int getObject() { return state[1]; } /** Returns the state's mag-filter param. */ public final int getMagFilter() { return state[2]; } /** Returns the state's min-filter param. */ public final int getMinFilter() { return state[3]; } /** Returns the state's wrap-s param. */ public final int getWrapS() { return state[4]; } /** Returns the state's wrap-t param. */ public final int getWrapT() { return state[5]; } @Override public final String toString() { return "TextureState[unit "+(state[0] - GL.GL_TEXTURE0)+", target "+toHexString(target)+ ": obj "+toHexString(state[1])+ ", filter[mag "+toHexString(state[2])+", min "+toHexString(state[3])+"], "+ ": wrap[s "+toHexString(state[4])+", t "+toHexString(state[5])+"]]"; } }