You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
649 lines
20 KiB
649 lines
20 KiB
/*
|
|
* Copyright (c) 2009-2012 jMonkeyEngine
|
|
* 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 'jMonkeyEngine' 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 com.jme3.renderer.lwjgl;
|
|
|
|
import com.jme3.renderer.opengl.GL;
|
|
import com.jme3.renderer.opengl.GL2;
|
|
import com.jme3.renderer.opengl.GL3;
|
|
import com.jme3.renderer.opengl.GL4;
|
|
import org.lwjgl.opengl.*;
|
|
|
|
import java.nio.ByteBuffer;
|
|
import java.nio.FloatBuffer;
|
|
import java.nio.IntBuffer;
|
|
import java.nio.ShortBuffer;
|
|
|
|
/**
|
|
* The LWJGL implementation of interfaces {@link GL}, {@link GL2}, {@link GL3}, {@link GL4}.
|
|
*/
|
|
public class LwjglGL extends LwjglRender implements GL, GL2, GL3, GL4 {
|
|
|
|
@Override
|
|
public void resetStats() {
|
|
}
|
|
|
|
@Override
|
|
public void glActiveTexture(final int texture) {
|
|
GL13.glActiveTexture(texture);
|
|
}
|
|
|
|
@Override
|
|
public void glAlphaFunc(final int func, final float ref) {
|
|
GL11.glAlphaFunc(func, ref);
|
|
}
|
|
|
|
@Override
|
|
public void glAttachShader(final int program, final int shader) {
|
|
GL20.glAttachShader(program, shader);
|
|
}
|
|
|
|
@Override
|
|
public void glBeginQuery(final int target, final int query) {
|
|
GL15.glBeginQuery(target, query);
|
|
}
|
|
|
|
@Override
|
|
public void glBindBuffer(final int target, final int buffer) {
|
|
GL15.glBindBuffer(target, buffer);
|
|
}
|
|
|
|
@Override
|
|
public void glBindTexture(final int target, final int texture) {
|
|
GL11.glBindTexture(target, texture);
|
|
}
|
|
|
|
@Override
|
|
public void glBlendEquationSeparate(final int colorMode, final int alphaMode) {
|
|
GL20.glBlendEquationSeparate(colorMode, alphaMode);
|
|
}
|
|
|
|
@Override
|
|
public void glBlendFunc(final int sfactor, final int dfactor) {
|
|
GL11.glBlendFunc(sfactor, dfactor);
|
|
}
|
|
|
|
@Override
|
|
public void glBlendFuncSeparate(final int sfactorRGB, final int dfactorRGB, final int sfactorAlpha,
|
|
final int dfactorAlpha) {
|
|
GL14.glBlendFuncSeparate(sfactorRGB, dfactorRGB, sfactorAlpha, dfactorAlpha);
|
|
}
|
|
|
|
@Override
|
|
public void glBufferData(final int target, final long dataSize, final int usage) {
|
|
GL15.glBufferData(target, dataSize, usage);
|
|
}
|
|
|
|
@Override
|
|
public void glBufferData(final int target, final FloatBuffer data, final int usage) {
|
|
checkLimit(data);
|
|
GL15.glBufferData(target, data, usage);
|
|
}
|
|
|
|
@Override
|
|
public void glBufferData(final int target, final ShortBuffer data, final int usage) {
|
|
checkLimit(data);
|
|
GL15.glBufferData(target, data, usage);
|
|
}
|
|
|
|
@Override
|
|
public void glBufferData(final int target, final ByteBuffer data, final int usage) {
|
|
checkLimit(data);
|
|
GL15.glBufferData(target, data, usage);
|
|
}
|
|
|
|
@Override
|
|
public void glBufferSubData(final int target, final long offset, final FloatBuffer data) {
|
|
checkLimit(data);
|
|
GL15.glBufferSubData(target, offset, data);
|
|
}
|
|
|
|
@Override
|
|
public void glBufferSubData(final int target, final long offset, final ShortBuffer data) {
|
|
checkLimit(data);
|
|
GL15.glBufferSubData(target, offset, data);
|
|
}
|
|
|
|
@Override
|
|
public void glBufferSubData(final int target, final long offset, final ByteBuffer data) {
|
|
checkLimit(data);
|
|
GL15.glBufferSubData(target, offset, data);
|
|
}
|
|
|
|
@Override
|
|
public void glClear(final int mask) {
|
|
GL11.glClear(mask);
|
|
}
|
|
|
|
@Override
|
|
public void glClearColor(final float red, final float green, final float blue, final float alpha) {
|
|
GL11.glClearColor(red, green, blue, alpha);
|
|
}
|
|
|
|
@Override
|
|
public void glColorMask(final boolean red, final boolean green, final boolean blue, final boolean alpha) {
|
|
GL11.glColorMask(red, green, blue, alpha);
|
|
}
|
|
|
|
@Override
|
|
public void glCompileShader(final int shader) {
|
|
GL20.glCompileShader(shader);
|
|
}
|
|
|
|
@Override
|
|
public void glCompressedTexImage2D(final int target, final int level, final int internalFormat, final int width,
|
|
final int height, final int border, final ByteBuffer data) {
|
|
checkLimit(data);
|
|
GL13.glCompressedTexImage2D(target, level, internalFormat, width, height, border, data);
|
|
}
|
|
|
|
@Override
|
|
public void glCompressedTexImage3D(final int target, final int level, final int internalFormat, final int width,
|
|
final int height, final int depth, final int border, final ByteBuffer data) {
|
|
checkLimit(data);
|
|
GL13.glCompressedTexImage3D(target, level, internalFormat, width, height, depth, border, data);
|
|
}
|
|
|
|
@Override
|
|
public void glCompressedTexSubImage2D(final int target, final int level, final int xoffset, final int yoffset,
|
|
final int width, final int height, final int format, final ByteBuffer data) {
|
|
checkLimit(data);
|
|
GL13.glCompressedTexSubImage2D(target, level, xoffset, yoffset, width, height, format, data);
|
|
}
|
|
|
|
@Override
|
|
public void glCompressedTexSubImage3D(final int target, final int level, final int xoffset, final int yoffset,
|
|
final int zoffset, final int width, final int height, final int depth,
|
|
final int format, final ByteBuffer data) {
|
|
checkLimit(data);
|
|
GL13.glCompressedTexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, data);
|
|
}
|
|
|
|
@Override
|
|
public int glCreateProgram() {
|
|
return GL20.glCreateProgram();
|
|
}
|
|
|
|
@Override
|
|
public int glCreateShader(final int shaderType) {
|
|
return GL20.glCreateShader(shaderType);
|
|
}
|
|
|
|
@Override
|
|
public void glCullFace(final int mode) {
|
|
GL11.glCullFace(mode);
|
|
}
|
|
|
|
@Override
|
|
public void glDeleteBuffers(final IntBuffer buffers) {
|
|
checkLimit(buffers);
|
|
GL15.glDeleteBuffers(buffers);
|
|
}
|
|
|
|
@Override
|
|
public void glDeleteProgram(final int program) {
|
|
GL20.glDeleteProgram(program);
|
|
}
|
|
|
|
@Override
|
|
public void glDeleteShader(final int shader) {
|
|
GL20.glDeleteShader(shader);
|
|
}
|
|
|
|
@Override
|
|
public void glDeleteTextures(final IntBuffer textures) {
|
|
checkLimit(textures);
|
|
GL11.glDeleteTextures(textures);
|
|
}
|
|
|
|
@Override
|
|
public void glDepthFunc(final int func) {
|
|
GL11.glDepthFunc(func);
|
|
}
|
|
|
|
@Override
|
|
public void glDepthMask(final boolean flag) {
|
|
GL11.glDepthMask(flag);
|
|
}
|
|
|
|
@Override
|
|
public void glDepthRange(final double nearVal, final double farVal) {
|
|
GL11.glDepthRange(nearVal, farVal);
|
|
}
|
|
|
|
@Override
|
|
public void glDetachShader(final int program, final int shader) {
|
|
GL20.glDetachShader(program, shader);
|
|
}
|
|
|
|
@Override
|
|
public void glDisable(final int cap) {
|
|
GL11.glDisable(cap);
|
|
}
|
|
|
|
@Override
|
|
public void glDisableVertexAttribArray(final int index) {
|
|
GL20.glDisableVertexAttribArray(index);
|
|
}
|
|
|
|
@Override
|
|
public void glDrawArrays(final int mode, final int first, final int count) {
|
|
GL11.glDrawArrays(mode, first, count);
|
|
}
|
|
|
|
@Override
|
|
public void glDrawBuffer(final int mode) {
|
|
GL11.glDrawBuffer(mode);
|
|
}
|
|
|
|
@Override
|
|
public void glDrawRangeElements(final int mode, final int start, final int end, final int count, final int type,
|
|
final long indices) {
|
|
GL12.glDrawRangeElements(mode, start, end, count, type, indices);
|
|
}
|
|
|
|
@Override
|
|
public void glEnable(final int cap) {
|
|
GL11.glEnable(cap);
|
|
}
|
|
|
|
@Override
|
|
public void glEnableVertexAttribArray(final int index) {
|
|
GL20.glEnableVertexAttribArray(index);
|
|
}
|
|
|
|
@Override
|
|
public void glEndQuery(final int target) {
|
|
GL15.glEndQuery(target);
|
|
}
|
|
|
|
@Override
|
|
public void glGenBuffers(final IntBuffer buffers) {
|
|
checkLimit(buffers);
|
|
GL15.glGenBuffers(buffers);
|
|
}
|
|
|
|
@Override
|
|
public void glGenTextures(final IntBuffer textures) {
|
|
checkLimit(textures);
|
|
GL11.glGenTextures(textures);
|
|
}
|
|
|
|
@Override
|
|
public void glGenQueries(final int num, final IntBuffer ids) {
|
|
GL15.glGenQueries(ids);
|
|
}
|
|
|
|
@Override
|
|
public void glGetBoolean(final int pname, final ByteBuffer params) {
|
|
checkLimit(params);
|
|
GL11.glGetBooleanv(pname, params);
|
|
}
|
|
|
|
@Override
|
|
public void glGetBufferSubData(final int target, final long offset, final ByteBuffer data) {
|
|
checkLimit(data);
|
|
GL15.glGetBufferSubData(target, offset, data);
|
|
}
|
|
|
|
@Override
|
|
public int glGetError() {
|
|
return GL11.glGetError();
|
|
}
|
|
|
|
@Override
|
|
public void glGetInteger(final int pname, final IntBuffer params) {
|
|
checkLimit(params);
|
|
GL11.glGetIntegerv(pname, params);
|
|
}
|
|
|
|
@Override
|
|
public void glGetProgram(final int program, final int pname, final IntBuffer params) {
|
|
checkLimit(params);
|
|
GL20.glGetProgramiv(program, pname, params);
|
|
}
|
|
|
|
@Override
|
|
public void glGetShader(final int shader, final int pname, final IntBuffer params) {
|
|
checkLimit(params);
|
|
GL20.glGetShaderiv(shader, pname, params);
|
|
}
|
|
|
|
@Override
|
|
public String glGetString(final int name) {
|
|
return GL11.glGetString(name);
|
|
}
|
|
|
|
@Override
|
|
public String glGetString(final int name, final int index) {
|
|
return GL30.glGetStringi(name, index);
|
|
}
|
|
|
|
@Override
|
|
public boolean glIsEnabled(final int cap) {
|
|
return GL11.glIsEnabled(cap);
|
|
}
|
|
|
|
@Override
|
|
public void glLineWidth(final float width) {
|
|
GL11.glLineWidth(width);
|
|
}
|
|
|
|
@Override
|
|
public void glLinkProgram(final int program) {
|
|
GL20.glLinkProgram(program);
|
|
}
|
|
|
|
@Override
|
|
public void glPixelStorei(final int pname, final int param) {
|
|
GL11.glPixelStorei(pname, param);
|
|
}
|
|
|
|
@Override
|
|
public void glPointSize(final float size) {
|
|
GL11.glPointSize(size);
|
|
}
|
|
|
|
@Override
|
|
public void glPolygonMode(final int face, final int mode) {
|
|
GL11.glPolygonMode(face, mode);
|
|
}
|
|
|
|
@Override
|
|
public void glPolygonOffset(final float factor, final float units) {
|
|
GL11.glPolygonOffset(factor, units);
|
|
}
|
|
|
|
@Override
|
|
public void glReadBuffer(final int mode) {
|
|
GL11.glReadBuffer(mode);
|
|
}
|
|
|
|
@Override
|
|
public void glReadPixels(final int x, final int y, final int width, final int height, final int format,
|
|
final int type, final ByteBuffer data) {
|
|
checkLimit(data);
|
|
GL11.glReadPixels(x, y, width, height, format, type, data);
|
|
}
|
|
|
|
@Override
|
|
public void glReadPixels(final int x, final int y, final int width, final int height, final int format,
|
|
final int type, final long offset) {
|
|
GL11.glReadPixels(x, y, width, height, format, type, offset);
|
|
}
|
|
|
|
@Override
|
|
public void glScissor(final int x, final int y, final int width, final int height) {
|
|
GL11.glScissor(x, y, width, height);
|
|
}
|
|
|
|
@Override
|
|
public void glStencilFuncSeparate(final int face, final int func, final int ref, final int mask) {
|
|
GL20.glStencilFuncSeparate(face, func, ref, mask);
|
|
}
|
|
|
|
@Override
|
|
public void glStencilOpSeparate(final int face, final int sfail, final int dpfail, final int dppass) {
|
|
GL20.glStencilOpSeparate(face, sfail, dpfail, dppass);
|
|
}
|
|
|
|
@Override
|
|
public void glTexImage2D(final int target, final int level, final int internalFormat, final int width,
|
|
final int height, final int border, final int format, final int type,
|
|
final ByteBuffer data) {
|
|
checkLimit(data);
|
|
GL11.glTexImage2D(target, level, internalFormat, width, height, border, format, type, data);
|
|
}
|
|
|
|
@Override
|
|
public void glTexImage3D(final int target, final int level, final int internalFormat, final int width,
|
|
final int height, final int depth, final int border, final int format, final int type,
|
|
final ByteBuffer data) {
|
|
checkLimit(data);
|
|
GL12.glTexImage3D(target, level, internalFormat, width, height, depth, border, format, type, data);
|
|
}
|
|
|
|
@Override
|
|
public void glTexParameterf(final int target, final int pname, final float param) {
|
|
GL11.glTexParameterf(target, pname, param);
|
|
}
|
|
|
|
@Override
|
|
public void glTexParameteri(final int target, final int pname, final int param) {
|
|
GL11.glTexParameteri(target, pname, param);
|
|
}
|
|
|
|
@Override
|
|
public void glTexSubImage2D(final int target, final int level, final int xoffset, final int yoffset,
|
|
final int width, final int height, final int format, final int type,
|
|
final ByteBuffer data) {
|
|
checkLimit(data);
|
|
GL11.glTexSubImage2D(target, level, xoffset, yoffset, width, height, format, type, data);
|
|
}
|
|
|
|
@Override
|
|
public void glTexSubImage3D(final int target, final int level, final int xoffset, final int yoffset,
|
|
final int zoffset, final int width, final int height, final int depth, final int format,
|
|
final int type, final ByteBuffer data) {
|
|
checkLimit(data);
|
|
GL12.glTexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, data);
|
|
}
|
|
|
|
@Override
|
|
public void glUniform1(final int location, final FloatBuffer value) {
|
|
checkLimit(value);
|
|
GL20.glUniform1fv(location, value);
|
|
}
|
|
|
|
@Override
|
|
public void glUniform1(final int location, final IntBuffer value) {
|
|
checkLimit(value);
|
|
GL20.glUniform1iv(location, value);
|
|
}
|
|
|
|
@Override
|
|
public void glUniform1f(final int location, final float v0) {
|
|
GL20.glUniform1f(location, v0);
|
|
}
|
|
|
|
@Override
|
|
public void glUniform1i(final int location, final int v0) {
|
|
GL20.glUniform1i(location, v0);
|
|
}
|
|
|
|
@Override
|
|
public void glUniform2(final int location, final IntBuffer value) {
|
|
checkLimit(value);
|
|
GL20.glUniform2iv(location, value);
|
|
}
|
|
|
|
@Override
|
|
public void glUniform2(final int location, final FloatBuffer value) {
|
|
checkLimit(value);
|
|
GL20.glUniform2fv(location, value);
|
|
}
|
|
|
|
@Override
|
|
public void glUniform2f(final int location, final float v0, final float v1) {
|
|
GL20.glUniform2f(location, v0, v1);
|
|
}
|
|
|
|
@Override
|
|
public void glUniform3(final int location, final IntBuffer value) {
|
|
checkLimit(value);
|
|
GL20.glUniform3iv(location, value);
|
|
}
|
|
|
|
@Override
|
|
public void glUniform3(final int location, final FloatBuffer value) {
|
|
checkLimit(value);
|
|
GL20.glUniform3fv(location, value);
|
|
}
|
|
|
|
@Override
|
|
public void glUniform3f(final int location, final float v0, final float v1, final float v2) {
|
|
GL20.glUniform3f(location, v0, v1, v2);
|
|
}
|
|
|
|
@Override
|
|
public void glUniform4(final int location, final FloatBuffer value) {
|
|
checkLimit(value);
|
|
GL20.glUniform4fv(location, value);
|
|
}
|
|
|
|
@Override
|
|
public void glUniform4(final int location, final IntBuffer value) {
|
|
checkLimit(value);
|
|
GL20.glUniform4iv(location, value);
|
|
}
|
|
|
|
@Override
|
|
public void glUniform4f(final int location, final float v0, final float v1, final float v2, final float v3) {
|
|
GL20.glUniform4f(location, v0, v1, v2, v3);
|
|
}
|
|
|
|
@Override
|
|
public void glUniformMatrix3(final int location, final boolean transpose, final FloatBuffer value) {
|
|
checkLimit(value);
|
|
GL20.glUniformMatrix3fv(location, transpose, value);
|
|
}
|
|
|
|
@Override
|
|
public void glUniformMatrix4(final int location, final boolean transpose, final FloatBuffer value) {
|
|
checkLimit(value);
|
|
GL20.glUniformMatrix4fv(location, transpose, value);
|
|
}
|
|
|
|
@Override
|
|
public void glUseProgram(final int program) {
|
|
GL20.glUseProgram(program);
|
|
}
|
|
|
|
@Override
|
|
public void glVertexAttribPointer(final int index, final int size, final int type, final boolean normalized,
|
|
final int stride, final long pointer) {
|
|
GL20.glVertexAttribPointer(index, size, type, normalized, stride, pointer);
|
|
}
|
|
|
|
@Override
|
|
public void glViewport(final int x, final int y, final int width, final int height) {
|
|
GL11.glViewport(x, y, width, height);
|
|
}
|
|
|
|
@Override
|
|
public int glGetAttribLocation(final int program, final String name) {
|
|
// NOTE: LWJGL requires null-terminated strings
|
|
return GL20.glGetAttribLocation(program, name + "\0");
|
|
}
|
|
|
|
@Override
|
|
public int glGetUniformLocation(final int program, final String name) {
|
|
// NOTE: LWJGL requires null-terminated strings
|
|
return GL20.glGetUniformLocation(program, name + "\0");
|
|
}
|
|
|
|
@Override
|
|
public void glShaderSource(final int shader, final String[] strings, final IntBuffer length) {
|
|
checkLimit(length);
|
|
GL20.glShaderSource(shader, strings);
|
|
}
|
|
|
|
@Override
|
|
public String glGetProgramInfoLog(final int program, final int maxSize) {
|
|
return GL20.glGetProgramInfoLog(program, maxSize);
|
|
}
|
|
|
|
@Override
|
|
public long glGetQueryObjectui64(int query, int target) {
|
|
return ARBTimerQuery.glGetQueryObjectui64(query, target);
|
|
}
|
|
|
|
@Override
|
|
public int glGetQueryObjectiv(int query, int pname) {
|
|
return GL15.glGetQueryObjecti(query, pname);
|
|
}
|
|
|
|
public String glGetShaderInfoLog(int shader, int maxSize) {
|
|
return GL20.glGetShaderInfoLog(shader, maxSize);
|
|
}
|
|
|
|
@Override
|
|
public void glBindFragDataLocation(final int program, final int colorNumber, final String name) {
|
|
GL30.glBindFragDataLocation(program, colorNumber, name);
|
|
}
|
|
|
|
@Override
|
|
public void glBindVertexArray(final int array) {
|
|
GL30.glBindVertexArray(array);
|
|
}
|
|
|
|
@Override
|
|
public void glGenVertexArrays(final IntBuffer arrays) {
|
|
checkLimit(arrays);
|
|
GL30.glGenVertexArrays(arrays);
|
|
}
|
|
|
|
@Override
|
|
public void glPatchParameter(final int count) {
|
|
GL40.glPatchParameteri(GL40.GL_PATCH_VERTICES, count);
|
|
}
|
|
|
|
@Override
|
|
public int glGetProgramResourceIndex(final int program, final int programInterface, final String name) {
|
|
return GL43.glGetProgramResourceIndex(program, programInterface, name);
|
|
}
|
|
|
|
@Override
|
|
public void glShaderStorageBlockBinding(final int program, final int storageBlockIndex, final int storageBlockBinding) {
|
|
GL43.glShaderStorageBlockBinding(program, storageBlockIndex, storageBlockBinding);
|
|
}
|
|
|
|
@Override
|
|
public void glDeleteVertexArrays(final IntBuffer arrays) {
|
|
checkLimit(arrays);
|
|
ARBVertexArrayObject.glDeleteVertexArrays(arrays);
|
|
}
|
|
|
|
@Override
|
|
public int glGetUniformBlockIndex(final int program, final String uniformBlockName) {
|
|
return GL31.glGetUniformBlockIndex(program, uniformBlockName);
|
|
}
|
|
|
|
@Override
|
|
public void glBindBufferBase(final int target, final int index, final int buffer) {
|
|
GL30.glBindBufferBase(target, index, buffer);
|
|
}
|
|
|
|
@Override
|
|
public void glUniformBlockBinding(final int program, final int uniformBlockIndex, final int uniformBlockBinding) {
|
|
GL31.glUniformBlockBinding(program, uniformBlockIndex, uniformBlockBinding);
|
|
}
|
|
}
|
|
|