251 lines
9.9 KiB
Java
251 lines
9.9 KiB
Java
/*
|
|
* Copyright (c) 2002-2008 LWJGL Project
|
|
* All rights reserved.
|
|
*
|
|
* Redistribution and use in source and binary forms, with or without
|
|
* modification, are permitted provided that the following conditions are
|
|
* met:
|
|
*
|
|
* * Redistributions of source code must retain the above copyright
|
|
* notice, this list of conditions and the following disclaimer.
|
|
*
|
|
* * 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.
|
|
*
|
|
* * Neither the name of 'LWJGL' nor the names of
|
|
* its contributors may be used to endorse or promote products derived
|
|
* from this software without specific prior written permission.
|
|
*
|
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
* "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 THE COPYRIGHT OWNER 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.
|
|
*/
|
|
package org.lwjgl.opengl;
|
|
|
|
import java.nio.IntBuffer;
|
|
|
|
import org.lwjgl.BufferUtils;
|
|
|
|
import static org.lwjgl.opengl.GL11.*;
|
|
|
|
/** This class represents the state necessary for render-to-texture. */
|
|
public final class RenderTexture {
|
|
|
|
// ----------------------------------------------------------------------------------
|
|
// ----------------------------- WGL_ARB_render_texture -----------------------------
|
|
// ----------------------------------------------------------------------------------
|
|
|
|
/*
|
|
Accepted by the <piAttributes> parameter of wglGetPixelFormatAttribivARB,
|
|
wglGetPixelFormatAttribfvARB, and the <piAttribIList> and <pfAttribIList>
|
|
parameters of wglChoosePixelFormatARB:
|
|
*/
|
|
private static final int WGL_BIND_TO_TEXTURE_RGB_ARB = 0x2070;
|
|
private static final int WGL_BIND_TO_TEXTURE_RGBA_ARB = 0x2071;
|
|
|
|
/*
|
|
Accepted by the <piAttribList> parameter of wglCreatePbufferARB and
|
|
by the <iAttribute> parameter of wglQueryPbufferARB:
|
|
*/
|
|
private static final int WGL_TEXTURE_FORMAT_ARB = 0x2072;
|
|
private static final int WGL_TEXTURE_TARGET_ARB = 0x2073;
|
|
private static final int WGL_MIPMAP_TEXTURE_ARB = 0x2074;
|
|
|
|
/*
|
|
Accepted as a value in the <piAttribList> parameter of
|
|
wglCreatePbufferARB and returned in the value parameter of
|
|
wglQueryPbufferARB when <iAttribute> is WGL_TEXTURE_FORMAT_ARB:
|
|
*/
|
|
private static final int WGL_TEXTURE_RGB_ARB = 0x2075;
|
|
private static final int WGL_TEXTURE_RGBA_ARB = 0x2076;
|
|
|
|
/*
|
|
Accepted as a value in the <piAttribList> parameter of
|
|
wglCreatePbufferARB and returned in the value parameter of
|
|
wglQueryPbufferARB when <iAttribute> is WGL_TEXTURE_TARGET_ARB:
|
|
*/
|
|
private static final int WGL_TEXTURE_CUBE_MAP_ARB = 0x2078;
|
|
private static final int WGL_TEXTURE_1D_ARB = 0x2079;
|
|
private static final int WGL_TEXTURE_2D_ARB = 0x207A;
|
|
private static final int WGL_NO_TEXTURE_ARB = 0x2077;
|
|
|
|
/*
|
|
Accepted by the <piAttribList> parameter of wglSetPbufferAttribARB and
|
|
by the <iAttribute> parameter of wglQueryPbufferARB:
|
|
*/
|
|
static final int WGL_MIPMAP_LEVEL_ARB = 0x207B;
|
|
static final int WGL_CUBE_MAP_FACE_ARB = 0x207C;
|
|
|
|
/*
|
|
Accepted as a value in the <piAttribList> parameter of
|
|
wglSetPbufferAttribARB and returned in the value parameter of
|
|
wglQueryPbufferARB when <iAttribute> is WGL_CUBE_MAP_FACE_ARB:
|
|
*/
|
|
static final int WGL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB = 0x207D;
|
|
static final int WGL_TEXTURE_CUBE_MAP_NEGATIVE_X_ARB = 0x207E;
|
|
static final int WGL_TEXTURE_CUBE_MAP_POSITIVE_Y_ARB = 0x207F;
|
|
static final int WGL_TEXTURE_CUBE_MAP_NEGATIVE_Y_ARB = 0x2080;
|
|
static final int WGL_TEXTURE_CUBE_MAP_POSITIVE_Z_ARB = 0x2081;
|
|
static final int WGL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB = 0x2082;
|
|
|
|
/*
|
|
Accepted by the <iBuffer> parameter of wglBindTexImageARB and
|
|
wglReleaseTexImageARB:
|
|
*/
|
|
static final int WGL_FRONT_LEFT_ARB = 0x2083;
|
|
static final int WGL_FRONT_RIGHT_ARB = 0x2084;
|
|
static final int WGL_BACK_LEFT_ARB = 0x2085;
|
|
static final int WGL_BACK_RIGHT_ARB = 0x2086;
|
|
|
|
/*
|
|
private static final int WGL_AUX0_ARB = 0x2087;
|
|
private static final int WGL_AUX1_ARB = 0x2088;
|
|
private static final int WGL_AUX2_ARB = 0x2089;
|
|
private static final int WGL_AUX3_ARB = 0x208A;
|
|
private static final int WGL_AUX4_ARB = 0x208B;
|
|
private static final int WGL_AUX5_ARB = 0x208C;
|
|
private static final int WGL_AUX6_ARB = 0x208D;
|
|
private static final int WGL_AUX7_ARB = 0x208E;
|
|
private static final int WGL_AUX8_ARB = 0x208F;
|
|
private static final int WGL_AUX9_ARB = 0x2090;
|
|
*/
|
|
|
|
// -------------------------------------------------------------------------------------------
|
|
// ----------------------------- WGL_NV_render_texture_rectangle -----------------------------
|
|
// -------------------------------------------------------------------------------------------
|
|
|
|
/*
|
|
Accepted by the <piAttributes> parameter of wglGetPixelFormatAttribivARB,
|
|
wglGetPixelFormatAttribfvARB, and the <piAttribIList> and <pfAttribIList>
|
|
parameters of wglChoosePixelFormatARB:
|
|
*/
|
|
private static final int WGL_BIND_TO_TEXTURE_RECTANGLE_RGB_NV = 0x20A0;
|
|
private static final int WGL_BIND_TO_TEXTURE_RECTANGLE_RGBA_NV = 0x20A1;
|
|
|
|
/*
|
|
Accepted as a value in the <piAttribList> parameter of wglCreatePbufferARB
|
|
and returned in the value parameter of wglQueryPbufferARB when
|
|
<iAttribute> is WGL_TEXTURE_TARGET_ARB:
|
|
*/
|
|
private static final int WGL_TEXTURE_RECTANGLE_NV = 0x20A2;
|
|
|
|
// ---------------------------------------------------------------------------------------
|
|
// ----------------------------- WGL_NV_render_depth_texture -----------------------------
|
|
// ---------------------------------------------------------------------------------------
|
|
|
|
/*
|
|
Accepted by the <piAttributes> parameter of wglGetPixelFormatAttribivARB,
|
|
wglGetPixelFormatAttribfvARB, and the <piAttribIList> and <pfAttribIList>
|
|
parameters of wglChoosePixelFormatARB:
|
|
*/
|
|
private static final int WGL_BIND_TO_TEXTURE_DEPTH_NV = 0x20A3;
|
|
private static final int WGL_BIND_TO_TEXTURE_RECTANGLE_DEPTH_NV = 0x20A4;
|
|
|
|
/*
|
|
Accepted by the <piAttribList> parameter of wglCreatePbufferARB and
|
|
by the <iAttribute> parameter of wglQueryPbufferARB:
|
|
*/
|
|
private static final int WGL_DEPTH_TEXTURE_FORMAT_NV = 0x20A5;
|
|
|
|
/*
|
|
Accepted as a value in the <piAttribList> parameter of wglCreatePbufferARB
|
|
and returned in the value parameter of wglQueryPbufferARB when
|
|
<iAttribute> is WGL_DEPTH_TEXTURE_FORMAT_NV:
|
|
*/
|
|
private static final int WGL_TEXTURE_DEPTH_COMPONENT_NV = 0x20A6;
|
|
|
|
/*
|
|
Accepted by the <iBuffer> parameter of wglBindTexImageARB:
|
|
*/
|
|
static final int WGL_DEPTH_COMPONENT_NV = 0x20A7;
|
|
|
|
/** The TEXTURE_1D target. */
|
|
public static final int RENDER_TEXTURE_1D = WGL_TEXTURE_1D_ARB;
|
|
|
|
/** The TEXTURE_2D target. */
|
|
public static final int RENDER_TEXTURE_2D = WGL_TEXTURE_2D_ARB;
|
|
|
|
/** The TEXTURE_RECTANGLE target. */
|
|
public static final int RENDER_TEXTURE_RECTANGLE = WGL_TEXTURE_RECTANGLE_NV;
|
|
|
|
/** The TEXTURE_CUBE_MAP target. */
|
|
public static final int RENDER_TEXTURE_CUBE_MAP = WGL_TEXTURE_CUBE_MAP_ARB;
|
|
|
|
IntBuffer pixelFormatCaps;
|
|
IntBuffer pBufferAttribs;
|
|
|
|
/**
|
|
* Creates a RenderTexture object for enabling render-to-texture on a P-buffer.
|
|
* <p/>
|
|
* NOTE: Only one of useRGB and useRGBA can be true at the same time.
|
|
* <p/>
|
|
* NOTE: useRGB(A) and useDepth can be true at the same time, thus allowing two different render textures.
|
|
* <p/>
|
|
* NOTE: The target parameter can be one of the following:
|
|
* <p/>
|
|
* RENDER_TEXTURE_1D RENDER_TEXTURE_2D RENDER_TEXTURE_RECTANGLE RENDER_TEXTURE_CUBE_MAP
|
|
*
|
|
* @param useRGB - When true the P-buffer can be used as an RGB render texture.
|
|
* @param useRGBA - When true the P-buffer can be used as an RGBA render texture.
|
|
* @param useDepth - When true the P-buffer can be used as a depth render texture.
|
|
* @param isRectangle - When true rectangle textures will be allowed on the P-buffer.
|
|
* @param target - The texture target of the render texture.
|
|
* @param mipmaps - How many mipmap levels to allocate on the P-buffer.
|
|
*/
|
|
public RenderTexture(boolean useRGB, boolean useRGBA, boolean useDepth, boolean isRectangle, int target, int mipmaps) {
|
|
if ( useRGB && useRGBA )
|
|
throw new IllegalArgumentException("A RenderTexture can't be both RGB and RGBA.");
|
|
|
|
if ( mipmaps < 0 )
|
|
throw new IllegalArgumentException("The mipmap levels can't be negative.");
|
|
|
|
if ( isRectangle && target != RENDER_TEXTURE_RECTANGLE )
|
|
throw new IllegalArgumentException("When the RenderTexture is rectangle the target must be RENDER_TEXTURE_RECTANGLE.");
|
|
|
|
pixelFormatCaps = BufferUtils.createIntBuffer(4);
|
|
pBufferAttribs = BufferUtils.createIntBuffer(8);
|
|
|
|
if ( useRGB ) {
|
|
pixelFormatCaps.put(isRectangle ? WGL_BIND_TO_TEXTURE_RECTANGLE_RGB_NV : WGL_BIND_TO_TEXTURE_RGB_ARB);
|
|
pixelFormatCaps.put(GL_TRUE);
|
|
|
|
pBufferAttribs.put(WGL_TEXTURE_FORMAT_ARB);
|
|
pBufferAttribs.put(WGL_TEXTURE_RGB_ARB);
|
|
} else if ( useRGBA ) {
|
|
pixelFormatCaps.put(isRectangle ? WGL_BIND_TO_TEXTURE_RECTANGLE_RGBA_NV : WGL_BIND_TO_TEXTURE_RGBA_ARB);
|
|
pixelFormatCaps.put(GL_TRUE);
|
|
|
|
pBufferAttribs.put(WGL_TEXTURE_FORMAT_ARB);
|
|
pBufferAttribs.put(WGL_TEXTURE_RGBA_ARB);
|
|
}
|
|
|
|
if ( useDepth ) {
|
|
pixelFormatCaps.put(isRectangle ? WGL_BIND_TO_TEXTURE_RECTANGLE_DEPTH_NV : WGL_BIND_TO_TEXTURE_DEPTH_NV);
|
|
pixelFormatCaps.put(GL_TRUE);
|
|
|
|
pBufferAttribs.put(WGL_DEPTH_TEXTURE_FORMAT_NV);
|
|
pBufferAttribs.put(WGL_TEXTURE_DEPTH_COMPONENT_NV);
|
|
}
|
|
|
|
pBufferAttribs.put(WGL_TEXTURE_TARGET_ARB);
|
|
pBufferAttribs.put(target);
|
|
|
|
if ( mipmaps != 0 ) {
|
|
pBufferAttribs.put(WGL_MIPMAP_TEXTURE_ARB);
|
|
pBufferAttribs.put(mipmaps);
|
|
}
|
|
|
|
pixelFormatCaps.flip();
|
|
pBufferAttribs.flip();
|
|
}
|
|
|
|
} |